# config.h {{{
set(CPP_FLAGS -DHAVE_CONFIG_H)
# }}}
# Include Directory {{{
include_directories(AFTER $ENV{ISSM_DIR}/ 
                          $ENV{ISSM_DIR}/src/c 
                          $ENV{ISSM_DIR}/src/c/main 
                          $ENV{ISSM_DIR}/src/c/datastructure 
                          $ENV{ISSM_DIR}/src/c/classes 
                          $ENV{ISSM_DIR}/src/c/classes/Options 
                          $ENV{ISSM_DIR}/src/c/classes/ExternalResults 
                          $ENV{ISSM_DIR}/src/c/classes/Elements 
                          $ENV{ISSM_DIR}/src/c/classes/Inputs 
                          $ENV{ISSM_DIR}/src/c/classes/Materials 
                          $ENV{ISSM_DIR}/src/c/classes/Constraints 
                          $ENV{ISSM_DIR}/src/c/classes/Loads 
                          $ENV{ISSM_DIR}/src/c/classes/matrix 
                          $ENV{ISSM_DIR}/src/c/classes/Params 
                          $ENV{ISSM_DIR}/src/c/classes/Params 
                          $ENV{ISSM_DIR}/src/c/shared 
                          $ENV{ISSM_DIR}/src/c/shared/MemOps 
                          $ENV{ISSM_DIR}/src/c/shared/Matrix 
                          $ENV{ISSM_DIR}/src/c/shared/io 
                          $ENV{ISSM_DIR}/src/c/shared/io/Disk 
                          $ENV{ISSM_DIR}/src/c/shared/io/Print 
                          $ENV{ISSM_DIR}/src/c/shared/io/Comm 
                          $ENV{ISSM_DIR}/src/c/shared/LatLong 
                          $ENV{ISSM_DIR}/src/c/shared/Enum 
                          $ENV{ISSM_DIR}/src/c/shared/Numerics 
                          $ENV{ISSM_DIR}/src/c/shared/Exceptions 
                          $ENV{ISSM_DIR}/src/c/shared/Sorting 
                          $ENV{ISSM_DIR}/src/c/shared/Elements 
                          $ENV{ISSM_DIR}/src/c/shared/String 
                          $ENV{ISSM_DIR}/src/c/toolkits 
                          $ENV{ISSM_DIR}/src/c/toolkits/metis 
                          $ENV{ISSM_DIR}/src/c/toolkits/issm 
                          $ENV{ISSM_DIR}/src/c/toolkits/adolc 
                          $ENV{ISSM_DIR}/src/c/toolkits/triangle 
                          $ENV{ISSM_DIR}/src/c/toolkits/objects 
                          $ENV{ISSM_DIR}/src/c/modules 
                          $ENV{ISSM_DIR}/src/c/modules/ModelProcessorx 
                          $ENV{ISSM_DIR}/src/c/modules/ParseToolkitsOptionsx 
                          $ENV{ISSM_DIR}/src/c/modules/NodesDofx 
                          $ENV{ISSM_DIR}/src/c/modules/NodalValuex 
                          $ENV{ISSM_DIR}/src/c/modules/VerticesDofx 
                          $ENV{ISSM_DIR}/src/c/modules/VertexCoordinatesx 
                          $ENV{ISSM_DIR}/src/c/modules/OutputResultsx 
                          $ENV{ISSM_DIR}/src/c/modules/InputDuplicatex 
                          $ENV{ISSM_DIR}/src/c/modules/InputScalex 
                          $ENV{ISSM_DIR}/src/c/modules/SurfaceAreax 
                          $ENV{ISSM_DIR}/src/c/modules/CreateNodalConstraintsx 
                          $ENV{ISSM_DIR}/src/c/modules/UpdateDynamicConstraintsx 
                          $ENV{ISSM_DIR}/src/c/modules/IoModelToConstraintsx 
                          $ENV{ISSM_DIR}/src/c/modules/InputUpdateFromConstantx 
                          $ENV{ISSM_DIR}/src/c/modules/GetSolutionFromInputsx 
                          $ENV{ISSM_DIR}/src/c/modules/GetVectorFromInputsx 
                          $ENV{ISSM_DIR}/src/c/modules/InputUpdateFromVectorx 
                          $ENV{ISSM_DIR}/src/c/modules/ConfigureObjectsx 
                          $ENV{ISSM_DIR}/src/c/modules/ComputeBasalStressx 
                          $ENV{ISSM_DIR}/src/c/modules/ComputeStrainRatex 
                          $ENV{ISSM_DIR}/src/c/modules/SpcNodesx 
                          $ENV{ISSM_DIR}/src/c/modules/PositiveDegreeDayx 
                          $ENV{ISSM_DIR}/src/c/modules/Delta18oParameterizationx 
                          $ENV{ISSM_DIR}/src/c/modules/SmbGradientsx 
                          $ENV{ISSM_DIR}/src/c/modules/MeshPartitionx 
                          $ENV{ISSM_DIR}/src/c/modules/Reducevectorgtofx 
                          $ENV{ISSM_DIR}/src/c/modules/Reduceloadx 
                          $ENV{ISSM_DIR}/src/c/modules/ConstraintsStatex 
                          $ENV{ISSM_DIR}/src/c/modules/ResetConstraintsx 
                          $ENV{ISSM_DIR}/src/c/modules/ResetCoordinateSystemx 
                          $ENV{ISSM_DIR}/src/c/modules/Solverx 
                          $ENV{ISSM_DIR}/src/c/modules/VecMergex 
                          $ENV{ISSM_DIR}/src/c/modules/Mergesolutionfromftogx 
                          $ENV{ISSM_DIR}/src/c/cores 
                          $ENV{ISSM_DIR}/src/c/solutionsequences 
                          $ENV{ISSM_DIR}/src/c/solutionsequences)
# }}}

# Core Sources {{{
set(core_sources   	./datastructures/DataSet.cpp
					./classes/gauss/GaussTria.cpp
					./classes/FemModel.cpp
					./classes/Loads/Friction.cpp
					./classes/Inputs/TransientInput.cpp
					./classes/Constraints/SpcTransient.cpp
					./classes/IndependentObject.cpp
					./classes/DependentObject.cpp
					./classes/DofIndexing.cpp
					./classes/IoModel.cpp
					./classes/Contours.cpp
					./classes/Nodes.cpp
					./classes/Vertices.cpp
					./classes/Node.cpp
					./classes/Vertex.cpp
					./classes/Hook.cpp
					./classes/ExternalResults/Results.cpp
					./classes/Elements/Elements.cpp
					./classes/Elements/ElementHook.cpp
					./classes/Elements/Tria.cpp
					./classes/Elements/TriaRef.cpp
					./classes/Inputs/Inputs.cpp
					./classes/Inputs/TriaInput.cpp
					./classes/Inputs/BoolInput.cpp
					./classes/Inputs/IntInput.cpp
					./classes/Inputs/DoubleInput.cpp
					./classes/Inputs/DatasetInput.cpp
					./classes/Materials/Materials.cpp
					./classes/Materials/Matice.cpp
					./classes/Materials/Matdamageice.cpp
					./classes/Materials/Matpar.cpp
					./classes/Constraints/Constraints.cpp
					./classes/Constraints/SpcStatic.cpp
					./classes/Constraints/SpcDynamic.cpp
					./classes/Loads/Loads.cpp
					./classes/Loads/Penpair.cpp
					./classes/Loads/Pengrid.cpp
					./classes/Loads/Icefront.cpp
					./classes/Loads/Numericalflux.cpp
					./classes/matrix/ElementMatrix.cpp
					./classes/matrix/ElementVector.cpp
					./classes/Params/Parameters.cpp
					./classes/Params/BoolParam.cpp
					./classes/Params/IntParam.cpp
					./classes/Params/IntVecParam.cpp
					./classes/Params/IntMatParam.cpp
					./classes/Params/DoubleParam.cpp
					./classes/Params/FileParam.cpp
					./classes/Params/StringArrayParam.cpp
					./classes/Params/DoubleMatParam.cpp
					./classes/Params/DoubleTransientMatParam.cpp
					./classes/Params/DoubleMatArrayParam.cpp
					./classes/Params/DoubleVecParam.cpp
					./classes/Params/StringParam.cpp
					./classes/Params/MatrixParam.cpp
					./classes/Params/VectorParam.cpp
					./classes/Params/TransientParam.cpp
					./classes/Params/DataSetParam.cpp
					./classes/Profiler.cpp
					./shared/Matrix/MatrixUtils.cpp
					./shared/io/Disk/pfopen.cpp
					./shared/io/Disk/pfclose.cpp
					./shared/io/Disk/WriteLockFile.cpp
					./shared/io/Print/PrintfFunction.cpp
					./shared/io/Comm/IssmComm.cpp
					./shared/LatLong/Ll2xyx.cpp
					./shared/LatLong/Xy2llx.cpp
					./shared/Enum/EnumToStringx.cpp
					./shared/Enum/StringToEnumx.cpp
					./shared/Numerics/Verbosity.cpp
					./shared/Numerics/GaussPoints.cpp
					./shared/Numerics/cross.cpp
					./shared/Numerics/isnan.cpp
					./shared/Numerics/cubic.cpp
					./shared/Numerics/extrema.cpp
					./shared/Numerics/XZvectorsToCoordinateSystem.cpp
					./shared/Exceptions/Exceptions.cpp
					./shared/Exceptions/exprintf.cpp
					./shared/Sorting/binary_search.cpp
					./shared/Elements/Paterson.cpp
					./shared/Elements/Arrhenius.cpp
					./shared/Elements/PrintArrays.cpp
					./shared/Elements/PddSurfaceMassBalance.cpp
					./shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp
					./shared/String/DescriptorIndex.cpp
					./toolkits/issm/IssmToolkitUtils.cpp
					./toolkits/issm/IssmSolver.cpp
					./toolkits/ToolkitOptions.cpp
					./modules/ModelProcessorx/ModelProcessorx.cpp
					./modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp
					./modules/ModelProcessorx/NodesPartitioning.cpp
					./modules/ModelProcessorx/EdgesPartitioning.cpp
					./modules/ModelProcessorx/SortDataSets.cpp
					./modules/ModelProcessorx/UpdateCounters.cpp
					./modules/ModelProcessorx/CreateDataSets.cpp
					./modules/ModelProcessorx/CreateParameters.cpp
					./modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp
					./modules/ModelProcessorx/CreateEdges.cpp
					./modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp
					./modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp
					./modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp
					./modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
					./modules/ModelProcessorx/CreateNodes.cpp
					./modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp
					./modules/NodesDofx/NodesDofx.cpp
					./modules/NodalValuex/NodalValuex.cpp
					./modules/VerticesDofx/VerticesDofx.cpp
					./modules/VertexCoordinatesx/VertexCoordinatesx.cpp
					./modules/OutputResultsx/OutputResultsx.cpp
					./modules/InputDuplicatex/InputDuplicatex.cpp
					./modules/InputScalex/InputScalex.cpp
					./modules/SurfaceAreax/SurfaceAreax.cpp
					./modules/CreateNodalConstraintsx/CreateNodalConstraintsx.cpp
					./modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.cpp
					./modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp
					./modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp
					./modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp
					./modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
					./modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp
					./modules/ConfigureObjectsx/ConfigureObjectsx.cpp
					./modules/ComputeBasalStressx/ComputeBasalStressx.cpp
					./modules/ComputeStrainRatex/ComputeStrainRatex.cpp
					./modules/SpcNodesx/SpcNodesx.cpp
					./modules/PositiveDegreeDayx/PositiveDegreeDayx.cpp
					./modules/Delta18oParameterizationx/Delta18oParameterizationx.cpp
					./modules/SmbGradientsx/SmbGradientsx.cpp
					./modules/Reducevectorgtofx/Reducevectorgtofx.cpp
					./modules/Reduceloadx/Reduceloadx.cpp
					./modules/ConstraintsStatex/ConstraintsStatex.cpp
					./modules/ResetConstraintsx/ResetConstraintsx.cpp
					./modules/ResetCoordinateSystemx/ResetCoordinateSystemx.cpp
					./modules/Solverx/Solverx.cpp
					./modules/VecMergex/VecMergex.cpp
					./modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp
					./cores/ProcessArguments.cpp
					./cores/ResetBoundaryConditions.cpp
					./cores/AnalysisConfiguration.cpp
					./cores/WrapperCorePointerFromSolutionEnum.cpp
					./cores/CorePointerFromSolutionEnum.cpp
					./cores/EnvironmentInit.cpp
					./cores/EnvironmentFinalize.cpp
					./cores/ad_core.cpp
					./solutionsequences/solutionsequence_linear.cpp
					./solutionsequences/solutionsequence_nonlinear.cpp
					./solutionsequences/solutionsequence_newton.cpp
					./solutionsequences/convergence.cpp
					./classes/Options/Options.cpp
					./classes/Options/OptionUtilities.cpp
					./classes/RiftStruct.cpp)
set(issm_sources ${core_sources})
# }}}

# DAKOTA sources  {{{
set(dakota_sources 				  ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp
					  				  ./modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp
					  				  ./modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp
					  ./modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp
					  				  ./modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp
					  ./cores/dakota_core.cpp
					  				  ./cores/DakotaSpawnCore.cpp)
#}}}
#Transient sources  {{{
set(transient_sources ./modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp 
							./cores/transient_core.cpp)
#}}}
#Steadystate sources  {{{
set(steadystate_sources ./cores/steadystate_core.cpp)
#}}}
#Prognostic sources  {{{
set(prognostic_sources ./modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp
					      ./modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp
					      ./modules/ModelProcessorx/Prognostic/CreateConstraintsPrognostic.cpp
					      ./modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp
							./cores/prognostic_core.cpp)
#}}}
#Thermal sources  {{{
set(thermal_sources ./modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp
					   ./modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp
					   ./modules/ModelProcessorx/Thermal/CreateConstraintsThermal.cpp
					   ./modules/ModelProcessorx/Thermal/CreateLoadsThermal.cpp
					   ./modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp
					   ./modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp
					   ./modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp
					   ./modules/ModelProcessorx/Enthalpy/CreateLoadsEnthalpy.cpp
					   ./modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp
					   ./modules/ModelProcessorx/Melting/CreateNodesMelting.cpp
					   ./modules/ModelProcessorx/Melting/CreateConstraintsMelting.cpp
					   ./modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp
					   ./modules/ConstraintsStatex/ThermalConstraintsState.cpp
					   ./modules/ConstraintsStatex/ThermalIsPresent.cpp
					   ./modules/ResetConstraintsx/ThermalConstraintsReset.cpp 
					   ./cores/thermal_core.cpp
					   ./solutionsequences/solutionsequence_thermal_nonlinear.cpp)
#}}}
#Control sources  {{{
set(control_sources ./modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp
					  				  ./modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
					  				  ./modules/ControlInputScaleGradientx/ControlInputScaleGradientx.cpp
					  				  ./modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
					  				  ./modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
					  				  ./modules/ModelProcessorx/Control/CreateParametersControl.cpp
					  ./modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
					  				  ./modules/InputControlUpdatex/InputControlUpdatex.cpp
					  				  ./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
					  				  ./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
					  				  ./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
					  				  ./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
					  				  ./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
					  				  ./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
					  				  ./modules/Orthx/Orthx.cpp
					  				  ./modules/Gradjx/Gradjx.cpp
					  ./modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
					  				  ./modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
					  				  ./modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
					  				  ./modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
					  				  				  ./classes/Inputs/ControlInput.cpp
					  ./shared/Numerics/BrentSearch.cpp
					  ./shared/Numerics/OptimalSearch.cpp 
					  ./cores/control_core.cpp
					  ./cores/controltao_core.cpp
					  ./cores/objectivefunction.cpp
					  ./cores/gradient_core.cpp
					  ./cores/adjointdiagnostic_core.cpp
					  ./cores/adjointbalancethickness_core.cpp
					  ./cores/AdjointCorePointerFromSolutionEnum.cpp
					  ./solutionsequences/solutionsequence_adjoint_linear.cpp)
#}}}
#Hydrology sources  {{{
set(hydrology_sources  ./modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp
					      ./modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp
					      ./modules/ModelProcessorx/HydrologyShreve/CreateConstraintsHydrologyShreve.cpp
					      ./modules/ModelProcessorx/HydrologyShreve/CreateLoadsHydrologyShreve.cpp 
							./modules/ModelProcessorx/HydrologyShreve/CreateParametersHydrologyShreve.cpp 
							./modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp
							./modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp
							./modules/ModelProcessorx/HydrologyDCInefficient/CreateConstraintsHydrologyDCInefficient.cpp
							./modules/ModelProcessorx/HydrologyDCInefficient/CreateLoadsHydrologyDCInefficient.cpp 
							./modules/ModelProcessorx/HydrologyDCInefficient/CreateParametersHydrologyDCInefficient.cpp 
							./modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp
							./modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp
							./modules/ModelProcessorx/HydrologyDCEfficient/CreateConstraintsHydrologyDCEfficient.cpp
							./modules/ModelProcessorx/HydrologyDCEfficient/CreateLoadsHydrologyDCEfficient.cpp 
							./modules/ModelProcessorx/HydrologyDCEfficient/CreateParametersHydrologyDCEfficient.cpp 
							./cores/hydrology_core.cpp
							./solutionsequences/solutionsequence_hydro_nonlinear.cpp)
#}}}
#Diagnostic sources  {{{
set(diagnostic_sources ./modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
					      ./modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp 
					      ./modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp 
					      ./modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp
					      ./modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp
					      ./modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp 
					      ./modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp 
					      ./modules/ModelProcessorx/DiagnosticVert/CreateLoadsDiagnosticVert.cpp
					      ./modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp
					      ./modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp 
					      ./modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp 
							./modules/ModelProcessorx/DiagnosticHutter/CreateLoadsDiagnosticHutter.cpp 
							./cores/diagnostic_core.cpp
							./solutionsequences/solutionsequence_stokescoupling_nonlinear.cpp)
#}}}
#Balanced sources  {{{
set(balanced_sources ./modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp
					    ./modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp
					    ./modules/ModelProcessorx/Balancethickness/CreateConstraintsBalancethickness.cpp
						 ./modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp
						 ./cores/balancethickness_core.cpp 
						 ./cores/dummy_core.cpp)
#}}}
#Slope sources  {{{
set(slope_sources  ./modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp
					  ./modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp 
					  ./modules/ModelProcessorx/BedSlope/CreateConstraintsBedSlope.cpp
					  ./modules/ModelProcessorx/BedSlope/CreateLoadsBedSlope.cpp
					  ./modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp
					  ./modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp 
					  ./modules/ModelProcessorx/SurfaceSlope/CreateConstraintsSurfaceSlope.cpp
					  ./modules/ModelProcessorx/SurfaceSlope/CreateLoadsSurfaceSlope.cpp
					  ./cores/surfaceslope_core.cpp
					  ./cores/bedslope_core.cpp)
#}}}
#Gia sources  {{{
set(gia_sources  ./cores/gia_core.cpp
					./modules/ModelProcessorx/Gia/UpdateElementsGia.cpp
					./modules/ModelProcessorx/Gia/CreateNodesGia.cpp 
					./modules/ModelProcessorx/Gia/CreateConstraintsGia.cpp
					./modules/ModelProcessorx/Gia/CreateLoadsGia.cpp
					./modules/GiaDeflectionCorex/GiaDeflectionCorex.cpp
									./modules/GiaDeflectionCorex/distme.f
					./modules/GiaDeflectionCorex/freed.f
					./modules/GiaDeflectionCorex/ojrule.f
					./modules/GiaDeflectionCorex/pwise.f
					./modules/GiaDeflectionCorex/qwise.f
					./modules/GiaDeflectionCorex/stot.f
					./modules/GiaDeflectionCorex/what0.f
					)
#}}}
#Groundingline sources  {{{
set(groundingline_sources ./modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
					        )
#}}}
#Rifts sources  {{{
set(rifts_sources ./classes/Loads/Riftfront.cpp
				    			    ./modules/ConstraintsStatex/RiftConstraintsState.cpp)
#}}}
#Android sources  {{{
set(android_sources )
#}}}
#3D sources  {{{
set(threed_sources 			     ./classes/gauss/GaussPenta.cpp
				     			     ./classes/Inputs/PentaInput.cpp
				     			     ./classes/Elements/Penta.cpp
				     			     ./classes/Elements/PentaRef.cpp)
#}}}
#Bamg sources  {{{
set(bamg_sources  						./bamg/BamgGeom.cpp
							./bamg/BamgMesh.cpp
							./bamg/BamgOpts.cpp
							./bamg/CrackedEdge.cpp
							./bamg/Curve.cpp
							./bamg/Direction.cpp
										./bamg/Edge.cpp
							./bamg/GeomEdge.cpp
							./bamg/GeomSubDomain.cpp
							./bamg/GeomVertex.cpp
				./bamg/Geometry.cpp
							./bamg/ListofIntersectionTriangles.cpp
							./bamg/EigenMetric.cpp
				./bamg/Metric.cpp
							./bamg/BamgQuadtree.cpp
										./bamg/SetOfE4.cpp
										./bamg/SubDomain.cpp
							./bamg/AdjacentTriangle.cpp
				./bamg/Triangle.cpp
				./bamg/det.h 
							./bamg/BamgVertex.cpp
										./bamg/VertexOnEdge.cpp
							./bamg/VertexOnGeom.cpp
							./bamg/VertexOnVertex.cpp
				./bamg/Mesh.cpp
							./shared/Bamg/Abs.h 
							./shared/Bamg/BigPrimeNumber.cpp
				./shared/Bamg/BinaryRand.h 
				./shared/Bamg/Exchange.h 
				./shared/Bamg/extrema.h 
				./shared/Bamg/HeapSort.h 
				./shared/Bamg/OppositeAngle.h 
				./modules/Bamgx/Bamgx.cpp
							./modules/BamgConvertMeshx/BamgConvertMeshx.cpp
							./modules/BamgTriangulatex/BamgTriangulatex.cpp
				)
#}}}
#Kriging sources  {{{
set(kriging_sources 					./classes/kriging/Observations.cpp
						./classes/kriging/Variogram.h 
											./classes/kriging/GaussianVariogram.cpp
											./classes/kriging/ExponentialVariogram.cpp
											./classes/kriging/SphericalVariogram.cpp
											./classes/kriging/PowerVariogram.cpp
											./classes/kriging/Quadtree.cpp
											./classes/kriging/Observation.cpp
						./modules/Krigingx/Krigingx.cpp
						./modules/Krigingx/Kriging
#For parallel kriging, only difference is ./modules/Krigingx/pKrigingx.cpp with no multithreading
set(pkriging_sources 					./classes/kriging/Observations.cpp
						./classes/kriging/Variogram.h 
											./classes/kriging/GaussianVariogram.cpp
											./classes/kriging/ExponentialVariogram.cpp
											./classes/kriging/SphericalVariogram.cpp
											./classes/kriging/PowerVariogram.cpp
											./classes/kriging/Quadtree.cpp
											./classes/kriging/Observation.cpp
						./modules/Krigingx/pKrigingx.cpp
						)
#}}}
#Kml sources  {{{
set(kml_sources 		     ./modules/Exp2Kmlx/Exp2Kmlx.cpp
			     		     ./modules/Kml2Expx/Kml2Expx.cpp
			     		     ./modules/Shp2Expx/Shp2Expx.cpp
			     		     ./modules/Shp2Kmlx/Shp2Kmlx.cpp
			     		     ./modules/KMLFileReadx/KMLFileReadx.cpp
			     		     ./modules/KMLMeshWritex/KMLMeshWritex.cpp
			     		     ./modules/KMLOverlayx/KMLOverlayx.cpp
			     		     ./kml/KML_Attribute.cpp
			     		     ./kml/KML_Comment.cpp
			     		     ./kml/KML_ColorStyle.cpp
			     		     ./kml/KML_Container.cpp
			     		     ./kml/KML_Document.cpp
			     		     ./kml/KML_Feature.cpp
			     		     ./kml/KML_File.cpp
			     		     ./kml/KML_Folder.cpp
			     		     ./kml/KML_Geometry.cpp
			     		     ./kml/KML_GroundOverlay.cpp
			     		     ./kml/KML_Icon.cpp
			     		     ./kml/KML_LatLonBox.cpp
		  	     		     ./kml/KML_LinearRing.cpp
			     		     ./kml/KML_LineString.cpp
			     		     ./kml/KML_LineStyle.cpp
			     		     ./kml/KML_MultiGeometry.cpp
			     		     ./kml/KML_Object.cpp
			     		     ./kml/KML_Overlay.cpp
			     		     ./kml/KML_Point.cpp
			     		     ./kml/KML_Placemark.cpp
			     		     ./kml/KML_Polygon.cpp
			     		     ./kml/KML_PolyStyle.cpp
			     		     ./kml/KML_Style.cpp
			     		     ./kml/KML_StyleSelector.cpp
			     		     ./kml/KML_SubStyle.cpp
			     		     ./kml/KML_Unknown.cpp
			     		     ./kml/KMLFileReadUtils.cpp
			     )
#}}}
#Petsc sources  {{{
petsc_sources= ./toolkits/petsc
					./toolkits/petsc/patches
													./toolkits/petsc/patches/VecToMPISerial.cpp
					./toolkits/petsc/patches/MatToSerial.cpp
					./toolkits/petsc/patches/VecMerge.cpp
					./toolkits/petsc/patches/NewVec.cpp
					./toolkits/petsc/patches/PetscOptionsDetermineSolverType.cpp
					./toolkits/petsc/patches/PetscOptionsInsertMultipleString.cpp
					./toolkits/petsc/patches/NewMat.cpp
					./toolkits/petsc/patches/VecFree.cpp
					./toolkits/petsc/patches/KSPFree.cpp
					./toolkits/petsc/patches/MatFree.cpp
					./toolkits/petsc/patches/MatMultPatch.cpp
					./toolkits/petsc/patches/ISSMToPetscMatrixType.cpp
					./toolkits/petsc/patches/ISSMToPetscInsertMode.cpp
					./toolkits/petsc/patches/ISSMToPetscNormMode.cpp
													./toolkits/petsc/objects/PetscMat.cpp
									./toolkits/petsc/objects/PetscVec.cpp
					./toolkits/petsc/objects/PetscSolver.cpp
									)
#}}}
#Mumps sources  {{{
set(mumps_sources      ./toolkits/mumps
									./toolkits/mumps/MpiDenseMumpsSolve.cpp)
#}}}
#Gsl sources  {{{
set(gsl_sources   ./toolkits/gsl/DenseGslSolve.cpp)
#}}}
#Mpi sources  {{{
set(mpi_sources 						./toolkits/mpi/patches/DetermineLocalSize.cpp
				./toolkits/mpi/patches/DetermineGlobalSize.cpp
				./toolkits/mpi/patches/DetermineRowRankFromLocalSize.cpp
				./toolkits/mpi/patches/GetOwnershipBoundariesFromRange.cpp
							)
#}}}
#Metis sources  {{{
set(metis_sources 				./toolkits/metis/patches/METIS_PartMeshNodalPatch.cpp)
#}}}

# API Print {{{
if(NOT PYTHON AND NOT MATLAB)
    add_library(ISSMOverload STATIC ./shared/String/ApiPrintf.cpp)
    list(APPEND issm_deps ISSMOverload)
else(NOT PYTHON AND NOT MATLAB)
    message(FATAL_ERROR "Python and Matlab are not supported yet.")
endif(NOT PYTHON AND NOT MATLAB)
# }}}

# Modules Sources {{{
set(modules_sources ./shared/Threads/LaunchThread.cpp
			./shared/Threads/PartitionRange.cpp
			./shared/Exp/exp.cpp
			./shared/TriMesh/AssociateSegmentToElement.cpp
			./shared/TriMesh/GridInsideHole.cpp
			./shared/TriMesh/OrderSegments.cpp
			./shared/TriMesh/SplitMeshForRifts.cpp
			./shared/TriMesh/TriMeshUtils.cpp
			./modules/Chacox/Chacox.cpp
			./modules/Chacox/input_parse.cpp
			./modules/Chacox/chaco_seconds.cpp
			./modules/Chacox/user_params.cpp
			./modules/TriaSearchx/TriaSearchx.cpp
			./modules/TriMeshx/TriMeshx.cpp
			./modules/TriMeshProcessRiftsx/TriMeshProcessRiftsx.cpp
			./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsx.cpp
			./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsxt.cpp
			./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.cpp
			./modules/InterpFromMesh2dx/InterpFromMesh2dx.cpp
			./modules/InterpFromMesh2dx/InterpFromMesh2dxt.cpp
			./modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp
			./modules/InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp
			./modules/InterpFromMeshToGridx/InterpFromMeshToGridx.cpp
			./modules/HoleFillerx/HoleFillerx.cpp
			./modules/EdgeDetectionx/EdgeDetectionx.cpp
			./modules/AverageFilterx/AverageFilterx.cpp
			./modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp
			./modules/ContourToMeshx/ContourToMeshx.cpp
			./modules/ContourToMeshx/ContourToMeshxt.cpp
			./modules/ContourToNodesx/ContourToNodesx.cpp
			./modules/Reducevectorgtosx/Reducevectorgtosx.cpp
			./modules/NodeConnectivityx/NodeConnectivityx.cpp
			./modules/ElementConnectivityx/ElementConnectivityx.cpp
			./modules/Scotchx/Scotchx.cpp
			./modules/PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.cpp)
# }}}

#{{{ Conditional build-up of sources
#ISSM sources are a combination of core sources and sources related to specific capabilities.

if(DAKOTA)
list(APPEND CPP_FLAGS '-D_HAVE_DAKOTA_')
list(APPEND issm_sources ${dakota_sources})
endif(DAKOTA)

if(PETSC)
list(APPEND CPP_FLAGS '-D_HAVE_PETSC_')
list(APPEND issm_sources ${petsc_sources})
endif(PETSC)

if(MUMPS)
list(APPEND CPP_FLAGS '-D_HAVE_MUMPS_')
list(APPEND issm_sources ${mumps_sources})
endif(MUMPS)

if(GSL)
list(APPEND CPP_FLAGS '-D_HAVE_GSL_')
list(APPEND issm_sources ${gsl_sources})
list(APPEND issm_deps gsl gslcblas)
list(APPEND issm_lib_paths ${GSL_LIB_DIR})
include_directories(AFTER ${GSL_INC_DIR})
message("GSL_INC: ${GSL_INC_DIR}")
message("GSL_LIB: ${GSL_LIB_DIR}")
endif(GSL)

if(TRANSIENT)
list(APPEND CPP_FLAGS '-D_HAVE_TRANSIENT_')
list(APPEND issm_sources ${transient_sources})
endif(TRANSIENT)

if(STEADYSTATE)
list(APPEND CPP_FLAGS '-D_HAVE_STEADYSTATE_')
list(APPEND issm_sources ${steadystate_sources})
endif(STEADYSTATE)

if(PROGNOSTIC)
list(APPEND CPP_FLAGS '-D_HAVE_PROGNOSTIC_')
list(APPEND issm_sources ${prognostic_sources})
endif(PROGNOSTIC)

if(THERMAL)
list(APPEND CPP_FLAGS '-D_HAVE_THERMAL_')
list(APPEND issm_sources ${thermal_sources})
endif(THERMAL)

if(GIA)
list(APPEND CPP_FLAGS '-D_HAVE_GIA_')
list(APPEND issm_sources ${gia_sources})
endif(GIA)

if(CONTROL)
list(APPEND CPP_FLAGS '-D_HAVE_CONTROL_')
list(APPEND issm_sources ${control_sources})
endif(CONTROL)

if(HYDROLOGY)
list(APPEND CPP_FLAGS '-D_HAVE_HYDROLOGY_')
list(APPEND issm_sources ${hydrology_sources})
endif(HYDROLOGY)

if(DIAGNOSTIC)
list(APPEND CPP_FLAGS '-D_HAVE_DIAGNOSTIC_')
list(APPEND issm_sources ${diagnostic_sources})
endif(DIAGNOSTIC)

if(BALANCED)
list(APPEND CPP_FLAGS '-D_HAVE_BALANCED_')
list(APPEND issm_sources ${balanced_sources})
endif(BALANCED)

if(SLOPE)
list(APPEND CPP_FLAGS '-D_HAVE_SLOPE_')
list(APPEND issm_sources ${slope_sources})
endif(SLOPE)

if(GROUNDINGLINE)
list(APPEND CPP_FLAGS '-D_HAVE_GROUNDINGLINE_')
list(APPEND issm_sources ${groundingline_sources})
endif(GROUNDINGLINE)

if(RIFTS)
list(APPEND CPP_FLAGS '-D_HAVE_RIFTS_')
list(APPEND issm_sources ${rifts_sources})
endif(RIFTS)

if(ANDROID)
list(APPEND CPP_FLAGS '-D_HAVE_ANDROID_')
list(APPEND issm_sources ${android_sources})
endif(ANDROID)

if(THREED)
list(APPEND CPP_FLAGS '-D_HAVE_THREED_')
list(APPEND issm_sources ${threed_sources})
endif(THREED)

if(MPI)
list(APPEND CPP_FLAGS '-D_HAVE_MPI_')
list(APPEND issm_sources ${mpi_sources})
endif(MPI)

if(METIS)
list(APPEND CPP_FLAGS '-D_HAVE_METIS_')
list(APPEND issm_sources ${metis_sources})
endif(METIS)

if(KRIGING)
list(APPEND CPP_FLAGS '-D_HAVE_KRIGING_')
list(APPEND issm_sources ${pkriging_sources})
endif(KRIGING)
#}}}

add_library(ISSMCore STATIC ${issm_sources})
add_library(ISSMModules STATIC ${modules_sources})

list(INSERT issm_deps 0 ISSMCore ISSMModules)
add_executable(issm ./main/issm.cpp)

# Definitions {{{
add_definitions(${CPP_FLAGS})
# }}}
# Compilation Flags {{{
# }}}
# Linking Flags {{{
link_directories($ENV{ISSM_DIR}/src/c )
target_link_libraries(issm ${issm_deps})
message("ISSM_DEPS: ${issm_deps}")
# }}}

# Install Targets {{{
# Install 'issm.exe'
install(TARGETS issm RUNTIME DESTINATION $ENV{ISSM_DIR}/bin)

# Install 'libISSMCore.a' and 'libISSMOverload.a'
install(TARGETS ISSMCore
                ISSMModules
                ISSMOverload
        ARCHIVE DESTINATION $ENV{ISSM_DIR}/lib)
# }}}
# Optional Install {{{
#if(${SHARED_LIBS} IS ON)
#   install(TARGETS ISSMCore
#                   ISSMOverload
#           LIBRARY)
#endif(${SHARED_LIBS} IS ON)
# }}}
