Index: sm/trunk-jpl/src/jl/classes.jl
===================================================================
--- /issm/trunk-jpl/src/jl/classes.jl	(revision 26628)
+++ 	(revision )
@@ -1,164 +1,0 @@
-using Printf
-
-abstract type AbstractMesh end
-mutable struct Mesh2dTriangle <: AbstractMesh
-	numberofvertices::Int64
-	numberofelements::Int64
-	x::Vector{Float64}
-	y::Vector{Float64}
-	elements::Matrix{Int64}
-	segments::Matrix{Int64}
-	vertexonboundary::Vector{Bool}
-end
-function Mesh2dTriangle() #{{{
-	return Mesh2dTriangle( 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef, 0), Matrix{Int64}(undef, 0, 0), Matrix{Int64}(undef, 0, 0), Vector{Bool}(undef,0))
-end# }}}
-function Base.show(io::IO, this::Mesh2dTriangle)# {{{
-
-	println(io,typeof(this),":")
-	for name in fieldnames(typeof(this))
-		a=getfield(this,name)
-		#print(io,"   $(name) = ")
-		@printf "%19s: " name
-		if isa(a,String)
-			println(io, a)
-		elseif length(a)>1
-			if !isempty(a)
-				println(io, typeof(a), " of size ", size(a))
-			else
-				println(io,"empty")
-			end
-		else
-			println(io, a)
-		end
-	end
-end# }}}
-mutable struct Mesh3dPrism{T} <: AbstractMesh
-	numberofvertices::Int64
-	numberofelements::Int64
-	numberoflayers::Int64
-	x::Vector{Float64}
-	y::Vector{Float64}
-	z::Vector{Float64}
-	elements::Matrix{Int64}
-	segments::Matrix{Int64}
-	vertexonboundary::Vector{Bool}
-end
-function Mesh3dPrism() #{{{
-	return Mesh3dPrism( 0, 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Matrix{Int64}(undef, 0, 0), Matrix{Int64}(undef, 0, 0), Vector{Bool}(undef,0))
-end# }}}
-
-mutable struct Geometry
-	surface::Vector{Float64}
-	base::Vector{Float64}
-	thickness::Vector{Float64}
-	bed::Vector{Float64}
-end
-function Geometry() #{{{
-	return Geometry( Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0))
-end# }}}
-
-mutable struct Mask
-	ocean_levelset::Vector{Float64}
-	ice_levelset::Vector{Float64}
-end
-function Mask() #{{{
-	return Mask( Vector{Float64}(undef,0), Vector{Float64}(undef,0))
-end# }}}
-
-mutable struct Initialization
-	vx::Vector{Float64}
-	vy::Vector{Float64}
-end
-function Initialization() #{{{
-	return Initialization( Vector{Float64}(undef,0), Vector{Float64}(undef,0))
-end# }}}
-
-mutable struct Stressbalance
-	spcvx::Vector{Float64}
-	spcvy::Vector{Float64}
-	restol::Float64
-	reltol::Float64
-	abstol::Float64
-	maxiter::Int64
-end
-function Stressbalance() #{{{
-	return Stressbalance( Vector{Float64}(undef,0), Vector{Float64}(undef,0), 1.e-4, 0.01, 10., 100)
-end# }}}
-function Base.show(io::IO, this::Stressbalance)# {{{
-
-	println(io,typeof(this),":")
-	for name in fieldnames(typeof(this))
-		a=getfield(this,name)
-		#print(io,"   $(name) = ")
-		@printf "%19s: " name
-		if isa(a,String)
-			println(io, a)
-		elseif length(a)>1
-			if !isempty(a)
-				println(io, typeof(a), " of size ", size(a))
-			else
-				println(io,"empty")
-			end
-		else
-			println(io, a)
-		end
-	end
-end# }}}
-
-mutable struct Constants
-	g::Float64
-	yts::Float64
-end
-function Constants() #{{{
-	return Constants( 9.81,  365*24*3600.)
-end# }}}
-
-mutable struct Materials
-	rho_ice::Float64
-	rho_water::Float64
-	rho_freshwater::Float64
-	mu_water::Float64
-	heatcapacity::Float64
-	latentheat::Float64
-	thermalconductivity::Float64
-	temperateiceconductivity::Float64
-	effectiveconductivity_averaging::Int64
-	meltingpoint::Float64
-	beta::Float64
-	mixed_layer_capacity::Float64
-	thermal_exchange_velocity::Float64
-	rheology_B::Vector{Float64}
-	rheology_n::Vector{Float64}
-	rheology_law::String
-end
-function Materials() #{{{
-	return Materials(917., 1023., 1000., 0.001787, 2093., 3.34*10^5, 2.4, .24, 1, 273.15, 9.8*10^-8, 3974., 1.00*10^-4, Vector{Float64}(undef,0), Vector{Float64}(undef,0), "Cuffey")
-end# }}}
-
-mutable struct model
-	mesh::AbstractMesh
-	geometry::Geometry
-	mask::Mask
-	materials::Materials
-	initialization::Initialization
-	stressbalance::Stressbalance
-	constants::Constants
-end
-function model() #{{{
-	return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), Initialization(),Stressbalance(), Constants())
-end#}}}
-function Base.show(io::IO, md::model)# {{{
-
-	compact = get(io, :compact, false)
-
-	println(io,"Model:")
-	@printf "%19s: %-26s -- %s\n" "mesh" typeof(md.mesh) "mesh properties"
-	@printf "%19s: %-26s -- %s\n" "geometry" typeof(md.geometry) "surface elevation, bedrock topography, ice thickness,..."
-	@printf "%19s: %-26s -- %s\n" "mask" typeof(md.mask) "defines grounded and floating regions"
-	@printf "%19s: %-26s -- %s\n" "materials" typeof(md.materials) "material properties"
-	@printf "%19s: %-26s -- %s\n" "initialization" typeof(md.initialization) "initial state"
-	@printf "%19s: %-26s -- %s\n" "stressbalance" typeof(md.stressbalance) "stress balance parameters"
-	@printf "%19s: %-26s -- %s\n" "constants" typeof(md.constants) "physical constants"
-
-end# }}}
Index: sm/trunk-jpl/src/jl/exp.jl
===================================================================
--- /issm/trunk-jpl/src/jl/exp.jl	(revision 26628)
+++ 	(revision )
@@ -1,137 +1,0 @@
-#for exptool, look into this http://juliaplots.org/MakieReferenceImages/gallery//mouse_picking/index.html
-
-#exp object definition, constructor, and disp
-mutable struct ExpStruct #{{{
-	name::String
-	nods::Int32
-	density::Float64
-	x::Vector{Float64}
-   y::Vector{Float64}
-	closed::Bool
-end  #}}}
-function ExpStruct() #{{{
-	return ExpStruct("",0, 0., Vector{Float64}(undef,0), Vector{Float64}(undef,0), false)
-end# }}}
-function Base.show(io::IO, exp::ExpStruct)# {{{
-
-	compact = get(io, :compact, false)
-
-	println(io,"ExpStruct:")
-	for name in fieldnames(typeof(exp))
-		a=getfield(exp,name)
-		print(io,"   $(name) = ")
-		if !isempty(a)
-			if compact && eltype(a)<:Number && length(a)>3
-				println(io, typeof(a), " of size ", size(a))
-			else
-				println(io,a)
-			end
-		else
-			println(io,"empty")
-		end
-	end
-end# }}}
-
-#methods
-#expread {{{
-"""
-	EXPREAD - read a file exp and build a Structure
-
-	This function reads an *.exp* and builds a structure containing the fields x
-	and y corresponding to the coordinates, one for the filename of the exp
-	file, for the density, for the nodes, and a field 'closed' to indicate if the
-	domain is closed.
-
-	Usage:
-		exp=expread(filename)
-
-# Examples:
-```julia-repl
-julia> exp=expread('domainoutline.exp')
-```
-
-# Arguments:
-- filename: the ARGUS file to read
-"""
-function expread(filename::String)
-
-	#initialize output
-	contours = Vector{ExpStruct}(undef, 0)
-
-	#open file
-	f = open(filename, "r") do f
-
-		#initialize some variables
-		nprof = 0
-		line = 1
-
-		while !eof(f)
-
-			#read first line
-			A = readline(f); line += 1
-
-			#if isempty, go to the next line and try again
-			if isempty(A)
-				continue
-			else
-				#initialize new profile
-				nprof += 1 
-				exp = ExpStruct();
-			end
-
-			#extract profile name
-			if A[1:8]!="## Name:"
-				println("line $(line): $(A)")
-				error("Unexpected exp file formatting") 
-			end
-			if length(A)>8
-				exp.name = A[9:end]
-			end
-
-			#read Icon
-			A = readline(f); line += 1
-			if A[1:8]!="## Icon:" error("Unexpected exp file formatting") end
-
-			#read Info
-			A = readline(f); line += 1
-			if A[1:14]!="# Points Count"
-				println("line $(line): $(A)")
-				error("Unexpected exp file formatting") 
-			end
-
-			#Reads number of nods and density
-			A = readline(f); line += 1
-			A = parse.(Float64, split(A))
-			if length(A) != 2 error("Unexpected exp file formatting") end
-			exp.nods = A[1]; exp.density = A[2]
-
-			#Allocate arrays
-			if exp.nods<=0 error("Unexpected exp file formatting") end
-			exp.x = Vector{Float64}(undef,exp.nods)
-			exp.y = Vector{Float64}(undef,exp.nods)
-
-			#Read coordinates
-			A = readline(f); line += 1
-			if A[1:13]!="# X pos Y pos" error("Unexpected exp file formatting") end
-			for i in 1:exp.nods
-				A = readline(f); line += 1
-				A = parse.(Float64, split(A))
-				if length(A) != 2 error("Unexpected exp file formatting") end
-				if any(isnan.(A)) error("NaNs found in coordinate") end
-				exp.x[i] = A[1]; exp.y[i] = A[2]
-			end
-
-			#check if closed
-			if exp.nods>1 && exp.x[1]==exp.x[end] && exp.y[1]==exp.y[end]
-				exp.closed = true
-			else
-				exp.closed = false
-			end
-
-			#add profile to list
-			push!(contours, exp)
-		end
-	end
-
-	return contours
-end# }}}
Index: /issm/trunk-jpl/src/jl/issm.jl
===================================================================
--- /issm/trunk-jpl/src/jl/issm.jl	(revision 26628)
+++ /issm/trunk-jpl/src/jl/issm.jl	(revision 26629)
@@ -6,10 +6,11 @@
 module ISSM
 
-include("classes.jl")
-include("utils.jl")
-include("triangle.jl")
-include("parameterization.jl")
-include("solve.jl")
-#include("plotmodel.jl")
+include("md/classes.jl")
+include("md/exp.jl")
+include("md/utils.jl")
+include("md/triangle.jl")
+include("md/parameterization.jl")
+include("solve/solve.jl")
+#include("md/plotmodel.jl")
 
 end
Index: sm/trunk-jpl/src/jl/issmenums.jl
===================================================================
--- /issm/trunk-jpl/src/jl/issmenums.jl	(revision 26628)
+++ 	(revision )
@@ -1,1544 +1,0 @@
-@enum IssmEnum begin
-	ParametersSTARTEnum
-	#Parameters{{{
-	AdolcParamEnum
-	AmrDeviatoricErrorGroupThresholdEnum
-	AmrDeviatoricErrorMaximumEnum
-	AmrDeviatoricErrorResolutionEnum
-	AmrDeviatoricErrorThresholdEnum
-	AmrErrEnum
-	AmrFieldEnum
-	AmrGradationEnum
-	AmrGroundingLineDistanceEnum
-	AmrGroundingLineResolutionEnum
-	AmrHmaxEnum
-	AmrHminEnum
-	AmrIceFrontDistanceEnum
-	AmrIceFrontResolutionEnum
-	AmrKeepMetricEnum
-	AmrLagEnum
-	AmrLevelMaxEnum
-	AmrRestartEnum
-	AmrThicknessErrorGroupThresholdEnum
-	AmrThicknessErrorMaximumEnum
-	AmrThicknessErrorResolutionEnum
-	AmrThicknessErrorThresholdEnum
-	AmrTypeEnum
-	AnalysisCounterEnum
-	AnalysisTypeEnum
-	AugmentedLagrangianREnum
-	AugmentedLagrangianRholambdaEnum
-	AugmentedLagrangianRhopEnum
-	AugmentedLagrangianRlambdaEnum
-	AugmentedLagrangianThetaEnum
-	AutodiffCbufsizeEnum
-	AutodiffDependentObjectsEnum
-	AutodiffDriverEnum
-	AutodiffFosForwardIndexEnum
-	AutodiffFosReverseIndexEnum
-	AutodiffFovForwardIndicesEnum
-	AutodiffGcTriggerMaxSizeEnum
-	AutodiffGcTriggerRatioEnum
-	AutodiffIsautodiffEnum
-	AutodiffLbufsizeEnum
-	AutodiffNumDependentsEnum
-	AutodiffNumIndependentsEnum
-	AutodiffObufsizeEnum
-	AutodiffTapeAllocEnum
-	AutodiffTbufsizeEnum
-	AutodiffXpEnum
-	BalancethicknessStabilizationEnum
-	BarystaticContributionsEnum
-	BasalforcingsBottomplumedepthEnum
-	BasalforcingsCrustthicknessEnum
-	BasalforcingsDeepwaterElevationEnum
-	BasalforcingsDeepwaterMeltingRateEnum
-	BasalforcingsDtbgEnum
-	BasalforcingsEnum
-	BasalforcingsIsmip6AverageTfEnum
-	BasalforcingsIsmip6BasinAreaEnum
-	BasalforcingsIsmip6DeltaTEnum
-	BasalforcingsIsmip6Gamma0Enum
-	BasalforcingsIsmip6IsLocalEnum
-	BasalforcingsIsmip6NumBasinsEnum
-	BasalforcingsIsmip6TfDepthsEnum
-	BasalforcingsLowercrustheatEnum
-	BasalforcingsMantleconductivityEnum
-	BasalforcingsNusseltEnum
-	BasalforcingsPicoAverageOverturningEnum
-	BasalforcingsPicoAverageSalinityEnum
-	BasalforcingsPicoAverageTemperatureEnum
-	BasalforcingsPicoBoxAreaEnum
-	BasalforcingsPicoFarOceansalinityEnum
-	BasalforcingsPicoFarOceantemperatureEnum
-	BasalforcingsPicoGammaTEnum
-	BasalforcingsPicoIsplumeEnum
-	BasalforcingsPicoMaxboxcountEnum
-	BasalforcingsPicoNumBasinsEnum
-	BasalforcingsPlumeradiusEnum
-	BasalforcingsPlumexEnum
-	BasalforcingsPlumeyEnum
-	BasalforcingsThresholdThicknessEnum
-	BasalforcingsTopplumedepthEnum
-	BasalforcingsUppercrustheatEnum
-	BasalforcingsUppercrustthicknessEnum
-	BasalforcingsUpperdepthMeltEnum
-	BasalforcingsUpperwaterElevationEnum
-	BasalforcingsUpperwaterMeltingRateEnum
-	CalvingCrevasseDepthEnum
-	CalvingCrevasseThresholdEnum
-	CalvingHeightAboveFloatationEnum
-	CalvingLawEnum
-	CalvingMinthicknessEnum
-	ConfigurationTypeEnum
-	ConstantsGEnum
-	ConstantsNewtonGravityEnum
-	ConstantsReferencetemperatureEnum
-	ConstantsYtsEnum
-	ControlInputSizeMEnum
-	ControlInputSizeNEnum
-	ControlInputInterpolationEnum
-	CumBslcEnum
-	CumBslcIceEnum
-	CumBslcHydroEnum
-	CumBslcOceanEnum
-	CumBslcIcePartitionEnum
-	CumBslcHydroPartitionEnum
-	CumBslcOceanPartitionEnum
-	CumGmtslcEnum
-	CumGmslcEnum
-	DamageC1Enum
-	DamageC2Enum
-	DamageC3Enum
-	DamageC4Enum
-	DamageEnum
-	DamageEquivStressEnum
-	DamageEvolutionNumRequestedOutputsEnum
-	DamageEvolutionRequestedOutputsEnum
-	DamageHealingEnum
-	DamageKappaEnum
-	DamageLawEnum
-	DamageMaxDamageEnum
-	DamageStabilizationEnum
-	DamageStressThresholdEnum
-	DamageStressUBoundEnum
-	DebugProfilingEnum
-	DomainDimensionEnum
-	DomainTypeEnum
-	DslModelEnum
-	DslModelidEnum
-	DslNummodelsEnum
-	SolidearthIsExternalEnum
-	SolidearthExternalNatureEnum
-	SolidearthExternalModelidEnum
-	SolidearthExternalNummodelsEnum
-	SolidearthSettingsComputeBpGrdEnum
-	EarthIdEnum
-	ElasticEnum
-	EplZigZagCounterEnum
-	EsaHElasticEnum
-	EsaHemisphereEnum
-	EsaRequestedOutputsEnum
-	EsaUElasticEnum
-	ExtrapolationVariableEnum
-	FemModelCommEnum
-	FieldsEnum
-	FlowequationFeFSEnum
-	FlowequationIsFSEnum
-	FlowequationIsHOEnum
-	FlowequationIsL1L2Enum
-	FlowequationIsMLHOEnum
-	FlowequationIsSIAEnum
-	FlowequationIsSSAEnum
-	FlowequationIsNitscheEnum
-	FeFSNitscheGammaEnum
-	FrictionCouplingEnum
-	FrictionDeltaEnum
-	FrictionEffectivePressureLimitEnum
-	FrictionFEnum
-	FrictionGammaEnum
-	FrictionLawEnum
-	FrictionPseudoplasticityExponentEnum
-	FrictionThresholdSpeedEnum
-	FrictionVoidRatioEnum
-	FrontalForcingsBasinIcefrontAreaEnum
-	FrontalForcingsNumberofBasinsEnum
-	FrontalForcingsParamEnum
-	GrdModelEnum
-	GroundinglineFrictionInterpolationEnum
-	GroundinglineMeltInterpolationEnum
-	GroundinglineMigrationEnum
-	HydrologyAveragingEnum
-	HydrologyCavitySpacingEnum
-	HydrologyChannelConductivityEnum
-	HydrologyChannelSheetWidthEnum
-	HydrologyEnglacialVoidRatioEnum
-	HydrologyIschannelsEnum
-	HydrologyMeltFlagEnum
-	HydrologyModelEnum
-	HydrologyNumRequestedOutputsEnum
-	HydrologyPressureMeltCoefficientEnum
-	HydrologyRelaxationEnum
-	HydrologyRequestedOutputsEnum
-	HydrologySedimentKmaxEnum
-	HydrologyStepsPerStepEnum
-	HydrologyStorageEnum
-	HydrologydcEplColapseThicknessEnum
-	HydrologydcEplConductivityEnum
-	HydrologydcEplInitialThicknessEnum
-	HydrologydcEplLayerCompressibilityEnum
-	HydrologydcEplMaxThicknessEnum
-	HydrologydcEplPoreWaterMassEnum
-	HydrologydcEplThickCompEnum
-	HydrologydcEplflipLockEnum
-	HydrologydcIsefficientlayerEnum
-	HydrologydcLeakageFactorEnum
-	HydrologydcMaxIterEnum
-	HydrologydcPenaltyFactorEnum
-	HydrologydcPenaltyLockEnum
-	HydrologydcRelTolEnum
-	HydrologydcSedimentlimitEnum
-	HydrologydcSedimentlimitFlagEnum
-	HydrologydcSedimentLayerCompressibilityEnum
-	HydrologydcSedimentPoreWaterMassEnum
-	HydrologydcSedimentPorosityEnum
-	HydrologydcSedimentThicknessEnum
-	HydrologydcTransferFlagEnum
-	HydrologydcUnconfinedFlagEnum
-	HydrologyshreveStabilizationEnum
-	IcecapToEarthCommEnum
-	IndexEnum
-	InputFileNameEnum
-	DirectoryNameEnum
-	IndicesEnum
-	InputToDepthaverageInEnum
-	InputToDepthaverageOutEnum
-	InputToExtrudeEnum
-	InputToL2ProjectEnum
-	InputToSmoothEnum
-	InversionAlgorithmEnum
-	InversionControlParametersEnum
-	InversionControlScalingFactorsEnum
-	InversionCostFunctionsEnum
-	InversionDxminEnum
-	InversionGatolEnum
-	InversionGradientScalingEnum
-	InversionGrtolEnum
-	InversionGttolEnum
-	InversionIncompleteAdjointEnum
-	InversionIscontrolEnum
-	InversionMaxiterEnum
-	InversionMaxiterPerStepEnum
-	InversionMaxstepsEnum
-	InversionNstepsEnum
-	InversionNumControlParametersEnum
-	InversionNumCostFunctionsEnum
-	InversionStepThresholdEnum
-	InversionTypeEnum
-	IvinsEnum
-	IsSlcCouplingEnum
-	LevelsetKillIcebergsEnum
-	LevelsetReinitFrequencyEnum
-	LevelsetStabilizationEnum
-	LockFileNameEnum
-	LoveAllowLayerDeletionEnum
-	LoveCoreMantleBoundaryEnum
-	LoveEarthMassEnum
-	LoveForcingTypeEnum
-	LoveFrequenciesEnum
-	LoveIsTemporalEnum
-	LoveG0Enum
-	LoveGravitationalConstantEnum
-	LoveInnerCoreBoundaryEnum
-	LoveComplexComputationEnum
-	LoveIntStepsPerLayerEnum
-	LoveKernelsEnum
-	LoveMu0Enum
-	LoveNfreqEnum
-	LoveNTemporalIterationsEnum
-	LoveNYiEquationsEnum
-	LoveR0Enum
-	LoveShNmaxEnum
-	LoveShNminEnum
-	LoveStartingLayerEnum
-	LoveUnderflowTolEnum
-	MassFluxSegmentsEnum
-	MassFluxSegmentsPresentEnum
-	MasstransportHydrostaticAdjustmentEnum
-	MasstransportIsfreesurfaceEnum
-	MasstransportMinThicknessEnum
-	MasstransportNumRequestedOutputsEnum
-	MasstransportPenaltyFactorEnum
-	MasstransportRequestedOutputsEnum
-	MasstransportStabilizationEnum
-	MaterialsBetaEnum
-	MaterialsEarthDensityEnum
-	MaterialsEffectiveconductivityAveragingEnum
-	MaterialsHeatcapacityEnum
-	MaterialsLatentheatEnum
-	MaterialsMeltingpointEnum
-	MaterialsMixedLayerCapacityEnum
-	MaterialsMuWaterEnum
-	MaterialsRheologyLawEnum
-	MaterialsRhoFreshwaterEnum
-	MaterialsRhoIceEnum
-	MaterialsRhoSeawaterEnum
-	MaterialsTemperateiceconductivityEnum
-	MaterialsThermalExchangeVelocityEnum
-	MaterialsThermalconductivityEnum
-	MeltingOffsetEnum
-	MeshAverageVertexConnectivityEnum
-	MeshElementtypeEnum
-	MeshNumberoflayersEnum
-	MeshNumberofverticesEnum
-	MeshNumberofelementsEnum
-	MigrationMaxEnum
-	ModelIdEnum
-	NbinsEnum
-	NodesEnum
-	NumModelsEnum
-	OceanGridNxEnum
-	OceanGridNyEnum
-	OceanGridXEnum
-	OceanGridYEnum
-	OutputBufferPointerEnum
-	OutputBufferSizePointerEnum
-	OutputFileNameEnum
-	OutputFilePointerEnum
-	OutputdefinitionEnum
-	QmuErrNameEnum
-	QmuInNameEnum
-	QmuIsdakotaEnum
-	QmuOutNameEnum
-	QmuOutputEnum
-	QmuCurrEvalIdEnum
-	QmuNsampleEnum
-	QmuResponsedescriptorsEnum
-	QmuVariableDescriptorsEnum
-	QmuVariablePartitionsEnum
-	QmuVariablePartitionsNpartEnum
-	QmuVariablePartitionsNtEnum
-	QmuResponsePartitionsEnum
-	QmuResponsePartitionsNpartEnum
-	QmuStatisticsEnum
-	QmuNumstatisticsEnum
-	QmuNdirectoriesEnum
-	QmuNfilesPerDirectoryEnum
-	QmuStatisticsMethodEnum
-	QmuMethodsEnum
-	RestartFileNameEnum
-	ResultsEnum
-	RootPathEnum
-	ModelnameEnum
-	SamplingAlphaEnum
-	SamplingPhiEnum
-	SamplingNumRequestedOutputsEnum
-	SamplingRequestedOutputsEnum
-	SamplingRobinEnum
-	SamplingSeedEnum
-	SamplingTauEnum
-	SaveResultsEnum
-	SolidearthPartitionIceEnum
-	SolidearthPartitionHydroEnum
-	SolidearthPartitionOceanEnum
-	SolidearthNpartIceEnum
-	SolidearthNpartOceanEnum
-	SolidearthNpartHydroEnum
-	SolidearthPlanetRadiusEnum
-	SolidearthPlanetAreaEnum
-	SolidearthSettingsAbstolEnum
-	SolidearthSettingsCrossSectionShapeEnum
-	RotationalAngularVelocityEnum
-	SolidearthSettingsElasticEnum
-	SolidearthSettingsViscousEnum
-	SealevelchangeGeometryDoneEnum
-	SealevelchangeViscousNumStepsEnum
-	SealevelchangeViscousTimesEnum
-	SealevelchangeViscousIndexEnum
-	RotationalEquatorialMoiEnum
-	TidalLoveHEnum
-	TidalLoveKEnum
-	TidalLoveLEnum
-	TidalLoveK2SecularEnum
-	LoadLoveHEnum
-	LoadLoveKEnum
-	LoadLoveLEnum
-	LoveTimeFreqEnum
-	LoveIsTimeEnum
-	SealevelchangeGSelfAttractionEnum
-	SealevelchangeGViscoElasticEnum
-	SolidearthSettingsSealevelLoadingEnum
-	SolidearthSettingsGRDEnum
-	SolidearthSettingsRunFrequencyEnum
-	SolidearthSettingsTimeAccEnum
-	SealevelchangeHViscoElasticEnum
-	SolidearthSettingsHorizEnum
-	SolidearthSettingsMaxiterEnum
-	SolidearthSettingsGrdOceanEnum
-	SolidearthSettingsOceanAreaScalingEnum
-	RotationalPolarMoiEnum
-	SolidearthSettingsReltolEnum
-	SealevelchangeRequestedOutputsEnum
-	SolidearthSettingsSelfAttractionEnum
-	SolidearthSettingsRotationEnum
-	SolidearthSettingsMaxSHCoeffEnum
-	SealevelchangeRunCountEnum
-	SealevelchangeTransitionsEnum
-	SealevelchangeUViscoElasticEnum
-	SettingsIoGatherEnum
-	SettingsNumResultsOnNodesEnum
-	SettingsOutputFrequencyEnum
-	SettingsCheckpointFrequencyEnum
-	SettingsResultsOnNodesEnum
-	SettingsSbCouplingFrequencyEnum
-	SettingsSolverResidueThresholdEnum
-	SettingsWaitonlockEnum
-	SmbAIceEnum
-	SmbAIdxEnum
-	SmbASnowEnum
-	SmbAccualtiEnum
-	SmbAccugradEnum
-	SmbAccurefEnum
-	SmbAdThreshEnum
-	SmbAutoregressionInitialTimeEnum
-	SmbAutoregressionTimestepEnum
-	SmbAutoregressiveOrderEnum
-	SmbAveragingEnum
-	SmbBeta0Enum
-	SmbBeta1Enum
-	SmbCovmatEnum
-	SmbDesfacEnum
-	SmbDpermilEnum
-	SmbDsnowIdxEnum
-	SmbCldFracEnum
-	SmbDelta18oEnum
-	SmbDelta18oSurfaceEnum
-	SmbDenIdxEnum
-	SmbDtEnum
-	SmbEnum
-	SmbFEnum
-	SmbInitDensityScalingEnum
-	SmbIsaccumulationEnum
-	SmbIsalbedoEnum
-	SmbIsconstrainsurfaceTEnum
-	SmbIsd18opdEnum
-	SmbIsdelta18oEnum
-	SmbIsdensificationEnum
-	SmbIsfirnwarmingEnum
-	SmbIsgraingrowthEnum
-	SmbIsmeltEnum
-	SmbIsmungsmEnum
-	SmbIsprecipscaledEnum
-	SmbIssetpddfacEnum
-	SmbIsshortwaveEnum
-	SmbIstemperaturescaledEnum
-	SmbIsthermalEnum
-	SmbIsturbulentfluxEnum
-	SmbKEnum
-	SmbNumBasinsEnum
-	SmbNumRequestedOutputsEnum
-	SmbPfacEnum
-	SmbPhiEnum
-	SmbRandomflagEnum
-	SmbRdlEnum
-	SmbRequestedOutputsEnum
-	SmbRlapsEnum
-	SmbRlapslgmEnum
-	SmbRunoffaltiEnum
-	SmbRunoffgradEnum
-	SmbRunoffrefEnum
-	SmbSealevEnum
-	SmbStepsPerStepEnum
-	SmbSwIdxEnum
-	SmbT0dryEnum
-	SmbT0wetEnum
-	SmbTdiffEnum
-	SmbThermoDeltaTScalingEnum
-	SmbTemperaturesReconstructedYearsEnum
-	SmbPrecipitationsReconstructedYearsEnum
-	SmoothThicknessMultiplierEnum
-	SolutionTypeEnum
-	SteadystateMaxiterEnum
-	SteadystateNumRequestedOutputsEnum
-	SteadystateReltolEnum
-	SteadystateRequestedOutputsEnum
-	StepEnum
-	StepsEnum
-	StressbalanceAbstolEnum
-	StressbalanceFSreconditioningEnum
-	StressbalanceIsnewtonEnum
-	StressbalanceMaxiterEnum
-	StressbalanceNumRequestedOutputsEnum
-	StressbalancePenaltyFactorEnum
-	StressbalanceReltolEnum
-	StressbalanceRequestedOutputsEnum
-	StressbalanceRestolEnum
-	StressbalanceRiftPenaltyThresholdEnum
-	StressbalanceShelfDampeningEnum
-	ThermalIsdrainicecolumnEnum
-	ThermalIsdynamicbasalspcEnum
-	ThermalIsenthalpyEnum
-	ThermalMaxiterEnum
-	ThermalNumRequestedOutputsEnum
-	ThermalPenaltyFactorEnum
-	ThermalPenaltyLockEnum
-	ThermalPenaltyThresholdEnum
-	ThermalReltolEnum
-	ThermalRequestedOutputsEnum
-	ThermalStabilizationEnum
-	ThermalWatercolumnUpperlimitEnum
-	TimeEnum
-	TimesteppingCflCoefficientEnum
-	TimesteppingCouplingTimeEnum
-	TimesteppingFinalTimeEnum
-	TimesteppingInterpForcingEnum
-	TimesteppingCycleForcingEnum
-	TimesteppingStartTimeEnum
-	TimesteppingTimeStepEnum
-	TimesteppingTimeStepMaxEnum
-	TimesteppingTimeStepMinEnum
-	TimesteppingTypeEnum
-	ToMITgcmCommEnum
-	ToolkitsFileNameEnum
-	ToolkitsOptionsAnalysesEnum
-	ToolkitsOptionsStringsEnum
-	ToolkitsTypesEnum
-	TransientAmrFrequencyEnum
-	TransientIsdamageevolutionEnum
-	TransientIsesaEnum
-	TransientIsgiaEnum
-	TransientIsgroundinglineEnum
-	TransientIshydrologyEnum
-	TransientIsmasstransportEnum 
-	TransientIsoceantransportEnum
-	TransientIsmovingfrontEnum
-	TransientIsoceancouplingEnum
-	TransientIssamplingEnum
-	TransientIsslcEnum
-	TransientIssmbEnum
-	TransientIsstressbalanceEnum
-	TransientIsthermalEnum
-	TransientNumRequestedOutputsEnum
-	TransientRequestedOutputsEnum
-	VelocityEnum
-	XxeEnum
-	YyeEnum
-	ZzeEnum
-	AreaeEnum
-	WorldCommEnum
-	#}}}
-	ParametersENDEnum
-	InputsSTARTEnum
-	#Inputs{{{
-	AccumulatedDeltaBottomPressureEnum
-	AccumulatedDeltaIceThicknessEnum
-	AccumulatedDeltaTwsEnum
-	AdjointEnum
-	AdjointpEnum
-	AdjointxEnum
-	AdjointxBaseEnum
-	AdjointxShearEnum
-	AdjointyEnum
-	AdjointyBaseEnum
-	AdjointyShearEnum
-	AdjointzEnum
-	AirEnum
-	ApproximationEnum
-	BalancethicknessMisfitEnum
-	BalancethicknessOmega0Enum
-	BalancethicknessOmegaEnum
-	BalancethicknessSpcthicknessEnum
-	BalancethicknessThickeningRateEnum
-	BasalCrevasseEnum
-	BasalforcingsFloatingiceMeltingRateEnum
-	BasalforcingsGeothermalfluxEnum
-	BasalforcingsGroundediceMeltingRateEnum
-	BasalforcingsPerturbationMeltingRateEnum
-	BasalforcingsIsmip6BasinIdEnum
-	BasalforcingsIsmip6TfEnum
-	BasalforcingsIsmip6TfShelfEnum
-	BasalforcingsIsmip6MeltAnomalyEnum
-	BasalforcingsMeltrateFactorEnum
-	BasalforcingsOceanSalinityEnum
-	BasalforcingsOceanTempEnum
-	BasalforcingsPicoBasinIdEnum
-	BasalforcingsPicoBoxIdEnum
-	BasalforcingsPicoOverturningCoeffEnum
-	BasalforcingsPicoSubShelfOceanOverturningEnum
-	BasalforcingsPicoSubShelfOceanSalinityEnum
-	BasalforcingsPicoSubShelfOceanTempEnum
-	BasalStressxEnum
-	BasalStressyEnum
-	BasalStressEnum
-	BaseEnum
-	BaseOldEnum
-	BaseSlopeXEnum
-	BaseSlopeYEnum
-	BedEnum
-	BedGRDEnum
-	BedEastEnum
-	BedEastGRDEnum
-	BedNorthEnum
-	BedNorthGRDEnum
-	BedSlopeXEnum
-	BedSlopeYEnum
-	BottomPressureEnum
-	BottomPressureOldEnum
-	CalvingCalvingrateEnum
-	CalvingHabFractionEnum
-	CalvingMeltingrateEnum
-	CalvingStressThresholdFloatingiceEnum
-	CalvingStressThresholdGroundediceEnum
-	CalvinglevermannCoeffEnum
-	CalvingratexAverageEnum
-	CalvingratexEnum
-	CalvingrateyAverageEnum
-	CalvingrateyEnum
-	CalvingFluxLevelsetEnum
-	CalvingMeltingFluxLevelsetEnum
-	ConvergedEnum
-	CrevasseDepthEnum
-	DamageDEnum
-	DamageDOldEnum
-	DamageDbarEnum
-	DamageDbarOldEnum
-	DamageFEnum
-	DegreeOfChannelizationEnum
-	DepthBelowSurfaceEnum
-	DeltaIceThicknessEnum
-	DeltaTwsEnum
-	DeltaBottomPressureEnum
-	DeltaDslEnum
-	DslOldEnum
-	DslEnum
-	DeltaStrEnum
-	StrOldEnum
-	StrEnum
-	DeviatoricStresseffectiveEnum
-	DeviatoricStressxxEnum
-	DeviatoricStressxyEnum
-	DeviatoricStressxzEnum
-	DeviatoricStressyyEnum
-	DeviatoricStressyzEnum
-	DeviatoricStresszzEnum
-	DeviatoricStress1Enum
-	DeviatoricStress2Enum
-	DistanceToCalvingfrontEnum
-	DistanceToGroundinglineEnum
-	Domain2DhorizontalEnum
-	Domain2DverticalEnum
-	Domain3DEnum
-	DragCoefficientAbsGradientEnum
-	DrivingStressXEnum
-	DrivingStressYEnum
-	DummyEnum
-	EffectivePressureEnum
-	EffectivePressureSubstepEnum
-	EffectivePressureTransientEnum
-	EnthalpyEnum
-	EnthalpyPicardEnum
-	EplHeadEnum
-	EplHeadOldEnum
-	EplHeadSlopeXEnum
-	EplHeadSlopeYEnum
-	EplHeadSubstepEnum
-	EplHeadTransientEnum
-	EsaEmotionEnum
-	EsaNmotionEnum
-	EsaRotationrateEnum
-	EsaStrainratexxEnum
-	EsaStrainratexyEnum
-	EsaStrainrateyyEnum
-	EsaUmotionEnum
-	EsaXmotionEnum
-	EsaYmotionEnum
-	EtaDiffEnum
-	FlowequationBorderFSEnum
-	FrictionAsEnum
-	FrictionCEnum
-	FrictionCmaxEnum
-	FrictionCoefficientEnum
-	FrictionCoefficientcoulombEnum
-	FrictionEffectivePressureEnum
-	FrictionMEnum
-	FrictionPEnum
-	FrictionPressureAdjustedTemperatureEnum
-	FrictionQEnum
-	FrictionSedimentCompressibilityCoefficientEnum
-	FrictionTillFrictionAngleEnum
-	FrictionWaterLayerEnum
-	FrictionfEnum
-	FrontalForcingsBasinIdEnum
-	FrontalForcingsSubglacialDischargeEnum
-	FrontalForcingsThermalForcingEnum
-	GeometryHydrostaticRatioEnum
-	NGiaEnum
-	NGiaRateEnum
-	UGiaEnum
-	UGiaRateEnum
-	GradientEnum
-	GroundinglineHeightEnum
-	HydraulicPotentialEnum
-	HydraulicPotentialOldEnum
-	HydrologyBasalFluxEnum
-	HydrologyBumpHeightEnum
-	HydrologyBumpSpacingEnum
-	HydrologydcBasalMoulinInputEnum
-	HydrologydcEplThicknessEnum
-	HydrologydcEplThicknessOldEnum
-	HydrologydcEplThicknessSubstepEnum
-	HydrologydcEplThicknessTransientEnum
-	HydrologydcMaskEplactiveEltEnum
-	HydrologydcMaskEplactiveNodeEnum
-	HydrologydcMaskThawedEltEnum
-	HydrologydcMaskThawedNodeEnum
-	HydrologydcSedimentTransmitivityEnum
-	HydrologyDrainageRateEnum
-	HydrologyEnglacialInputEnum
-	HydrologyGapHeightEnum
-	HydrologyGapHeightXEnum
-	HydrologyGapHeightXXEnum
-	HydrologyGapHeightYEnum
-	HydrologyGapHeightYYEnum
-	HydrologyHeadEnum
-	HydrologyHeadOldEnum
-	HydrologyMoulinInputEnum
-	HydrologyNeumannfluxEnum
-	HydrologyReynoldsEnum
-	HydrologySheetConductivityEnum
-	HydrologySheetThicknessEnum
-	HydrologySheetThicknessOldEnum
-	HydrologyTwsEnum
-	HydrologyTwsSpcEnum
-	HydrologyTwsAnalysisEnum
-	HydrologyWatercolumnMaxEnum
-	HydrologyWaterVxEnum
-	HydrologyWaterVyEnum
-	IceEnum
-	IceMaskNodeActivationEnum
-	InputEnum
-	InversionCostFunctionsCoefficientsEnum
-	InversionSurfaceObsEnum
-	InversionThicknessObsEnum
-	InversionVelObsEnum
-	InversionVxObsEnum
-	InversionVyObsEnum
-	LevelsetfunctionSlopeXEnum
-	LevelsetfunctionSlopeYEnum
-	LevelsetObservationEnum
-	LoadingforceXEnum
-	LoadingforceYEnum
-	LoadingforceZEnum
-	MaskOceanLevelsetEnum
-	MaskIceLevelsetEnum
-	MaskIceRefLevelsetEnum
-	MasstransportSpcthicknessEnum
-	MaterialsRheologyBEnum
-	MaterialsRheologyBbarEnum
-	MaterialsRheologyEEnum
-	MaterialsRheologyEbarEnum
-	MaterialsRheologyEcEnum
-	MaterialsRheologyEcbarEnum
-	MaterialsRheologyEsEnum
-	MaterialsRheologyEsbarEnum
-	MaterialsRheologyNEnum
-	MeshScaleFactorEnum
-	MeshVertexonbaseEnum
-	MeshVertexonboundaryEnum
-	MeshVertexonsurfaceEnum
-	MisfitEnum
-	MovingFrontalVxEnum
-	MovingFrontalVyEnum
-	NeumannfluxEnum
-	NewDamageEnum
-	NodeEnum
-	OmegaAbsGradientEnum
-	OceantransportSpcbottompressureEnum
-	OceantransportSpcstrEnum
-	OceantransportSpcdslEnum
-	P0Enum
-	P1Enum
-	PartitioningEnum
-	PressureEnum
-	RadarEnum
-	RadarAttenuationMacGregorEnum
-	RadarAttenuationWolffEnum
-	RadarIcePeriodEnum
-	RadarPowerMacGregorEnum
-	RadarPowerWolffEnum
-	RheologyBAbsGradientEnum
-	RheologyBInitialguessEnum
-	RheologyBInitialguessMisfitEnum
-	RheologyBbarAbsGradientEnum
-	SampleEnum
-	SamplingBetaEnum
-	SamplingKappaEnum
-	SealevelEnum
-	SealevelGRDEnum
-	SealevelBarystaticMaskEnum
-	SealevelBarystaticIceMaskEnum
-	SealevelBarystaticIceWeightsEnum
-	SealevelBarystaticIceAreaEnum
-	SealevelBarystaticIceLatbarEnum
-	SealevelBarystaticIceLongbarEnum
-	SealevelBarystaticIceLoadEnum
-	SealevelBarystaticHydroMaskEnum
-	SealevelBarystaticHydroWeightsEnum
-	SealevelBarystaticHydroAreaEnum
-	SealevelBarystaticHydroLatbarEnum
-	SealevelBarystaticHydroLongbarEnum
-	SealevelBarystaticHydroLoadEnum
-	SealevelBarystaticBpMaskEnum
-	SealevelBarystaticBpWeightsEnum
-	SealevelBarystaticBpAreaEnum
-	SealevelBarystaticBpLoadEnum
-	SealevelBarystaticOceanMaskEnum
-	SealevelBarystaticOceanWeightsEnum
-	SealevelBarystaticOceanAreaEnum
-	SealevelBarystaticOceanLatbarEnum
-	SealevelBarystaticOceanLongbarEnum
-	SealevelBarystaticOceanLoadEnum
-	SealevelNEsaEnum
-	SealevelNEsaRateEnum
-	SealevelRSLEnum
-	BslcEnum
-	BslcIceEnum
-	BslcHydroEnum
-	BslcOceanEnum
-	BslcRateEnum
-	GmtslcEnum
-	SealevelGrotm1Enum
-	SealevelGrotm2Enum
-	SealevelGrotm3Enum
-	SealevelGUrotm1Enum
-	SealevelGUrotm2Enum
-	SealevelGUrotm3Enum
-	SealevelGNrotm1Enum
-	SealevelGNrotm2Enum
-	SealevelGNrotm3Enum
-	SealevelGErotm1Enum
-	SealevelGErotm2Enum
-	SealevelGErotm3Enum
-	SealevelRSLBarystaticEnum
-	SealevelRSLRateEnum
-	SealevelUGrdEnum
-	SealevelNGrdEnum
-	SealevelUEastEsaEnum
-	SealevelUNorthEsaEnum
-	SealevelchangeIndicesEnum
-	SealevelchangeGEnum
-	SealevelchangeGUEnum
-	SealevelchangeGEEnum
-	SealevelchangeGNEnum
-	SealevelchangeGsubelOceanEnum
-	SealevelchangeGUsubelOceanEnum
-	SealevelchangeGEsubelOceanEnum
-	SealevelchangeGNsubelOceanEnum
-	SealevelchangeGsubelIceEnum
-	SealevelchangeGUsubelIceEnum
-	SealevelchangeGEsubelIceEnum
-	SealevelchangeGNsubelIceEnum
-	SealevelchangeGsubelHydroEnum
-	SealevelchangeGUsubelHydroEnum
-	SealevelchangeGEsubelHydroEnum
-	SealevelchangeGNsubelHydroEnum
-	SealevelchangeViscousRSLEnum
-	SealevelchangeViscousUEnum
-	SealevelchangeViscousNEnum
-	SealevelchangeViscousEEnum
-	SedimentHeadEnum
-	SedimentHeadOldEnum
-	SedimentHeadSubstepEnum
-	SedimentHeadTransientEnum
-	SedimentHeadResidualEnum
-	SedimentHeadStackedEnum
-	SigmaNNEnum
-	SigmaVMEnum
-	SmbAccumulatedECEnum
-	SmbAccumulatedMassBalanceEnum
-	SmbAccumulatedMeltEnum
-	SmbAccumulatedPrecipitationEnum
-	SmbAccumulatedRainEnum
-	SmbAccumulatedRefreezeEnum
-	SmbAccumulatedRunoffEnum
-	SmbAEnum
-	SmbAdiffEnum
-	SmbAValueEnum
-	SmbAccumulationEnum
-	SmbAdiffiniEnum
-	SmbAiniEnum
-	SmbBasinsIdEnum
-	SmbBMaxEnum
-	SmbBMinEnum
-	SmbBNegEnum
-	SmbBPosEnum
-	SmbCEnum
-	SmbCcsnowValueEnum
-	SmbCciceValueEnum
-	SmbCotValueEnum
-	SmbDEnum
-	SmbDailyairdensityEnum
-	SmbDailyairhumidityEnum
-	SmbDailydlradiationEnum
-	SmbDailydsradiationEnum
-	SmbDailypressureEnum
-	SmbDailyrainfallEnum
-	SmbDailysnowfallEnum
-	SmbDailytemperatureEnum
-	SmbDailywindspeedEnum
-	SmbDiniEnum
-	SmbDlwrfEnum
-	SmbDswrfEnum
-	SmbDswdiffrfEnum
-	SmbDzAddEnum
-	SmbDzEnum
-	SmbDzMinEnum
-	SmbDzTopEnum
-	SmbDziniEnum
-	SmbEAirEnum
-	SmbECEnum
-	SmbECDtEnum
-	SmbECiniEnum
-	SmbElaEnum
-	SmbEvaporationEnum
-	SmbFACEnum
-	SmbGdnEnum
-	SmbGdniniEnum
-	SmbGspEnum
-	SmbGspiniEnum
-	SmbHrefEnum
-	SmbIsInitializedEnum
-	SmbMAddEnum
-	SmbMassBalanceEnum
-	SmbMassBalanceSubstepEnum
-	SmbMassBalanceTransientEnum
-	SmbMeanLHFEnum
-	SmbMeanSHFEnum
-	SmbMeanULWEnum
-	SmbMeltEnum
-	SmbMInitnum
-	SmbMonthlytemperaturesEnum
-	SmbMSurfEnum
-	SmbNetLWEnum
-	SmbNetSWEnum
-	SmbPAirEnum
-	SmbPEnum
-	SmbPddfacIceEnum
-	SmbPddfacSnowEnum
-	SmbPrecipitationEnum
-	SmbPrecipitationsAnomalyEnum
-	SmbPrecipitationsLgmEnum
-	SmbPrecipitationsPresentdayEnum
-	SmbPrecipitationsReconstructedEnum
-	SmbRainEnum
-	SmbReEnum
-	SmbRefreezeEnum
-	SmbReiniEnum
-	SmbRunoffEnum
-	SmbRunoffSubstepEnum
-	SmbRunoffTransientEnum
-	SmbS0gcmEnum
-	SmbS0pEnum
-	SmbS0tEnum
-	SmbSizeiniEnum
-	SmbSmbCorrEnum
-	SmbSmbrefEnum
-	SmbSzaValueEnum
-	SmbTEnum
-	SmbTaEnum
-	SmbTeValueEnum
-	SmbTemperaturesAnomalyEnum
-	SmbTemperaturesLgmEnum
-	SmbTemperaturesPresentdayEnum
-	SmbTemperaturesReconstructedEnum
-	SmbTiniEnum
-	SmbTmeanEnum
-	SmbTzEnum
-	SmbValuesAutoregressionEnum
-	SmbVEnum
-	SmbVmeanEnum
-	SmbVzEnum
-	SmbWEnum
-	SmbWAddEnum
-	SmbWiniEnum
-	SmbZMaxEnum
-	SmbZMinEnum
-	SmbZTopEnum
-	SmbZYEnum
-	SolidearthExternalDisplacementEastRateEnum
-	SolidearthExternalDisplacementNorthRateEnum
-	SolidearthExternalDisplacementUpRateEnum
-	SolidearthExternalGeoidRateEnum
-	StrainRateeffectiveEnum
-	StrainRateparallelEnum
-	StrainRateperpendicularEnum
-	StrainRatexxEnum
-	StrainRatexyEnum
-	StrainRatexzEnum
-	StrainRateyyEnum
-	StrainRateyzEnum
-	StrainRatezzEnum
-	StressMaxPrincipalEnum
-	StressTensorxxEnum
-	StressTensorxyEnum
-	StressTensorxzEnum
-	StressTensoryyEnum
-	StressTensoryzEnum
-	StressTensorzzEnum
-	SurfaceAbsMisfitEnum
-	SurfaceAbsVelMisfitEnum
-	AreaEnum
-	SealevelAreaEnum
-	SurfaceAreaEnum
-	SurfaceAverageVelMisfitEnum
-	SurfaceCrevasseEnum
-	SurfaceEnum
-	SurfaceOldEnum
-	SurfaceLogVelMisfitEnum
-	SurfaceLogVxVyMisfitEnum
-	SurfaceObservationEnum
-	SurfaceRelVelMisfitEnum
-	SurfaceSlopeXEnum
-	SurfaceSlopeYEnum
-	TemperatureEnum
-	TemperaturePDDEnum
-	TemperaturePicardEnum
-	TemperatureSEMICEnum
-	ThermalSpctemperatureEnum
-	ThicknessAbsGradientEnum
-	ThicknessAbsMisfitEnum
-	ThicknessAcrossGradientEnum
-	ThicknessAlongGradientEnum
-	ThicknessEnum
-	ThicknessOldEnum
-	ThicknessPositiveEnum
-	ThicknessResidualEnum
-	TransientAccumulatedDeltaIceThicknessEnum
-	VelEnum
-	VxAverageEnum
-	VxBaseEnum
-	VxEnum
-	VxMeshEnum
-	VxObsEnum
-	VxShearEnum
-	VxSurfaceEnum
-	VyAverageEnum
-	VyBaseEnum
-	VyEnum
-	VyMeshEnum
-	VyObsEnum
-	VyShearEnum
-	VySurfaceEnum
-	VzEnum
-	VzFSEnum
-	VzHOEnum
-	VzMeshEnum
-	VzSSAEnum
-	WaterColumnOldEnum
-	WatercolumnEnum
-	WaterfractionDrainageEnum
-	WaterfractionDrainageIntegratedEnum
-	WaterfractionEnum
-	WaterheightEnum
-	WeightsLevelsetObservationEnum
-	WeightsSurfaceObservationEnum
-	OldAccumulatedDeltaBottomPressureEnum
-	OldAccumulatedDeltaIceThicknessEnum
-	OldAccumulatedDeltaTwsEnum
-	Outputdefinition1Enum
-	Outputdefinition10Enum
-	Outputdefinition11Enum
-	Outputdefinition12Enum
-	Outputdefinition13Enum
-	Outputdefinition14Enum
-	Outputdefinition15Enum
-	Outputdefinition16Enum
-	Outputdefinition17Enum
-	Outputdefinition18Enum
-	Outputdefinition19Enum
-	Outputdefinition20Enum
-	Outputdefinition21Enum
-	Outputdefinition22Enum
-	Outputdefinition23Enum
-	Outputdefinition24Enum
-	Outputdefinition25Enum
-	Outputdefinition26Enum
-	Outputdefinition27Enum
-	Outputdefinition28Enum
-	Outputdefinition29Enum
-	Outputdefinition2Enum
-	Outputdefinition30Enum
-	Outputdefinition31Enum
-	Outputdefinition32Enum
-	Outputdefinition33Enum
-	Outputdefinition34Enum
-	Outputdefinition35Enum
-	Outputdefinition36Enum
-	Outputdefinition37Enum
-	Outputdefinition38Enum
-	Outputdefinition39Enum
-	Outputdefinition3Enum
-	Outputdefinition40Enum
-	Outputdefinition41Enum
-	Outputdefinition42Enum
-	Outputdefinition43Enum
-	Outputdefinition44Enum
-	Outputdefinition45Enum
-	Outputdefinition46Enum
-	Outputdefinition47Enum
-	Outputdefinition48Enum
-	Outputdefinition49Enum
-	Outputdefinition4Enum
-	Outputdefinition50Enum
-	Outputdefinition51Enum
-	Outputdefinition52Enum
-	Outputdefinition53Enum
-	Outputdefinition54Enum
-	Outputdefinition55Enum
-	Outputdefinition56Enum
-	Outputdefinition57Enum
-	Outputdefinition58Enum
-	Outputdefinition59Enum
-	Outputdefinition5Enum
-	Outputdefinition60Enum
-	Outputdefinition61Enum
-	Outputdefinition62Enum
-	Outputdefinition63Enum
-	Outputdefinition64Enum
-	Outputdefinition65Enum
-	Outputdefinition66Enum
-	Outputdefinition67Enum
-	Outputdefinition68Enum
-	Outputdefinition69Enum
-	Outputdefinition6Enum
-	Outputdefinition70Enum
-	Outputdefinition71Enum
-	Outputdefinition72Enum
-	Outputdefinition73Enum
-	Outputdefinition74Enum
-	Outputdefinition75Enum
-	Outputdefinition76Enum
-	Outputdefinition77Enum
-	Outputdefinition78Enum
-	Outputdefinition79Enum
-	Outputdefinition7Enum
-	Outputdefinition80Enum
-	Outputdefinition81Enum
-	Outputdefinition82Enum
-	Outputdefinition83Enum
-	Outputdefinition84Enum
-	Outputdefinition85Enum
-	Outputdefinition86Enum
-	Outputdefinition87Enum
-	Outputdefinition88Enum
-	Outputdefinition89Enum
-	Outputdefinition8Enum
-	Outputdefinition90Enum
-	Outputdefinition91Enum
-	Outputdefinition92Enum
-	Outputdefinition93Enum
-	Outputdefinition94Enum
-	Outputdefinition95Enum
-	Outputdefinition96Enum
-	Outputdefinition97Enum
-	Outputdefinition98Enum
-	Outputdefinition99Enum
-	Outputdefinition9Enum
-	Outputdefinition100Enum
-	#}}}
-	InputsENDEnum
-	#Other{{{
-	AbsoluteEnum
-	AdaptiveTimesteppingEnum
-	AdjointBalancethickness2AnalysisEnum
-	AdjointBalancethicknessAnalysisEnum
-	AdjointHorizAnalysisEnum
-	AggressiveMigrationEnum
-	AmrBamgEnum
-	AmrNeopzEnum
-	AndroidFrictionCoefficientEnum
-	ArrheniusEnum
-	AutodiffJacobianEnum
-	Balancethickness2AnalysisEnum
-	Balancethickness2SolutionEnum
-	BalancethicknessAnalysisEnum
-	BalancethicknessApparentMassbalanceEnum
-	BalancethicknessSoftAnalysisEnum
-	BalancethicknessSoftSolutionEnum
-	BalancethicknessSolutionEnum
-	BalancevelocityAnalysisEnum
-	BalancevelocitySolutionEnum
-	BasalforcingsIsmip6Enum
-	BasalforcingsPicoEnum
-	BeckmannGoosseFloatingMeltRateEnum
-	BedSlopeSolutionEnum
-	BoolExternalResultEnum
-	BoolInputEnum
-	IntInputEnum
-	DoubleInputEnum
-	BoolParamEnum
-	BoundaryEnum
-	BuddJackaEnum
-	CalvingDev2Enum
-	CalvingHabEnum
-	CalvingLevermannEnum
-	CalvingVonmisesEnum
-	CfdragcoeffabsgradEnum
-	CfsurfacelogvelEnum
-	CfsurfacesquareEnum
-	CflevelsetmisfitEnum
-	ChannelEnum
-	ChannelAreaEnum
-	ChannelAreaOldEnum
-	ChannelDischargeEnum
-	ClosedEnum
-	ColinearEnum
-	ConstraintsEnum
-	ContactEnum
-	ContourEnum
-	ContoursEnum
-	ControlInputEnum
-	ControlInputGradEnum
-	ControlInputMaxsEnum
-	ControlInputMinsEnum
-	ControlInputValuesEnum
-	CrouzeixRaviartEnum
-	CuffeyEnum
-	CuffeyTemperateEnum
-	DamageEvolutionAnalysisEnum
-	DamageEvolutionSolutionEnum
-	DataSetEnum
-	DataSetParamEnum
-	DatasetInputEnum
-	DefaultAnalysisEnum
-	DefaultCalvingEnum
-	DenseEnum
-	DependentObjectEnum
-	DepthAverageAnalysisEnum
-	DeviatoricStressErrorEstimatorEnum
-	DivergenceEnum
-	Domain3DsurfaceEnum
-	DoubleArrayInputEnum
-	ArrayInputEnum
-	DoubleExternalResultEnum
-	DoubleMatArrayParamEnum
-	DoubleMatExternalResultEnum
-	DoubleMatParamEnum
-	DoubleParamEnum
-	DoubleVecParamEnum
-	ElementEnum
-	ElementHookEnum
-	ElementSIdEnum
-	EnthalpyAnalysisEnum
-	EsaAnalysisEnum
-	EsaSolutionEnum
-	EsaTransitionsEnum
-	ExternalResultEnum
-	ExtrapolationAnalysisEnum
-	ExtrudeFromBaseAnalysisEnum
-	ExtrudeFromTopAnalysisEnum
-	FSApproximationEnum
-	FSSolverEnum
-	FSpressureEnum
-	FSvelocityEnum
-	FemModelEnum
-	FileParamEnum
-	FixedTimesteppingEnum
-	FloatingAreaEnum
-	FloatingAreaScaledEnum
-	FloatingMeltRateEnum
-	FreeEnum
-	FreeSurfaceBaseAnalysisEnum
-	FreeSurfaceTopAnalysisEnum
-	FrontalForcingsDefaultEnum
-	FrontalForcingsRignotEnum
-	FsetEnum
-	FullMeltOnPartiallyFloatingEnum
-	GLheightadvectionAnalysisEnum
-	GaussPentaEnum
-	GaussSegEnum
-	GaussTetraEnum
-	GaussTriaEnum
-	GenericOptionEnum
-	GenericParamEnum
-	GenericExternalResultEnum
-	Gradient1Enum
-	Gradient2Enum
-	Gradient3Enum
-	Gradient4Enum
-	GroundedAreaEnum
-	GroundedAreaScaledEnum
-	GroundingOnlyEnum
-	GroundinglineMassFluxEnum
-	GsetEnum
-	GslEnum
-	HOApproximationEnum
-	HOFSApproximationEnum
-	HookEnum
-	HydrologyDCEfficientAnalysisEnum
-	HydrologyDCInefficientAnalysisEnum
-	HydrologyGlaDSAnalysisEnum
-	HydrologyGlaDSEnum
-	HydrologyPismAnalysisEnum
-	HydrologyShaktiAnalysisEnum
-	HydrologyShreveAnalysisEnum
-	HydrologySolutionEnum
-	HydrologydcEnum
-	HydrologypismEnum
-	HydrologyshaktiEnum
-	HydrologyshreveEnum
-	IceMassEnum
-	IceMassScaledEnum
-	IceVolumeAboveFloatationEnum
-	IceVolumeAboveFloatationScaledEnum
-	IceVolumeEnum
-	IceVolumeScaledEnum
-	IcefrontMassFluxEnum
-	IcefrontMassFluxLevelsetEnum
-	IncrementalEnum
-	IndexedEnum
-	IntExternalResultEnum
-	ElementInputEnum
-	IntMatExternalResultEnum
-	IntMatParamEnum
-	IntParamEnum
-	IntVecParamEnum
-	InputsEnum
-	InternalEnum
-	IntersectEnum
-	InversionVzObsEnum
-	JEnum
-	L1L2ApproximationEnum
-	MLHOApproximationEnum
-	L2ProjectionBaseAnalysisEnum
-	L2ProjectionEPLAnalysisEnum
-	LACrouzeixRaviartEnum
-	LATaylorHoodEnum
-	LambdaSEnum
-	LevelsetAnalysisEnum
-	LevelsetfunctionPicardEnum
-	LinearFloatingMeltRateEnum
-	LliboutryDuvalEnum
-	LoadsEnum
-	LoveAnalysisEnum
-	LoveHiEnum
-	LoveHrEnum
-	LoveKernelsImagEnum
-	LoveKernelsRealEnum
-	LoveKiEnum
-	LoveKrEnum
-	LoveLiEnum
-	LoveLrEnum
-	LoveSolutionEnum
-	MINIEnum
-	MINIcondensedEnum
-	MantlePlumeGeothermalFluxEnum
-	MassFluxEnum
-	MassconEnum
-	MassconaxpbyEnum
-	MassfluxatgateEnum
-	MasstransportAnalysisEnum
-	MasstransportSolutionEnum
-	MatdamageiceEnum
-	MatenhancediceEnum
-	MaterialsEnum
-	MatestarEnum
-	MaticeEnum
-	MatlithoEnum
-	MathydroEnum
-	MatrixParamEnum
-	MaxAbsVxEnum
-	MaxAbsVyEnum
-	MaxAbsVzEnum
-	MaxDivergenceEnum
-	MaxVelEnum
-	MaxVxEnum
-	MaxVyEnum
-	MaxVzEnum
-	MelangeEnum
-	MeltingAnalysisEnum
-	MeshElementsEnum
-	MeshXEnum
-	MeshYEnum
-	MinVelEnum
-	MinVxEnum
-	MinVyEnum
-	MinVzEnum
-	MismipFloatingMeltRateEnum
-	MoulinEnum
-	MpiDenseEnum
-	MpiEnum
-	MpiSparseEnum
-	MumpsEnum
-	NoFrictionOnPartiallyFloatingEnum
-	NoMeltOnPartiallyFloatingEnum
-	NodalEnum
-	NodalvalueEnum
-	NodeSIdEnum
-	NoneApproximationEnum
-	NoneEnum
-	NumberedcostfunctionEnum
-	NyeCO2Enum
-	NyeH2OEnum
-	NumericalfluxEnum
-	OceantransportAnalysisEnum
-	OceantransportSolutionEnum
-	OldGradientEnum
-	OneLayerP4zEnum
-	OpenEnum
-	OptionEnum
-	ParamEnum
-	ParametersEnum
-	P0ArrayEnum
-	P0DGEnum
-	P1DGEnum
-	P1P1Enum
-	P1P1GLSEnum
-	P1bubbleEnum
-	P1bubblecondensedEnum
-	P1xP2Enum
-	P1xP3Enum
-	P1xP4Enum
-	P2Enum
-	P2bubbleEnum
-	P2bubblecondensedEnum
-	P2xP1Enum
-	P2xP4Enum
-	PatersonEnum
-	PengridEnum
-	PenpairEnum
-	PentaEnum
-	PentaInputEnum
-	ProfilerEnum
-	ProfilingCurrentFlopsEnum
-	ProfilingCurrentMemEnum
-	ProfilingSolutionTimeEnum
-	RegionaloutputEnum
-	RegularEnum
-	RecoveryAnalysisEnum
-	RiftfrontEnum
-	SamplingAnalysisEnum
-	SamplingSolutionEnum
-	SIAApproximationEnum
-	SMBautoregressionEnum
-	SMBcomponentsEnum
-	SMBd18opddEnum
-	SMBforcingEnum
-	SMBgcmEnum
-	SMBgembEnum
-	SMBgradientsEnum
-	SMBgradientscomponentsEnum
-	SMBgradientselaEnum
-	SMBhenningEnum
-	SMBmeltcomponentsEnum
-	SMBpddEnum
-	SMBpddSicopolisEnum
-	SMBsemicEnum
-	SSAApproximationEnum
-	SSAFSApproximationEnum
-	SSAHOApproximationEnum
-	ScaledEnum
-	SealevelAbsoluteEnum
-	SealevelEmotionEnum
-	SealevelInertiaTensorXZEnum
-	SealevelInertiaTensorYZEnum
-	SealevelInertiaTensorZZEnum
-	SealevelchangePolarMotionEnum
-	SealevelNmotionEnum
-	SealevelUmotionEnum
-	SealevelchangeAnalysisEnum
-	SegEnum
-	SegInputEnum
-	SegmentEnum
-	SegmentRiftfrontEnum
-	SeparateEnum
-	SeqEnum
-	SmbAnalysisEnum
-	SmbSolutionEnum
-	SmoothAnalysisEnum
-	SoftMigrationEnum
-	SpatialLinearFloatingMeltRateEnum
-	SpcDynamicEnum
-	SpcStaticEnum
-	SpcTransientEnum
-	SsetEnum
-	StatisticsSolutionEnum
-	SteadystateSolutionEnum
-	StressIntensityFactorEnum
-	StressbalanceAnalysisEnum
-	StressbalanceConvergenceNumStepsEnum
-	StressbalanceSIAAnalysisEnum
-	StressbalanceSolutionEnum
-	StressbalanceVerticalAnalysisEnum
-	StringArrayParamEnum
-	StringExternalResultEnum
-	StringParamEnum
-	SubelementFriction1Enum
-	SubelementFriction2Enum
-	SubelementMelt1Enum
-	SubelementMelt2Enum
-	SubelementMigrationEnum
-	SurfaceSlopeSolutionEnum
-	TaylorHoodEnum
-	TetraEnum
-	TetraInputEnum
-	ThermalAnalysisEnum
-	ThermalSolutionEnum
-	ThicknessErrorEstimatorEnum
-	TotalCalvingFluxLevelsetEnum
-	TotalCalvingMeltingFluxLevelsetEnum
-	TotalFloatingBmbEnum
-	TotalFloatingBmbScaledEnum
-	TotalGroundedBmbEnum
-	TotalGroundedBmbScaledEnum
-	TotalSmbEnum
-	TotalSmbScaledEnum
-	TransientArrayParamEnum
-	TransientInputEnum
-	TransientParamEnum
-	TransientSolutionEnum
-	TriaEnum
-	TriaInputEnum
-	UzawaPressureAnalysisEnum
-	VectorParamEnum
-	VertexEnum
-	VertexLIdEnum
-	VertexPIdEnum
-	VertexSIdEnum
-	VerticesEnum
-	ViscousHeatingEnum
-	WaterEnum
-	XTaylorHoodEnum
-	XYEnum
-	XYZEnum
-	#}}}
-	MaximumNumberOfDefinitionsEnum
-end
-
-function EnumToString(enum::IssmEnum)
-
-	#Make dictionnary from enums
-	inst = instances(IssmEnum)
-	syms = Symbol.(inst)
-	enumdic = Dict(zip(inst, syms))
-
-	return enumdic[enum]
-end
-
-function EnumToString(enum::Int64)
-	return EnumToString(IssmEnum(enum))
-end
-
-function StringToEnum(string::String)
-
-	#Make dictionnary from enums
-	inst = instances(IssmEnum)
-	syms = Symbol.(inst)
-	enumdic = Dict(zip(syms, inst))
-
-	return enumdic[Symbol(string)]
-end
-
-function StringToEnumInt(string::String)
-	return Integer(StringToEnum(string))
-end
Index: /issm/trunk-jpl/src/jl/md/classes.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/classes.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/classes.jl	(revision 26629)
@@ -0,0 +1,164 @@
+using Printf
+
+abstract type AbstractMesh end
+mutable struct Mesh2dTriangle <: AbstractMesh
+	numberofvertices::Int64
+	numberofelements::Int64
+	x::Vector{Float64}
+	y::Vector{Float64}
+	elements::Matrix{Int64}
+	segments::Matrix{Int64}
+	vertexonboundary::Vector{Bool}
+end
+function Mesh2dTriangle() #{{{
+	return Mesh2dTriangle( 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef, 0), Matrix{Int64}(undef, 0, 0), Matrix{Int64}(undef, 0, 0), Vector{Bool}(undef,0))
+end# }}}
+function Base.show(io::IO, this::Mesh2dTriangle)# {{{
+
+	println(io,typeof(this),":")
+	for name in fieldnames(typeof(this))
+		a=getfield(this,name)
+		#print(io,"   $(name) = ")
+		@printf "%19s: " name
+		if isa(a,String)
+			println(io, a)
+		elseif length(a)>1
+			if !isempty(a)
+				println(io, typeof(a), " of size ", size(a))
+			else
+				println(io,"empty")
+			end
+		else
+			println(io, a)
+		end
+	end
+end# }}}
+mutable struct Mesh3dPrism{T} <: AbstractMesh
+	numberofvertices::Int64
+	numberofelements::Int64
+	numberoflayers::Int64
+	x::Vector{Float64}
+	y::Vector{Float64}
+	z::Vector{Float64}
+	elements::Matrix{Int64}
+	segments::Matrix{Int64}
+	vertexonboundary::Vector{Bool}
+end
+function Mesh3dPrism() #{{{
+	return Mesh3dPrism( 0, 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Matrix{Int64}(undef, 0, 0), Matrix{Int64}(undef, 0, 0), Vector{Bool}(undef,0))
+end# }}}
+
+mutable struct Geometry
+	surface::Vector{Float64}
+	base::Vector{Float64}
+	thickness::Vector{Float64}
+	bed::Vector{Float64}
+end
+function Geometry() #{{{
+	return Geometry( Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0))
+end# }}}
+
+mutable struct Mask
+	ocean_levelset::Vector{Float64}
+	ice_levelset::Vector{Float64}
+end
+function Mask() #{{{
+	return Mask( Vector{Float64}(undef,0), Vector{Float64}(undef,0))
+end# }}}
+
+mutable struct Initialization
+	vx::Vector{Float64}
+	vy::Vector{Float64}
+end
+function Initialization() #{{{
+	return Initialization( Vector{Float64}(undef,0), Vector{Float64}(undef,0))
+end# }}}
+
+mutable struct Stressbalance
+	spcvx::Vector{Float64}
+	spcvy::Vector{Float64}
+	restol::Float64
+	reltol::Float64
+	abstol::Float64
+	maxiter::Int64
+end
+function Stressbalance() #{{{
+	return Stressbalance( Vector{Float64}(undef,0), Vector{Float64}(undef,0), 1.e-4, 0.01, 10., 100)
+end# }}}
+function Base.show(io::IO, this::Stressbalance)# {{{
+
+	println(io,typeof(this),":")
+	for name in fieldnames(typeof(this))
+		a=getfield(this,name)
+		#print(io,"   $(name) = ")
+		@printf "%19s: " name
+		if isa(a,String)
+			println(io, a)
+		elseif length(a)>1
+			if !isempty(a)
+				println(io, typeof(a), " of size ", size(a))
+			else
+				println(io,"empty")
+			end
+		else
+			println(io, a)
+		end
+	end
+end# }}}
+
+mutable struct Constants
+	g::Float64
+	yts::Float64
+end
+function Constants() #{{{
+	return Constants( 9.81,  365*24*3600.)
+end# }}}
+
+mutable struct Materials
+	rho_ice::Float64
+	rho_water::Float64
+	rho_freshwater::Float64
+	mu_water::Float64
+	heatcapacity::Float64
+	latentheat::Float64
+	thermalconductivity::Float64
+	temperateiceconductivity::Float64
+	effectiveconductivity_averaging::Int64
+	meltingpoint::Float64
+	beta::Float64
+	mixed_layer_capacity::Float64
+	thermal_exchange_velocity::Float64
+	rheology_B::Vector{Float64}
+	rheology_n::Vector{Float64}
+	rheology_law::String
+end
+function Materials() #{{{
+	return Materials(917., 1023., 1000., 0.001787, 2093., 3.34*10^5, 2.4, .24, 1, 273.15, 9.8*10^-8, 3974., 1.00*10^-4, Vector{Float64}(undef,0), Vector{Float64}(undef,0), "Cuffey")
+end# }}}
+
+mutable struct model
+	mesh::AbstractMesh
+	geometry::Geometry
+	mask::Mask
+	materials::Materials
+	initialization::Initialization
+	stressbalance::Stressbalance
+	constants::Constants
+end
+function model() #{{{
+	return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), Initialization(),Stressbalance(), Constants())
+end#}}}
+function Base.show(io::IO, md::model)# {{{
+
+	compact = get(io, :compact, false)
+
+	println(io,"Model:")
+	@printf "%19s: %-26s -- %s\n" "mesh" typeof(md.mesh) "mesh properties"
+	@printf "%19s: %-26s -- %s\n" "geometry" typeof(md.geometry) "surface elevation, bedrock topography, ice thickness,..."
+	@printf "%19s: %-26s -- %s\n" "mask" typeof(md.mask) "defines grounded and floating regions"
+	@printf "%19s: %-26s -- %s\n" "materials" typeof(md.materials) "material properties"
+	@printf "%19s: %-26s -- %s\n" "initialization" typeof(md.initialization) "initial state"
+	@printf "%19s: %-26s -- %s\n" "stressbalance" typeof(md.stressbalance) "stress balance parameters"
+	@printf "%19s: %-26s -- %s\n" "constants" typeof(md.constants) "physical constants"
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/md/exp.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/exp.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/exp.jl	(revision 26629)
@@ -0,0 +1,137 @@
+#for exptool, look into this http://juliaplots.org/MakieReferenceImages/gallery//mouse_picking/index.html
+
+#exp object definition, constructor, and disp
+mutable struct ExpStruct #{{{
+	name::String
+	nods::Int32
+	density::Float64
+	x::Vector{Float64}
+   y::Vector{Float64}
+	closed::Bool
+end  #}}}
+function ExpStruct() #{{{
+	return ExpStruct("",0, 0., Vector{Float64}(undef,0), Vector{Float64}(undef,0), false)
+end# }}}
+function Base.show(io::IO, exp::ExpStruct)# {{{
+
+	compact = get(io, :compact, false)
+
+	println(io,"ExpStruct:")
+	for name in fieldnames(typeof(exp))
+		a=getfield(exp,name)
+		print(io,"   $(name) = ")
+		if !isempty(a)
+			if compact && eltype(a)<:Number && length(a)>3
+				println(io, typeof(a), " of size ", size(a))
+			else
+				println(io,a)
+			end
+		else
+			println(io,"empty")
+		end
+	end
+end# }}}
+
+#methods
+#expread {{{
+"""
+	EXPREAD - read a file exp and build a Structure
+
+	This function reads an *.exp* and builds a structure containing the fields x
+	and y corresponding to the coordinates, one for the filename of the exp
+	file, for the density, for the nodes, and a field 'closed' to indicate if the
+	domain is closed.
+
+	Usage:
+		exp=expread(filename)
+
+# Examples:
+```julia-repl
+julia> exp=expread('domainoutline.exp')
+```
+
+# Arguments:
+- filename: the ARGUS file to read
+"""
+function expread(filename::String)
+
+	#initialize output
+	contours = Vector{ExpStruct}(undef, 0)
+
+	#open file
+	f = open(filename, "r") do f
+
+		#initialize some variables
+		nprof = 0
+		line = 1
+
+		while !eof(f)
+
+			#read first line
+			A = readline(f); line += 1
+
+			#if isempty, go to the next line and try again
+			if isempty(A)
+				continue
+			else
+				#initialize new profile
+				nprof += 1 
+				exp = ExpStruct();
+			end
+
+			#extract profile name
+			if A[1:8]!="## Name:"
+				println("line $(line): $(A)")
+				error("Unexpected exp file formatting") 
+			end
+			if length(A)>8
+				exp.name = A[9:end]
+			end
+
+			#read Icon
+			A = readline(f); line += 1
+			if A[1:8]!="## Icon:" error("Unexpected exp file formatting") end
+
+			#read Info
+			A = readline(f); line += 1
+			if A[1:14]!="# Points Count"
+				println("line $(line): $(A)")
+				error("Unexpected exp file formatting") 
+			end
+
+			#Reads number of nods and density
+			A = readline(f); line += 1
+			A = parse.(Float64, split(A))
+			if length(A) != 2 error("Unexpected exp file formatting") end
+			exp.nods = A[1]; exp.density = A[2]
+
+			#Allocate arrays
+			if exp.nods<=0 error("Unexpected exp file formatting") end
+			exp.x = Vector{Float64}(undef,exp.nods)
+			exp.y = Vector{Float64}(undef,exp.nods)
+
+			#Read coordinates
+			A = readline(f); line += 1
+			if A[1:13]!="# X pos Y pos" error("Unexpected exp file formatting") end
+			for i in 1:exp.nods
+				A = readline(f); line += 1
+				A = parse.(Float64, split(A))
+				if length(A) != 2 error("Unexpected exp file formatting") end
+				if any(isnan.(A)) error("NaNs found in coordinate") end
+				exp.x[i] = A[1]; exp.y[i] = A[2]
+			end
+
+			#check if closed
+			if exp.nods>1 && exp.x[1]==exp.x[end] && exp.y[1]==exp.y[end]
+				exp.closed = true
+			else
+				exp.closed = false
+			end
+
+			#add profile to list
+			push!(contours, exp)
+		end
+	end
+
+	return contours
+end# }}}
Index: /issm/trunk-jpl/src/jl/md/parameterization.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/parameterization.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/parameterization.jl	(revision 26629)
@@ -0,0 +1,52 @@
+# setmask {{{
+"""
+SETMASK - establish boundaries between grounded and floating ice.
+
+   By default, ice is considered grounded. The contour floatingicename defines nodes 
+   for which ice is floating. The contour groundedicename defines nodes inside an floatingice, 
+   that are grounded (ie: ice rises, islands, etc ...)
+   All input files are in the Argus format (extension .exp).
+
+   Usage:
+      md=setmask(md,floatingicename,groundedicename)
+
+   Examples:
+      md=setmask(md,'all','');
+      md=setmask(md,'Iceshelves.exp','Islands.exp');
+"""
+function setmask(md::model,floatingicename::String,groundedicename::String)
+
+	elementonfloatingice = FlagElements( md, floatingicename);
+	elementongroundedice = FlagElements( md, groundedicename);
+
+	elementonfloatingice = convert( Array{Float64}, (elementonfloatingice.>0) .&  (elementongroundedice.==0.))
+	elementongroundedice = convert( Array{Float64}, elementonfloatingice.==0.)
+
+	vertexonfloatingice=zeros(md.mesh.numberofvertices)
+	vertexongroundedice=zeros(md.mesh.numberofvertices)
+
+	vertexongroundedice[md.mesh.elements[findall(elementongroundedice.>0),:]] .= 1.
+	vertexonfloatingice[findall(vertexongroundedice.==0.)] .= 1.
+
+	#define levelsets
+	md.mask.ocean_levelset = vertexongroundedice
+	md.mask.ocean_levelset[findall(vertexongroundedice .==0.)] .= -1.
+	md.mask.ice_levelset = -1*ones(md.mesh.numberofvertices)
+
+	return md
+end
+#}}}
+# FlagElements {{{
+function FlagElements(md::model,region::String)
+
+	if isempty(region)
+		flags = zeros(md.mesh.numberofelements)
+	elseif region == "all"
+		flags = ones(md.mesh.numberofelements)
+	else
+		flags = InContour(md.mesh.x,md.mesh.y,region);
+	end
+
+	return flags
+end
+#}}}
Index: /issm/trunk-jpl/src/jl/md/plotmodel.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/plotmodel.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/plotmodel.jl	(revision 26629)
@@ -0,0 +1,45 @@
+import ColorSchemes.jet
+using GLMakie
+using .ISSM
+
+function plotmodel(md::ISSM.model,data::Vector)
+
+	vertexcolor  = :black
+	facetcolor   = :blue
+	showvertices = true
+	showfacets   = true
+
+	if data isa AbstractVector
+
+		if length(data)==md.mesh.numberofelements
+			# vector of polygons
+			x = md.mesh.x
+			y = md.mesh.y
+			index = md.mesh.elements
+			ps = [Makie.GeometryBasics.Polygon([Point2(x[index[i,1]], y[index[i,1]]), Point2(x[index[i,2]], y[index[i,2]]), Point2(x[index[i,3]], y[index[i,3]])])
+					for i in 1:md.mesh.numberofelements]
+
+			fig, ax, h = Makie.poly(ps, color = data, colormap = jet)
+
+			#Add colorbar
+			Colorbar(fig[1, 2], limits = (minimum(data), maximum(data)), colormap = jet)
+		elseif length(data)==md.mesh.numberofvertices
+			fig, ax, h = Makie.mesh( [md.mesh.x md.mesh.y], md.mesh.elements, shading = false, color = data, colormap = jet)
+
+			#Add colorbar
+			#Colorbar(fig[1, 2], h, width=25)
+		else
+			error("data of size "*string(length(data))*" not supported yet!")
+		end
+	else
+		# default to single color
+		@assert length(data)==1
+		fig, ax, h = Makie.mesh( [md.mesh.x md.mesh.y], md.mesh.elements, shading = false, color = data, colormap = jet)
+	end
+
+	if showvertices
+		Makie.scatter!( [md.mesh.x md.mesh.y], markersize = 4, color = vertexcolor)
+	end
+
+	return fig
+end
Index: /issm/trunk-jpl/src/jl/md/triangle.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/triangle.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/triangle.jl	(revision 26629)
@@ -0,0 +1,178 @@
+
+#Class Triangle's triangulateio
+mutable struct CTriangulateIO #{{{
+
+    pointlist :: Ptr{Cdouble}
+    pointattributelist :: Ptr{Cdouble}
+    pointmarkerlist :: Ptr{Cint}
+    numberofpoints :: Cint
+    numberofpointattributes :: Cint
+    
+    trianglelist :: Ptr{Cint}
+    triangleattributelist :: Ptr{Cdouble}
+    trianglearealist :: Ptr{Cdouble}
+    neighborlist :: Ptr{Cint}
+    numberoftriangles :: Cint
+    numberofcorners :: Cint
+    numberoftriangleattributes :: Cint
+    
+    segmentlist :: Ptr{Cint}
+    segmentmarkerlist :: Ptr{Cint}
+    numberofsegments :: Cint
+
+    holelist :: Ptr{Cdouble}
+    numberofholes :: Cint
+
+    regionlist :: Ptr{Cdouble}
+    numberofregions :: Cint
+
+    edgelist :: Ptr{Cint}
+    edgemarkerlist :: Ptr{Cint}
+    normlist :: Ptr{Cdouble}
+    numberofedges :: Cint
+ end  #}}}
+function CTriangulateIO() #{{{
+	return CTriangulateIO(C_NULL, C_NULL, C_NULL, 0, 0,
+								 C_NULL, C_NULL, C_NULL, C_NULL, 0, 0, 0,
+								 C_NULL, C_NULL, 0,
+								 C_NULL, 0,
+								 C_NULL, 0,
+								 C_NULL, C_NULL, C_NULL, 0)
+end# }}}
+function Base.show(io::IO, tio::CTriangulateIO)# {{{
+	println(io,"CTriangulateIO(")
+	for name in fieldnames(typeof(tio))
+		a=getfield(tio,name)
+		print(io,"$(name) = ")
+		println(io,a)
+	end
+	println(io,")")
+end# }}}
+
+using Printf #needed for sprintf
+
+"""
+TRIANGLE - create model mesh using the triangle package
+
+	This function creates a model mesh using Triangle and a domain outline, to
+	within a certain resolution
+#Arguments
+ - md is a model tuple
+ - domainname is the name of an Argus domain outline file
+ - resolution:  is a characteristic length for the mesh (same unit as the domain outline unit)
+
+# Usage:
+ - md=triangle(md,domainname,resolution)
+# Examples:
+ - md=triangle(md,'DomainOutline.exp',1000);
+ - md=triangle(md,'DomainOutline.exp','Rifts.exp',1500);
+"""
+function triangle(md::model,domainname::String,resolution::Float64) #{{{
+
+	#read input file
+	contours = expread(domainname)
+	area     = resolution^2
+
+	#Initialize i/o structures
+	ctio_in  = CTriangulateIO();
+	ctio_out = CTriangulateIO();
+	vor_out  = CTriangulateIO();
+
+	#Construct input structure
+	numberofpoints   = 0
+	numberofsegments = 0
+	for i in 1:length(contours)
+		numberofpoints   += contours[i].nods-1
+		numberofsegments += contours[i].nods-1
+	end
+	numberofpointattributes = 1
+
+	pointlist=Array{Cdouble,2}(undef,2,numberofpoints)
+	count = 0
+	for i in 1:length(contours)
+		nods = contours[i].nods
+		pointlist[1,count+1:count+nods-1] = contours[i].x[1:end-1]
+		pointlist[2,count+1:count+nods-1] = contours[i].y[1:end-1]
+		count += (nods-1)
+	end
+	pointattributelist=Array{Cdouble,1}(undef,numberofpoints)
+	pointmarkerlist=Array{Cint,1}(undef,numberofpoints)
+	for i in 1:numberofpoints
+		pointmarkerlist[i]=0
+		pointattributelist[i]=0.
+	end
+
+	counter=0;
+   backcounter=0;
+	segmentlist=Array{Cint,2}(undef,2,numberofsegments)
+	segmentmarkerlist=Array{Cint,1}(undef,numberofsegments)
+	segmentmarkerlist[:].=0
+	for i in 1:length(contours)
+		nods = contours[i].nods
+		segmentlist[1,counter+1:counter+nods-2] = collect(counter+0:counter+nods-3)
+		segmentlist[2,counter+1:counter+nods-2] = collect(counter+1:counter+nods-2)
+		counter+=nods-2
+		#close profile
+		segmentlist[1,counter+1]=counter
+		segmentlist[2,counter+1]=backcounter
+		counter+=1
+		backcounter=counter
+	end
+
+	numberofregions = 0
+	numberofholes = length(contours)-1
+	holelist = Array{Cdouble,2}(undef,2,numberofholes)
+	if numberofholes>0
+		 for i in 2:length(contours)
+			 xA=contours[i].x[1]; xB=contours[i].x[end-1]
+			 yA=contours[i].y[1]; yB=contours[i].y[end-1]
+			 xC=(xA+xB)/2;        yC=(yA+yB)/2;
+			 xD=xC+tan(10. /180. *pi)*(yC-yA);
+			 yD=yC+tan(10. /180. *pi)*(xA-xC);
+			 xE=xC-tan(10. /180. *pi)*(yC-yA);
+			 yE=yC-tan(10. /180. *pi)*(xA-xC);
+			 holelist[1,i-1] = xD
+			 holelist[2,i-1] = yD
+		 end
+	end
+
+	#based on this, prepare input structure
+	ctio_in.numberofpoints = numberofpoints
+	ctio_in.pointlist=pointer(pointlist)
+	ctio_in.numberofpointattributes=numberofpointattributes
+	ctio_in.pointattributelist=pointer(pointattributelist)
+	ctio_in.pointmarkerlist=pointer(pointmarkerlist)
+	ctio_in.numberofsegments=numberofsegments
+	ctio_in.segmentlist=pointer(segmentlist)
+	ctio_in.segmentmarkerlist = pointer(segmentmarkerlist)
+	ctio_in.numberofholes=numberofholes
+	ctio_in.holelist=pointer(holelist)
+	ctio_in.numberofregions=0
+
+	#Call triangle using ISSM's default options
+	triangle_switches = "pQzDq30ia"*@sprintf("%lf",area) #replace V by Q to quiet down the logging
+	#rc=ccall( (:triangulate,"libtriangle"),
+	rc=ccall( (:triangulate,"../../externalpackages/triangle/src/libtriangle.dylib"),
+				Cint, ( Cstring, Ref{CTriangulateIO}, Ref{CTriangulateIO}, Ref{CTriangulateIO}),
+				triangle_switches, Ref(ctio_in), Ref(ctio_out), Ref(vor_out))
+
+	#post process output
+	points    = convert(Array{Cdouble,2}, Base.unsafe_wrap(Array, ctio_out.pointlist,    (2,Int(ctio_out.numberofpoints)), own=true))'
+	triangles = convert(Array{Cint,2},    Base.unsafe_wrap(Array, ctio_out.trianglelist, (3,Int(ctio_out.numberoftriangles)), own=true))' .+1
+	segments  = convert(Array{Cint,2},    Base.unsafe_wrap(Array, ctio_out.segmentlist,  (2,Int(ctio_out.numberofsegments)), own=true))' .+1
+	
+	#assign output
+	md.mesh = Mesh2dTriangle()
+	md.mesh.numberofvertices = ctio_out.numberofpoints
+	md.mesh.numberofelements = ctio_out.numberoftriangles
+	md.mesh.x                = points[:,1]
+	md.mesh.y                = points[:,2]
+	md.mesh.elements         = triangles
+	md.mesh.segments         = segments
+
+	#post processing
+	md.mesh.vertexonboundary = zeros(Bool,md.mesh.numberofvertices)
+	md.mesh.vertexonboundary[md.mesh.segments] .= true
+
+   return md
+end#}}}
Index: /issm/trunk-jpl/src/jl/md/utils.jl
===================================================================
--- /issm/trunk-jpl/src/jl/md/utils.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/md/utils.jl	(revision 26629)
@@ -0,0 +1,108 @@
+#utils
+function issmdir() #{{{
+	issmdir = ENV["ISSM_DIR"]
+
+	if isempty(issmdir)
+		error("Could not determine the location of ISSM")
+	else
+		return issmdir
+	end
+end#}}}
+function archread(filename::String,variablename::String) #{{{
+
+	#initialize variables
+	found = false
+
+	#open file
+	output = open(filename, "r") do f
+
+		while !eof(f)
+			reclen  = bswap(read(f, Int32))
+			rectype = bswap(read(f, Int32))
+			if rectype!=1
+				error("Expected variable of type string")
+			else
+				fieldname_length = bswap(read(f, Int32))
+				field_name = String(read(f, fieldname_length))
+			end
+			rec_length = bswap(read(f, Int32))
+			field_type = bswap(read(f, Int32))
+			if field_type==2
+				data = bswap(read(f, Float64))
+			elseif field_type==3
+				rows = bswap(read(f, Int32))
+				cols = bswap(read(f, Int32))
+				data = reinterpret(Float64, read(f, sizeof(Float64)*rows*cols))
+				data .= ntoh.(data)
+				data = reshape(data, (rows,cols))
+				data = collect(data)
+				if cols == 1
+					data = vec(data)
+				end
+			else
+				error("Error: Encountered invalid field type when reading data.")
+			end
+
+			if field_name == variablename
+				found = true
+				return data
+			end
+		end
+	end
+
+	return output
+end# }}}
+function InterpFromMeshToMesh2d(index::Array,x::Vector,y::Vector,data::Vector,xout::Vector,yout::Vector) #{{{
+	#prepare input arrays
+	nods = Cint(length(x))
+	nels = Cint(size(index,1))
+	nods_interp = Cint(length(xout))
+	Cindex=Array{Cint,1}(undef,length(index))
+	for i in 1:size(index,1)
+		for j in 1:3
+			Cindex[(i-1)*3+j] = Int32(index[i,j])
+		end
+	end
+	Cx    = Array{Cdouble,1}(undef,nods)
+	Cy    = Array{Cdouble,1}(undef,nods)
+	Cdata = Array{Cdouble,1}(undef,nods)
+	for i in 1:nods
+		Cx[i]    = x[i]
+		Cy[i]    = y[i]
+		Cdata[i] = data[i]
+	end
+	Cxout = Array{Cdouble,1}(undef,nods_interp)
+	Cyout = Array{Cdouble,1}(undef,nods_interp)
+	for i in 1:nods_interp
+		Cxout[i] = xout[i]
+		Cyout[i] = yout[i]
+	end
+
+	Cdataout = Vector{Float64}(undef,nods_interp)
+
+	#This is not working....
+	rc=ccall( (:InterpFromMeshToMesh2dx,"libISSMCore"),
+				Cint, (Ptr{Ptr{Cdouble}},Ptr{Cint}, Ptr{Cdouble}, Ptr{Cdouble}, Cint, Cint, Ptr{Cdouble}, Cint, Cint, Ptr{Cdouble}, Ptr{Cdouble}, Cint),
+				Ref(Ref(Cdataout)), Ref(Cindex), Ref(Cx), Ref(Cy), nods, nels,
+				Ref(Cdata), nods, 1, Ref(Cxout), Ref(Cyout), nods_interp)
+
+	#Process output
+	dataout = Vector{Float64}(undef,nods_interp)
+	for i in 1:nods_interp
+		dataout[i] = Cdataout[i]
+	end
+
+	return dataout
+end #}}}
+function solve(md::model,solution::String) #{{{
+
+	if solution=="sb" || solution=="Stressbalance"
+		solutionstring = "StressbalanceSolution"
+	else
+		error("solutionstring "*solution*" not supported!");
+	end
+
+	IssmCore(md)
+
+	return md
+end #}}}
Index: sm/trunk-jpl/src/jl/parameterization.jl
===================================================================
--- /issm/trunk-jpl/src/jl/parameterization.jl	(revision 26628)
+++ 	(revision )
@@ -1,55 +1,0 @@
-include("classes.jl")
-include("exp.jl")
-
-# setmask {{{
-"""
-SETMASK - establish boundaries between grounded and floating ice.
-
-   By default, ice is considered grounded. The contour floatingicename defines nodes 
-   for which ice is floating. The contour groundedicename defines nodes inside an floatingice, 
-   that are grounded (ie: ice rises, islands, etc ...)
-   All input files are in the Argus format (extension .exp).
-
-   Usage:
-      md=setmask(md,floatingicename,groundedicename)
-
-   Examples:
-      md=setmask(md,'all','');
-      md=setmask(md,'Iceshelves.exp','Islands.exp');
-"""
-function setmask(md::model,floatingicename::String,groundedicename::String)
-
-	elementonfloatingice = FlagElements( md, floatingicename);
-	elementongroundedice = FlagElements( md, groundedicename);
-
-	elementonfloatingice = convert( Array{Float64}, (elementonfloatingice.>0) .&  (elementongroundedice.==0.))
-	elementongroundedice = convert( Array{Float64}, elementonfloatingice.==0.)
-
-	vertexonfloatingice=zeros(md.mesh.numberofvertices)
-	vertexongroundedice=zeros(md.mesh.numberofvertices)
-
-	vertexongroundedice[md.mesh.elements[findall(elementongroundedice.>0),:]] .= 1.
-	vertexonfloatingice[findall(vertexongroundedice.==0.)] .= 1.
-
-	#define levelsets
-	md.mask.ocean_levelset = vertexongroundedice
-	md.mask.ocean_levelset[findall(vertexongroundedice .==0.)] .= -1.
-	md.mask.ice_levelset = -1*ones(md.mesh.numberofvertices)
-
-	return md
-end
-#}}}
-# FlagElements {{{
-function FlagElements(md::model,region::String)
-
-	if isempty(region)
-		flags = zeros(md.mesh.numberofelements)
-	elseif region == "all"
-		flags = ones(md.mesh.numberofelements)
-	else
-		flags = InContour(md.mesh.x,md.mesh.y,region);
-	end
-
-	return flags
-end
-#}}}
Index: sm/trunk-jpl/src/jl/plotmodel.jl
===================================================================
--- /issm/trunk-jpl/src/jl/plotmodel.jl	(revision 26628)
+++ 	(revision )
@@ -1,47 +1,0 @@
-import ColorSchemes.jet
-
-using GLMakie
-include("classes.jl")
-using .ISSM
-
-function plotmodel(md::ISSM.model,data::Vector)
-
-	vertexcolor  = :black
-	facetcolor   = :blue
-	showvertices = true
-	showfacets   = true
-
-	if data isa AbstractVector
-
-		if length(data)==md.mesh.numberofelements
-			# vector of polygons
-			x = md.mesh.x
-			y = md.mesh.y
-			index = md.mesh.elements
-			ps = [Makie.GeometryBasics.Polygon([Point2(x[index[i,1]], y[index[i,1]]), Point2(x[index[i,2]], y[index[i,2]]), Point2(x[index[i,3]], y[index[i,3]])])
-					for i in 1:md.mesh.numberofelements]
-
-			fig, ax, h = Makie.poly(ps, color = data, colormap = jet)
-
-			#Add colorbar
-			Colorbar(fig[1, 2], limits = (minimum(data), maximum(data)), colormap = jet)
-		elseif length(data)==md.mesh.numberofvertices
-			fig, ax, h = Makie.mesh( [md.mesh.x md.mesh.y], md.mesh.elements, shading = false, color = data, colormap = jet)
-
-			#Add colorbar
-			#Colorbar(fig[1, 2], h, width=25)
-		else
-			error("data of size "*string(length(data))*" not supported yet!")
-		end
-	else
-		# default to single color
-		@assert length(data)==1
-		fig, ax, h = Makie.mesh( [md.mesh.x md.mesh.y], md.mesh.elements, shading = false, color = data, colormap = jet)
-	end
-
-	if showvertices
-		Makie.scatter!( [md.mesh.x md.mesh.y], markersize = 4, color = vertexcolor)
-	end
-
-	return fig
-end
Index: sm/trunk-jpl/src/jl/solve.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve.jl	(revision 26628)
+++ 	(revision )
@@ -1,488 +1,0 @@
-include("classes.jl")
-include("issmenums.jl")
-
-#define classes first
-abstract type Parameter end
-struct DoubleParam <: Parameter #{{{
-	enum::IssmEnum
-	value::Float64
-end# }}}
-function GetParameterValue(param::DoubleParam) #{{{
-	return param.value
-end#}}}
-struct IntParam <: Parameter #{{{
-	enum::IssmEnum
-	value::Int64
-end# }}}
-function GetParameterValue(param::IntParam) #{{{
-	return param.value
-end#}}}
-mutable struct Parameters #{{{
-	lookup::Dict{IssmEnum,Parameter}
-end# }}}
-function AddParam(parameters::Parameters,value::Float64,enum::IssmEnum) #{{{
-
-	parameters.lookup[enum] = DoubleParam(enum,value)
-
-end#}}}
-function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
-
-	parameters.lookup[enum] = IntParam(enum,value)
-
-end#}}}
-function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
-
-	parameters.lookup[enum] = IntParam(enum,value)
-
-end#}}}
-function FindParam(parameters::Parameters,enum::IssmEnum) #{{{
-
-	param = parameters.lookup[enum]
-	return GetParameterValue(param)
-
-end#}}}
-
-abstract type Input end
-struct BoolInput <: Input#{{{
-	enum::IssmEnum
-	values::Matrix{Bool}
-end# }}}
-struct IntInput <: Input#{{{
-	enum::IssmEnum
-	values::Matrix{Int64}
-end# }}}
-struct ElementInput <: Input#{{{
-	enum::IssmEnum
-	interp::IssmEnum
-	values::Vector{Float64}
-end# }}}
-mutable struct Inputs #{{{
-	numberofelements::Int64
-	numberofvertices::Int64
-	lookup::Dict{IssmEnum,Input}
-end# }}}
-function SetInput(inputs::Inputs,enum::IssmEnum,index::Int64,value::Bool) #{{{
-
-	#Does this input exist
-	if !haskey(inputs.lookup,enum)
-		#it does not exist yet, we need to create it...
-		@assert inputs.numberofelements > 0
-		input = BoolInput(enum,zeros(Bool,inputs.numberofelements))
-		inputs.lookup[enum] = BoolInput(enum,zeros(Bool,inputs.numberofelements))
-	end
-
-	#Get this input and check type
-	input = inputs.lookup[enum]
-	if typeof(input)!=BoolInput error("not consistent") end
-
-	#set value
-	@assert index>0 && index<=inputs.numberofelements
-	input.values[index] = value
-end#}}}
-function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,index::Int64,value::Float64) #{{{
-
-	#Does this input exist
-	if !haskey(inputs.lookup,enum)
-		#it does not exist yet, we need to create it...
-		@assert inputs.numberofelements > 0
-		if interp==P0Enum
-			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofelements))
-		elseif interp==P1Enum
-			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofvertices))
-		else
-			error("not supported yet")
-		end
-	end
-
-	#Get this input and check type
-	input = inputs.lookup[enum]
-	if typeof(input)!=ElementInput error("input type not consistent") end
-	if interp!=input.interp        error("input interpolations not consistent") end
-
-	#set value
-	input.values[index] = value
-end#}}}
-function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,indices::Vector{Int64},values::Vector{Float64}) #{{{
-
-	#Does this input exist
-	if !haskey(inputs.lookup,enum)
-		#it does not exist yet, we need to create it...
-		@assert inputs.numberofvertices>0
-		if interp==P1Enum
-			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofvertices))
-		else
-			error("not supported yet")
-		end
-	end
-
-	#Get this input and check type
-	input = inputs.lookup[enum]
-	if typeof(input)!=ElementInput error("input type not consistent") end
-	if interp!=input.interp        error("input interpolations not consistent") end
-
-	#set value
-	input.values[indices] = values
-end#}}}
-
-mutable struct Node #{{{
-	id::Int64
-	sid::Int64
-	indexingupdate::Bool
-	gsize::Int64
-	gdoflist::Vector{Int64}
-	fdoflist::Vector{Int64}
-	sdoflist::Vector{Int64}
-	svalues::Vector{Float64}
-end# }}}
-function Base.show(io::IO, this::Node)# {{{
-
-	println(io,"Node:")
-	println(io,"   id:  ",this.id)
-	println(io,"   sid: ",this.sid)
-	println(io,"   indexingupdate: ",this.indexingupdate)
-	println(io,"   gsize: ",this.gsize)
-	println(io,"   gdoflist: ",this.gdoflist)
-	println(io,"   fdoflist: ",this.fdoflist)
-	println(io,"   sdoflist: ",this.sdoflist)
-	println(io,"   svalues: ",this.svalues)
-end# }}}
-function ApplyConstraint(node::Node,dof::Int8,value::Float64) #{{{
-
-	node.indexingupdate = true
-	node.fdoflist[dof]  = -1
-	node.sdoflist[dof]  = +1
-	node.svalues[dof]   = value
-
-end# }}}
-struct Constraint #{{{
-	id::Int64
-	nodeid::Int64
-	dof::Int8
-	value::Float64
-end# }}}
-function ConstrainNode(constraint::Constraint,nodes::Vector{Node},parameters::Parameters) #{{{
-
-	#Chase through nodes and find the node to which this SpcStatic apply
-	node = nodes[constraint.nodeid]
-
-	#Apply Constraint
-	ApplyConstraint(node,constraint.dof,constraint.value)
-
-end# }}}
-mutable struct Vertex#{{{
-	sid::Int64
-	x::Float64
-	y::Float64
-end# }}}
-mutable struct Tria #{{{
-	sid::Int64
-	pid::Int64
-	#vertexids::Int64[3]
-	#vertices::Vertex[3]
-	vertexids::Vector{Int64}
-	vertices::Vector{Vertex}
-	nodeids::Vector{Int64}
-	nodes::Vector{Node}
-	parameters::Parameters
-	inputs::Inputs
-end# }}}
-mutable struct FemModel #{{{
-	elements::Vector{Tria}
-	vertices::Vector{Vertex}
-	nodes::Vector{Node}
-	parameters::Parameters
-	inputs::Inputs
-	constraints::Vector{Constraint}
-	#loads::Vector{Loads}
-end#}}}
-struct GaussTria #{{{
-	numgauss::Int64
-	weights::Vector{Float64}
-	coords1::Vector{Float64}
-	coords2::Vector{Float64}
-	coords3::Vector{Float64}
-end #}}}
-function GaussTria(order::Int64) #{{{
-
-	#=Gauss quadrature points for the triangle.
-	Higher-order points from D.A. Dunavant, "High Degree Efficient
-	Symmetrical Gaussian Quadrature Rules for the Triangle", IJNME,
-	Vol. 21, pp. 1129-1148 (1985), as transcribed for Probe rules3.=#
-
-	if(order==1)
-		npoints = 1
-		weights = [1.732050807568877]
-		coords1 = [0.333333333333333]
-		coords2 = [0.333333333333333]
-		coords3 = [0.333333333333333]
-	elseif(order==2)
-		weights = [0.577350269189625, 0.577350269189625, 0.577350269189625]
-		coords1 = [0.666666666666667, 0.166666666666667, 0.166666666666667]
-		coords2 = [0.166666666666667, 0.666666666666667, 0.166666666666667]
-		coords3 = [0.166666666666667, 0.166666666666667, 0.666666666666667]
-	elseif(order==3)
-		npoints=4
-		weights = [-0.974278579257493, 0.902109795608790, 0.902109795608790, 0.902109795608790]
-		coords1 = [0.333333333333333, 0.600000000000000, 0.200000000000000, 0.200000000000000]
-		coords2 = [0.333333333333333, 0.200000000000000, 0.600000000000000, 0.200000000000000]
-		coords3 = [0.333333333333333, 0.200000000000000, 0.200000000000000, 0.600000000000000]
-	else
-		error("order ",order," not supported yet");
-	end
-
-	return GaussTria(npoints,weights,coords1,coords2,coords3)
-end# }}}
-
-abstract type Analysis end
-struct StressbalanceAnalysis <: Analysis#{{{
-end #}}}
-
-#Modules
-function FetchDataToInput(md::model,inputs::Inputs,elements::Vector{Tria},data::Vector{Float64},enum::IssmEnum) #{{{
-	for i in 1:length(elements)
-		InputCreate(elements[i],inputs,data,enum)
-	end
-end#}}}
-function IssmCore(md::model) #{{{
-	
-	#Construct FemModel
-	femmodel=ModelProcessor(md)
-
-	#Solve
-	analysis = StressbalanceAnalysis()
-	Core(analysis,femmodel)
-
-	#then what??
-	error("STOP")
-
-end# }}}
-function ModelProcessor(md::model) #{{{
-
-	#Initialize structures
-	elements    = Vector{Tria}(undef,0)
-	vertices    = Vector{Vertex}(undef,0)
-	nodes       = Vector{Node}(undef,0)
-	constraints = Vector{Constraint}(undef,0)
-	parameters  = Parameters(Dict{IssmEnum,Parameter}())
-	inputs      = Inputs(md.mesh.numberofelements,md.mesh.numberofvertices,Dict{IssmEnum,Input}())
-
-	#Create  elements, vertices and materials (independent of the analysis)
-	CreateElements(elements,md)
-	CreateVertices(vertices,md)
-	CreateParameters(parameters,md)
-	CreateInputs(inputs,elements,md)
-
-	#Now create analysis specific data structure
-	analysis = StressbalanceAnalysis()
-	UpdateParameters(analysis,parameters,md)
-	CreateNodes(analysis,nodes,md)
-	UpdateElements(analysis,elements,inputs,md)
-	CreateConstraints(analysis,constraints,md)
-
-	#Configure objects
-	ConfigureObjectx(elements,nodes,vertices,parameters,inputs)
-
-	#Constrain and Number nodes
-	SpcNodesx(nodes,constraints,parameters)
-	NodesDofx(nodes,parameters)
-   error("STOP")
-
-	#Build FemModel
-	return FemModel(elements,vertices,nodes,parameters,inputs,constraints)
-end# }}}
-function CreateElements(elements::Vector{Tria},md::model) #{{{
-
-	#Make sure elements is currently empty
-	@assert length(elements)==0
-
-	tempparams   = Parameters(Dict{IssmEnum,Parameter}())
-	tempinputs   = Inputs(-1,-1,Dict{IssmEnum,Input}())
-	tempvertices = Vector{Vertex}(undef,3)
-	tempnodes    = Vector{Node}(undef,3)
-
-	count = 0
-	for i in 1:md.mesh.numberofelements
-
-		#Assume Linear Elements for now
-		vertexids = md.mesh.elements[i,:]
-		nodeids   = md.mesh.elements[i,:]
-
-		#Call constructor and add to dataset elements
-		push!(elements,Tria(i,count,vertexids,tempvertices,nodeids,tempnodes,tempparams,tempinputs))
-	end
-
-end# }}}
-function CreateVertices(vertices::Vector{Vertex},md::model) #{{{
-
-	#Make sure vertices is currently empty
-	@assert length(vertices)==0
-
-	#Get data from md
-	x = md.mesh.x
-	y = md.mesh.y
-
-	count = 0
-	for i in 1:md.mesh.numberofvertices
-		push!(vertices,Vertex(i,x[i],y[i]))
-	end
-
-end# }}}
-function CreateParameters(parameters::Parameters,md::model) #{{{
-
-	#Get data from md
-	AddParam(parameters,md.materials.rho_ice,MaterialsRhoIceEnum)
-	AddParam(parameters,md.materials.rho_water,MaterialsRhoSeawaterEnum)
-	AddParam(parameters,md.materials.rho_freshwater,MaterialsRhoFreshwaterEnum)
-end# }}}
-function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{
-
-	#Only assume we have Matice for now
-	FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum)
-	FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum)
-end# }}}
-function ConfigureObjectx(elements::Vector{Tria},nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) #{{{
-
-	for i in 1:length(elements)
-		Configure(elements[i],nodes,vertices,parameters,inputs)
-	end
-
-end# }}}
-function SpcNodesx(nodes::Vector{Node},constraints::Vector{Constraint},parameters::Parameters) #{{{
-
-	for i in 1:length(constraints)
-		ConstrainNode(constraints[i],nodes,parameters)
-	end
-
-end# }}}
-function NodesDofx(nodes::Vector{Node}, parameters::Parameters) #{{{
-
-	error("not implemented yet")
-
-end# }}}
-
-#Analyses
-function UpdateParameters(analysis::StressbalanceAnalysis,parameters::Parameters,md::model) #{{{
-	AddParam(parameters,md.stressbalance.restol,StressbalanceRestolEnum)
-	AddParam(parameters,md.stressbalance.reltol,StressbalanceReltolEnum)
-	AddParam(parameters,md.stressbalance.abstol,StressbalanceAbstolEnum)
-	AddParam(parameters,md.stressbalance.maxiter,StressbalanceMaxiterEnum)
-end#}}}
-function CreateNodes(analysis::StressbalanceAnalysis,nodes::Vector{Node},md::model) #{{{
-
-	numdof = 2
-	for i in 1:md.mesh.numberofvertices
-		push!(nodes,Node(i,i,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
-	end
-end#}}}
-function UpdateElements(analysis::StressbalanceAnalysis,elements::Vector{Tria}, inputs::Inputs, md::model) #{{{
-
-	#Provide node indices to element
-	for i in 1:md.mesh.numberofvertices
-		Update(elements[i],inputs,i,md,P1Enum)
-	end
-
-	#Add necessary inputs to perform this analysis
-	FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum)
-	FetchDataToInput(md,inputs,elements,md.geometry.thickness,ThicknessEnum)
-	FetchDataToInput(md,inputs,elements,md.geometry.surface,SurfaceEnum)
-	FetchDataToInput(md,inputs,elements,md.geometry.base,BaseEnum)
-	FetchDataToInput(md,inputs,elements,md.initialization.vx./md.constants.yts,VxEnum)
-	FetchDataToInput(md,inputs,elements,md.initialization.vy./md.constants.yts,VyEnum)
-
-end#}}}
-function CreateConstraints(analysis::StressbalanceAnalysis,constraints::Vector{Constraint},md::model) #{{{
-
-	#load constraints from model
-	spcvx = md.stressbalance.spcvx
-	spcvy = md.stressbalance.spcvy
-
-	count = 1
-	for i in 1:md.mesh.numberofvertices
-		if ~isnan(spcvx[i])
-			push!(constraints,Constraint(count,i,1,spcvx[i]))
-			count+=1
-		end
-		if ~isnan(spcvy[i])
-			push!(constraints,Constraint(count,i,2,spcvy[i]))
-			count+=1
-		end
-	end
-
-end#}}}
-function Core(analysis::StressbalanceAnalysis,femmodel::FemModel)# {{{
-
-	#Fetch parameters relevant to solution sequence
-	maxiter = FindParam(femmodel.parameters,StressbalanceMaxiterEnum)
-	restol  = FindParam(femmodel.parameters,StressbalanceRestolEnum)
-	reltol  = FindParam(femmodel.parameters,StressbalanceReltolEnum)
-	abstol  = FindParam(femmodel.parameters,StressbalanceAbstolEnum)
-
-	solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol)
-	error("STOP")
-
-end #}}}
-function solutionsequence_nonlinear(femmodel::FemModel,analysis::Analysis,maxiter::Int64,restol::Float64,reltol::Float64,abstol::Float64) # {{{
-
-	#Initialize number of iterations
-	count = 0
-	converged = false
-
-	#Get existing solution
-	ug = GetSolutionFromInputsx(analysis,femmodel)
-
-	#Loop until we reach convergence
-	while(~converged)
-
-		error("not implemented yet")
-
-		#Increase count
-		count += 1
-		if(count>maxiter)
-			println("   maximum number of nonlinear iterations (",maxiter,") exceeded")
-			converged = true
-		end
-	end
-
-	error("STOP")
-
-end# }}}
-
-#Element functions
-function InputCreate(element::Tria,inputs::Inputs,data::Vector{Float64},enum::IssmEnum) #{{{
-	if size(data,1)==inputs.numberofelements
-		SetTriaInput(inputs,enum,P0Enum,element.sid,data[element.sid])
-	elseif size(data,1)==inputs.numberofvertices
-		SetTriaInput(inputs,enum,P1Enum,element.vertexids,data[element.vertexids])
-	else
-		error("size ",size(data,1)," not supported yet");
-	end
-end #}}}
-function Update(element::Tria,inputs::Inputs,index::Int64,md::model,finiteelement::IssmEnum) #{{{
-
-	if finiteelement==P1Enum
-		numnodes = 3
-		element.nodeids    = Vector{Int64}(undef,numnodes)
-		element.nodeids[1] = md.mesh.elements[index,1]
-		element.nodeids[2] = md.mesh.elements[index,2]
-		element.nodeids[3] = md.mesh.elements[index,3]
-	else
-		error("not supported yet")
-	end
-end #}}}
-function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) # {{{
-
-   #Configure vertices
-   for i in 1:3
-      element.vertices[i] = vertices[element.vertexids[i]]
-   end
-
-	#Configure nodes (assuming P1 finite elements)
-	for i in 1:3
-		element.nodes[i] = nodes[element.nodeids[i]]
-	end
-
-	#Point to real datasets
-	element.parameters = parameters
-	element.inputs     = inputs
-	
-end # }}}
Index: /issm/trunk-jpl/src/jl/solve/analyses.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/analyses.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/analyses.jl	(revision 26629)
@@ -0,0 +1,91 @@
+#Analysis class definitions
+abstract type Analysis end
+struct StressbalanceAnalysis <: Analysis#{{{
+end #}}}
+
+#Stress balance analysis
+function UpdateParameters(analysis::StressbalanceAnalysis,parameters::Parameters,md::model) #{{{
+	AddParam(parameters,md.stressbalance.restol,StressbalanceRestolEnum)
+	AddParam(parameters,md.stressbalance.reltol,StressbalanceReltolEnum)
+	AddParam(parameters,md.stressbalance.abstol,StressbalanceAbstolEnum)
+	AddParam(parameters,md.stressbalance.maxiter,StressbalanceMaxiterEnum)
+end#}}}
+function CreateNodes(analysis::StressbalanceAnalysis,nodes::Vector{Node},md::model) #{{{
+
+	numdof = 2
+	for i in 1:md.mesh.numberofvertices
+		push!(nodes,Node(i,i,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
+	end
+end#}}}
+function UpdateElements(analysis::StressbalanceAnalysis,elements::Vector{Tria}, inputs::Inputs, md::model) #{{{
+
+	#Provide node indices to element
+	for i in 1:md.mesh.numberofvertices
+		Update(elements[i],inputs,i,md,P1Enum)
+	end
+
+	#Add necessary inputs to perform this analysis
+	FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum)
+	FetchDataToInput(md,inputs,elements,md.geometry.thickness,ThicknessEnum)
+	FetchDataToInput(md,inputs,elements,md.geometry.surface,SurfaceEnum)
+	FetchDataToInput(md,inputs,elements,md.geometry.base,BaseEnum)
+	FetchDataToInput(md,inputs,elements,md.initialization.vx./md.constants.yts,VxEnum)
+	FetchDataToInput(md,inputs,elements,md.initialization.vy./md.constants.yts,VyEnum)
+
+end#}}}
+function CreateConstraints(analysis::StressbalanceAnalysis,constraints::Vector{Constraint},md::model) #{{{
+
+	#load constraints from model
+	spcvx = md.stressbalance.spcvx
+	spcvy = md.stressbalance.spcvy
+
+	count = 1
+	for i in 1:md.mesh.numberofvertices
+		if ~isnan(spcvx[i])
+			push!(constraints,Constraint(count,i,1,spcvx[i]))
+			count+=1
+		end
+		if ~isnan(spcvy[i])
+			push!(constraints,Constraint(count,i,2,spcvy[i]))
+			count+=1
+		end
+	end
+
+end#}}}
+function Core(analysis::StressbalanceAnalysis,femmodel::FemModel)# {{{
+
+	#Fetch parameters relevant to solution sequence
+	maxiter = FindParam(femmodel.parameters,StressbalanceMaxiterEnum)
+	restol  = FindParam(femmodel.parameters,StressbalanceRestolEnum)
+	reltol  = FindParam(femmodel.parameters,StressbalanceReltolEnum)
+	abstol  = FindParam(femmodel.parameters,StressbalanceAbstolEnum)
+
+	solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol)
+	error("STOP")
+
+end #}}}
+function solutionsequence_nonlinear(femmodel::FemModel,analysis::Analysis,maxiter::Int64,restol::Float64,reltol::Float64,abstol::Float64) # {{{
+
+	#Initialize number of iterations
+	count = 0
+	converged = false
+
+	#Get existing solution
+	ug = GetSolutionFromInputsx(analysis,femmodel)
+
+	#Loop until we reach convergence
+	while(~converged)
+
+		error("not implemented yet")
+
+		#Increase count
+		count += 1
+		if(count>maxiter)
+			println("   maximum number of nonlinear iterations (",maxiter,") exceeded")
+			converged = true
+		end
+	end
+
+	error("STOP")
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/solve/constraints.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/constraints.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/constraints.jl	(revision 26629)
@@ -0,0 +1,18 @@
+#Constraint class definition
+struct Constraint #{{{
+	id::Int64
+	nodeid::Int64
+	dof::Int8
+	value::Float64
+end# }}}
+
+#Constraint functions
+function ConstrainNode(constraint::Constraint,nodes::Vector{Node},parameters::Parameters) #{{{
+
+	#Chase through nodes and find the node to which this SpcStatic apply
+	node = nodes[constraint.nodeid]
+
+	#Apply Constraint
+	ApplyConstraint(node,constraint.dof,constraint.value)
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/solve/elements.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/elements.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/elements.jl	(revision 26629)
@@ -0,0 +1,53 @@
+#Tria class definition
+mutable struct Tria #{{{
+	sid::Int64
+	pid::Int64
+	#vertexids::Int64[3]
+	#vertices::Vertex[3]
+	vertexids::Vector{Int64}
+	vertices::Vector{Vertex}
+	nodeids::Vector{Int64}
+	nodes::Vector{Node}
+	parameters::Parameters
+	inputs::Inputs
+end# }}}
+
+#Element functions
+function InputCreate(element::Tria,inputs::Inputs,data::Vector{Float64},enum::IssmEnum) #{{{
+	if size(data,1)==inputs.numberofelements
+		SetTriaInput(inputs,enum,P0Enum,element.sid,data[element.sid])
+	elseif size(data,1)==inputs.numberofvertices
+		SetTriaInput(inputs,enum,P1Enum,element.vertexids,data[element.vertexids])
+	else
+		error("size ",size(data,1)," not supported yet");
+	end
+end #}}}
+function Update(element::Tria,inputs::Inputs,index::Int64,md::model,finiteelement::IssmEnum) #{{{
+
+	if finiteelement==P1Enum
+		numnodes = 3
+		element.nodeids    = Vector{Int64}(undef,numnodes)
+		element.nodeids[1] = md.mesh.elements[index,1]
+		element.nodeids[2] = md.mesh.elements[index,2]
+		element.nodeids[3] = md.mesh.elements[index,3]
+	else
+		error("not supported yet")
+	end
+end #}}}
+function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) # {{{
+
+   #Configure vertices
+   for i in 1:3
+      element.vertices[i] = vertices[element.vertexids[i]]
+   end
+
+	#Configure nodes (assuming P1 finite elements)
+	for i in 1:3
+		element.nodes[i] = nodes[element.nodeids[i]]
+	end
+
+	#Point to real datasets
+	element.parameters = parameters
+	element.inputs     = inputs
+	
+end # }}}
Index: /issm/trunk-jpl/src/jl/solve/femmodel.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/femmodel.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/femmodel.jl	(revision 26629)
@@ -0,0 +1,13 @@
+#femmodel class definition
+mutable struct FemModel #{{{
+	elements::Vector{Tria}
+	vertices::Vector{Vertex}
+	nodes::Vector{Node}
+	parameters::Parameters
+	inputs::Inputs
+	constraints::Vector{Constraint}
+	#loads::Vector{Loads}
+end#}}}
+
+#femmodel functions
+
Index: /issm/trunk-jpl/src/jl/solve/gauss.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/gauss.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/gauss.jl	(revision 26629)
@@ -0,0 +1,41 @@
+#Gauss class definition
+struct GaussTria #{{{
+	numgauss::Int64
+	weights::Vector{Float64}
+	coords1::Vector{Float64}
+	coords2::Vector{Float64}
+	coords3::Vector{Float64}
+end #}}}
+
+#Gauss constructor
+function GaussTria(order::Int64) #{{{
+
+	#=Gauss quadrature points for the triangle.
+	Higher-order points from D.A. Dunavant, "High Degree Efficient
+	Symmetrical Gaussian Quadrature Rules for the Triangle", IJNME,
+	Vol. 21, pp. 1129-1148 (1985), as transcribed for Probe rules3.=#
+
+	if(order==1)
+		npoints = 1
+		weights = [1.732050807568877]
+		coords1 = [0.333333333333333]
+		coords2 = [0.333333333333333]
+		coords3 = [0.333333333333333]
+	elseif(order==2)
+		weights = [0.577350269189625, 0.577350269189625, 0.577350269189625]
+		coords1 = [0.666666666666667, 0.166666666666667, 0.166666666666667]
+		coords2 = [0.166666666666667, 0.666666666666667, 0.166666666666667]
+		coords3 = [0.166666666666667, 0.166666666666667, 0.666666666666667]
+	elseif(order==3)
+		npoints=4
+		weights = [-0.974278579257493, 0.902109795608790, 0.902109795608790, 0.902109795608790]
+		coords1 = [0.333333333333333, 0.600000000000000, 0.200000000000000, 0.200000000000000]
+		coords2 = [0.333333333333333, 0.200000000000000, 0.600000000000000, 0.200000000000000]
+		coords3 = [0.333333333333333, 0.200000000000000, 0.200000000000000, 0.600000000000000]
+	else
+		error("order ",order," not supported yet");
+	end
+
+	return GaussTria(npoints,weights,coords1,coords2,coords3)
+end# }}}
+
Index: /issm/trunk-jpl/src/jl/solve/inputs.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/inputs.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/inputs.jl	(revision 26629)
@@ -0,0 +1,86 @@
+#Input class definition
+abstract type Input end
+struct BoolInput <: Input#{{{
+	enum::IssmEnum
+	values::Matrix{Bool}
+end# }}}
+struct IntInput <: Input#{{{
+	enum::IssmEnum
+	values::Matrix{Int64}
+end# }}}
+struct ElementInput <: Input#{{{
+	enum::IssmEnum
+	interp::IssmEnum
+	values::Vector{Float64}
+end# }}}
+
+#Inputs dataset definition
+mutable struct Inputs #{{{
+	numberofelements::Int64
+	numberofvertices::Int64
+	lookup::Dict{IssmEnum,Input}
+end# }}}
+
+#Inputs functions
+function SetInput(inputs::Inputs,enum::IssmEnum,index::Int64,value::Bool) #{{{
+
+	#Does this input exist
+	if !haskey(inputs.lookup,enum)
+		#it does not exist yet, we need to create it...
+		@assert inputs.numberofelements > 0
+		input = BoolInput(enum,zeros(Bool,inputs.numberofelements))
+		inputs.lookup[enum] = BoolInput(enum,zeros(Bool,inputs.numberofelements))
+	end
+
+	#Get this input and check type
+	input = inputs.lookup[enum]
+	if typeof(input)!=BoolInput error("not consistent") end
+
+	#set value
+	@assert index>0 && index<=inputs.numberofelements
+	input.values[index] = value
+end#}}}
+function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,index::Int64,value::Float64) #{{{
+
+	#Does this input exist
+	if !haskey(inputs.lookup,enum)
+		#it does not exist yet, we need to create it...
+		@assert inputs.numberofelements > 0
+		if interp==P0Enum
+			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofelements))
+		elseif interp==P1Enum
+			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofvertices))
+		else
+			error("not supported yet")
+		end
+	end
+
+	#Get this input and check type
+	input = inputs.lookup[enum]
+	if typeof(input)!=ElementInput error("input type not consistent") end
+	if interp!=input.interp        error("input interpolations not consistent") end
+
+	#set value
+	input.values[index] = value
+end#}}}
+function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,indices::Vector{Int64},values::Vector{Float64}) #{{{
+
+	#Does this input exist
+	if !haskey(inputs.lookup,enum)
+		#it does not exist yet, we need to create it...
+		@assert inputs.numberofvertices>0
+		if interp==P1Enum
+			inputs.lookup[enum] = ElementInput(enum,interp,zeros(inputs.numberofvertices))
+		else
+			error("not supported yet")
+		end
+	end
+
+	#Get this input and check type
+	input = inputs.lookup[enum]
+	if typeof(input)!=ElementInput error("input type not consistent") end
+	if interp!=input.interp        error("input interpolations not consistent") end
+
+	#set value
+	input.values[indices] = values
+end#}}}
Index: /issm/trunk-jpl/src/jl/solve/issmenums.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/issmenums.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/issmenums.jl	(revision 26629)
@@ -0,0 +1,1544 @@
+@enum IssmEnum begin
+	ParametersSTARTEnum
+	#Parameters{{{
+	AdolcParamEnum
+	AmrDeviatoricErrorGroupThresholdEnum
+	AmrDeviatoricErrorMaximumEnum
+	AmrDeviatoricErrorResolutionEnum
+	AmrDeviatoricErrorThresholdEnum
+	AmrErrEnum
+	AmrFieldEnum
+	AmrGradationEnum
+	AmrGroundingLineDistanceEnum
+	AmrGroundingLineResolutionEnum
+	AmrHmaxEnum
+	AmrHminEnum
+	AmrIceFrontDistanceEnum
+	AmrIceFrontResolutionEnum
+	AmrKeepMetricEnum
+	AmrLagEnum
+	AmrLevelMaxEnum
+	AmrRestartEnum
+	AmrThicknessErrorGroupThresholdEnum
+	AmrThicknessErrorMaximumEnum
+	AmrThicknessErrorResolutionEnum
+	AmrThicknessErrorThresholdEnum
+	AmrTypeEnum
+	AnalysisCounterEnum
+	AnalysisTypeEnum
+	AugmentedLagrangianREnum
+	AugmentedLagrangianRholambdaEnum
+	AugmentedLagrangianRhopEnum
+	AugmentedLagrangianRlambdaEnum
+	AugmentedLagrangianThetaEnum
+	AutodiffCbufsizeEnum
+	AutodiffDependentObjectsEnum
+	AutodiffDriverEnum
+	AutodiffFosForwardIndexEnum
+	AutodiffFosReverseIndexEnum
+	AutodiffFovForwardIndicesEnum
+	AutodiffGcTriggerMaxSizeEnum
+	AutodiffGcTriggerRatioEnum
+	AutodiffIsautodiffEnum
+	AutodiffLbufsizeEnum
+	AutodiffNumDependentsEnum
+	AutodiffNumIndependentsEnum
+	AutodiffObufsizeEnum
+	AutodiffTapeAllocEnum
+	AutodiffTbufsizeEnum
+	AutodiffXpEnum
+	BalancethicknessStabilizationEnum
+	BarystaticContributionsEnum
+	BasalforcingsBottomplumedepthEnum
+	BasalforcingsCrustthicknessEnum
+	BasalforcingsDeepwaterElevationEnum
+	BasalforcingsDeepwaterMeltingRateEnum
+	BasalforcingsDtbgEnum
+	BasalforcingsEnum
+	BasalforcingsIsmip6AverageTfEnum
+	BasalforcingsIsmip6BasinAreaEnum
+	BasalforcingsIsmip6DeltaTEnum
+	BasalforcingsIsmip6Gamma0Enum
+	BasalforcingsIsmip6IsLocalEnum
+	BasalforcingsIsmip6NumBasinsEnum
+	BasalforcingsIsmip6TfDepthsEnum
+	BasalforcingsLowercrustheatEnum
+	BasalforcingsMantleconductivityEnum
+	BasalforcingsNusseltEnum
+	BasalforcingsPicoAverageOverturningEnum
+	BasalforcingsPicoAverageSalinityEnum
+	BasalforcingsPicoAverageTemperatureEnum
+	BasalforcingsPicoBoxAreaEnum
+	BasalforcingsPicoFarOceansalinityEnum
+	BasalforcingsPicoFarOceantemperatureEnum
+	BasalforcingsPicoGammaTEnum
+	BasalforcingsPicoIsplumeEnum
+	BasalforcingsPicoMaxboxcountEnum
+	BasalforcingsPicoNumBasinsEnum
+	BasalforcingsPlumeradiusEnum
+	BasalforcingsPlumexEnum
+	BasalforcingsPlumeyEnum
+	BasalforcingsThresholdThicknessEnum
+	BasalforcingsTopplumedepthEnum
+	BasalforcingsUppercrustheatEnum
+	BasalforcingsUppercrustthicknessEnum
+	BasalforcingsUpperdepthMeltEnum
+	BasalforcingsUpperwaterElevationEnum
+	BasalforcingsUpperwaterMeltingRateEnum
+	CalvingCrevasseDepthEnum
+	CalvingCrevasseThresholdEnum
+	CalvingHeightAboveFloatationEnum
+	CalvingLawEnum
+	CalvingMinthicknessEnum
+	ConfigurationTypeEnum
+	ConstantsGEnum
+	ConstantsNewtonGravityEnum
+	ConstantsReferencetemperatureEnum
+	ConstantsYtsEnum
+	ControlInputSizeMEnum
+	ControlInputSizeNEnum
+	ControlInputInterpolationEnum
+	CumBslcEnum
+	CumBslcIceEnum
+	CumBslcHydroEnum
+	CumBslcOceanEnum
+	CumBslcIcePartitionEnum
+	CumBslcHydroPartitionEnum
+	CumBslcOceanPartitionEnum
+	CumGmtslcEnum
+	CumGmslcEnum
+	DamageC1Enum
+	DamageC2Enum
+	DamageC3Enum
+	DamageC4Enum
+	DamageEnum
+	DamageEquivStressEnum
+	DamageEvolutionNumRequestedOutputsEnum
+	DamageEvolutionRequestedOutputsEnum
+	DamageHealingEnum
+	DamageKappaEnum
+	DamageLawEnum
+	DamageMaxDamageEnum
+	DamageStabilizationEnum
+	DamageStressThresholdEnum
+	DamageStressUBoundEnum
+	DebugProfilingEnum
+	DomainDimensionEnum
+	DomainTypeEnum
+	DslModelEnum
+	DslModelidEnum
+	DslNummodelsEnum
+	SolidearthIsExternalEnum
+	SolidearthExternalNatureEnum
+	SolidearthExternalModelidEnum
+	SolidearthExternalNummodelsEnum
+	SolidearthSettingsComputeBpGrdEnum
+	EarthIdEnum
+	ElasticEnum
+	EplZigZagCounterEnum
+	EsaHElasticEnum
+	EsaHemisphereEnum
+	EsaRequestedOutputsEnum
+	EsaUElasticEnum
+	ExtrapolationVariableEnum
+	FemModelCommEnum
+	FieldsEnum
+	FlowequationFeFSEnum
+	FlowequationIsFSEnum
+	FlowequationIsHOEnum
+	FlowequationIsL1L2Enum
+	FlowequationIsMLHOEnum
+	FlowequationIsSIAEnum
+	FlowequationIsSSAEnum
+	FlowequationIsNitscheEnum
+	FeFSNitscheGammaEnum
+	FrictionCouplingEnum
+	FrictionDeltaEnum
+	FrictionEffectivePressureLimitEnum
+	FrictionFEnum
+	FrictionGammaEnum
+	FrictionLawEnum
+	FrictionPseudoplasticityExponentEnum
+	FrictionThresholdSpeedEnum
+	FrictionVoidRatioEnum
+	FrontalForcingsBasinIcefrontAreaEnum
+	FrontalForcingsNumberofBasinsEnum
+	FrontalForcingsParamEnum
+	GrdModelEnum
+	GroundinglineFrictionInterpolationEnum
+	GroundinglineMeltInterpolationEnum
+	GroundinglineMigrationEnum
+	HydrologyAveragingEnum
+	HydrologyCavitySpacingEnum
+	HydrologyChannelConductivityEnum
+	HydrologyChannelSheetWidthEnum
+	HydrologyEnglacialVoidRatioEnum
+	HydrologyIschannelsEnum
+	HydrologyMeltFlagEnum
+	HydrologyModelEnum
+	HydrologyNumRequestedOutputsEnum
+	HydrologyPressureMeltCoefficientEnum
+	HydrologyRelaxationEnum
+	HydrologyRequestedOutputsEnum
+	HydrologySedimentKmaxEnum
+	HydrologyStepsPerStepEnum
+	HydrologyStorageEnum
+	HydrologydcEplColapseThicknessEnum
+	HydrologydcEplConductivityEnum
+	HydrologydcEplInitialThicknessEnum
+	HydrologydcEplLayerCompressibilityEnum
+	HydrologydcEplMaxThicknessEnum
+	HydrologydcEplPoreWaterMassEnum
+	HydrologydcEplThickCompEnum
+	HydrologydcEplflipLockEnum
+	HydrologydcIsefficientlayerEnum
+	HydrologydcLeakageFactorEnum
+	HydrologydcMaxIterEnum
+	HydrologydcPenaltyFactorEnum
+	HydrologydcPenaltyLockEnum
+	HydrologydcRelTolEnum
+	HydrologydcSedimentlimitEnum
+	HydrologydcSedimentlimitFlagEnum
+	HydrologydcSedimentLayerCompressibilityEnum
+	HydrologydcSedimentPoreWaterMassEnum
+	HydrologydcSedimentPorosityEnum
+	HydrologydcSedimentThicknessEnum
+	HydrologydcTransferFlagEnum
+	HydrologydcUnconfinedFlagEnum
+	HydrologyshreveStabilizationEnum
+	IcecapToEarthCommEnum
+	IndexEnum
+	InputFileNameEnum
+	DirectoryNameEnum
+	IndicesEnum
+	InputToDepthaverageInEnum
+	InputToDepthaverageOutEnum
+	InputToExtrudeEnum
+	InputToL2ProjectEnum
+	InputToSmoothEnum
+	InversionAlgorithmEnum
+	InversionControlParametersEnum
+	InversionControlScalingFactorsEnum
+	InversionCostFunctionsEnum
+	InversionDxminEnum
+	InversionGatolEnum
+	InversionGradientScalingEnum
+	InversionGrtolEnum
+	InversionGttolEnum
+	InversionIncompleteAdjointEnum
+	InversionIscontrolEnum
+	InversionMaxiterEnum
+	InversionMaxiterPerStepEnum
+	InversionMaxstepsEnum
+	InversionNstepsEnum
+	InversionNumControlParametersEnum
+	InversionNumCostFunctionsEnum
+	InversionStepThresholdEnum
+	InversionTypeEnum
+	IvinsEnum
+	IsSlcCouplingEnum
+	LevelsetKillIcebergsEnum
+	LevelsetReinitFrequencyEnum
+	LevelsetStabilizationEnum
+	LockFileNameEnum
+	LoveAllowLayerDeletionEnum
+	LoveCoreMantleBoundaryEnum
+	LoveEarthMassEnum
+	LoveForcingTypeEnum
+	LoveFrequenciesEnum
+	LoveIsTemporalEnum
+	LoveG0Enum
+	LoveGravitationalConstantEnum
+	LoveInnerCoreBoundaryEnum
+	LoveComplexComputationEnum
+	LoveIntStepsPerLayerEnum
+	LoveKernelsEnum
+	LoveMu0Enum
+	LoveNfreqEnum
+	LoveNTemporalIterationsEnum
+	LoveNYiEquationsEnum
+	LoveR0Enum
+	LoveShNmaxEnum
+	LoveShNminEnum
+	LoveStartingLayerEnum
+	LoveUnderflowTolEnum
+	MassFluxSegmentsEnum
+	MassFluxSegmentsPresentEnum
+	MasstransportHydrostaticAdjustmentEnum
+	MasstransportIsfreesurfaceEnum
+	MasstransportMinThicknessEnum
+	MasstransportNumRequestedOutputsEnum
+	MasstransportPenaltyFactorEnum
+	MasstransportRequestedOutputsEnum
+	MasstransportStabilizationEnum
+	MaterialsBetaEnum
+	MaterialsEarthDensityEnum
+	MaterialsEffectiveconductivityAveragingEnum
+	MaterialsHeatcapacityEnum
+	MaterialsLatentheatEnum
+	MaterialsMeltingpointEnum
+	MaterialsMixedLayerCapacityEnum
+	MaterialsMuWaterEnum
+	MaterialsRheologyLawEnum
+	MaterialsRhoFreshwaterEnum
+	MaterialsRhoIceEnum
+	MaterialsRhoSeawaterEnum
+	MaterialsTemperateiceconductivityEnum
+	MaterialsThermalExchangeVelocityEnum
+	MaterialsThermalconductivityEnum
+	MeltingOffsetEnum
+	MeshAverageVertexConnectivityEnum
+	MeshElementtypeEnum
+	MeshNumberoflayersEnum
+	MeshNumberofverticesEnum
+	MeshNumberofelementsEnum
+	MigrationMaxEnum
+	ModelIdEnum
+	NbinsEnum
+	NodesEnum
+	NumModelsEnum
+	OceanGridNxEnum
+	OceanGridNyEnum
+	OceanGridXEnum
+	OceanGridYEnum
+	OutputBufferPointerEnum
+	OutputBufferSizePointerEnum
+	OutputFileNameEnum
+	OutputFilePointerEnum
+	OutputdefinitionEnum
+	QmuErrNameEnum
+	QmuInNameEnum
+	QmuIsdakotaEnum
+	QmuOutNameEnum
+	QmuOutputEnum
+	QmuCurrEvalIdEnum
+	QmuNsampleEnum
+	QmuResponsedescriptorsEnum
+	QmuVariableDescriptorsEnum
+	QmuVariablePartitionsEnum
+	QmuVariablePartitionsNpartEnum
+	QmuVariablePartitionsNtEnum
+	QmuResponsePartitionsEnum
+	QmuResponsePartitionsNpartEnum
+	QmuStatisticsEnum
+	QmuNumstatisticsEnum
+	QmuNdirectoriesEnum
+	QmuNfilesPerDirectoryEnum
+	QmuStatisticsMethodEnum
+	QmuMethodsEnum
+	RestartFileNameEnum
+	ResultsEnum
+	RootPathEnum
+	ModelnameEnum
+	SamplingAlphaEnum
+	SamplingPhiEnum
+	SamplingNumRequestedOutputsEnum
+	SamplingRequestedOutputsEnum
+	SamplingRobinEnum
+	SamplingSeedEnum
+	SamplingTauEnum
+	SaveResultsEnum
+	SolidearthPartitionIceEnum
+	SolidearthPartitionHydroEnum
+	SolidearthPartitionOceanEnum
+	SolidearthNpartIceEnum
+	SolidearthNpartOceanEnum
+	SolidearthNpartHydroEnum
+	SolidearthPlanetRadiusEnum
+	SolidearthPlanetAreaEnum
+	SolidearthSettingsAbstolEnum
+	SolidearthSettingsCrossSectionShapeEnum
+	RotationalAngularVelocityEnum
+	SolidearthSettingsElasticEnum
+	SolidearthSettingsViscousEnum
+	SealevelchangeGeometryDoneEnum
+	SealevelchangeViscousNumStepsEnum
+	SealevelchangeViscousTimesEnum
+	SealevelchangeViscousIndexEnum
+	RotationalEquatorialMoiEnum
+	TidalLoveHEnum
+	TidalLoveKEnum
+	TidalLoveLEnum
+	TidalLoveK2SecularEnum
+	LoadLoveHEnum
+	LoadLoveKEnum
+	LoadLoveLEnum
+	LoveTimeFreqEnum
+	LoveIsTimeEnum
+	SealevelchangeGSelfAttractionEnum
+	SealevelchangeGViscoElasticEnum
+	SolidearthSettingsSealevelLoadingEnum
+	SolidearthSettingsGRDEnum
+	SolidearthSettingsRunFrequencyEnum
+	SolidearthSettingsTimeAccEnum
+	SealevelchangeHViscoElasticEnum
+	SolidearthSettingsHorizEnum
+	SolidearthSettingsMaxiterEnum
+	SolidearthSettingsGrdOceanEnum
+	SolidearthSettingsOceanAreaScalingEnum
+	RotationalPolarMoiEnum
+	SolidearthSettingsReltolEnum
+	SealevelchangeRequestedOutputsEnum
+	SolidearthSettingsSelfAttractionEnum
+	SolidearthSettingsRotationEnum
+	SolidearthSettingsMaxSHCoeffEnum
+	SealevelchangeRunCountEnum
+	SealevelchangeTransitionsEnum
+	SealevelchangeUViscoElasticEnum
+	SettingsIoGatherEnum
+	SettingsNumResultsOnNodesEnum
+	SettingsOutputFrequencyEnum
+	SettingsCheckpointFrequencyEnum
+	SettingsResultsOnNodesEnum
+	SettingsSbCouplingFrequencyEnum
+	SettingsSolverResidueThresholdEnum
+	SettingsWaitonlockEnum
+	SmbAIceEnum
+	SmbAIdxEnum
+	SmbASnowEnum
+	SmbAccualtiEnum
+	SmbAccugradEnum
+	SmbAccurefEnum
+	SmbAdThreshEnum
+	SmbAutoregressionInitialTimeEnum
+	SmbAutoregressionTimestepEnum
+	SmbAutoregressiveOrderEnum
+	SmbAveragingEnum
+	SmbBeta0Enum
+	SmbBeta1Enum
+	SmbCovmatEnum
+	SmbDesfacEnum
+	SmbDpermilEnum
+	SmbDsnowIdxEnum
+	SmbCldFracEnum
+	SmbDelta18oEnum
+	SmbDelta18oSurfaceEnum
+	SmbDenIdxEnum
+	SmbDtEnum
+	SmbEnum
+	SmbFEnum
+	SmbInitDensityScalingEnum
+	SmbIsaccumulationEnum
+	SmbIsalbedoEnum
+	SmbIsconstrainsurfaceTEnum
+	SmbIsd18opdEnum
+	SmbIsdelta18oEnum
+	SmbIsdensificationEnum
+	SmbIsfirnwarmingEnum
+	SmbIsgraingrowthEnum
+	SmbIsmeltEnum
+	SmbIsmungsmEnum
+	SmbIsprecipscaledEnum
+	SmbIssetpddfacEnum
+	SmbIsshortwaveEnum
+	SmbIstemperaturescaledEnum
+	SmbIsthermalEnum
+	SmbIsturbulentfluxEnum
+	SmbKEnum
+	SmbNumBasinsEnum
+	SmbNumRequestedOutputsEnum
+	SmbPfacEnum
+	SmbPhiEnum
+	SmbRandomflagEnum
+	SmbRdlEnum
+	SmbRequestedOutputsEnum
+	SmbRlapsEnum
+	SmbRlapslgmEnum
+	SmbRunoffaltiEnum
+	SmbRunoffgradEnum
+	SmbRunoffrefEnum
+	SmbSealevEnum
+	SmbStepsPerStepEnum
+	SmbSwIdxEnum
+	SmbT0dryEnum
+	SmbT0wetEnum
+	SmbTdiffEnum
+	SmbThermoDeltaTScalingEnum
+	SmbTemperaturesReconstructedYearsEnum
+	SmbPrecipitationsReconstructedYearsEnum
+	SmoothThicknessMultiplierEnum
+	SolutionTypeEnum
+	SteadystateMaxiterEnum
+	SteadystateNumRequestedOutputsEnum
+	SteadystateReltolEnum
+	SteadystateRequestedOutputsEnum
+	StepEnum
+	StepsEnum
+	StressbalanceAbstolEnum
+	StressbalanceFSreconditioningEnum
+	StressbalanceIsnewtonEnum
+	StressbalanceMaxiterEnum
+	StressbalanceNumRequestedOutputsEnum
+	StressbalancePenaltyFactorEnum
+	StressbalanceReltolEnum
+	StressbalanceRequestedOutputsEnum
+	StressbalanceRestolEnum
+	StressbalanceRiftPenaltyThresholdEnum
+	StressbalanceShelfDampeningEnum
+	ThermalIsdrainicecolumnEnum
+	ThermalIsdynamicbasalspcEnum
+	ThermalIsenthalpyEnum
+	ThermalMaxiterEnum
+	ThermalNumRequestedOutputsEnum
+	ThermalPenaltyFactorEnum
+	ThermalPenaltyLockEnum
+	ThermalPenaltyThresholdEnum
+	ThermalReltolEnum
+	ThermalRequestedOutputsEnum
+	ThermalStabilizationEnum
+	ThermalWatercolumnUpperlimitEnum
+	TimeEnum
+	TimesteppingCflCoefficientEnum
+	TimesteppingCouplingTimeEnum
+	TimesteppingFinalTimeEnum
+	TimesteppingInterpForcingEnum
+	TimesteppingCycleForcingEnum
+	TimesteppingStartTimeEnum
+	TimesteppingTimeStepEnum
+	TimesteppingTimeStepMaxEnum
+	TimesteppingTimeStepMinEnum
+	TimesteppingTypeEnum
+	ToMITgcmCommEnum
+	ToolkitsFileNameEnum
+	ToolkitsOptionsAnalysesEnum
+	ToolkitsOptionsStringsEnum
+	ToolkitsTypesEnum
+	TransientAmrFrequencyEnum
+	TransientIsdamageevolutionEnum
+	TransientIsesaEnum
+	TransientIsgiaEnum
+	TransientIsgroundinglineEnum
+	TransientIshydrologyEnum
+	TransientIsmasstransportEnum 
+	TransientIsoceantransportEnum
+	TransientIsmovingfrontEnum
+	TransientIsoceancouplingEnum
+	TransientIssamplingEnum
+	TransientIsslcEnum
+	TransientIssmbEnum
+	TransientIsstressbalanceEnum
+	TransientIsthermalEnum
+	TransientNumRequestedOutputsEnum
+	TransientRequestedOutputsEnum
+	VelocityEnum
+	XxeEnum
+	YyeEnum
+	ZzeEnum
+	AreaeEnum
+	WorldCommEnum
+	#}}}
+	ParametersENDEnum
+	InputsSTARTEnum
+	#Inputs{{{
+	AccumulatedDeltaBottomPressureEnum
+	AccumulatedDeltaIceThicknessEnum
+	AccumulatedDeltaTwsEnum
+	AdjointEnum
+	AdjointpEnum
+	AdjointxEnum
+	AdjointxBaseEnum
+	AdjointxShearEnum
+	AdjointyEnum
+	AdjointyBaseEnum
+	AdjointyShearEnum
+	AdjointzEnum
+	AirEnum
+	ApproximationEnum
+	BalancethicknessMisfitEnum
+	BalancethicknessOmega0Enum
+	BalancethicknessOmegaEnum
+	BalancethicknessSpcthicknessEnum
+	BalancethicknessThickeningRateEnum
+	BasalCrevasseEnum
+	BasalforcingsFloatingiceMeltingRateEnum
+	BasalforcingsGeothermalfluxEnum
+	BasalforcingsGroundediceMeltingRateEnum
+	BasalforcingsPerturbationMeltingRateEnum
+	BasalforcingsIsmip6BasinIdEnum
+	BasalforcingsIsmip6TfEnum
+	BasalforcingsIsmip6TfShelfEnum
+	BasalforcingsIsmip6MeltAnomalyEnum
+	BasalforcingsMeltrateFactorEnum
+	BasalforcingsOceanSalinityEnum
+	BasalforcingsOceanTempEnum
+	BasalforcingsPicoBasinIdEnum
+	BasalforcingsPicoBoxIdEnum
+	BasalforcingsPicoOverturningCoeffEnum
+	BasalforcingsPicoSubShelfOceanOverturningEnum
+	BasalforcingsPicoSubShelfOceanSalinityEnum
+	BasalforcingsPicoSubShelfOceanTempEnum
+	BasalStressxEnum
+	BasalStressyEnum
+	BasalStressEnum
+	BaseEnum
+	BaseOldEnum
+	BaseSlopeXEnum
+	BaseSlopeYEnum
+	BedEnum
+	BedGRDEnum
+	BedEastEnum
+	BedEastGRDEnum
+	BedNorthEnum
+	BedNorthGRDEnum
+	BedSlopeXEnum
+	BedSlopeYEnum
+	BottomPressureEnum
+	BottomPressureOldEnum
+	CalvingCalvingrateEnum
+	CalvingHabFractionEnum
+	CalvingMeltingrateEnum
+	CalvingStressThresholdFloatingiceEnum
+	CalvingStressThresholdGroundediceEnum
+	CalvinglevermannCoeffEnum
+	CalvingratexAverageEnum
+	CalvingratexEnum
+	CalvingrateyAverageEnum
+	CalvingrateyEnum
+	CalvingFluxLevelsetEnum
+	CalvingMeltingFluxLevelsetEnum
+	ConvergedEnum
+	CrevasseDepthEnum
+	DamageDEnum
+	DamageDOldEnum
+	DamageDbarEnum
+	DamageDbarOldEnum
+	DamageFEnum
+	DegreeOfChannelizationEnum
+	DepthBelowSurfaceEnum
+	DeltaIceThicknessEnum
+	DeltaTwsEnum
+	DeltaBottomPressureEnum
+	DeltaDslEnum
+	DslOldEnum
+	DslEnum
+	DeltaStrEnum
+	StrOldEnum
+	StrEnum
+	DeviatoricStresseffectiveEnum
+	DeviatoricStressxxEnum
+	DeviatoricStressxyEnum
+	DeviatoricStressxzEnum
+	DeviatoricStressyyEnum
+	DeviatoricStressyzEnum
+	DeviatoricStresszzEnum
+	DeviatoricStress1Enum
+	DeviatoricStress2Enum
+	DistanceToCalvingfrontEnum
+	DistanceToGroundinglineEnum
+	Domain2DhorizontalEnum
+	Domain2DverticalEnum
+	Domain3DEnum
+	DragCoefficientAbsGradientEnum
+	DrivingStressXEnum
+	DrivingStressYEnum
+	DummyEnum
+	EffectivePressureEnum
+	EffectivePressureSubstepEnum
+	EffectivePressureTransientEnum
+	EnthalpyEnum
+	EnthalpyPicardEnum
+	EplHeadEnum
+	EplHeadOldEnum
+	EplHeadSlopeXEnum
+	EplHeadSlopeYEnum
+	EplHeadSubstepEnum
+	EplHeadTransientEnum
+	EsaEmotionEnum
+	EsaNmotionEnum
+	EsaRotationrateEnum
+	EsaStrainratexxEnum
+	EsaStrainratexyEnum
+	EsaStrainrateyyEnum
+	EsaUmotionEnum
+	EsaXmotionEnum
+	EsaYmotionEnum
+	EtaDiffEnum
+	FlowequationBorderFSEnum
+	FrictionAsEnum
+	FrictionCEnum
+	FrictionCmaxEnum
+	FrictionCoefficientEnum
+	FrictionCoefficientcoulombEnum
+	FrictionEffectivePressureEnum
+	FrictionMEnum
+	FrictionPEnum
+	FrictionPressureAdjustedTemperatureEnum
+	FrictionQEnum
+	FrictionSedimentCompressibilityCoefficientEnum
+	FrictionTillFrictionAngleEnum
+	FrictionWaterLayerEnum
+	FrictionfEnum
+	FrontalForcingsBasinIdEnum
+	FrontalForcingsSubglacialDischargeEnum
+	FrontalForcingsThermalForcingEnum
+	GeometryHydrostaticRatioEnum
+	NGiaEnum
+	NGiaRateEnum
+	UGiaEnum
+	UGiaRateEnum
+	GradientEnum
+	GroundinglineHeightEnum
+	HydraulicPotentialEnum
+	HydraulicPotentialOldEnum
+	HydrologyBasalFluxEnum
+	HydrologyBumpHeightEnum
+	HydrologyBumpSpacingEnum
+	HydrologydcBasalMoulinInputEnum
+	HydrologydcEplThicknessEnum
+	HydrologydcEplThicknessOldEnum
+	HydrologydcEplThicknessSubstepEnum
+	HydrologydcEplThicknessTransientEnum
+	HydrologydcMaskEplactiveEltEnum
+	HydrologydcMaskEplactiveNodeEnum
+	HydrologydcMaskThawedEltEnum
+	HydrologydcMaskThawedNodeEnum
+	HydrologydcSedimentTransmitivityEnum
+	HydrologyDrainageRateEnum
+	HydrologyEnglacialInputEnum
+	HydrologyGapHeightEnum
+	HydrologyGapHeightXEnum
+	HydrologyGapHeightXXEnum
+	HydrologyGapHeightYEnum
+	HydrologyGapHeightYYEnum
+	HydrologyHeadEnum
+	HydrologyHeadOldEnum
+	HydrologyMoulinInputEnum
+	HydrologyNeumannfluxEnum
+	HydrologyReynoldsEnum
+	HydrologySheetConductivityEnum
+	HydrologySheetThicknessEnum
+	HydrologySheetThicknessOldEnum
+	HydrologyTwsEnum
+	HydrologyTwsSpcEnum
+	HydrologyTwsAnalysisEnum
+	HydrologyWatercolumnMaxEnum
+	HydrologyWaterVxEnum
+	HydrologyWaterVyEnum
+	IceEnum
+	IceMaskNodeActivationEnum
+	InputEnum
+	InversionCostFunctionsCoefficientsEnum
+	InversionSurfaceObsEnum
+	InversionThicknessObsEnum
+	InversionVelObsEnum
+	InversionVxObsEnum
+	InversionVyObsEnum
+	LevelsetfunctionSlopeXEnum
+	LevelsetfunctionSlopeYEnum
+	LevelsetObservationEnum
+	LoadingforceXEnum
+	LoadingforceYEnum
+	LoadingforceZEnum
+	MaskOceanLevelsetEnum
+	MaskIceLevelsetEnum
+	MaskIceRefLevelsetEnum
+	MasstransportSpcthicknessEnum
+	MaterialsRheologyBEnum
+	MaterialsRheologyBbarEnum
+	MaterialsRheologyEEnum
+	MaterialsRheologyEbarEnum
+	MaterialsRheologyEcEnum
+	MaterialsRheologyEcbarEnum
+	MaterialsRheologyEsEnum
+	MaterialsRheologyEsbarEnum
+	MaterialsRheologyNEnum
+	MeshScaleFactorEnum
+	MeshVertexonbaseEnum
+	MeshVertexonboundaryEnum
+	MeshVertexonsurfaceEnum
+	MisfitEnum
+	MovingFrontalVxEnum
+	MovingFrontalVyEnum
+	NeumannfluxEnum
+	NewDamageEnum
+	NodeEnum
+	OmegaAbsGradientEnum
+	OceantransportSpcbottompressureEnum
+	OceantransportSpcstrEnum
+	OceantransportSpcdslEnum
+	P0Enum
+	P1Enum
+	PartitioningEnum
+	PressureEnum
+	RadarEnum
+	RadarAttenuationMacGregorEnum
+	RadarAttenuationWolffEnum
+	RadarIcePeriodEnum
+	RadarPowerMacGregorEnum
+	RadarPowerWolffEnum
+	RheologyBAbsGradientEnum
+	RheologyBInitialguessEnum
+	RheologyBInitialguessMisfitEnum
+	RheologyBbarAbsGradientEnum
+	SampleEnum
+	SamplingBetaEnum
+	SamplingKappaEnum
+	SealevelEnum
+	SealevelGRDEnum
+	SealevelBarystaticMaskEnum
+	SealevelBarystaticIceMaskEnum
+	SealevelBarystaticIceWeightsEnum
+	SealevelBarystaticIceAreaEnum
+	SealevelBarystaticIceLatbarEnum
+	SealevelBarystaticIceLongbarEnum
+	SealevelBarystaticIceLoadEnum
+	SealevelBarystaticHydroMaskEnum
+	SealevelBarystaticHydroWeightsEnum
+	SealevelBarystaticHydroAreaEnum
+	SealevelBarystaticHydroLatbarEnum
+	SealevelBarystaticHydroLongbarEnum
+	SealevelBarystaticHydroLoadEnum
+	SealevelBarystaticBpMaskEnum
+	SealevelBarystaticBpWeightsEnum
+	SealevelBarystaticBpAreaEnum
+	SealevelBarystaticBpLoadEnum
+	SealevelBarystaticOceanMaskEnum
+	SealevelBarystaticOceanWeightsEnum
+	SealevelBarystaticOceanAreaEnum
+	SealevelBarystaticOceanLatbarEnum
+	SealevelBarystaticOceanLongbarEnum
+	SealevelBarystaticOceanLoadEnum
+	SealevelNEsaEnum
+	SealevelNEsaRateEnum
+	SealevelRSLEnum
+	BslcEnum
+	BslcIceEnum
+	BslcHydroEnum
+	BslcOceanEnum
+	BslcRateEnum
+	GmtslcEnum
+	SealevelGrotm1Enum
+	SealevelGrotm2Enum
+	SealevelGrotm3Enum
+	SealevelGUrotm1Enum
+	SealevelGUrotm2Enum
+	SealevelGUrotm3Enum
+	SealevelGNrotm1Enum
+	SealevelGNrotm2Enum
+	SealevelGNrotm3Enum
+	SealevelGErotm1Enum
+	SealevelGErotm2Enum
+	SealevelGErotm3Enum
+	SealevelRSLBarystaticEnum
+	SealevelRSLRateEnum
+	SealevelUGrdEnum
+	SealevelNGrdEnum
+	SealevelUEastEsaEnum
+	SealevelUNorthEsaEnum
+	SealevelchangeIndicesEnum
+	SealevelchangeGEnum
+	SealevelchangeGUEnum
+	SealevelchangeGEEnum
+	SealevelchangeGNEnum
+	SealevelchangeGsubelOceanEnum
+	SealevelchangeGUsubelOceanEnum
+	SealevelchangeGEsubelOceanEnum
+	SealevelchangeGNsubelOceanEnum
+	SealevelchangeGsubelIceEnum
+	SealevelchangeGUsubelIceEnum
+	SealevelchangeGEsubelIceEnum
+	SealevelchangeGNsubelIceEnum
+	SealevelchangeGsubelHydroEnum
+	SealevelchangeGUsubelHydroEnum
+	SealevelchangeGEsubelHydroEnum
+	SealevelchangeGNsubelHydroEnum
+	SealevelchangeViscousRSLEnum
+	SealevelchangeViscousUEnum
+	SealevelchangeViscousNEnum
+	SealevelchangeViscousEEnum
+	SedimentHeadEnum
+	SedimentHeadOldEnum
+	SedimentHeadSubstepEnum
+	SedimentHeadTransientEnum
+	SedimentHeadResidualEnum
+	SedimentHeadStackedEnum
+	SigmaNNEnum
+	SigmaVMEnum
+	SmbAccumulatedECEnum
+	SmbAccumulatedMassBalanceEnum
+	SmbAccumulatedMeltEnum
+	SmbAccumulatedPrecipitationEnum
+	SmbAccumulatedRainEnum
+	SmbAccumulatedRefreezeEnum
+	SmbAccumulatedRunoffEnum
+	SmbAEnum
+	SmbAdiffEnum
+	SmbAValueEnum
+	SmbAccumulationEnum
+	SmbAdiffiniEnum
+	SmbAiniEnum
+	SmbBasinsIdEnum
+	SmbBMaxEnum
+	SmbBMinEnum
+	SmbBNegEnum
+	SmbBPosEnum
+	SmbCEnum
+	SmbCcsnowValueEnum
+	SmbCciceValueEnum
+	SmbCotValueEnum
+	SmbDEnum
+	SmbDailyairdensityEnum
+	SmbDailyairhumidityEnum
+	SmbDailydlradiationEnum
+	SmbDailydsradiationEnum
+	SmbDailypressureEnum
+	SmbDailyrainfallEnum
+	SmbDailysnowfallEnum
+	SmbDailytemperatureEnum
+	SmbDailywindspeedEnum
+	SmbDiniEnum
+	SmbDlwrfEnum
+	SmbDswrfEnum
+	SmbDswdiffrfEnum
+	SmbDzAddEnum
+	SmbDzEnum
+	SmbDzMinEnum
+	SmbDzTopEnum
+	SmbDziniEnum
+	SmbEAirEnum
+	SmbECEnum
+	SmbECDtEnum
+	SmbECiniEnum
+	SmbElaEnum
+	SmbEvaporationEnum
+	SmbFACEnum
+	SmbGdnEnum
+	SmbGdniniEnum
+	SmbGspEnum
+	SmbGspiniEnum
+	SmbHrefEnum
+	SmbIsInitializedEnum
+	SmbMAddEnum
+	SmbMassBalanceEnum
+	SmbMassBalanceSubstepEnum
+	SmbMassBalanceTransientEnum
+	SmbMeanLHFEnum
+	SmbMeanSHFEnum
+	SmbMeanULWEnum
+	SmbMeltEnum
+	SmbMInitnum
+	SmbMonthlytemperaturesEnum
+	SmbMSurfEnum
+	SmbNetLWEnum
+	SmbNetSWEnum
+	SmbPAirEnum
+	SmbPEnum
+	SmbPddfacIceEnum
+	SmbPddfacSnowEnum
+	SmbPrecipitationEnum
+	SmbPrecipitationsAnomalyEnum
+	SmbPrecipitationsLgmEnum
+	SmbPrecipitationsPresentdayEnum
+	SmbPrecipitationsReconstructedEnum
+	SmbRainEnum
+	SmbReEnum
+	SmbRefreezeEnum
+	SmbReiniEnum
+	SmbRunoffEnum
+	SmbRunoffSubstepEnum
+	SmbRunoffTransientEnum
+	SmbS0gcmEnum
+	SmbS0pEnum
+	SmbS0tEnum
+	SmbSizeiniEnum
+	SmbSmbCorrEnum
+	SmbSmbrefEnum
+	SmbSzaValueEnum
+	SmbTEnum
+	SmbTaEnum
+	SmbTeValueEnum
+	SmbTemperaturesAnomalyEnum
+	SmbTemperaturesLgmEnum
+	SmbTemperaturesPresentdayEnum
+	SmbTemperaturesReconstructedEnum
+	SmbTiniEnum
+	SmbTmeanEnum
+	SmbTzEnum
+	SmbValuesAutoregressionEnum
+	SmbVEnum
+	SmbVmeanEnum
+	SmbVzEnum
+	SmbWEnum
+	SmbWAddEnum
+	SmbWiniEnum
+	SmbZMaxEnum
+	SmbZMinEnum
+	SmbZTopEnum
+	SmbZYEnum
+	SolidearthExternalDisplacementEastRateEnum
+	SolidearthExternalDisplacementNorthRateEnum
+	SolidearthExternalDisplacementUpRateEnum
+	SolidearthExternalGeoidRateEnum
+	StrainRateeffectiveEnum
+	StrainRateparallelEnum
+	StrainRateperpendicularEnum
+	StrainRatexxEnum
+	StrainRatexyEnum
+	StrainRatexzEnum
+	StrainRateyyEnum
+	StrainRateyzEnum
+	StrainRatezzEnum
+	StressMaxPrincipalEnum
+	StressTensorxxEnum
+	StressTensorxyEnum
+	StressTensorxzEnum
+	StressTensoryyEnum
+	StressTensoryzEnum
+	StressTensorzzEnum
+	SurfaceAbsMisfitEnum
+	SurfaceAbsVelMisfitEnum
+	AreaEnum
+	SealevelAreaEnum
+	SurfaceAreaEnum
+	SurfaceAverageVelMisfitEnum
+	SurfaceCrevasseEnum
+	SurfaceEnum
+	SurfaceOldEnum
+	SurfaceLogVelMisfitEnum
+	SurfaceLogVxVyMisfitEnum
+	SurfaceObservationEnum
+	SurfaceRelVelMisfitEnum
+	SurfaceSlopeXEnum
+	SurfaceSlopeYEnum
+	TemperatureEnum
+	TemperaturePDDEnum
+	TemperaturePicardEnum
+	TemperatureSEMICEnum
+	ThermalSpctemperatureEnum
+	ThicknessAbsGradientEnum
+	ThicknessAbsMisfitEnum
+	ThicknessAcrossGradientEnum
+	ThicknessAlongGradientEnum
+	ThicknessEnum
+	ThicknessOldEnum
+	ThicknessPositiveEnum
+	ThicknessResidualEnum
+	TransientAccumulatedDeltaIceThicknessEnum
+	VelEnum
+	VxAverageEnum
+	VxBaseEnum
+	VxEnum
+	VxMeshEnum
+	VxObsEnum
+	VxShearEnum
+	VxSurfaceEnum
+	VyAverageEnum
+	VyBaseEnum
+	VyEnum
+	VyMeshEnum
+	VyObsEnum
+	VyShearEnum
+	VySurfaceEnum
+	VzEnum
+	VzFSEnum
+	VzHOEnum
+	VzMeshEnum
+	VzSSAEnum
+	WaterColumnOldEnum
+	WatercolumnEnum
+	WaterfractionDrainageEnum
+	WaterfractionDrainageIntegratedEnum
+	WaterfractionEnum
+	WaterheightEnum
+	WeightsLevelsetObservationEnum
+	WeightsSurfaceObservationEnum
+	OldAccumulatedDeltaBottomPressureEnum
+	OldAccumulatedDeltaIceThicknessEnum
+	OldAccumulatedDeltaTwsEnum
+	Outputdefinition1Enum
+	Outputdefinition10Enum
+	Outputdefinition11Enum
+	Outputdefinition12Enum
+	Outputdefinition13Enum
+	Outputdefinition14Enum
+	Outputdefinition15Enum
+	Outputdefinition16Enum
+	Outputdefinition17Enum
+	Outputdefinition18Enum
+	Outputdefinition19Enum
+	Outputdefinition20Enum
+	Outputdefinition21Enum
+	Outputdefinition22Enum
+	Outputdefinition23Enum
+	Outputdefinition24Enum
+	Outputdefinition25Enum
+	Outputdefinition26Enum
+	Outputdefinition27Enum
+	Outputdefinition28Enum
+	Outputdefinition29Enum
+	Outputdefinition2Enum
+	Outputdefinition30Enum
+	Outputdefinition31Enum
+	Outputdefinition32Enum
+	Outputdefinition33Enum
+	Outputdefinition34Enum
+	Outputdefinition35Enum
+	Outputdefinition36Enum
+	Outputdefinition37Enum
+	Outputdefinition38Enum
+	Outputdefinition39Enum
+	Outputdefinition3Enum
+	Outputdefinition40Enum
+	Outputdefinition41Enum
+	Outputdefinition42Enum
+	Outputdefinition43Enum
+	Outputdefinition44Enum
+	Outputdefinition45Enum
+	Outputdefinition46Enum
+	Outputdefinition47Enum
+	Outputdefinition48Enum
+	Outputdefinition49Enum
+	Outputdefinition4Enum
+	Outputdefinition50Enum
+	Outputdefinition51Enum
+	Outputdefinition52Enum
+	Outputdefinition53Enum
+	Outputdefinition54Enum
+	Outputdefinition55Enum
+	Outputdefinition56Enum
+	Outputdefinition57Enum
+	Outputdefinition58Enum
+	Outputdefinition59Enum
+	Outputdefinition5Enum
+	Outputdefinition60Enum
+	Outputdefinition61Enum
+	Outputdefinition62Enum
+	Outputdefinition63Enum
+	Outputdefinition64Enum
+	Outputdefinition65Enum
+	Outputdefinition66Enum
+	Outputdefinition67Enum
+	Outputdefinition68Enum
+	Outputdefinition69Enum
+	Outputdefinition6Enum
+	Outputdefinition70Enum
+	Outputdefinition71Enum
+	Outputdefinition72Enum
+	Outputdefinition73Enum
+	Outputdefinition74Enum
+	Outputdefinition75Enum
+	Outputdefinition76Enum
+	Outputdefinition77Enum
+	Outputdefinition78Enum
+	Outputdefinition79Enum
+	Outputdefinition7Enum
+	Outputdefinition80Enum
+	Outputdefinition81Enum
+	Outputdefinition82Enum
+	Outputdefinition83Enum
+	Outputdefinition84Enum
+	Outputdefinition85Enum
+	Outputdefinition86Enum
+	Outputdefinition87Enum
+	Outputdefinition88Enum
+	Outputdefinition89Enum
+	Outputdefinition8Enum
+	Outputdefinition90Enum
+	Outputdefinition91Enum
+	Outputdefinition92Enum
+	Outputdefinition93Enum
+	Outputdefinition94Enum
+	Outputdefinition95Enum
+	Outputdefinition96Enum
+	Outputdefinition97Enum
+	Outputdefinition98Enum
+	Outputdefinition99Enum
+	Outputdefinition9Enum
+	Outputdefinition100Enum
+	#}}}
+	InputsENDEnum
+	#Other{{{
+	AbsoluteEnum
+	AdaptiveTimesteppingEnum
+	AdjointBalancethickness2AnalysisEnum
+	AdjointBalancethicknessAnalysisEnum
+	AdjointHorizAnalysisEnum
+	AggressiveMigrationEnum
+	AmrBamgEnum
+	AmrNeopzEnum
+	AndroidFrictionCoefficientEnum
+	ArrheniusEnum
+	AutodiffJacobianEnum
+	Balancethickness2AnalysisEnum
+	Balancethickness2SolutionEnum
+	BalancethicknessAnalysisEnum
+	BalancethicknessApparentMassbalanceEnum
+	BalancethicknessSoftAnalysisEnum
+	BalancethicknessSoftSolutionEnum
+	BalancethicknessSolutionEnum
+	BalancevelocityAnalysisEnum
+	BalancevelocitySolutionEnum
+	BasalforcingsIsmip6Enum
+	BasalforcingsPicoEnum
+	BeckmannGoosseFloatingMeltRateEnum
+	BedSlopeSolutionEnum
+	BoolExternalResultEnum
+	BoolInputEnum
+	IntInputEnum
+	DoubleInputEnum
+	BoolParamEnum
+	BoundaryEnum
+	BuddJackaEnum
+	CalvingDev2Enum
+	CalvingHabEnum
+	CalvingLevermannEnum
+	CalvingVonmisesEnum
+	CfdragcoeffabsgradEnum
+	CfsurfacelogvelEnum
+	CfsurfacesquareEnum
+	CflevelsetmisfitEnum
+	ChannelEnum
+	ChannelAreaEnum
+	ChannelAreaOldEnum
+	ChannelDischargeEnum
+	ClosedEnum
+	ColinearEnum
+	ConstraintsEnum
+	ContactEnum
+	ContourEnum
+	ContoursEnum
+	ControlInputEnum
+	ControlInputGradEnum
+	ControlInputMaxsEnum
+	ControlInputMinsEnum
+	ControlInputValuesEnum
+	CrouzeixRaviartEnum
+	CuffeyEnum
+	CuffeyTemperateEnum
+	DamageEvolutionAnalysisEnum
+	DamageEvolutionSolutionEnum
+	DataSetEnum
+	DataSetParamEnum
+	DatasetInputEnum
+	DefaultAnalysisEnum
+	DefaultCalvingEnum
+	DenseEnum
+	DependentObjectEnum
+	DepthAverageAnalysisEnum
+	DeviatoricStressErrorEstimatorEnum
+	DivergenceEnum
+	Domain3DsurfaceEnum
+	DoubleArrayInputEnum
+	ArrayInputEnum
+	DoubleExternalResultEnum
+	DoubleMatArrayParamEnum
+	DoubleMatExternalResultEnum
+	DoubleMatParamEnum
+	DoubleParamEnum
+	DoubleVecParamEnum
+	ElementEnum
+	ElementHookEnum
+	ElementSIdEnum
+	EnthalpyAnalysisEnum
+	EsaAnalysisEnum
+	EsaSolutionEnum
+	EsaTransitionsEnum
+	ExternalResultEnum
+	ExtrapolationAnalysisEnum
+	ExtrudeFromBaseAnalysisEnum
+	ExtrudeFromTopAnalysisEnum
+	FSApproximationEnum
+	FSSolverEnum
+	FSpressureEnum
+	FSvelocityEnum
+	FemModelEnum
+	FileParamEnum
+	FixedTimesteppingEnum
+	FloatingAreaEnum
+	FloatingAreaScaledEnum
+	FloatingMeltRateEnum
+	FreeEnum
+	FreeSurfaceBaseAnalysisEnum
+	FreeSurfaceTopAnalysisEnum
+	FrontalForcingsDefaultEnum
+	FrontalForcingsRignotEnum
+	FsetEnum
+	FullMeltOnPartiallyFloatingEnum
+	GLheightadvectionAnalysisEnum
+	GaussPentaEnum
+	GaussSegEnum
+	GaussTetraEnum
+	GaussTriaEnum
+	GenericOptionEnum
+	GenericParamEnum
+	GenericExternalResultEnum
+	Gradient1Enum
+	Gradient2Enum
+	Gradient3Enum
+	Gradient4Enum
+	GroundedAreaEnum
+	GroundedAreaScaledEnum
+	GroundingOnlyEnum
+	GroundinglineMassFluxEnum
+	GsetEnum
+	GslEnum
+	HOApproximationEnum
+	HOFSApproximationEnum
+	HookEnum
+	HydrologyDCEfficientAnalysisEnum
+	HydrologyDCInefficientAnalysisEnum
+	HydrologyGlaDSAnalysisEnum
+	HydrologyGlaDSEnum
+	HydrologyPismAnalysisEnum
+	HydrologyShaktiAnalysisEnum
+	HydrologyShreveAnalysisEnum
+	HydrologySolutionEnum
+	HydrologydcEnum
+	HydrologypismEnum
+	HydrologyshaktiEnum
+	HydrologyshreveEnum
+	IceMassEnum
+	IceMassScaledEnum
+	IceVolumeAboveFloatationEnum
+	IceVolumeAboveFloatationScaledEnum
+	IceVolumeEnum
+	IceVolumeScaledEnum
+	IcefrontMassFluxEnum
+	IcefrontMassFluxLevelsetEnum
+	IncrementalEnum
+	IndexedEnum
+	IntExternalResultEnum
+	ElementInputEnum
+	IntMatExternalResultEnum
+	IntMatParamEnum
+	IntParamEnum
+	IntVecParamEnum
+	InputsEnum
+	InternalEnum
+	IntersectEnum
+	InversionVzObsEnum
+	JEnum
+	L1L2ApproximationEnum
+	MLHOApproximationEnum
+	L2ProjectionBaseAnalysisEnum
+	L2ProjectionEPLAnalysisEnum
+	LACrouzeixRaviartEnum
+	LATaylorHoodEnum
+	LambdaSEnum
+	LevelsetAnalysisEnum
+	LevelsetfunctionPicardEnum
+	LinearFloatingMeltRateEnum
+	LliboutryDuvalEnum
+	LoadsEnum
+	LoveAnalysisEnum
+	LoveHiEnum
+	LoveHrEnum
+	LoveKernelsImagEnum
+	LoveKernelsRealEnum
+	LoveKiEnum
+	LoveKrEnum
+	LoveLiEnum
+	LoveLrEnum
+	LoveSolutionEnum
+	MINIEnum
+	MINIcondensedEnum
+	MantlePlumeGeothermalFluxEnum
+	MassFluxEnum
+	MassconEnum
+	MassconaxpbyEnum
+	MassfluxatgateEnum
+	MasstransportAnalysisEnum
+	MasstransportSolutionEnum
+	MatdamageiceEnum
+	MatenhancediceEnum
+	MaterialsEnum
+	MatestarEnum
+	MaticeEnum
+	MatlithoEnum
+	MathydroEnum
+	MatrixParamEnum
+	MaxAbsVxEnum
+	MaxAbsVyEnum
+	MaxAbsVzEnum
+	MaxDivergenceEnum
+	MaxVelEnum
+	MaxVxEnum
+	MaxVyEnum
+	MaxVzEnum
+	MelangeEnum
+	MeltingAnalysisEnum
+	MeshElementsEnum
+	MeshXEnum
+	MeshYEnum
+	MinVelEnum
+	MinVxEnum
+	MinVyEnum
+	MinVzEnum
+	MismipFloatingMeltRateEnum
+	MoulinEnum
+	MpiDenseEnum
+	MpiEnum
+	MpiSparseEnum
+	MumpsEnum
+	NoFrictionOnPartiallyFloatingEnum
+	NoMeltOnPartiallyFloatingEnum
+	NodalEnum
+	NodalvalueEnum
+	NodeSIdEnum
+	NoneApproximationEnum
+	NoneEnum
+	NumberedcostfunctionEnum
+	NyeCO2Enum
+	NyeH2OEnum
+	NumericalfluxEnum
+	OceantransportAnalysisEnum
+	OceantransportSolutionEnum
+	OldGradientEnum
+	OneLayerP4zEnum
+	OpenEnum
+	OptionEnum
+	ParamEnum
+	ParametersEnum
+	P0ArrayEnum
+	P0DGEnum
+	P1DGEnum
+	P1P1Enum
+	P1P1GLSEnum
+	P1bubbleEnum
+	P1bubblecondensedEnum
+	P1xP2Enum
+	P1xP3Enum
+	P1xP4Enum
+	P2Enum
+	P2bubbleEnum
+	P2bubblecondensedEnum
+	P2xP1Enum
+	P2xP4Enum
+	PatersonEnum
+	PengridEnum
+	PenpairEnum
+	PentaEnum
+	PentaInputEnum
+	ProfilerEnum
+	ProfilingCurrentFlopsEnum
+	ProfilingCurrentMemEnum
+	ProfilingSolutionTimeEnum
+	RegionaloutputEnum
+	RegularEnum
+	RecoveryAnalysisEnum
+	RiftfrontEnum
+	SamplingAnalysisEnum
+	SamplingSolutionEnum
+	SIAApproximationEnum
+	SMBautoregressionEnum
+	SMBcomponentsEnum
+	SMBd18opddEnum
+	SMBforcingEnum
+	SMBgcmEnum
+	SMBgembEnum
+	SMBgradientsEnum
+	SMBgradientscomponentsEnum
+	SMBgradientselaEnum
+	SMBhenningEnum
+	SMBmeltcomponentsEnum
+	SMBpddEnum
+	SMBpddSicopolisEnum
+	SMBsemicEnum
+	SSAApproximationEnum
+	SSAFSApproximationEnum
+	SSAHOApproximationEnum
+	ScaledEnum
+	SealevelAbsoluteEnum
+	SealevelEmotionEnum
+	SealevelInertiaTensorXZEnum
+	SealevelInertiaTensorYZEnum
+	SealevelInertiaTensorZZEnum
+	SealevelchangePolarMotionEnum
+	SealevelNmotionEnum
+	SealevelUmotionEnum
+	SealevelchangeAnalysisEnum
+	SegEnum
+	SegInputEnum
+	SegmentEnum
+	SegmentRiftfrontEnum
+	SeparateEnum
+	SeqEnum
+	SmbAnalysisEnum
+	SmbSolutionEnum
+	SmoothAnalysisEnum
+	SoftMigrationEnum
+	SpatialLinearFloatingMeltRateEnum
+	SpcDynamicEnum
+	SpcStaticEnum
+	SpcTransientEnum
+	SsetEnum
+	StatisticsSolutionEnum
+	SteadystateSolutionEnum
+	StressIntensityFactorEnum
+	StressbalanceAnalysisEnum
+	StressbalanceConvergenceNumStepsEnum
+	StressbalanceSIAAnalysisEnum
+	StressbalanceSolutionEnum
+	StressbalanceVerticalAnalysisEnum
+	StringArrayParamEnum
+	StringExternalResultEnum
+	StringParamEnum
+	SubelementFriction1Enum
+	SubelementFriction2Enum
+	SubelementMelt1Enum
+	SubelementMelt2Enum
+	SubelementMigrationEnum
+	SurfaceSlopeSolutionEnum
+	TaylorHoodEnum
+	TetraEnum
+	TetraInputEnum
+	ThermalAnalysisEnum
+	ThermalSolutionEnum
+	ThicknessErrorEstimatorEnum
+	TotalCalvingFluxLevelsetEnum
+	TotalCalvingMeltingFluxLevelsetEnum
+	TotalFloatingBmbEnum
+	TotalFloatingBmbScaledEnum
+	TotalGroundedBmbEnum
+	TotalGroundedBmbScaledEnum
+	TotalSmbEnum
+	TotalSmbScaledEnum
+	TransientArrayParamEnum
+	TransientInputEnum
+	TransientParamEnum
+	TransientSolutionEnum
+	TriaEnum
+	TriaInputEnum
+	UzawaPressureAnalysisEnum
+	VectorParamEnum
+	VertexEnum
+	VertexLIdEnum
+	VertexPIdEnum
+	VertexSIdEnum
+	VerticesEnum
+	ViscousHeatingEnum
+	WaterEnum
+	XTaylorHoodEnum
+	XYEnum
+	XYZEnum
+	#}}}
+	MaximumNumberOfDefinitionsEnum
+end
+
+function EnumToString(enum::IssmEnum)
+
+	#Make dictionnary from enums
+	inst = instances(IssmEnum)
+	syms = Symbol.(inst)
+	enumdic = Dict(zip(inst, syms))
+
+	return enumdic[enum]
+end
+
+function EnumToString(enum::Int64)
+	return EnumToString(IssmEnum(enum))
+end
+
+function StringToEnum(string::String)
+
+	#Make dictionnary from enums
+	inst = instances(IssmEnum)
+	syms = Symbol.(inst)
+	enumdic = Dict(zip(syms, inst))
+
+	return enumdic[Symbol(string)]
+end
+
+function StringToEnumInt(string::String)
+	return Integer(StringToEnum(string))
+end
Index: /issm/trunk-jpl/src/jl/solve/modules.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/modules.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/modules.jl	(revision 26629)
@@ -0,0 +1,111 @@
+#Model Processor
+function FetchDataToInput(md::model,inputs::Inputs,elements::Vector{Tria},data::Vector{Float64},enum::IssmEnum) #{{{
+	for i in 1:length(elements)
+		InputCreate(elements[i],inputs,data,enum)
+	end
+end#}}}
+function ModelProcessor(md::model) #{{{
+
+	#Initialize structures
+	elements    = Vector{Tria}(undef,0)
+	vertices    = Vector{Vertex}(undef,0)
+	nodes       = Vector{Node}(undef,0)
+	constraints = Vector{Constraint}(undef,0)
+	parameters  = Parameters(Dict{IssmEnum,Parameter}())
+	inputs      = Inputs(md.mesh.numberofelements,md.mesh.numberofvertices,Dict{IssmEnum,Input}())
+
+	#Create  elements, vertices and materials (independent of the analysis)
+	CreateElements(elements,md)
+	CreateVertices(vertices,md)
+	CreateParameters(parameters,md)
+	CreateInputs(inputs,elements,md)
+
+	#Now create analysis specific data structure
+	analysis = StressbalanceAnalysis()
+	UpdateParameters(analysis,parameters,md)
+	CreateNodes(analysis,nodes,md)
+	UpdateElements(analysis,elements,inputs,md)
+	CreateConstraints(analysis,constraints,md)
+
+	#Configure objects
+	ConfigureObjectx(elements,nodes,vertices,parameters,inputs)
+
+	#Constrain and Number nodes
+	SpcNodesx(nodes,constraints,parameters)
+	NodesDofx(nodes,parameters)
+	error("STOP")
+
+	#Build FemModel
+	return FemModel(elements,vertices,nodes,parameters,inputs,constraints)
+end# }}}
+function CreateElements(elements::Vector{Tria},md::model) #{{{
+
+	#Make sure elements is currently empty
+	@assert length(elements)==0
+
+	tempparams   = Parameters(Dict{IssmEnum,Parameter}())
+	tempinputs   = Inputs(-1,-1,Dict{IssmEnum,Input}())
+	tempvertices = Vector{Vertex}(undef,3)
+	tempnodes    = Vector{Node}(undef,3)
+
+	count = 0
+	for i in 1:md.mesh.numberofelements
+
+		#Assume Linear Elements for now
+		vertexids = md.mesh.elements[i,:]
+		nodeids   = md.mesh.elements[i,:]
+
+		#Call constructor and add to dataset elements
+		push!(elements,Tria(i,count,vertexids,tempvertices,nodeids,tempnodes,tempparams,tempinputs))
+	end
+
+end# }}}
+function CreateVertices(vertices::Vector{Vertex},md::model) #{{{
+
+	#Make sure vertices is currently empty
+	@assert length(vertices)==0
+
+	#Get data from md
+	x = md.mesh.x
+	y = md.mesh.y
+
+	count = 0
+	for i in 1:md.mesh.numberofvertices
+		push!(vertices,Vertex(i,x[i],y[i]))
+	end
+
+end# }}}
+function CreateParameters(parameters::Parameters,md::model) #{{{
+
+	#Get data from md
+	AddParam(parameters,md.materials.rho_ice,MaterialsRhoIceEnum)
+	AddParam(parameters,md.materials.rho_water,MaterialsRhoSeawaterEnum)
+	AddParam(parameters,md.materials.rho_freshwater,MaterialsRhoFreshwaterEnum)
+end# }}}
+function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{
+
+	#Only assume we have Matice for now
+	FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum)
+	FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum)
+end# }}}
+
+#Other modules
+function ConfigureObjectx(elements::Vector{Tria},nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) #{{{
+
+	for i in 1:length(elements)
+		Configure(elements[i],nodes,vertices,parameters,inputs)
+	end
+
+end# }}}
+function SpcNodesx(nodes::Vector{Node},constraints::Vector{Constraint},parameters::Parameters) #{{{
+
+	for i in 1:length(constraints)
+		ConstrainNode(constraints[i],nodes,parameters)
+	end
+
+end# }}}
+function NodesDofx(nodes::Vector{Node}, parameters::Parameters) #{{{
+
+	error("not implemented yet")
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/solve/nodes.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/nodes.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/nodes.jl	(revision 26629)
@@ -0,0 +1,33 @@
+#Node class definition
+mutable struct Node #{{{
+	id::Int64
+	sid::Int64
+	indexingupdate::Bool
+	gsize::Int64
+	gdoflist::Vector{Int64}
+	fdoflist::Vector{Int64}
+	sdoflist::Vector{Int64}
+	svalues::Vector{Float64}
+end# }}}
+
+#Node functions
+function Base.show(io::IO, this::Node)# {{{
+
+	println(io,"Node:")
+	println(io,"   id:  ",this.id)
+	println(io,"   sid: ",this.sid)
+	println(io,"   indexingupdate: ",this.indexingupdate)
+	println(io,"   gsize: ",this.gsize)
+	println(io,"   gdoflist: ",this.gdoflist)
+	println(io,"   fdoflist: ",this.fdoflist)
+	println(io,"   sdoflist: ",this.sdoflist)
+	println(io,"   svalues: ",this.svalues)
+end# }}}
+function ApplyConstraint(node::Node,dof::Int8,value::Float64) #{{{
+
+	node.indexingupdate = true
+	node.fdoflist[dof]  = -1
+	node.sdoflist[dof]  = +1
+	node.svalues[dof]   = value
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/solve/parameters.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/parameters.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/parameters.jl	(revision 26629)
@@ -0,0 +1,46 @@
+#Parameter class definition
+abstract type Parameter end
+struct DoubleParam <: Parameter #{{{
+	enum::IssmEnum
+	value::Float64
+end# }}}
+struct IntParam <: Parameter #{{{
+	enum::IssmEnum
+	value::Int64
+end# }}}
+
+#Parameters dataset class definition
+mutable struct Parameters #{{{
+	lookup::Dict{IssmEnum,Parameter}
+end# }}}
+
+#Parameter functions
+function GetParameterValue(param::DoubleParam) #{{{
+	return param.value
+end#}}}
+function GetParameterValue(param::IntParam) #{{{
+	return param.value
+end#}}}
+
+#Parameters functions
+function AddParam(parameters::Parameters,value::Float64,enum::IssmEnum) #{{{
+
+	parameters.lookup[enum] = DoubleParam(enum,value)
+
+end#}}}
+function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
+
+	parameters.lookup[enum] = IntParam(enum,value)
+
+end#}}}
+function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
+
+	parameters.lookup[enum] = IntParam(enum,value)
+
+end#}}}
+function FindParam(parameters::Parameters,enum::IssmEnum) #{{{
+
+	param = parameters.lookup[enum]
+	return GetParameterValue(param)
+
+end#}}}
Index: /issm/trunk-jpl/src/jl/solve/solve.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/solve.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/solve.jl	(revision 26629)
@@ -0,0 +1,26 @@
+include("../md/classes.jl")
+include("./issmenums.jl")
+include("./parameters.jl")
+include("./inputs.jl")
+include("./vertices.jl")
+include("./nodes.jl")
+include("./elements.jl")
+include("./constraints.jl")
+include("./femmodel.jl")
+include("./analyses.jl")
+include("./gauss.jl")
+include("./modules.jl")
+
+function IssmCore(md::model) #{{{
+
+	#Construct FemModel
+	femmodel=ModelProcessor(md)
+
+	#Solve
+	analysis = StressbalanceAnalysis()
+	Core(analysis,femmodel)
+
+	#then what??
+	error("STOP")
+
+end# }}}
Index: /issm/trunk-jpl/src/jl/solve/vertices.jl
===================================================================
--- /issm/trunk-jpl/src/jl/solve/vertices.jl	(revision 26629)
+++ /issm/trunk-jpl/src/jl/solve/vertices.jl	(revision 26629)
@@ -0,0 +1,6 @@
+#Vertex class definition
+mutable struct Vertex#{{{
+	sid::Int64
+	x::Float64
+	y::Float64
+end# }}}
Index: sm/trunk-jpl/src/jl/triangle.jl
===================================================================
--- /issm/trunk-jpl/src/jl/triangle.jl	(revision 26628)
+++ 	(revision )
@@ -1,180 +1,0 @@
-
-#Class Triangle's triangulateio
-mutable struct CTriangulateIO #{{{
-
-    pointlist :: Ptr{Cdouble}
-    pointattributelist :: Ptr{Cdouble}
-    pointmarkerlist :: Ptr{Cint}
-    numberofpoints :: Cint
-    numberofpointattributes :: Cint
-    
-    trianglelist :: Ptr{Cint}
-    triangleattributelist :: Ptr{Cdouble}
-    trianglearealist :: Ptr{Cdouble}
-    neighborlist :: Ptr{Cint}
-    numberoftriangles :: Cint
-    numberofcorners :: Cint
-    numberoftriangleattributes :: Cint
-    
-    segmentlist :: Ptr{Cint}
-    segmentmarkerlist :: Ptr{Cint}
-    numberofsegments :: Cint
-
-    holelist :: Ptr{Cdouble}
-    numberofholes :: Cint
-
-    regionlist :: Ptr{Cdouble}
-    numberofregions :: Cint
-
-    edgelist :: Ptr{Cint}
-    edgemarkerlist :: Ptr{Cint}
-    normlist :: Ptr{Cdouble}
-    numberofedges :: Cint
- end  #}}}
-function CTriangulateIO() #{{{
-	return CTriangulateIO(C_NULL, C_NULL, C_NULL, 0, 0,
-								 C_NULL, C_NULL, C_NULL, C_NULL, 0, 0, 0,
-								 C_NULL, C_NULL, 0,
-								 C_NULL, 0,
-								 C_NULL, 0,
-								 C_NULL, C_NULL, C_NULL, 0)
-end# }}}
-function Base.show(io::IO, tio::CTriangulateIO)# {{{
-	println(io,"CTriangulateIO(")
-	for name in fieldnames(typeof(tio))
-		a=getfield(tio,name)
-		print(io,"$(name) = ")
-		println(io,a)
-	end
-	println(io,")")
-end# }}}
-
-using Printf #needed for sprintf
-include("classes.jl")
-include("exp.jl")
-
-"""
-TRIANGLE - create model mesh using the triangle package
-
-	This function creates a model mesh using Triangle and a domain outline, to
-	within a certain resolution
-#Arguments
- - md is a model tuple
- - domainname is the name of an Argus domain outline file
- - resolution:  is a characteristic length for the mesh (same unit as the domain outline unit)
-
-# Usage:
- - md=triangle(md,domainname,resolution)
-# Examples:
- - md=triangle(md,'DomainOutline.exp',1000);
- - md=triangle(md,'DomainOutline.exp','Rifts.exp',1500);
-"""
-function triangle(md::model,domainname::String,resolution::Float64) #{{{
-
-	#read input file
-	contours = expread(domainname)
-	area     = resolution^2
-
-	#Initialize i/o structures
-	ctio_in  = CTriangulateIO();
-	ctio_out = CTriangulateIO();
-	vor_out  = CTriangulateIO();
-
-	#Construct input structure
-	numberofpoints   = 0
-	numberofsegments = 0
-	for i in 1:length(contours)
-		numberofpoints   += contours[i].nods-1
-		numberofsegments += contours[i].nods-1
-	end
-	numberofpointattributes = 1
-
-	pointlist=Array{Cdouble,2}(undef,2,numberofpoints)
-	count = 0
-	for i in 1:length(contours)
-		nods = contours[i].nods
-		pointlist[1,count+1:count+nods-1] = contours[i].x[1:end-1]
-		pointlist[2,count+1:count+nods-1] = contours[i].y[1:end-1]
-		count += (nods-1)
-	end
-	pointattributelist=Array{Cdouble,1}(undef,numberofpoints)
-	pointmarkerlist=Array{Cint,1}(undef,numberofpoints)
-	for i in 1:numberofpoints
-		pointmarkerlist[i]=0
-		pointattributelist[i]=0.
-	end
-
-	counter=0;
-   backcounter=0;
-	segmentlist=Array{Cint,2}(undef,2,numberofsegments)
-	segmentmarkerlist=Array{Cint,1}(undef,numberofsegments)
-	segmentmarkerlist[:].=0
-	for i in 1:length(contours)
-		nods = contours[i].nods
-		segmentlist[1,counter+1:counter+nods-2] = collect(counter+0:counter+nods-3)
-		segmentlist[2,counter+1:counter+nods-2] = collect(counter+1:counter+nods-2)
-		counter+=nods-2
-		#close profile
-		segmentlist[1,counter+1]=counter
-		segmentlist[2,counter+1]=backcounter
-		counter+=1
-		backcounter=counter
-	end
-
-	numberofregions = 0
-	numberofholes = length(contours)-1
-	holelist = Array{Cdouble,2}(undef,2,numberofholes)
-	if numberofholes>0
-		 for i in 2:length(contours)
-			 xA=contours[i].x[1]; xB=contours[i].x[end-1]
-			 yA=contours[i].y[1]; yB=contours[i].y[end-1]
-			 xC=(xA+xB)/2;        yC=(yA+yB)/2;
-			 xD=xC+tan(10. /180. *pi)*(yC-yA);
-			 yD=yC+tan(10. /180. *pi)*(xA-xC);
-			 xE=xC-tan(10. /180. *pi)*(yC-yA);
-			 yE=yC-tan(10. /180. *pi)*(xA-xC);
-			 holelist[1,i-1] = xD
-			 holelist[2,i-1] = yD
-		 end
-	end
-
-	#based on this, prepare input structure
-	ctio_in.numberofpoints = numberofpoints
-	ctio_in.pointlist=pointer(pointlist)
-	ctio_in.numberofpointattributes=numberofpointattributes
-	ctio_in.pointattributelist=pointer(pointattributelist)
-	ctio_in.pointmarkerlist=pointer(pointmarkerlist)
-	ctio_in.numberofsegments=numberofsegments
-	ctio_in.segmentlist=pointer(segmentlist)
-	ctio_in.segmentmarkerlist = pointer(segmentmarkerlist)
-	ctio_in.numberofholes=numberofholes
-	ctio_in.holelist=pointer(holelist)
-	ctio_in.numberofregions=0
-
-	#Call triangle using ISSM's default options
-	triangle_switches = "pQzDq30ia"*@sprintf("%lf",area) #replace V by Q to quiet down the logging
-	#rc=ccall( (:triangulate,"libtriangle"),
-	rc=ccall( (:triangulate,"../../externalpackages/triangle/src/libtriangle.dylib"),
-				Cint, ( Cstring, Ref{CTriangulateIO}, Ref{CTriangulateIO}, Ref{CTriangulateIO}),
-				triangle_switches, Ref(ctio_in), Ref(ctio_out), Ref(vor_out))
-
-	#post process output
-	points    = convert(Array{Cdouble,2}, Base.unsafe_wrap(Array, ctio_out.pointlist,    (2,Int(ctio_out.numberofpoints)), own=true))'
-	triangles = convert(Array{Cint,2},    Base.unsafe_wrap(Array, ctio_out.trianglelist, (3,Int(ctio_out.numberoftriangles)), own=true))' .+1
-	segments  = convert(Array{Cint,2},    Base.unsafe_wrap(Array, ctio_out.segmentlist,  (2,Int(ctio_out.numberofsegments)), own=true))' .+1
-	
-	#assign output
-	md.mesh = Mesh2dTriangle()
-	md.mesh.numberofvertices = ctio_out.numberofpoints
-	md.mesh.numberofelements = ctio_out.numberoftriangles
-	md.mesh.x                = points[:,1]
-	md.mesh.y                = points[:,2]
-	md.mesh.elements         = triangles
-	md.mesh.segments         = segments
-
-	#post processing
-	md.mesh.vertexonboundary = zeros(Bool,md.mesh.numberofvertices)
-	md.mesh.vertexonboundary[md.mesh.segments] .= true
-
-   return md
-end#}}}
Index: sm/trunk-jpl/src/jl/utils.jl
===================================================================
--- /issm/trunk-jpl/src/jl/utils.jl	(revision 26628)
+++ 	(revision )
@@ -1,108 +1,0 @@
-#utils
-function issmdir() #{{{
-	issmdir = ENV["ISSM_DIR"]
-
-	if isempty(issmdir)
-		error("Could not determine the location of ISSM")
-	else
-		return issmdir
-	end
-end#}}}
-function archread(filename::String,variablename::String) #{{{
-
-	#initialize variables
-	found = false
-
-	#open file
-	output = open(filename, "r") do f
-
-		while !eof(f)
-			reclen  = bswap(read(f, Int32))
-			rectype = bswap(read(f, Int32))
-			if rectype!=1
-				error("Expected variable of type string")
-			else
-				fieldname_length = bswap(read(f, Int32))
-				field_name = String(read(f, fieldname_length))
-			end
-			rec_length = bswap(read(f, Int32))
-			field_type = bswap(read(f, Int32))
-			if field_type==2
-				data = bswap(read(f, Float64))
-			elseif field_type==3
-				rows = bswap(read(f, Int32))
-				cols = bswap(read(f, Int32))
-				data = reinterpret(Float64, read(f, sizeof(Float64)*rows*cols))
-				data .= ntoh.(data)
-				data = reshape(data, (rows,cols))
-				data = collect(data)
-				if cols == 1
-					data = vec(data)
-				end
-			else
-				error("Error: Encountered invalid field type when reading data.")
-			end
-
-			if field_name == variablename
-				found = true
-				return data
-			end
-		end
-	end
-
-	return output
-end# }}}
-function InterpFromMeshToMesh2d(index::Array,x::Vector,y::Vector,data::Vector,xout::Vector,yout::Vector) #{{{
-	#prepare input arrays
-	nods = Cint(length(x))
-	nels = Cint(size(index,1))
-	nods_interp = Cint(length(xout))
-	Cindex=Array{Cint,1}(undef,length(index))
-	for i in 1:size(index,1)
-		for j in 1:3
-			Cindex[(i-1)*3+j] = Int32(index[i,j])
-		end
-	end
-	Cx    = Array{Cdouble,1}(undef,nods)
-	Cy    = Array{Cdouble,1}(undef,nods)
-	Cdata = Array{Cdouble,1}(undef,nods)
-	for i in 1:nods
-		Cx[i]    = x[i]
-		Cy[i]    = y[i]
-		Cdata[i] = data[i]
-	end
-	Cxout = Array{Cdouble,1}(undef,nods_interp)
-	Cyout = Array{Cdouble,1}(undef,nods_interp)
-	for i in 1:nods_interp
-		Cxout[i] = xout[i]
-		Cyout[i] = yout[i]
-	end
-
-	Cdataout = Vector{Float64}(undef,nods_interp)
-
-	#This is not working....
-	rc=ccall( (:InterpFromMeshToMesh2dx,"libISSMCore"),
-				Cint, (Ptr{Ptr{Cdouble}},Ptr{Cint}, Ptr{Cdouble}, Ptr{Cdouble}, Cint, Cint, Ptr{Cdouble}, Cint, Cint, Ptr{Cdouble}, Ptr{Cdouble}, Cint),
-				Ref(Ref(Cdataout)), Ref(Cindex), Ref(Cx), Ref(Cy), nods, nels,
-				Ref(Cdata), nods, 1, Ref(Cxout), Ref(Cyout), nods_interp)
-
-	#Process output
-	dataout = Vector{Float64}(undef,nods_interp)
-	for i in 1:nods_interp
-		dataout[i] = Cdataout[i]
-	end
-
-	return dataout
-end #}}}
-function solve(md::model,solution::String) #{{{
-
-	if solution=="sb" || solution=="Stressbalance"
-		solutionstring = "StressbalanceSolution"
-	else
-		error("solutionstring "*solution*" not supported!");
-	end
-
-	IssmCore(md)
-
-	return md
-end #}}}
