Index: /issm/trunk-jpl/src/m/boundaryconditions/SetIceShelfBC.js
===================================================================
--- /issm/trunk-jpl/src/m/boundaryconditions/SetIceShelfBC.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/boundaryconditions/SetIceShelfBC.js	(revision 19759)
@@ -0,0 +1,106 @@
+function SetIceShelfBC(md) { 
+//SETICESHELFBC - Create the boundary conditions for stressbalance and thermal models for a  Ice Shelf with Ice Front
+//
+//   Neumann BC are used on the ice front (an ANRGUS contour around the ice front
+//   must be given in input)
+//   Dirichlet BC are used elsewhere for stressbalance
+//
+//   Usage:
+//      md=SetIceShelfBC(md,varargin)
+//
+//   Example:
+//      SetIceShelfBC(md);
+//      SetIceShelfBC(md,'Front.exp');
+//
+//   See also: SETICESHEETBC, SETMARINEICESHEETBC
+
+	//node on Dirichlet (boundary and ~icefront)
+	if (arguments.length==2){
+		icefront=arguments[1];
+		nodeinsideicefront=ContourToMesh(md.mesh.elements,md.mesh.x,md.mesh.y,icefrontfile,'node',2);
+		nodeonicefront=ArrayAnd(md.mesh.vertexonboundary,nodeinsideicefront);
+	}
+	else if(arguments.length==1){
+		nodeonicefront=NewArrayFill(md.mesh.numberofvertices,0);
+	}
+	else{
+		throw Error('SetIceShelfBC usage error');
+	}
+
+	md.stressbalance.spcvx=NewArrayFill(md.mesh.numberofvertices,NaN); 
+	md.stressbalance.spcvy=NewArrayFill(md.mesh.numberofvertices,NaN);
+	md.stressbalance.spcvz=NewArrayFill(md.mesh.numberofvertices,NaN);
+	md.stressbalance.referential=NewArrayFill(md.mesh.numberofvertices,NaN);
+	md.stressbalance.loadingforce=NewArrayFill(md.mesh.numberofvertices,0);
+
+	//Ice front position: 
+	pos=ArrayFind(nodeonicefront,1);
+	for(var i=0;i<pos.length;i++)md.mask.ice_levelset[pos[i]]=0;
+
+	//First find segments that are not completely on the front
+	if (md.mesh.elementtype() === 'Penta'){
+		numbernodesfront=4;
+	}
+	else if (md.mesh.elementtype() === 'Tria'){
+		numbernodesfront=2;
+	}
+	else{
+		throw Error('mesh type not supported yet');
+	}
+	var obs=false;
+	if((md.inversion.vx_obs.length == md.mesh.numberofvertices) & (md.inversion.vy_obs.length==md.mesh.numberofvertices))obs=true;
+
+
+	if(obs==true){
+		console.log('      boundary conditions for stressbalance model: setting spc as observed velocities');
+	}
+	else{
+		console.log('      boundary conditions for stressbalance model: setting spc as zero');
+	}
+	for(var i=0;i<md.mesh.segments.length;i++){
+		var sum=0;
+		for (var j=0;j<numbernodesfront;j++) sum+=md.mask.ice_levelset[md.mesh.segments[i][j]-1];
+		if(sum!=numbernodesfront){
+			for (var j=0;j<numbernodesfront;j++){
+				if(obs==false){
+					md.stressbalance.spcvx[md.mesh.segments[i][j]-1]=0;
+					md.stressbalance.spcvy[md.mesh.segments[i][j]-1]=0;
+				}
+				else{
+					md.stressbalance.spcvx[md.mesh.segments[i][j]-1]=md.inversion.vx_obs[md.mesh.segments[i][j]-1];
+					md.stressbalance.spcvy[md.mesh.segments[i][j]-1]=md.inversion.vy_obs[md.mesh.segments[i][j]-1];
+				}
+				md.stressbalance.spcvz[md.mesh.segments[i][j]-1]=0;
+
+			}
+		}
+	}
+
+	//Initialize surface and basal forcings
+	md.smb.initialize(md);
+	md.basalforcings.initialize(md);
+
+	//Deal with other boundary conditions
+	if (md.balancethickness.thickening_rate === NaN){
+		md.balancethickness.thickening_rate=NewArrayFill(md.mesh.numberofvertices,0);
+		console.log('      no balancethickness.thickening_rate specified: values set as zero');
+	}
+		
+	md.masstransport.spcthickness=NewArrayFill(md.mesh.numberofvertices,NaN);
+	md.balancethickness.spcthickness=NewArrayFill(md.mesh.numberofvertices,NaN);
+	md.damage.spcdamage=NewArrayFill(md.mesh.numberofvertices,NaN);
+
+	if (md.initialization.temperature.length==md.mesh.numberofvertices){
+		md.thermal.spctemperature=NewArrayFill(md.mesh.numberofvertices,NaN);
+		if ('vertexonsurface' in md.mesh){
+			pos=ArrayFind(md.mesh.vertexonsurface,1);
+			for(var i=0;i<pos.length;i++)md.thermal.spctemperature[i]=md.initialization.temperature[i]; //impose observed temperature on surface
+		}
+		if (md.basalforcings.geothermalflux.length != md.mesh.numberofvertices){
+			md.basalforcings.geothermalflux=NewArrayFill(md.mesh.numberofvertices,0);
+		}
+	}
+	else{
+		console.log('      no thermal boundary conditions created: no observed temperature found');
+	}
+}
Index: /issm/trunk-jpl/src/m/classes/SMBforcing.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBforcing.js	(revision 19758)
+++ /issm/trunk-jpl/src/m/classes/SMBforcing.js	(revision 19759)
@@ -13,4 +13,12 @@
 		fielddisplay(this,'requested_outputs','additional outputs requested');
 	} // }}}
+		this.initialize = function(md) {// {{{
+
+			if (self.mass_balance === NaN){
+				self.mass_balance=NewArrayFill(md.mesh.numberofvertices,0);
+				console.log('      no smb.mass_balance specified: values set as zero');
+			}
+
+		} // }}}
 	//properties 
 	this.mass_balance = NaN;
Index: /issm/trunk-jpl/src/m/classes/autodiff.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/autodiff.js	(revision 19759)
@@ -0,0 +1,48 @@
+//AUTODIFF class definition
+//
+//   Usage:
+//      autodiff=new autodiff();
+
+function autodiff (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		this.obufsize     = 524288;
+		this.lbufsize     = 524288;
+		this.cbufsize     = 524288;
+		this.tbufsize     = 524288;
+		this.gcTriggerRatio=2.0;
+		this.gcTriggerMaxSize=65536;
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   automatic differentiation parameters:'));
+		fielddisplay(this,'isautodiff','indicates if the automatic differentiation is activated');
+		fielddisplay(this,'dependents','list of dependent variables');
+		fielddisplay(this,'independents','list of independent variables');
+		fielddisplay(this,'driver',"ADOLC driver ('fos_forward' or 'fov_forward')");
+		fielddisplay(this,'obufsize','Number of operations per buffer (==OBUFSIZE in usrparms.h)');
+		fielddisplay(this,'lbufsize','Number of locations per buffer (==LBUFSIZE in usrparms.h)');
+		fielddisplay(this,'cbufsize','Number of values per buffer (==CBUFSIZE in usrparms.h)');
+		fielddisplay(this,'tbufsize','Number of taylors per buffer (<=TBUFSIZE in usrparms.h)');
+		fielddisplay(this,'gcTriggerRatio','free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio');
+		fielddisplay(this,'gcTriggerMaxSize','free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize');
+
+	}// }}}
+	//properties 
+	// {{{
+	this.isautodiff   = false;
+	this.dependents   = {};
+	this.independents = {};
+	this.driver       = 'fos_forward';
+	this.obufsize     = NaN;
+	this.lbufsize     = NaN;
+	this.cbufsize     = NaN;
+	this.tbufsize     = NaN;
+	this.gcTriggerRatio = NaN;
+	this.gcTriggerMaxSize = NaN;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/balancethickness.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/balancethickness.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/balancethickness.js	(revision 19759)
@@ -0,0 +1,30 @@
+//BALANCETHICKNESS class definition
+//
+//   Usage:
+//      balancethickness=new balancethickness();
+
+function balancethickness (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//Type of stabilization used
+		this.stabilization=1;
+
+	}// }}}
+	this.disp= function(){// {{{
+		console.log(sprintf('   balance thickness solution parameters:'));
+
+		fielddisplay(this,'spcthickness','thickness constraints (NaN means no constraint) [m]');
+		fielddisplay(this,'thickening_rate','ice thickening rate used in the mass conservation (dh/dt) [m/yr]');
+		fielddisplay(this,"stabilization','0: None, 1: SU, 2: SSA's artificial diffusivity, 3:DG");
+
+	}// }}}
+	//properties 
+	// {{{
+	this.spcthickness      = NaN;
+	this.thickening_rate   = NaN;
+	this.stabilization     = 0;
+	this.omega             = NaN;
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/basalforcings.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/basalforcings.js	(revision 19758)
+++ /issm/trunk-jpl/src/m/classes/basalforcings.js	(revision 19759)
@@ -17,4 +17,17 @@
 
 	} // }}}
+		this.initialize = function (md){ // {{{
+
+			if (this.groundedice_melting_rate === NaN){
+				this.groundedice_melting_rate=NewArrayFill(md.mesh.numberofvertices,0);
+				console.log('      no basalforcings.groundedice_melting_rate specified: values set as zero');
+			}
+
+			if (this.floatingice_melting_rate === NaN){
+				this.floatingice_melting_rate=NewArrayFill(md.mesh.numberofvertices,0);
+				console.log('      no basalforcings.floatingice_melting_rate specified: values set as zero');
+			}
+
+		} // }}}
 	//properties 
 	//{{{
Index: /issm/trunk-jpl/src/m/classes/calving.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/calving.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/calving.js	(revision 19759)
@@ -0,0 +1,33 @@
+//CALVING class definition
+//
+//   Usage:
+//      calving=new calving();
+
+function calving (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//stabilization = 2 by default
+		this.stabilization = 2;
+	
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   Calving parameters:'));
+		fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+		fielddisplay(this,'spclevelset','Levelset constraints (NaN means no constraint)');
+		fielddisplay(this,'calvingrate','calving rate at given location [m/a]');
+		fielddisplay(this,'meltingrate','melting rate at given location [m/a]');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.stabilization = 0;
+	this.spclevelset   = NaN;
+	this.calvingrate   = NaN;
+	this.meltingrate   = NaN;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/flaim.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/flaim.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/flaim.js	(revision 19759)
@@ -0,0 +1,58 @@
+//FLAIM class definition
+//
+//   Usage:
+//      flaim=new flaim();
+
+function flaim (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   FLAIM - Flight Line Adaptation using Ice sheet Modeling:')); 
+
+		console.log(sprintf('\n      Input:'));
+		fielddisplay(this,'targets'            ,'name of kml output targets file ');
+		fielddisplay(this,'tracks'             ,'name of kml input tracks file ');
+		fielddisplay(this,'flightreqs'         ,'structure of kml flight requirements (not used yet)');
+		fielddisplay(this,'criterion'          ,'element or nodal criterion for flight path evaluation (metric)');
+
+		console.log(sprintf('\n      Arguments:'));
+		fielddisplay(this,'gridsatequator'     ,'number of grids at equator (determines resolution)');
+		fielddisplay(this,'usevalueordering'   ,'flag to consider target values for flight path evaluation');
+		fielddisplay(this,'split_antimeridian' ,'flag to split polygons on the antimeridian');
+
+		console.log(sprintf('\n      Optimization:'));
+		fielddisplay(this,'path_optimize'     ,'optimize? (default false)');
+		fielddisplay(this,'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(this,'opt_dist'     ,'specifies the distance in km (default 25) to move a randomly selected path point on each iteration');
+		fielddisplay(this,'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.']);
+
+		console.log(sprintf('\n      Output:'));
+		fielddisplay(this,'solution'           ,'name of kml solution file');
+		fielddisplay(this,'quality'            ,'quality of kml solution');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.targets            = '';
+	this.tracks             = '';
+	this.flightreqs         = {};
+	this.criterion          = NaN;
+	this.gridsatequator     = 200000;
+	this.usevalueordering   = true;
+	this.split_antimeridian = true;
+	this.solution           = '';
+	this.quality            = 0;
+	this.path_optimize      = false;
+	this.opt_ndir           = 1;
+	this.opt_dist           = 25;
+	this.opt_niter          = 30000;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/gia.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/gia.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/gia.js	(revision 19759)
@@ -0,0 +1,31 @@
+//GIA class definition
+//
+//   Usage:
+//      gia=new gia();
+
+function gia (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		this.cross_section_shape=1; //square as default (see iedge in GiaDeflectionCorex)
+	
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   gia parameters:'));
+
+		fielddisplay(this,'mantle_viscosity','mantle viscosity[Pa s]');
+		fielddisplay(this,'lithosphere_thickness','lithosphere thickness (km)');
+		fielddisplay(this,'cross_section_shape','1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.mantle_viscosity              = NaN;
+	this.lithosphere_thickness         = NaN;
+	this.cross_section_shape           = 0;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/hydrologyshreve.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/hydrologyshreve.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/hydrologyshreve.js	(revision 19759)
@@ -0,0 +1,27 @@
+//HYDROLOGYSHREVE class definition
+//
+//   Usage:
+//      hydrologyshreve=new hydrologyshreve();
+
+function hydrologyshreve (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//Type of stabilization to use 0:nothing 1:artificial_diffusivity
+		self.stabilization=1;
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   hydrologyshreve solution parameters:'));
+		fielddisplay(this,'spcwatercolumn','water thickness constraints (NaN means no constraint) [m]');
+		fielddisplay(this,'stabilization','artificial diffusivity (default is 1). can be more than 1 to increase diffusivity.');
+
+	}// }}}
+	//properties 
+	// {{{
+	this.spcwatercolumn = NaN;
+	this.stabilization  = 0;
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/inversion.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/inversion.js	(revision 19759)
@@ -0,0 +1,101 @@
+//INVERSION class definition
+//
+//   Usage:
+//      inversion=new inversion();
+
+function inversion (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//default is incomplete adjoint for now
+		this.incomplete_adjoint=1;
+
+		//parameter to be inferred by control methods (only
+		//drag and B are supported yet)
+		this.control_parameters=['FrictionCoefficient'];
+
+		//number of steps in the control methods
+		this.nsteps=20;
+
+		//maximum number of iteration in the optimization algorithm for
+		//each step
+		this.maxiter_per_step=20*NewArrayFill(this.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
+		this.gradient_scaling=NewArrayFill(this.nsteps,50);
+
+		//several responses can be used:
+		this.cost_functions=101;
+
+		//step_threshold is used to speed up control method. When
+		//misfit(1)/misfit(0) < this.step_threshold, we go directly to
+		//the next step
+		this.step_threshold=NewArrayFill(this.nsteps,.7); //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
+		this.cost_function_threshold=NaN; //not activated
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   inversion parameters:'));
+		fielddisplay(this,'iscontrol','is inversion activated?');
+		fielddisplay(this,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+		fielddisplay(this,'control_parameters',"ex: {'FrictionCoefficient'}, or {'MaterialsRheologyBbar'}");
+		fielddisplay(this,'nsteps','number of optimization searches');
+		fielddisplay(this,'cost_functions','indicate the type of response for each optimization step');
+		fielddisplay(this,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+		fielddisplay(this,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied');
+		fielddisplay(this,'maxiter_per_step','maximum iterations during each optimization step');
+		fielddisplay(this,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step');
+		fielddisplay(this,'step_threshold','decrease threshold for misfit, default is 30%');
+		fielddisplay(this,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+		fielddisplay(this,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+		fielddisplay(this,'vx_obs','observed velocity x component [m/yr]');
+		fielddisplay(this,'vy_obs','observed velocity y component [m/yr]');
+		fielddisplay(this,'vel_obs','observed velocity magnitude [m/yr]');
+		fielddisplay(this,'thickness_obs','observed thickness [m]');
+		fielddisplay(this,'surface_obs','observed surface elevation [m]');
+		console.log('Available cost functions:');
+		console.log('   101: SurfaceAbsVelMisfit');
+		console.log('   102: SurfaceRelVelMisfit');
+		console.log('   103: SurfaceLogVelMisfit');
+		console.log('   104: SurfaceLogVxVyMisfit');
+		console.log('   105: SurfaceAverageVelMisfit');
+		console.log('   201: ThicknessAbsMisfit');
+		console.log('   501: DragCoefficientAbsGradient');
+		console.log('   502: RheologyBbarAbsGradient');
+		console.log('   503: ThicknessAbsGradient');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.iscontrol                   = 0;
+	this.incomplete_adjoint          = 0;
+	this.control_parameters          = NaN;
+	this.nsteps                      = 0;
+	this.maxiter_per_step            = NaN;
+	this.cost_functions              = NaN;
+	this.cost_functions_coefficients = NaN;
+	this.gradient_scaling            = NaN;
+	this.cost_function_threshold     = 0;
+	this.min_parameters              = NaN;
+	this.max_parameters              = NaN;
+	this.step_threshold              = NaN;
+	this.vx_obs                      = NaN;
+	this.vy_obs                      = NaN;
+	this.vz_obs                      = NaN;
+	this.vel_obs                     = NaN;
+	this.thickness_obs               = NaN;
+	this.surface_obs                 = NaN;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/masstransport.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/masstransport.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/masstransport.js	(revision 19759)
@@ -0,0 +1,54 @@
+//MASSTRANSPORT class definition
+//
+//   Usage:
+//      masstransport=new masstransport();
+
+function masstransport (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+		this.stabilization=1;
+
+		//Factor applied to compute the penalties kappa=max(stiffness matrix)*10^penalty_factor
+		this.penalty_factor=3;
+
+		//Minimum ice thickness that can be used
+		this.min_thickness=1;
+
+		//Hydrostatic adjustment
+		this.hydrostatic_adjustment='Absolute';
+
+		//default output
+		this.requested_outputs=['default'];
+
+	}// }}}
+	this.disp= function(){// {{{
+		console.log(sprintf('   Masstransport solution parameters:'));
+		fielddisplay(this,'spcthickness','thickness constraints (NaN means no constraint) [m]');
+		fielddisplay(this,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
+		fielddisplay(this,'min_thickness','minimum ice thickness allowed [m]');
+		fielddisplay(this,'hydrostatic_adjustment',"adjustment of ice shelves surface and bed elevations: 'Incremental' or 'Absolute' ");
+		fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport');
+
+		console.log(sprintf('\n      %s','Penalty options:'));
+		fielddisplay(this,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
+		fielddisplay(this,'vertex_pairing','pairs of vertices that are penalized');
+		fielddisplay(this,'requested_outputs','additional outputs requested');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.spcthickness           = NaN;
+	this.isfreesurface          = 0;
+	this.min_thickness          = 0;
+	this.hydrostatic_adjustment = 0;
+	this.stabilization          = 0;
+	this.vertex_pairing         = NaN;
+	this.penalty_factor         = 0;
+	this.requested_outputs      = [''];
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/miscellaneous.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/miscellaneous.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/miscellaneous.js	(revision 19759)
@@ -0,0 +1,27 @@
+//MISCELLANEOUS class definition
+//
+//   Usage:
+//      miscellaneous=new miscellaneous();
+
+function miscellaneous (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   miscellaneous parameters:'));
+
+		fielddisplay(this,'notes','notes in a cell of strings');
+		fielddisplay(this,'name','model name');
+		fielddisplay(this,'dummy','empty field to store some data');
+
+	}// }}}
+	//properties 
+	// {{{
+	this.notes = '';
+	this.name  = '';
+	this.dummy = {};
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/model.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/model.js	(revision 19758)
+++ /issm/trunk-jpl/src/m/classes/model.js	(revision 19759)
@@ -66,5 +66,4 @@
 			this.settings         = new settings();
 			this.toolkits         = new toolkits();
-			this.toolkits.disp();
 			this.cluster          = new generic();
 			this.balancethickness = new balancethickness();
Index: /issm/trunk-jpl/src/m/classes/outputdefinition.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/outputdefinition.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/outputdefinition.js	(revision 19759)
@@ -0,0 +1,22 @@
+//OUTPUTDEFINITION class definition
+//
+//   Usage:
+//      outputdefinition=new outputdefinition();
+
+function outputdefinition (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+		this.definitions={};
+	}// }}}
+	this.disp= function(){// {{{
+		console.log(sprintf('   outputdefinition:'));
+		fielddisplay(this,'definitions','list of potential outputs that can be requested, but which need additional data to be defined');
+
+
+	}// }}}
+	//properties 
+	// {{{
+	this.definitions                 = {};
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/private.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/private.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/private.js	(revision 19759)
@@ -0,0 +1,27 @@
+//PRIVATE class definition
+//
+//   Usage:
+//      private=new private();
+
+function private (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.disp= function(){// {{{
+		console.log(sprintf('   private parameters: do not change'));
+
+		fielddisplay(this,'isconsistent','is model this consistent');
+		fielddisplay(this,'runtimename','name of the run launched');
+		fielddisplay(this,'bamg','structure with mesh properties constructed if bamg is used to mesh the domain');
+		fielddisplay(this,'solution','type of solution launched');
+	}// }}}
+	//properties 
+	// {{{
+	this.isconsistent = true;
+	this.runtimename  = '';
+	this.bamg         = {};
+	this.solution     = '';
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/qmu.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/qmu.js	(revision 19759)
@@ -0,0 +1,114 @@
+//QMU class definition
+//
+//   Usage:
+//      qmu=new qmu();
+
+function qmu (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   qmu parameters:'));
+
+		/*fielddisplay(this,'isdakota','is qmu analysis activated?');
+		for (var i=0;i<this.variables.length;i++){
+			console.log(sprintf('         variables%s:  (arrays of each variable class)',...
+						string_dim(this.variables,i)));
+		}
+		fnames=fieldnames(this.variables(i));
+		maxlen=0;
+		for j=1:numel(fnames)
+			maxlen=max(maxlen,length(fnames{j}));
+		end
+
+			for j=1:numel(fnames)
+				console.log(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+							fnames{j},size(this.variables.(fnames{j})),class(this.variables.(fnames{j}))));
+		end
+			end
+			for i=1:numel(this.responses)
+				console.log(sprintf('         responses%s:  (arrays of each response class)',...
+							string_dim(this.responses,i)));
+		fnames=fieldnames(this.responses(i));
+		maxlen=0;
+		for j=1:numel(fnames)
+			maxlen=max(maxlen,length(fnames{j}));
+		end
+
+			for j=1:numel(fnames)
+				console.log(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+							fnames{j},size(this.responses.(fnames{j})),class(this.responses.(fnames{j}))));
+		end
+			end
+			fielddisplay(this,'numberofresponses','number of responses') 
+			for i=1:numel(this.method);
+		if strcmp(class(this.method(i)),'dakota_method')
+			console.log(sprintf('            method%s :    ''%s''',...
+						string_dim(this.method,i),this.method(i).method));
+		end
+			end
+			for i=1:numel(this.params)
+				console.log(sprintf('         params%s:  (array of method-independent parameters)',...
+							string_dim(this.params,i)));
+		fnames=fieldnames(this.params(i));
+		maxlen=0;
+		for j=1:numel(fnames)
+			maxlen=max(maxlen,length(fnames{j}));
+		end
+
+			for j=1:numel(fnames)
+				console.log(sprintf(['            %-' num2str(maxlen+1) 's: %s'],...
+							fnames{j},any2str(this.params(i).(fnames{j}))));
+		end
+			end
+			for i=1:numel(this.results)
+				console.log(sprintf('         results%s:  (information from dakota files)',...
+							string_dim(this.results,i)));
+		fnames=fieldnames(this.results(i));
+		maxlen=0;
+		for j=1:numel(fnames)
+			maxlen=max(maxlen,length(fnames{j}));
+		end
+
+			for j=1:numel(fnames)
+				console.log(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+							fnames{j},size(this.results.(fnames{j})),class(this.results.(fnames{j}))));
+		end
+			end
+			fielddisplay(this,'partition','user provided mesh partitioning, defaults to metis if not specified') 
+			fielddisplay(this,'numberofpartitions','number of partitions for semi-discrete qmu') 
+			fielddisplay(this,'variabledescriptors','');
+		fielddisplay(this,'responsedescriptors','');
+		fielddisplay(this,'method','array of dakota_method class');
+		fielddisplay(this,'mass_flux_profile_directory','directory for mass flux profiles');
+		fielddisplay(this,'mass_flux_profiles','list of mass_flux profiles');
+		fielddisplay(this,'mass_flux_segments','');
+		fielddisplay(this,'adjacency','');
+		fielddisplay(this,'vertex_weight','weight applied to each mesh vertex');
+		*/
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.isdakota                    = 0;
+	this.variables                   = {};
+	this.responses                   = {};
+	this.method                      = {};
+	this.params                      = {};
+	this.results                     = {};
+	this.partition                   = NaN;
+	this.numberofpartitions          = 0;
+	this.numberofresponses           = 0;
+	this.variabledescriptors         = {};
+	this.responsedescriptors         = {};
+	this.mass_flux_profile_directory = NaN;
+	this.mass_flux_profiles          = NaN;
+	this.mass_flux_segments          = {};
+	this.adjacency                   = NaN;
+	this.vertex_weight               = NaN;
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/radaroverlay.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/radaroverlay.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/radaroverlay.js	(revision 19759)
@@ -0,0 +1,25 @@
+//RADAROVERLAY class definition
+//
+//   Usage:
+//      radaroverlay=new radaroverlay();
+
+function radaroverlay (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.disp= function(){// {{{
+		console.log(sprintf('   radaroverlay parameters:'));
+
+		fielddisplay(this,'pwr','radar power image (matrix)');
+		fielddisplay(this,'x','corresponding x coordinates [m]');
+		fielddisplay(this,'y','corresponding y coordinates [m]');
+
+	}// }}}
+	//properties 
+	// {{{
+	this.pwr = NaN;
+	this.x   = NaN;
+	this.y   = NaN;
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/steadystate.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/steadystate.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/steadystate.js	(revision 19759)
@@ -0,0 +1,39 @@
+//STEADYSTATE class definition
+//
+//   Usage:
+//      steadystate=new steadystate();
+
+function steadystate (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//maximum of steady state iterations
+		this.maxiter=100;
+
+		//Relative tolerance for the steadystate convertgence
+		this.reltol=0.01;
+
+		//default output
+		this.requested_outputs=['default'];
+
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   steadystate solution parameters:'));
+
+		fielddisplay(this,'reltol','relative tolerance criterion');
+		fielddisplay(this,'maxiter','maximum number of iterations');
+		fielddisplay(this,'requested_outputs','additional requested outputs');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.reltol            = 0;
+	this.maxiter           = 0;
+	this.requested_outputs = [];
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/stressbalance.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/stressbalance.js	(revision 19758)
+++ /issm/trunk-jpl/src/m/classes/stressbalance.js	(revision 19759)
@@ -93,4 +93,5 @@
 	this.loadingforce           = NaN;
 	this.requested_outputs      = ['']
+
 	this.setdefaultparameters();
 	//}}}
Index: /issm/trunk-jpl/src/m/classes/thermal.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/thermal.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/thermal.js	(revision 19759)
@@ -0,0 +1,67 @@
+//THERMAL class definition
+//
+//   Usage:
+//      thermal=new thermal();
+
+function thermal (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//Number of unstable constraints acceptable
+		this.penalty_threshold=0;
+
+		//Type of stabilization used
+		this.stabilization=1;
+
+		//Relative tolerance for the enthalpy convergence
+		this.reltol=0.01;
+
+		//Maximum number of iterations
+		this.maxiter=100;
+
+		//factor used to compute the values of the penalties: kappa=max(stiffness matrix)*10^penalty_factor
+		this.penalty_factor=3;
+
+		//Should we use cold ice (default) or enthalpy formulation
+		this.isenthalpy=0;
+
+		//will basal boundary conditions be set dynamically
+		this.isdynamicbasalspc=0;
+
+		//default output
+		this.requested_outputs=['default'];
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   Thermal solution parameters:'));
+
+		fielddisplay(this,'spctemperature','temperature constraints (NaN means no constraint) [K]');
+		fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
+		fielddisplay(this,'reltol','relative tolerance convergence criterion for enthalpy');
+		fielddisplay(this,'maxiter','maximum number of non linear iterations');
+		fielddisplay(this,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
+		fielddisplay(this,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)');
+		fielddisplay(this,'penalty_factor','scaling exponent (default is 3)');
+		fielddisplay(this,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)');
+		fielddisplay(this,'isdynamicbasalspc',['enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)']);
+		fielddisplay(this,'requested_outputs','additional outputs requested');
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.spctemperature    = NaN;
+	this.penalty_threshold = 0;
+	this.stabilization     = 0;
+	this.reltol				= 0;
+	this.maxiter           = 0;
+	this.penalty_lock      = 0;
+	this.penalty_factor    = 0;
+	this.isenthalpy        = 0;
+	this.isdynamicbasalspc = 0;
+	this.requested_outputs = [];
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/classes/transient.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.js	(revision 19759)
+++ /issm/trunk-jpl/src/m/classes/transient.js	(revision 19759)
@@ -0,0 +1,61 @@
+//TRANSIENT class definition
+//
+//   Usage:
+//      transient=new transient();
+
+function transient (){
+	//methods
+	this.setdefaultparameters = function(){// {{{
+
+		//full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now
+		this.issmb           = 1;
+		this.ismasstransport = 1;
+		this.isstressbalance = 1;
+		this.isthermal       = 1;
+		this.isgroundingline = 0;
+		this.isgia           = 0;
+		this.isdamageevolution = 0;
+		this.islevelset      = 0;
+		this.iscalving       = 0;
+		this.ishydrology     = 0;
+
+		//default output
+		this.requested_outputs=['default'];
+
+	}// }}}
+	this.disp= function(){// {{{
+
+		console.log(sprintf('   transient solution parameters:'));
+
+		fielddisplay(this,'issmb','indicates whether a surface mass balance solution is used in the transient');
+		fielddisplay(this,'ismasstransport','indicates whether a masstransport solution is used in the transient');
+		fielddisplay(this,'isstressbalance','indicates whether a stressbalance solution is used in the transient');
+		fielddisplay(this,'isthermal','indicates whether a thermal solution is used in the transient');
+		fielddisplay(this,'isgroundingline','indicates whether a groundingline migration is used in the transient');
+		fielddisplay(this,'isgia','indicates whether a postglacial rebound model is used in the transient');
+		fielddisplay(this,'isdamageevolution','indicates whether damage evolution is used in the transient');
+		fielddisplay(this,'islevelset','LEVEL SET DESCRIPTION...');
+		fielddisplay(this,'iscalving','indicates whether calving is used in the transient');
+		fielddisplay(this,'ishydrology','indicates whether an hydrology model is used');
+		fielddisplay(this,'requested_outputs','list of additional outputs requested');
+
+
+	}// }}}
+	//properties 
+	// {{{
+
+	this.issmb             = 0;
+	this.ismasstransport   = 0;
+	this.isstressbalance   = 0;
+	this.isthermal         = 0;
+	this.isgroundingline   = 0;
+	this.isgia             = 0;
+	this.isdamageevolution = 0;
+	this.islevelset        = 0;
+	this.iscalving         = 0;
+	this.ishydrology       = 0;
+	this.requested_outputs = [];
+
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/src/m/plot/processdata.js
===================================================================
--- /issm/trunk-jpl/src/m/plot/processdata.js	(revision 19758)
+++ /issm/trunk-jpl/src/m/plot/processdata.js	(revision 19759)
@@ -15,5 +15,5 @@
 
 	//check format
-	if ( data.length ==0 | data === [] | typeof data === 'number' | ArrayAnyNaN(data)){
+	if ( data.length ==0 | data === [] | typeof data === 'number' | data === NaN ){
 		throw Error('plotmodel error message: data provided is empty');
 	}
