<!DOCTYPE HTML>
<html class="" dir="ltr" lang="en-US">
<head>
	<meta charset="UTF-8">

	<title>GRASP Framework Overview &#8211; GRASP Open</title>

		<!-- All in One SEO 4.9.0 - aioseo.com -->
	<link rel="canonical" href="https://www.grasp-open.com/docbook-custom-style.css/" />
	<meta name="generator" content="All in One SEO (AIOSEO) 4.9.0" />
		<script type="application/ld+json" class="aioseo-schema">
			{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.grasp-open.com\/docbook-custom-style.css\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.grasp-open.com#listItem","position":1,"name":"Home","item":"https:\/\/www.grasp-open.com","nextItem":{"@type":"ListItem","@id":"#listItem","name":"GRASP Framework Overview"}}]},{"@type":"Organization","@id":"https:\/\/www.grasp-open.com\/#organization","name":"GRASP Open","description":"Platform for GRASP algorithm development","url":"https:\/\/www.grasp-open.com\/"},{"@type":"WebPage","@id":"https:\/\/www.grasp-open.com\/docbook-custom-style.css\/#webpage","url":"https:\/\/www.grasp-open.com\/docbook-custom-style.css\/","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.grasp-open.com\/#website"},"breadcrumb":{"@id":"https:\/\/www.grasp-open.com\/docbook-custom-style.css\/#breadcrumblist"}},{"@type":"WebSite","@id":"https:\/\/www.grasp-open.com\/#website","url":"https:\/\/www.grasp-open.com\/","name":"GRASP Open","description":"Platform for GRASP algorithm development","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.grasp-open.com\/#organization"}}]}
		</script>
		<!-- All in One SEO -->

<link rel="alternate" type="application/rss+xml" title="GRASP Open &raquo; Feed" href="https://www.grasp-open.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="GRASP Open &raquo; Comments Feed" href="https://www.grasp-open.com/comments/feed/" />
<meta name="viewport" content="width=device-width, initial-scale=1"><meta name="SKYPE_TOOLBAR" content="SKYPE_TOOLBAR_PARSER_COMPATIBLE"><meta name="theme-color" content="#f5f5f5"><style id="wp-img-auto-sizes-contain-inline-css">
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>

<style id="wp-emoji-styles-inline-css">

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
</style>
<style id="classic-theme-styles-inline-css">
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
</style>
<style id="wp-block-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the block styles printed at wp_footer." }
/*# sourceURL=wp-block-styles-placeholder-inline-css */
</style>
<style id="wp-global-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the global-styles printed at wp_footer." }
/*# sourceURL=wp-global-styles-placeholder-inline-css */
</style>
<link rel='stylesheet' id='contact-form-7-css' href='https://www.grasp-open.com/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=6.1.3' media='all' />
<link rel='stylesheet' id='parent-style-css' href='https://www.grasp-open.com/wp-content/themes/Impreza/style.css?ver=7.0' media='all' />
<link rel='stylesheet' id='child-style-css' href='https://www.grasp-open.com/wp-content/themes/Impreza-child-2019/style.css?ver=7.0' media='all' />
<link rel='stylesheet' id='us-theme-css' href='//www.grasp-open.com/wp-content/uploads/us-assets/www.grasp-open.com.css?ver=5.6.1' media='all' />
<link rel='stylesheet' id='theme-style-css' href='//www.grasp-open.com/wp-content/themes/Impreza-child-2019/style.css?ver=5.6.1' media='all' />
<link rel='stylesheet' id='bsf-Defaults-css' href='https://www.grasp-open.com/wp-content/uploads/smile_fonts/Defaults/Defaults.css?ver=3.19.19' media='all' />
<script></script><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.grasp-open.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 7.0" />

<!-- teachPress -->
<script type="text/javascript" src="https://www.grasp-open.com/wp-content/plugins/teachpress/js/frontend.js?ver=9.0.12"></script>
<!-- END teachPress -->
	<script>
		if (!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
			var root = document.getElementsByTagName('html')[0]
			root.className += " no-touch";
		}
	</script>
	<style>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><meta name="generator" content="Powered by WPBakery Page Builder - drag and drop page builder for WordPress."/>
<meta name="redi-version" content="1.2.7" /><link rel="icon" href="https://www.grasp-open.com/wp-content/uploads/2015/12/GraspOpen_v8-favicon.png" sizes="32x32" />
<link rel="icon" href="https://www.grasp-open.com/wp-content/uploads/2015/12/GraspOpen_v8-favicon.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://www.grasp-open.com/wp-content/uploads/2015/12/GraspOpen_v8-favicon.png" />
<meta name="msapplication-TileImage" content="https://www.grasp-open.com/wp-content/uploads/2015/12/GraspOpen_v8-favicon.png" />
<noscript><style> .wpb_animate_when_almost_visible { opacity: 1; }</style></noscript>
				<style id="us-header-css">@media (min-width:900px){.hidden_for_default{display:none !important}.l-subheader.at_bottom{display:none}.l-header{position:relative;z-index:111;width:100%}.l-subheader{margin:0 auto}.l-subheader.width_full{padding-left:1.5rem;padding-right:1.5rem}.l-subheader-h{display:flex;align-items:center;position:relative;margin:0 auto;height:inherit}.w-header-show{display:none}.l-header.pos_fixed{position:fixed;left:0}.l-header.pos_fixed:not(.notransition) .l-subheader{transition-property:transform, background-color, box-shadow, line-height, height;transition-duration:0.3s;transition-timing-function:cubic-bezier(.78,.13,.15,.86)}.l-header.bg_transparent:not(.sticky) .l-subheader{box-shadow:none !important;background-image:none;background-color:transparent}.l-header.bg_transparent~.l-main .l-section.width_full.height_auto:first-child{padding-top:0 !important;padding-bottom:0 !important}.l-header.pos_static.bg_transparent{position:absolute;left:0}.l-subheader.width_full .l-subheader-h{max-width:none !important}.header_inpos_above .l-header.pos_fixed{overflow:hidden;transition:transform 0.3s;transform:translate3d(0,-100%,0)}.header_inpos_above .l-header.pos_fixed.sticky{overflow:visible;transform:none}.header_inpos_above .l-header.pos_fixed~.l-section,.header_inpos_above .l-header.pos_fixed~.l-main,.header_inpos_above .l-header.pos_fixed~.l-main .l-section:first-child{padding-top:0 !important}.l-header.shadow_thin .l-subheader.at_middle,.l-header.shadow_thin .l-subheader.at_bottom,.l-header.shadow_none.sticky .l-subheader.at_middle,.l-header.shadow_none.sticky .l-subheader.at_bottom{box-shadow:0 1px 0 rgba(0,0,0,0.08)}.l-header.shadow_wide .l-subheader.at_middle,.l-header.shadow_wide .l-subheader.at_bottom{box-shadow:0 3px 5px -1px rgba(0,0,0,0.1), 0 2px 1px -1px rgba(0,0,0,0.05)}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-dropdown-list{top:auto;bottom:-0.4em;padding-top:0.4em;padding-bottom:2.4em}.l-subheader-cell>.w-cart{margin-left:0;margin-right:0}.l-subheader.at_top{line-height:40px;height:40px}.l-header.sticky .l-subheader.at_top{line-height:0px;height:0px}.l-subheader.at_middle{line-height:100px;height:100px}.l-header.sticky .l-subheader.at_middle{line-height:70px;height:70px}.l-subheader.at_bottom{line-height:50px;height:50px}.l-header.sticky .l-subheader.at_bottom{line-height:50px;height:50px}.l-header.pos_fixed~.l-section:first-of-type,.sidebar_left .l-header.pos_fixed + .l-main,.sidebar_right .l-header.pos_fixed + .l-main,.sidebar_none .l-header.pos_fixed + .l-main .l-section:first-of-type,.sidebar_none .l-header.pos_fixed + .l-main .l-section-gap:nth-child(2),.header_inpos_below .l-header.pos_fixed~.l-main .l-section:nth-of-type(2),.l-header.pos_static.bg_transparent~.l-section:first-of-type,.sidebar_left .l-header.pos_static.bg_transparent + .l-main,.sidebar_right .l-header.pos_static.bg_transparent + .l-main,.sidebar_none .l-header.pos_static.bg_transparent + .l-main .l-section:first-of-type{padding-top:140px}.l-header.pos_static.bg_solid + .l-main .l-section.preview_trendy .w-blogpost-preview{top:-140px}.header_inpos_bottom .l-header.pos_fixed~.l-main .l-section:first-of-type{padding-bottom:140px}.l-header.bg_transparent~.l-main .l-section.valign_center:first-of-type>.l-section-h{top:-70px}.header_inpos_bottom .l-header.pos_fixed.bg_transparent~.l-main .l-section.valign_center:first-of-type>.l-section-h{top:70px}.l-header.pos_fixed~.l-main .l-section.height_full:not(:first-of-type){min-height:calc(100vh - 70px)}.admin-bar .l-header.pos_fixed~.l-main .l-section.height_full:not(:first-of-type){min-height:calc(100vh - 102px)}.l-header.pos_static.bg_solid~.l-main .l-section.height_full:first-of-type{min-height:calc(100vh - 140px)}.l-header.pos_fixed~.l-main .l-section.sticky{top:70px}.admin-bar .l-header.pos_fixed~.l-main .l-section.sticky{top:102px}.l-header.pos_fixed.sticky + .l-section.type_sticky,.sidebar_none .l-header.pos_fixed.sticky + .l-main .l-section.type_sticky:first-of-type{padding-top:70px}.header_inpos_below .l-header.pos_fixed:not(.sticky){position:absolute;top:100%}.header_inpos_bottom .l-header.pos_fixed:not(.sticky){position:absolute;bottom:0}.header_inpos_below .l-header.pos_fixed~.l-main .l-section:first-of-type,.header_inpos_bottom .l-header.pos_fixed~.l-main .l-section:first-of-type{padding-top:0 !important}.header_inpos_below .l-header.pos_fixed~.l-main .l-section.height_full:nth-of-type(2){min-height:100vh}.admin-bar.header_inpos_below .l-header.pos_fixed~.l-main .l-section.height_full:nth-of-type(2){min-height:calc(100vh - 32px)}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-cart-dropdown,.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-nav.type_desktop .w-nav-list.level_2{bottom:100%;transform-origin:0 100%}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-nav.type_mobile.m_layout_dropdown .w-nav-list.level_1{top:auto;bottom:100%;box-shadow:0 -3px 3px rgba(0,0,0,0.1)}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-nav.type_desktop .w-nav-list.level_3,.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-nav.type_desktop .w-nav-list.level_4{top:auto;bottom:0;transform-origin:0 100%}}@media (min-width:600px) and (max-width:899px){.hidden_for_tablets{display:none !important}.l-subheader.at_bottom{display:none}.l-header{position:relative;z-index:111;width:100%}.l-subheader{margin:0 auto}.l-subheader.width_full{padding-left:1.5rem;padding-right:1.5rem}.l-subheader-h{display:flex;align-items:center;position:relative;margin:0 auto;height:inherit}.w-header-show{display:none}.l-header.pos_fixed{position:fixed;left:0}.l-header.pos_fixed:not(.notransition) .l-subheader{transition-property:transform, background-color, box-shadow, line-height, height;transition-duration:0.3s;transition-timing-function:cubic-bezier(.78,.13,.15,.86)}.l-header.bg_transparent:not(.sticky) .l-subheader{box-shadow:none !important;background-image:none;background-color:transparent}.l-header.bg_transparent~.l-main .l-section.width_full.height_auto:first-child{padding-top:0 !important;padding-bottom:0 !important}.l-header.pos_static.bg_transparent{position:absolute;left:0}.l-subheader.width_full .l-subheader-h{max-width:none !important}.header_inpos_above .l-header.pos_fixed{overflow:hidden;transition:transform 0.3s;transform:translate3d(0,-100%,0)}.header_inpos_above .l-header.pos_fixed.sticky{overflow:visible;transform:none}.header_inpos_above .l-header.pos_fixed~.l-section,.header_inpos_above .l-header.pos_fixed~.l-main,.header_inpos_above .l-header.pos_fixed~.l-main .l-section:first-child{padding-top:0 !important}.l-header.shadow_thin .l-subheader.at_middle,.l-header.shadow_thin .l-subheader.at_bottom,.l-header.shadow_none.sticky .l-subheader.at_middle,.l-header.shadow_none.sticky .l-subheader.at_bottom{box-shadow:0 1px 0 rgba(0,0,0,0.08)}.l-header.shadow_wide .l-subheader.at_middle,.l-header.shadow_wide .l-subheader.at_bottom{box-shadow:0 3px 5px -1px rgba(0,0,0,0.1), 0 2px 1px -1px rgba(0,0,0,0.05)}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-dropdown-list{top:auto;bottom:-0.4em;padding-top:0.4em;padding-bottom:2.4em}.l-subheader-cell>.w-cart{margin-left:0;margin-right:0}.l-subheader.at_top{line-height:40px;height:40px}.l-header.sticky .l-subheader.at_top{line-height:0px;height:0px}.l-subheader.at_middle{line-height:80px;height:80px}.l-header.sticky .l-subheader.at_middle{line-height:60px;height:60px}.l-subheader.at_bottom{line-height:50px;height:50px}.l-header.sticky .l-subheader.at_bottom{line-height:50px;height:50px}.l-header.pos_fixed~.l-section:first-of-type,.sidebar_left .l-header.pos_fixed + .l-main,.sidebar_right .l-header.pos_fixed + .l-main,.sidebar_none .l-header.pos_fixed + .l-main .l-section:first-of-type,.sidebar_none .l-header.pos_fixed + .l-main .l-section-gap:nth-child(2),.l-header.pos_static.bg_transparent~.l-section:first-of-type,.sidebar_left .l-header.pos_static.bg_transparent + .l-main,.sidebar_right .l-header.pos_static.bg_transparent + .l-main,.sidebar_none .l-header.pos_static.bg_transparent + .l-main .l-section:first-of-type{padding-top:120px}.l-header.pos_static.bg_solid + .l-main .l-section.preview_trendy .w-blogpost-preview{top:-120px}.l-header.pos_fixed~.l-main .l-section.sticky{top:60px}.l-header.pos_fixed.sticky + .l-section.type_sticky,.sidebar_none .l-header.pos_fixed.sticky + .l-main .l-section.type_sticky:first-of-type{padding-top:60px}}@media (max-width:599px){.hidden_for_mobiles{display:none !important}.l-subheader.at_top{display:none}.l-subheader.at_bottom{display:none}.l-header{position:relative;z-index:111;width:100%}.l-subheader{margin:0 auto}.l-subheader.width_full{padding-left:1.5rem;padding-right:1.5rem}.l-subheader-h{display:flex;align-items:center;position:relative;margin:0 auto;height:inherit}.w-header-show{display:none}.l-header.pos_fixed{position:fixed;left:0}.l-header.pos_fixed:not(.notransition) .l-subheader{transition-property:transform, background-color, box-shadow, line-height, height;transition-duration:0.3s;transition-timing-function:cubic-bezier(.78,.13,.15,.86)}.l-header.bg_transparent:not(.sticky) .l-subheader{box-shadow:none !important;background-image:none;background-color:transparent}.l-header.bg_transparent~.l-main .l-section.width_full.height_auto:first-child{padding-top:0 !important;padding-bottom:0 !important}.l-header.pos_static.bg_transparent{position:absolute;left:0}.l-subheader.width_full .l-subheader-h{max-width:none !important}.header_inpos_above .l-header.pos_fixed{overflow:hidden;transition:transform 0.3s;transform:translate3d(0,-100%,0)}.header_inpos_above .l-header.pos_fixed.sticky{overflow:visible;transform:none}.header_inpos_above .l-header.pos_fixed~.l-section,.header_inpos_above .l-header.pos_fixed~.l-main,.header_inpos_above .l-header.pos_fixed~.l-main .l-section:first-child{padding-top:0 !important}.l-header.shadow_thin .l-subheader.at_middle,.l-header.shadow_thin .l-subheader.at_bottom,.l-header.shadow_none.sticky .l-subheader.at_middle,.l-header.shadow_none.sticky .l-subheader.at_bottom{box-shadow:0 1px 0 rgba(0,0,0,0.08)}.l-header.shadow_wide .l-subheader.at_middle,.l-header.shadow_wide .l-subheader.at_bottom{box-shadow:0 3px 5px -1px rgba(0,0,0,0.1), 0 2px 1px -1px rgba(0,0,0,0.05)}.header_inpos_bottom .l-header.pos_fixed:not(.sticky) .w-dropdown-list{top:auto;bottom:-0.4em;padding-top:0.4em;padding-bottom:2.4em}.l-subheader-cell>.w-cart{margin-left:0;margin-right:0}.l-subheader.at_top{line-height:40px;height:40px}.l-header.sticky .l-subheader.at_top{line-height:0px;height:0px}.l-subheader.at_middle{line-height:50px;height:50px}.l-header.sticky .l-subheader.at_middle{line-height:50px;height:50px}.l-subheader.at_bottom{line-height:50px;height:50px}.l-header.sticky .l-subheader.at_bottom{line-height:50px;height:50px}.l-header.pos_fixed~.l-section:first-of-type,.sidebar_left .l-header.pos_fixed + .l-main,.sidebar_right .l-header.pos_fixed + .l-main,.sidebar_none .l-header.pos_fixed + .l-main .l-section:first-of-type,.sidebar_none .l-header.pos_fixed + .l-main .l-section-gap:nth-child(2),.l-header.pos_static.bg_transparent~.l-section:first-of-type,.sidebar_left .l-header.pos_static.bg_transparent + .l-main,.sidebar_right .l-header.pos_static.bg_transparent + .l-main,.sidebar_none .l-header.pos_static.bg_transparent + .l-main .l-section:first-of-type{padding-top:50px}.l-header.pos_static.bg_solid + .l-main .l-section.preview_trendy .w-blogpost-preview{top:-50px}.l-header.pos_fixed~.l-main .l-section.sticky{top:50px}.l-header.pos_fixed.sticky + .l-section.type_sticky,.sidebar_none .l-header.pos_fixed.sticky + .l-main .l-section.type_sticky:first-of-type{padding-top:50px}}@media (min-width:900px){.ush_image_1{height:51px}.l-header.sticky .ush_image_1{height:51px}}@media (min-width:600px) and (max-width:899px){.ush_image_1{height:20px}.l-header.sticky .ush_image_1{height:20px}}@media (max-width:599px){.ush_image_1{height:30px}.l-header.sticky .ush_image_1{height:30px}}.ush_text_1{white-space:nowrap}.ush_text_2{white-space:nowrap}.ush_text_3{white-space:nowrap}.header_hor .ush_menu_1.type_desktop .w-nav-list.level_1>.menu-item>a{padding-left:20px;padding-right:20px}.header_ver .ush_menu_1.type_desktop .w-nav-list.level_1>.menu-item>a{padding-top:20px;padding-bottom:20px}.ush_menu_1.type_desktop .w-nav-list>.menu-item.level_1{font-size:16px}.ush_menu_1.type_desktop .w-nav-list>.menu-item:not(.level_1){font-size:15px}.ush_menu_1.type_mobile .w-nav-anchor.level_1{font-size:1.1rem}.ush_menu_1.type_mobile .w-nav-anchor:not(.level_1){font-size:0.9rem}@media (min-width:900px){.ush_menu_1 .w-nav-icon{font-size:20px}}@media (min-width:600px) and (max-width:899px){.ush_menu_1 .w-nav-icon{font-size:20px}}@media (max-width:599px){.ush_menu_1 .w-nav-icon{font-size:20px}}@media screen and (max-width:950px){.w-nav.ush_menu_1>.w-nav-list.level_1{display:none}.ush_menu_1 .w-nav-control{display:block}}@media (min-width:900px){.ush_search_1.layout_simple{max-width:240px}.ush_search_1.layout_modern.active{width:240px}.ush_search_1 .w-search-open,.ush_search_1 .w-search-close,.ush_search_1 .w-search-form-btn{font-size:18px}}@media (min-width:600px) and (max-width:899px){.ush_search_1.layout_simple{max-width:200px}.ush_search_1.layout_modern.active{width:200px}.ush_search_1 .w-search-open,.ush_search_1 .w-search-close,.ush_search_1 .w-search-form-btn{font-size:18px}}@media (max-width:599px){.ush_search_1 .w-search-open,.ush_search_1 .w-search-close,.ush_search_1 .w-search-form-btn{font-size:18px}}.ush_socials_1 .w-socials-list{margin:-0}.ush_socials_1 .w-socials-item{padding:0}@media (min-width:900px){.ush_socials_1{font-size:20px}}@media (min-width:600px) and (max-width:899px){.ush_socials_1{font-size:18px}}@media (max-width:599px){.ush_socials_1{font-size:16px}}@media (min-width:900px){.ush_cart_1 .w-cart-link{font-size:20px}}@media (min-width:600px) and (max-width:899px){.ush_cart_1 .w-cart-link{font-size:20px}}@media (max-width:599px){.ush_cart_1 .w-cart-link{font-size:20px}}</style>
			
</head>
<body class="wp-singular -template-default single page page-id-0 page-parent wp-theme-Impreza wp-child-theme-Impreza-child-2019 l-body Impreza_5.6.1 header_hor header_inpos_top state_default wpb-js-composer js-comp-ver-7.1 vc_responsive" itemscope itemtype="https://schema.org/WebPage">

<div class="l-canvas sidebar_none type_wide">

	
		
		<header class="l-header pos_fixed bg_solid shadow_thin" itemscope itemtype="https://schema.org/WPHeader"><div class="l-subheader at_top"><div class="l-subheader-h"><div class="l-subheader-cell at_left"><div class="w-text ush_text_2"><div class="w-text-h"><i class="fas fa-phone"></i><span class="w-text-value">+337 868 051 80</span></div></div><div class="w-text ush_text_3"><div class="w-text-h"><i class="fas fa-envelope"></i><a class="w-text-value" href="mailto:office@grasp-sas.com">office@grasp-sas.com</a></div></div></div><div class="l-subheader-cell at_center"></div><div class="l-subheader-cell at_right"><div class="w-socials ush_socials_1 style_default hover_fade color_brand shape_square"><div class="w-socials-list"></div></div></div></div></div><div class="l-subheader at_middle"><div class="l-subheader-h"><div class="l-subheader-cell at_left"><div class="w-image ush_image_1"><a class="w-image-h" href="https://www.grasp-open.com/"><img width="358" height="162" src="https://www.grasp-open.com/wp-content/uploads/2019/01/GraspOpen_v8medium.png" class="for_default" alt="" decoding="async" fetchpriority="high" srcset="https://www.grasp-open.com/wp-content/uploads/2019/01/GraspOpen_v8medium.png 358w, https://www.grasp-open.com/wp-content/uploads/2019/01/GraspOpen_v8medium-300x136.png 300w" sizes="(max-width: 358px) 100vw, 358px" /></a></div></div><div class="l-subheader-cell at_center"></div><div class="l-subheader-cell at_right"><nav class="w-nav ush_menu_1 height_full type_desktop dropdown_height m_align_left m_layout_dropdown" itemscope itemtype="https://schema.org/SiteNavigationElement"><a class="w-nav-control" href="javascript:void(0);" aria-label="Menu"><div class="w-nav-icon"><i></i></div><span>Menu</span></a><ul class="w-nav-list level_1 hide_for_mobiles hover_simple"><li id="menu-item-3771" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home w-nav-item level_1 menu-item-3771"><a class="w-nav-anchor level_1"  href="http://www.grasp-open.com/"><span class="w-nav-title">Home</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-5326" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children w-nav-item level_1 menu-item-5326"><a class="w-nav-anchor level_1"  href="#"><span class="w-nav-title">Events</span><span class="w-nav-arrow"></span></a><ul class="w-nav-list level_2"><li id="menu-item-5471" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_2 menu-item-5471"><a class="w-nav-anchor level_2"  href="https://www.grasp-open.com/grasp-synergy-summer-school-2026/"><span class="w-nav-title">GRASP-SYNERGY Summer School 2026 (Valladolid, ES)</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-5477" class="menu-item menu-item-type-custom menu-item-object-custom w-nav-item level_2 menu-item-5477"><a class="w-nav-anchor level_2"  href="https://www.loa.univ-lille.fr/workshops/GRASP-ACE2023/"><span class="w-nav-title">GRASP-ACE Summer School 2023 (Lille, FR)</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-5327" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_2 menu-item-5327"><a class="w-nav-anchor level_2"  href="https://www.grasp-open.com/summer-school-2019/"><span class="w-nav-title">GRASP-ACE Summer School 2019 (Granada, ES)</span><span class="w-nav-arrow"></span></a></li></ul></li><li id="menu-item-5278" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_1 menu-item-5278"><a class="w-nav-anchor level_1"  href="https://www.grasp-open.com/publications-2/"><span class="w-nav-title">Publications</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-4232" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_1 menu-item-4232"><a class="w-nav-anchor level_1"  href="https://www.grasp-open.com/products/"><span class="w-nav-title">Products</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-5302" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_1 menu-item-5302"><a class="w-nav-anchor level_1"  href="https://www.grasp-open.com/labs/"><span class="w-nav-title">Labs</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-3836" class="menu-item menu-item-type-custom menu-item-object-custom w-nav-item level_1 menu-item-3836"><a class="w-nav-anchor level_1"  href="http://www.grasp-open.com/doc/"><span class="w-nav-title">Documentation</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-5359" class="menu-item menu-item-type-custom menu-item-object-custom w-nav-item level_1 menu-item-5359"><a class="w-nav-anchor level_1"  href="https://portal.grasp-sas.com/register"><span class="w-nav-title">Register</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-3776" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_1 menu-item-3776"><a class="w-nav-anchor level_1"  href="https://www.grasp-open.com/contact/"><span class="w-nav-title">Contact</span><span class="w-nav-arrow"></span></a></li><li id="menu-item-3988" class="menu-item menu-item-type-post_type menu-item-object-page w-nav-item level_1 menu-item-3988"><a class="w-nav-anchor level_1"  href="https://www.grasp-open.com/search/"><span class="w-nav-title"><i class="fa fa-search"></i></span><span class="w-nav-arrow"></span></a></li><li class="w-nav-close"></li></ul><div class="w-nav-options hidden" onclick='return {&quot;mobileWidth&quot;:951,&quot;mobileBehavior&quot;:1}'></div></nav></div></div></div><div class="l-subheader for_hidden hidden"></div></header>
		
	<link rel="stylesheet" id="docbook-custom-style" href="docbook-custom-style.css" type="text/css" media="all"><div class="l-submain"><div class="g-html i-cf"><div id="content" class="l-submain-h" role="main"><div class="chapter" title="Chapter 3. Installation"><div class="titlepage"><div><div><h2 class="title"><a name="chap03"></a>Chapter 3. Installation</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span><a href="ch03.php#idm557">3.1. Introduction</a></span></dt><dt><span><a href="ch03.php#idm561">3.2. Hardware requirements</a></span></dt><dt><span><a href="ch03.php#idm563">3.3. Operating Systems</a></span></dt><dt><span><a href="ch03.php#access-repository">3.4. Access to <acronym class="acronym">GRASP</acronym> Open repository</a></span></dt><dt><span><a href="ch03.php#idm596">3.5. Building and installing <acronym class="acronym">GRASP</acronym></a></span></dt><dd><dl><dt><span><a href="ch03.php#idm610">3.5.1. Dependencies</a></span></dt><dt><span><a href="ch03.php#basic-installation">3.5.2. Basic installation of <acronym class="acronym">GRASP</acronym></a></span></dt><dt><span><a href="ch03.php#idm669">3.5.3. Advanced compilation</a></span></dt></dl></dd><dt><span><a href="ch03.php#running-code">3.6. Running the code</a></span></dt><dd><dl><dt><span><a href="ch03.php#idm927">3.6.1. Usage of GRASP: The configuration file</a></span></dt></dl></dd><dt><span><a href="ch03.php#multi-repository">3.7. Code repository and extensions</a></span></dt><dd><dl><dt><span><a href="ch03.php#grasp-manager">3.7.1. GRASP Manager</a></span></dt></dl></dd><dt><span><a href="ch03.php#idm1030">3.8. Known problems</a></span></dt></dl></div><div class="sect1" title="3.1. Introduction"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm557"></a>3.1. Introduction</h2></div></div></div><p>
            This section describes how to download, compile and install the <acronym class="acronym">GRASP</acronym> Open software from the user's perspective.
            Basic knowledge of the terminal and some tools such as GIT are necessary to complete this process.
        </p></div><div class="sect1" title="3.2. Hardware requirements"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm561"></a>3.2. Hardware requirements</h2></div></div></div>
        The system has been tested on modern Intel architectures only (PC compatible, Macintoshes).
        It should work on any 32-bit and 64-bit platform. A minimum of 2 GB of RAM is recommended.
        GRASP is a very hardware demanding software because math calculations are very time-consuming. In
        a multicore scenarios GRASP is able to parallelize the entire process using MPI technology. Additionally, 
        GRASP offers a GPGPU module (as extension, not installed by default) that allows to parallelize
        a single segment retrieval using graphics cards.
    </div><div class="sect1" title="3.3. Operating Systems"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm563"></a>3.3. Operating Systems</h2></div></div></div><p>
            The code has been widely tested under Linux machines and <span class="trademark">MacOSX</span>™ systems.
            The installation process in old operating systems is usually more complex so we suggest to always use 
            the lastest version of operating system. Ubuntu systems have shown the easiest installation process
            so we recommend it for regular users.
        </p><p>
            For windows users some test under <span class="trademark">Microsoft Windows</span>™ has been also performed successfully using Cygwin,
            but we do not offer official support for this solution. Some manipulations are needed depending on the specific version of Windows and
            Cygwin, so even if a solution is possible, it is not straightforward and we do not recommend it. There is one exception:
            the last version of <span class="trademark">Microsoft Windows 10</span>™ offers the feature <span class="bold"><strong>Windows Subsystem for 
            Linux</strong></span> which allows the users to set up an Ubuntu environment over Windows. This unestable but very promissing
            feature can really help to install GRASP on Windows. You can start with this solution following this article of 
            <a class="link" href="https://msdn.microsoft.com/commandline/wsl/about" target="_top">MSDN</a>. Once you have your Ubuntu environment configured,
            you can follow this guide as a Linux user.
        </p></div><div class="sect1" title="3.4. Access to GRASP Open repository"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="access-repository"></a>3.4. Access to <acronym class="acronym">GRASP</acronym> Open repository</h2></div></div></div><p>
            To access the code, the users have to register their account on GRASP Open web page.
            There are different ways to download the code (direct download link, clone over HTTP...) but
            we recommend to clone the code over GIT protocol. This method has the benefit of being manageable by the
            grasp-manager (see <a class="xref" href="ch03.php#grasp-manager" title="3.7.1. GRASP Manager">Section 3.7.1, “GRASP Manager”</a>) which is the easiest way to keep the code up-to-date
            and manage GRASP extensions. The following steps show the process of getting access to the repository
            and setting up your access via GIT protocol.
            </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
                    Go to <a class="link" href="https://www.grasp-open.com/products/" target="_top">GRASP-Open web page code section</a>. And click in the "GITLAB REPOSITORY" bottom.
                </li><li class="listitem">
                    Fill all the fields of the registration form (last section of that page), accept the conditions and press SIGNUP button. 
                </li><li class="listitem">
                    If the registration was successful, you will get a confirmation message. Click on the "Initialize password" button.
                </li><li class="listitem">
                    The GitLab system, which is the system used to manage the code, will ask you for your email to reset the password (initialize it). Introduce your email and click on the "Reset Password" button.
                </li><li class="listitem">
                    You'll receive an email for resetting the password. Follow the link in the email and set up your new password.
                </li><li class="listitem">
                    The next window will show the main page of the GitLab system. You can sign in using your email and your password. Remember that you
                    can access that web page at anytime, using the button "GITLAB REPOSITORY" in <a class="link" href="https://www.grasp-open.com/products/" target="_top">GRASP-Open web page code section</a>.
                </li><li class="listitem">
                    On the main page of the GitLab system you can see different repositories you can access. Go to the GRASP repository or
                    use this <a class="link" href="http://code.grasp-open.com/open/grasp" target="_top">link</a></li><li class="listitem">
                    There you can explore many things: you can see the code, see the changes, open an issue to get in touch with the developer team ... 
                    To download the code, there are three alternatives: a) direct download, b) cloning repository over http or c) cloning repository
                    over git protocol. The last solution is recommended so we'll continue explaining this process.
                </li><li class="listitem">
                    Set up your ssh-key in GitLab. It allows you to access the code via GIT protocol whitout a need of typing passwords. To set up
                    a ssh-key you have to go to you-profile&gt;edit&gt;ssh-keys section or using this <a class="link" href="http://code.grasp-open.com/profile/keys" target="_top">link</a>.
                </li><li class="listitem">
                    Follow <a class="link" href="http://code.grasp-open.com/help/ssh/README" target="_top">this guide</a> to create a ssh-key if you don't have one. If you already have a
                    ssh-key you can follow the same guide but skip the first steps of a key creation, just copy it to the clipboard.
                </li><li class="listitem">
                    Paste your ssh-key in the GitLab system and click the button "Add key"
                </li><li class="listitem">
                    Now your system is properly configured and you can download the code over the git protocol. The section <a class="xref" href="ch03.php#basic-installation" title="3.5.2. Basic installation of GRASP">Section 3.5.2, “Basic installation of <acronym class="acronym">GRASP</acronym>”</a>
                    explains how to download the code, compile and install it.
                </li></ol></div><p>
        </p></div><div class="sect1" title="3.5. Building and installing GRASP"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm596"></a>3.5. Building and installing <acronym class="acronym">GRASP</acronym></h2></div></div></div><p>
            The <acronym class="acronym">GRASP</acronym> software makes a heavy use of a number of libraries for data preparation and numerical computations.
            As for the <acronym class="acronym">GRASP</acronym> software itself, it relies on the following libraries
            <a class="link" href="http://en.wikipedia.org/wiki/Free_and_open-source_software" target="_top">FOSS</a> or belong to the public domain.
        </p><p>
            We are very focused on keeping the whole system free and depending only on non-commercial libraries. That does not
            mean that non-open source software can't be linked to <acronym class="acronym">GRASP</acronym>
            (certainly closed-source, or even open-source, although restricted
            <sup>[<a name="idm605" href="#ftn.idm605" class="footnote">2</a>]</sup>
            solutions
            are sometimes better than the free ones for certain purposes), but the system should always be able to run only with 
            free, open-source alternatives.
        </p><div class="sect2" title="3.5.1. Dependencies"><div class="titlepage"><div><div><h3 class="title"><a name="idm610"></a>3.5.1. Dependencies</h3></div></div></div><p>
                The following list shows the GRASP core dependencies. Some extensions can require extra dependencies,
                in that case, please follow the documentation of the extension to know the installation process.
                </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">a C compiler (recommended gcc).</li><li class="listitem">a Fortran compiler (known to work with <a class="link" href="http://gcc.gnu.org/wiki/GFortranBinaries" target="_top">gfortran</a> and ifort).</li><li class="listitem">a make command (provided on any POSIX system).</li><li class="listitem">the <a class="link" href="http://www.cmake.org" target="_top">cmake</a> building software.</li><li class="listitem">
                        One of the four numerical packages:
                        <p>
                            </p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><a class="link" href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/" target="_top">SuperLU</a></li><li class="listitem"><a class="link" href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/" target="_top">SuperLU_MT</a> (not included in the framework yet)</li><li class="listitem"><a class="link" href="http://graal.ens-lyon.fr/MUMPS/" target="_top">MUMPS</a></li><li class="listitem"><a class="link" href="http://viennacl.sourceforge.net" target="_top">ViennaCL</a></li></ul></div><p>
                        </p></li><li class="listitem">
                        a BLAS library (Netlib <a class="link" href="http://www.netlib.org/blas/" target="_top">BLAS</a>, <a class="link" href="http://math-atlas.sourceforge.net" target="_top">ATLAS</a>, <a class="link" href="http://www.tacc.utexas.edu/tacc-projects/gotoblas2/" target="_top">GotoBLAS</a>). Actually, BLAS is not used directly by <acronym class="acronym">GRASP</acronym>, but some numerical packages
                        (SuperLU, MUMPS), which <acronym class="acronym">GRASP</acronym> relies on, are built on the BLAS. BLAS will be necessary only if you build <acronym class="acronym">GRASP</acronym> with these
                        packages. Currently, Netlib BLAS is the default BLAS library for the <acronym class="acronym">GRASP</acronym> but this may change over time.
                        The <acronym class="acronym">GRASP</acronym> code has currently been tested with the Netlib, BLAS and ATLAS.
                    </li><li class="listitem">
                        The <a class="link" href="http://www.netlib.org/lapack/" target="_top">LAPACK</a> library. As for the ATLAS, LAPACK is only necessary with
                        the SuperLU and MUMPS packages, not with ViennaCL. Please note that ATLAS ships with a partial LAPACK implementation for its own purposes, but that
                        is not sufficient for the numerical packages on which <acronym class="acronym">GRASP</acronym> relies. You must install the full LAPACK package.
                    </li><li class="listitem"><a class="link" href="http://www.netlib.org/scalapack/" target="_top">ScaLAPACK</a> (a requirement for the SuperLU and MUMPS numerical packages only).</li><li class="listitem"><a class="link" href="http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview" target="_top">ParMETIS</a> (a requirement for the MUMPS numerical package only).</li><li class="listitem"><a class="link" href="http://www.open-mpi.org" target="_top">OpenMPI</a> (optional). This package is needed to work with the MUMPS. The GRASP software can also be compiled using MPI by adding it
                        the capability to process many segments at the same time.</li><li class="listitem">The Gnome Library <a class="link" href="https://developer.gnome.org/glib/" target="_top">GLib</a> (mostly used by the configuration manager).</li><li class="listitem">The <a class="link" href="http://pyyaml.org/wiki/LibYAML" target="_top">LibYAML</a> library (YAML is the chosen format for <acronym class="acronym">GRASP</acronym> configuration).</li><li class="listitem">The C Unit Testing Framework: <a class="link" href="http://cunit.sourceforge.net" target="_top">CUnit</a>.</li></ul></div><p>
            </p><p>
                These dependencies can be installed in an Ubuntu system with the following command:
                </p><pre class="screen">        

# All deps except superlu:
sudo apt-get install build-essential cmake git gfortran libyaml-dev libglib2.0-dev libcunit1-dev libsuperlu-dev
                </pre><p>
            </p></div><div class="sect2" title="3.5.2. Basic installation of GRASP"><div class="titlepage"><div><div><h3 class="title"><a name="basic-installation"></a>3.5.2. Basic installation of <acronym class="acronym">GRASP</acronym></h3></div></div></div><p>
                Your system should be ready now for the installation. If it is not the case, please refer to the previous section. 
                Also, it is assumed that the user has access to the git repository, otherwise please check <a class="xref" href="ch03.php#access-repository" title="3.4. Access to GRASP Open repository">Section 3.4, “Access to <acronym class="acronym">GRASP</acronym> Open repository”</a>.
            </p><p>
                The steps to download and install GRASP are the same for all platforms (Windows/Cygwin, MacOSX, Linux). Depending on your system, 
                you may or may not have the <span class="command"><strong>sudo</strong></span> command. It is used for running a command with administrative rights. In that 
                case, you can try without <span class="command"><strong>sudo</strong></span> (e.g. on Cygwin), or use the <span class="command"><strong>su</strong></span> instead for logging as administrator. You can also perform a custom installation (see the next section) so you don't need to be administrator. If none of this makes sense for you, ask your local Unix guru.
            </p><p>
                </p><pre class="screen">        

$ git clone git@code.grasp-open.com:open/grasp.git 
$ cd grasp
$ # you should now be in the master branch of the project
$ # (developers of the project may need to checkout the dev branch)
$ make # build the project using the default build settings
$ sudo make install # install grasp. Administrative privileges are needed.
                </pre><p>
            </p></div><div class="sect2" title="3.5.3. Advanced compilation"><div class="titlepage"><div><div><h3 class="title"><a name="idm669"></a>3.5.3. Advanced compilation</h3></div></div></div><p>GRASP uses cmake system to compile the code. You can compile the code using CMAKE following these steps:</p><p>
                </p><pre class="screen">        

$ # Place a terminal in GRASP root folder
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DADDITIONAL_DEPENDENCIES_PATH=/usr/local/grasp-deps -DCONSTANTS_SET=generic
$ make -j12
$ sudo make install
$ grasp # test the command
                </pre><p>
            </p><p>You can use a different compilation configuration. All configuration options are defined in <a class="xref" href="ch03.php#custom-installation-cmake" title="3.5.3.2. Custom installation using cmake">Section 3.5.3.2, “Custom installation using cmake”</a></p><p>For users that are not familiar with cmake there is a Makefile which wraps cmake system and is placed in root folder. 
                This Makefile simplifies the use of cmake via make script. Internally, the Makefile creates cmake structure and call it. 
                Thanks to this operation, you can compile using this system like it is defined in <a class="xref" href="ch03.php#basic-installation" title="3.5.2. Basic installation of GRASP">Section 3.5.2, “Basic installation of <acronym class="acronym">GRASP</acronym>”</a>. Addionally, this Makefile also
                allows you to use some extra configuration parameters that are explained in <a class="xref" href="ch03.php#custom-installation-make" title="3.5.3.1. Custom installation using make">Section 3.5.3.1, “Custom installation using make”</a>.
            </p><p>Finally, the last way to compile the code is via grasp-manager. Grasp-manager is described in the next section: <a class="xref" href="ch03.php#grasp-manager" title="3.7.1. GRASP Manager">Section 3.7.1, “GRASP Manager”</a></p>.
        

            <div class="sect3" title="3.5.3.1. Custom installation using make"><div class="titlepage"><div><div><h4 class="title"><a name="custom-installation-make"></a>3.5.3.1. Custom installation using make</h4></div></div></div><p>
                    If you have compiled the code following the rules explained in <a class="xref" href="ch03.php#basic-installation" title="3.5.2. Basic installation of GRASP">Section 3.5.2, “Basic installation of <acronym class="acronym">GRASP</acronym>”</a>, you have compiled the code with default options. 
                    The options and their possible values are listed below (the default value is written in italic):
                    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><span class="bold"><strong>CONSTANTS_SET: </strong></span><span class="emphasis"><em>generic</em></span> or see <a class="xref" href="ch03.php#constants-set" title="3.5.3.3. Constants sets">Section 3.5.3.3, “Constants sets”</a></li><li class="listitem"><span class="bold"><strong>BUILD: </strong></span><span class="emphasis"><em>Release</em></span> or Debug, RelWithDebInfo or Fast</li><li class="listitem"><span class="bold"><strong>MPI: </strong></span><span class="emphasis"><em>off</em></span> or on</li><li class="listitem"><span class="bold"><strong>DEBUG_MPI: </strong></span><span class="emphasis"><em>off</em></span> or on</li><li class="listitem"><span class="bold"><strong>F90: </strong></span><span class="emphasis"><em>gfortran</em></span> or ifort</li><li class="listitem"><span class="bold"><strong>PREFIX: </strong></span><span class="emphasis"><em>/usr/local</em></span> or other valid path where dependencies are available</li><li class="listitem"><span class="bold"><strong>BUILD_DIR: </strong></span><span class="emphasis"><em>build</em></span> or other name but then build is ignored by git</li><li class="listitem"><span class="bold"><strong>CC: </strong></span><span class="emphasis"><em>cc</em></span> or another valid c compiler</li><li class="listitem"><span class="bold"><strong>CCX: </strong></span><span class="emphasis"><em>c++</em></span> or another valid c++ compiler</li></ul></div><p>
                    For example:
                    </p><pre class="screen">        

$ make CONSTANTS_SET=polder MPI=on
                    </pre><p>        
                </p></div><div class="sect3" title="3.5.3.2. Custom installation using cmake"><div class="titlepage"><div><div><h4 class="title"><a name="custom-installation-cmake"></a>3.5.3.2. Custom installation using cmake</h4></div></div></div><p>
                    By default, the resources and dependencies will be installed in the
                    following directories:
                    </p><table border="0" summary="Simple list" class="simplelist"><tr><td>
                            <code class="filename">/usr/local/share/grasp</code> (resources that are internal databases or files used by <acronym class="acronym">GRASP</acronym>)</td></tr><tr><td>
                            <code class="filename">/usr/local/grasp-deps</code> (for general-purpose, utility libraries)</td></tr></table><p>
                </p><p>
                    If one does not wish (or may not be able) to install <acronym class="acronym">GRASP</acronym> under default system directories,
                    it is possible, and very easy to change these paths of installation with the <code class="envar">PREFIX</code> variable.
                </p><p>
                    Please find below the way to install the project under your HOME directory instead of <code class="filename">/usr/local</code> (now you don't need administrative rights anymore). In this case, we will use cmake compilation system instead of the Makefile placed in the root folder, which wraps it.
                </p><p>
                    </p><pre class="screen">        

$ cd ~/grasp/dependencies
$ sudo make PREFIX=$HOME/local install
$ #The command above builds and installs the third-parties dependencies under /home/your_name/local,
$ #instead of /usr/local
$ cd ..
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DADDITIONAL_DEPENDENCIES_PATH=$HOME/local -DCONSTANTS_SET=generic
$ #The command above generates a Makefile with custom parameters
$ make -j12 # build the project
$ sudo make install # install grasp under $HOME/local/bin
$ $HOME/local/bin/grasp
$ # test the command (of course, it is then recommended to add $HOME/local/bin to your PATH)
                    </pre><p>
                </p><p>
                    Another possible customization is to change the numerical solver for <acronym class="acronym">GRASP</acronym>. By default, it is set to <a class="link" href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/" target="_top">SUPERLU</a>. If you wish to try another solver
                    <sup>[<a name="idm734" href="#ftn.idm734" class="footnote">3</a>]</sup>, you may use:
                </p><p>
                    <span class="command"><strong>cmake SPARSE_SOLVER=</strong></span>
                    <span class="emphasis"><em>your_chosen_solver</em></span>
                </p><div class="table"><a name="tablesolvers"></a><p class="title"><b>Table 3.1. SPARSE_SOLVER's
                        valid values</b></p><div class="table-contents"><table summary="SPARSE_SOLVER's
                        valid values" border="1"><colgroup><col align="left"></colgroup><tbody><tr><td align="left">SUPERLU (default)</td></tr><tr><td align="left">SUPERLU_MT (not supported yet)</td></tr><tr><td align="left">VIENNA_CL</td></tr><tr><td align="left">MUMPS</td></tr></tbody></table></div></div><br class="table-break"><p>
                    You may also want to link the project to the BLAS implementation of
                    your choice. This is possible with:
                </p><p>
                    <span class="command"><strong>cmake BLAS=</strong></span>
                    <span class="emphasis"><em>your_chosen_blas_library</em></span>
                </p><div class="table"><a name="tableblas"></a><p class="title"><b>Table 3.2. BLAS valid values</b></p><div class="table-contents"><table summary="BLAS valid values" border="1"><colgroup><col align="left"></colgroup><tbody><tr><td align="left">netlib-blas (default)</td></tr><tr><td align="left">atlas</td></tr></tbody></table></div></div><br class="table-break"><p>
                    The CONSTANTS_SET setting can be used for performing memory optimizations with
                    a specific set of data, e.g. <span class="command"><strong>cmake CONSTANTS_SET=polder</strong></span>. If one is not sure,
                    one may stick to the default. See <a class="xref" href="ch03.php#constants-set" title="3.5.3.3. Constants sets">Section 3.5.3.3, “Constants sets”</a>
                </p><div class="table"><a name="tableconstset"></a><p class="title"><b>Table 3.3. Main CONSTANTS_SET values (installed by default)</b></p><div class="table-contents"><table summary="Main CONSTANTS_SET values (installed by default)" border="1"><colgroup><col align="left"></colgroup><tbody><tr><td align="left">generic (default)</td></tr><tr><td align="left">valgrind</td></tr><tr><td align="left">(you can install external constants set and use them)</td></tr></tbody></table></div></div><br class="table-break"><p>
                    The <code class="envar">BUILD</code> setting can be used to switch between debug (non optimized, with debug information), dev (partially optimized)
                    and prod (optimized) modes at build time,
                    e.g. <span class="command"><strong>cmake BUILD=prod</strong></span>. The default is <code class="computeroutput">dev</code>.
                </p><div class="table"><a name="tablebuild"></a><p class="title"><b>Table 3.4. BUILD valid values</b></p><div class="table-contents"><table summary="BUILD valid values" border="1"><colgroup><col align="left"></colgroup><tbody><tr><td align="left">Debug</td></tr><tr><td align="left">Release (default)</td></tr><tr><td align="left">RelWithDebInfo</td></tr><tr><td align="left">Fast</td></tr></tbody></table></div></div><br class="table-break"><p>
                    Of course, there is no limitation to the number of settings that the <span class="command"><strong>cmake</strong></span> command can accept:
                </p><p>
                    <span class="command"><strong>cmake PREFIX=$HOME/local BUILD=prod SPARSE_SOLVER=SUPERLU CONSTANTS_SET=generic</strong></span>
                </p></div><div class="sect3" title="3.5.3.3. Constants sets"><div class="titlepage"><div><div><h4 class="title"><a name="constants-set"></a>3.5.3.3. Constants sets</h4></div></div></div><p>
                    GRASP is a highly memory- and time-consuming software, which is strongly optimized. Usually in software development, 
                    time can be optimized using more memory and memory can be saved using more calculation time. In software development, 
                    there should be a balance between the time consumption and the memory cost. GRASP has found this balance 
                    using many static arrays to optimize time performance and defining the size of these arrays like constant 
                    values. This method permits to choose during compilation time, the size of these arrays, allowing the user to optimize 
                    the software, depending on the use. For example, GRASP will take more memory if it is compiled to use a maximum 
                    of eight wavelengths instead of four. We have created some standard constants sets for the most common uses and 
                    in general you can use "generic" CONSTANTS_SET as one valid to test all instruments. If it is not valid 
                    you can check whether your application fits with another existing constants set or create your own. Constants sets are managed
                    by grasp-manager as an extension of GRASP. It means that you can install an external definition of the constants set
                    depending on your necessities or create your own. Constants set are placed in <code class="filename">src/retrieval/constants_set/{CONSTANTS_SET_NAME}</code> 
                    and consist of four files:
                    </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">mod_par_DLS.inc</li><li class="listitem">mod_par_OS.inc</li><li class="listitem">mod_par_DLS_bin.inc</li><li class="listitem">mod_par_inv.inc</li></ul></div><p>   
                    Where {CONSTANTS_SET_NAME} is the name of the constants set, which also can be defined by the user, for code compilation.
                </p></div></div></div><div class="sect1" title="3.6. Running the code"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="running-code"></a>3.6. Running the code</h2></div></div></div><p>
            Once the code is installed, you can test it right away. In the following examples, it is assumed that the 
            user has installed GRASP as a wide system executable. Otherwise, the GRASP binary is placed in <code class="filename">./build/bin/grasp</code>.
            When GRASP is executed without arguments, it prints some general information about the version and
            how it was compiled:
        </p><p>
            </p><pre class="screen">    

$ grasp

GRASP core version: v0.7.0 (commit: c0bd56a ; branch_name: HEAD)
Compiled on 2016-06-02 10:21:03 +0200 commit of 2016-05-24 18:17:11 +0200
With C compiler: Apple LLVM version 7.3.0 (clang-703.0.31)
With FORTRAN compiler: GNU Fortran (Homebrew gcc 5.3.0 --with-all-languages) 5.3.0
Using generic constant set and build type Release
Maximum segment size: nx=2 ; ny=2 ; nt=30
Input drivers loaded: sdata
Input transformers loaded: none
Output segment functions loaded: ascii classic classic_plot none
Output tile functions loaded: ascii none
Output current functions loaded: none
Path to resources: /usr/local/share/grasp/
Sparse solver used: SuperLU
Build System: Darwin-15.5.0
Executable path: undefined absolute path (./build/bin/grasp_app)

usage: grasp [OPTIONS] {settings_file.yml}|help

OPTIONS:
-V       use valgrind
            </pre><p>
        </p><p>
            In the examples folder there are some examples that the user can apply to verify that the whole system is
            working properly. To run an example you have to call GRASP followed 
            by the settings file as the first argument:
        </p><pre class="screen">    

$grasp examples/sunphotometer/settings_example_sunphotometer_inversion.yml
Config file read successfully <a class="co" name="configok-co" href="ch03.php#configok"><img src="images/callouts/1.png" alt="1" border="0"></a>
The tile is divided in segments with 1 rows, 1 cols and 1 times. 1 inversions will be performed (sequential version) <a class="co" name="tiledivision-co" href="ch03.php#tiledivision"><img src="images/callouts/2.png" alt="2" border="0"></a>
Retrieval #0 (1/1): 100.00%: 1 pixel will be processed <a class="co" name="firstsegment-co" href="ch03.php#firstsegment"><img src="images/callouts/3.png" alt="3" border="0"></a>

... <a class="co" name="retrievalprocess-co" href="ch03.php#retrievalprocess"><img src="images/callouts/4.png" alt="4" border="0"></a>

826.69409  1:   0.76332E+00   84.82804 %    2:   0.47585E+00    119.16735 %    pixel # 1      Residual using INITIAL GUESS
277.77368  1:   0.29931E+00   30.63890 %    2:   0.33364E+00    30.73591 %   pixel # 1    Residual after iteration # 1
22.29646  1:   0.71556E-01    5.62210 %    2:   0.21300E-01     2.00627 %    pixel # 1    Residual after iteration # 2
8.99939  1:   0.19544E-01    1.39876 %    2:   0.86748E-02      1.84197 %    pixel # 1    Residual after iteration # 3
1.26664  1:   0.34922E-02    1.21845 %    2:   0.25801E-03      0.03841 %    pixel # 1    Residual after iteration # 4
0.91952  1:   0.27402E-02    0.83636 %    2:   0.34244E-03      0.05860 %    pixel # 1    Residual after iteration # 5
0.49750  1:   0.27118E-02    0.39311 %    2:   0.28940E-03      0.09854 %    pixel # 1    Residual after iteration # 6
0.49593  1:   0.22867E-02    0.25629 %    2:   0.41266E-03      0.10136 %    pixel # 1    Residual after iteration # 7
0.37954  1:   0.83430E-03    0.12501 %    2:   0.34994E-03      0.03372 %    pixel # 1    Residual after iteration # 8
0.19446  1:   0.67640E-03    0.09489 %    2:   0.16508E-03      0.04304 %    pixel # 1    Residual after iteration # 9
0.11306  1:   0.59844E-03    0.07205 %    2:   0.84066E-04      0.02038 %    pixel # 1    Residual after iteration # 10
0.11299  1:   0.58013E-03    0.07008 %    2:   0.85618E-04      0.01960 %    pixel # 1    Residual after iteration # 11
Retrieval #0 (1/1): 100.00%: 1 pixels processed in 15.478408 seconds (cpu time: 15.433357).
Average per pixel: 15.478408 (cpu time: 15.433357)
Retrieval #0 (1/1): 100.00%: finished

... <a class="co" name="results-co" href="ch03.php#results"><img src="images/callouts/5.png" alt="5" border="0"></a>

Size Distribution dV/dlnr (normalized to 1) for 1 - fraction
0.50000E-01   0.18937E-03
0.65604E-01   0.25878E-01
0.86077E-01   0.31692E+00
0.11294E+00   0.46703E+00
0.14818E+00   0.49857E+00
0.19443E+00   0.31519E+00
0.25510E+00   0.13060E+00
0.33472E+00   0.37423E-01
0.43917E+00   0.15058E-01
0.57623E+00   0.21979E-01
0.75605E+00   0.60639E-01
0.99200E+00   0.12603E+00
0.13016E+01   0.20535E+00
0.17078E+01   0.31518E+00
0.22407E+01   0.32588E+00
0.29400E+01   0.32922E+00
0.38575E+01   0.22504E+00
0.50613E+01   0.15226E+00
0.66407E+01   0.84118E-01
0.87131E+01   0.25702E-01
0.11432E+02   0.33366E-02
0.15000E+02   0.15965E-03

... <a class="co" name="endprocess-co" href="ch03.php#endprocess"><img src="images/callouts/6.png" alt="6" border="0"></a>

Total Time: 1 pixels processed in 15.573089 seconds (cpu time: 15.515442).
Average per pixel: 15.573089 (cpu time: 15.515442)
Algorithm Time: 1 pixels processed in 15.478408 seconds (cpu time: 15.433357).
Average per pixel: 15.478408 (cpu time: 15.433357)
Control Unit Time: 1 pixels processed in 0.094681 seconds (cpu time: 0.082085).
Average per pixel: 0.094681 (cpu time: 0.139732)
        </pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="configok"></a><a href="#configok-co"><img src="images/callouts/1.png" alt="1" border="0"></a> </p></td><td valign="top" align="left"><p>
                    First step of execution is to parse settings file and validate it. If everything is OK this line 
                    will be printed, otherwise a list of errors will be produced. Please, pay attention to error messages because they
                    should help you to understand what is going on and how to resolve the problem.
                </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="tiledivision"></a><a href="#tiledivision-co"><img src="images/callouts/2.png" alt="2" border="0"></a> </p></td><td valign="top" align="left"><p>
                    This line informs you how the data are going to be organized for retrieval. Data are organized as segments that will run inside
                    the retrieval algorithm. Control unit will organize these segments into a tile as a bigger group of pixels.
                </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="firstsegment"></a><a href="#firstsegment-co"><img src="images/callouts/3.png" alt="3" border="0"></a> </p></td><td valign="top" align="left"><p>
                    The first retrieval is launched and the retrieval algorithm starts to process the first segment (group of pixels)
                </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="retrievalprocess"></a><a href="#retrievalprocess-co"><img src="images/callouts/4.png" alt="4" border="0"></a> </p></td><td valign="top" align="left"><p>
                    The retrieval can be in a verbose mode or not. If it is in a verbose mode, a detailed information on the process will be printed. The
                    most important information is in the next lines. The user can follow the fitting process and see how the errors decrease
                    iteration by iteration.
                </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="results"></a><a href="#results-co"><img src="images/callouts/5.png" alt="5" border="0"></a> </p></td><td valign="top" align="left"><p>
                    Finally, the results are processed. This example prints results on the screen. You can dump them to a file in different
                    formats such as CSV, HDF ... Output functions are extensions that you can optionally install. In the settings file, it is defined
                    which functions are used and how (set up).
                </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="endprocess"></a><a href="#endprocess-co"><img src="images/callouts/6.png" alt="6" border="0"></a> </p></td><td valign="top" align="left"><p>
                    The process is finished with a small summary about how many data have been processed and how long it took.
                </p></td></tr></table></div><p>
            It is also possible to add any number of arguments in the form of
            <code class="computeroutput">setting=value</code>.
            They provide a quick and easy way to override the default settings in
            the configuration file, for experimenting without editing this file.
        </p><div class="table"><a name="idm839"></a><p class="title"><b>Table 3.5. Some common settings</b></p><div class="table-contents"><table summary="Some common settings" border="1"><colgroup><col align="left"><col align="left"><col><col align="left"></colgroup><thead><tr><th align="left">Name</th><th align="left">Type</th><th align="left">Default</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left">
                            <code class="computeroutput">help</code>
                        </td><td align="left"><code class="computeroutput">boolean</code>
                            <sup>[<a name="fnBoolean" href="#ftn.fnBoolean" class="footnote">a</a>]</sup>
                        </td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, displays
                            an exhaustive list of settings with their significance.
                        </td></tr><tr><td align="left">
                            <code class="computeroutput">input.debug.print_clean_segment</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, prints a segment that has just been cleaned
                            from its non-significant data. (see also print_raw_segment)
                        </td></tr><tr><td align="left">
                            <code class="computeroutput">input.debug.print_raw_segment</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, prints a segment that has just been loaded
                            from a driver (with possible non-significant data). (see also print_clean_segment)
                        </td></tr><tr><td align="left">
                            <code class="computeroutput">input.sdata.dump</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, displays the input measurements
                            in the form of a <acronym class="acronym">SDATA</acronym> stream. Mostly useful for the 
                            maintainers of the scientific subsystem.</td></tr><tr><td align="left">
                            <code class="computeroutput">input.sdata_driver.debug</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, displays the actions of the sdata driver when
                            a <acronym class="acronym">SDATA</acronym> file is being read. This can be used for validating a new <acronym class="acronym">SDATA</acronym>
                            file (the contents of this file will be displayed in a readable form),
                            and less commonly for debugging the <acronym class="acronym">SDATA</acronym> driver.</td></tr><tr><td align="left">
                            <code class="computeroutput">retrieval.debug.print_segment_information</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">false</code></td><td align="left">When set to <code class="computeroutput">true</code>, prints a segment with data that are actually passed
                            to the retrieval library (unless there is a bug in the C/Fortran interface,
                            the data should be the same as those from input.debug.print_clean_segment).
                        </td></tr><tr><td align="left">
                            <code class="computeroutput">retrieval.debug.verbose</code>
                        </td><td align="left"><code class="computeroutput">boolean</code></td><td align="left"><code class="computeroutput">true</code></td><td align="left">When set to <code class="computeroutput">true</code>, displays debugging information relative to the
                            retrieval subsystem. Mostly useful for the maintainers of the
                            scientific subsystem.</td></tr></tbody><tbody class="footnotes"><tr><td colspan="4"><div class="footnote"><p><sup>[<a name="ftn.fnBoolean" href="#fnBoolean" class="para">a</a>] </sup>
                                    Boolean variables (also known as <span class="emphasis"><em>logical</em></span> in the
                                    FORTRAN community) can take the values <code class="computeroutput">true</code> or
		<code class="computeroutput">false</code> (that can also be abbreviated as <code class="computeroutput">t</code> and <code class="computeroutput">f</code>)
                                </p></div></td></tr></tbody></table></div></div><br class="table-break"><div class="sect2" title="3.6.1. Usage of GRASP: The configuration file"><div class="titlepage"><div><div><h3 class="title"><a name="idm927"></a>3.6.1. Usage of GRASP: The configuration file</h3></div></div></div><p>
                The default behaviour of the system is defined in a configuration file, whose settings can
                be overridden by command line arguments, as described in the previous section.
                A configuration manager (also known as the settings module) is responsible 
                for loading the configuration file and for taking care of the overriding mechanism for
                command line arguments, if necessary. It centralizes all the information needed 
                for a processing and in that matter drives the actual behaviour of the framework.
            </p><p>
                When there is more than a few parameters to change, or when one
                wishes to perform more persistent corrections, it is easier to
                edit the configuration file than to set parameters in the command line.
            </p><p>
                The chosen format for new <acronym class="acronym">GRASP</acronym> configuration files is 
                <a class="link" href="http://en.wikipedia.org/wiki/YAML" target="_top">YAML</a>,
                a standard format perfectly adapted for complex configurations
                such as the one needed by the <acronym class="acronym">GRASP</acronym> project. It provides support
                for simple values as well as for complex data structures, while
                maintaining a high level of readability. YAML format is based on fixed indentation (the spaces
                before an element define the level where it applies). The command line interface of GRASP proposes an easy system
                to overwrite the main settings file with a "dot syntax", where each level of indentation is replaced
                by a dot. For example, in <acronym class="acronym">GRASP</acronym>, it is equivalent to be called with the argument <code class="computeroutput">input.driver=sdata</code>
                or to be defined in the settings file, as follow:
                </p><pre class="programlisting">
input:
    driver: sdata
                </pre><p>    
    
            </p><p>
                <acronym class="acronym">GRASP</acronym> settings system allows to import external files into one.
                Note that the standard YAML format doesn't support file
                inclusion, but <acronym class="acronym">GRASP</acronym> configuration files support this feature through
                the <code class="computeroutput">import</code> keyword that
                expects a list of files to be included. It is, therefore, possible
                to split large configuration files into smaller, easier to maintain
                independent files (this is especially important since several
                people will have to maintain different sections of the configuration).
            </p><div class="figure"><a name="idm942"></a><p class="title"><b>Figure 3.1. Excerpt of configuration file</b></p><div class="figure-contents"><pre class="programlisting">
import: [ ] <a class="co" name="import-co" href="ch03.php#import"><img src="images/callouts/1.png" alt="1" border="0"></a>

input: <a class="co" name="section-co" href="ch03.php#section"><img src="images/callouts/2.png" alt="2" border="0"></a>
    driver: sdata_driver
    filename: bin/SDATA_NEW.dat

retrieval:
    # General retrieval parameters <a class="co" name="comment-co" href="ch03.php#comment"><img src="images/callouts/3.png" alt="3" border="0"></a>
    general:
        minimization_convention: logarithm
        threshold_for_stopping: 1.0e-5
        number_layers: 50 <a class="co" name="setting-co" href="ch03.php#setting"><img src="images/callouts/4.png" alt="4" border="0"></a>
        shift_for_applying_logarithm_to_negative_values: 0.2
        binning_method: logarithm
        maximun_iterations_of_Levenberg-Marquardt: 15
        stop_before_performing_retrieval: false
        internal_file_path: "../retrieval/internal_files/"
        external_file_path: "../../home/"
        reference_plane_for_polarization: meridian
        regime_of_measures_fitting: absolute_polarization_components
        linearization_threshold:  0.03
        IMQ:       2
        use_internal_initial_guess:     false     
        threshold_for_length_corrections:     -1.0e-2
        threshold_for_stopping_Q_iterations:  1.0e-2
        scale_for_finite_difference:          1.0e-3
        irradiance_corrected: false # or no or 0
        coeff_corr: 0.96
        regime_of_multipixel_constraints: 
            inversion_regime: multi_pixel_followed_by_single_pixel  
            time-scale:   100.01
            x-scale:   100.05
            y-scale:   100.05
        error_estimation: true   
        number_of_characteristics_retrieved: 7	
...     
    noises:
        noise[1]: <a class="co" name="tagindex-co" href="ch03.php#tagindex"><img src="images/callouts/5.png" alt="5" border="0"></a>
            standard_deviation: 0.0
            error_type:  absolute
            variation:  0.01
            measure_type[1]:
                type: I
                wavelength_involved: [ 1, 2, 3, 4, 5, 6 ] <a class="co" name="list-co" href="ch03.php#list"><img src="images/callouts/6.png" alt="6" border="0"></a>
        noise[2]:
            standard_deviation: 0.0
            error_type:  absolute
...
                </pre></div></div><br class="figure-break"><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="import"></a><a href="#import-co"><img src="images/callouts/1.png" alt="1" border="0"></a> </p></td><td valign="top" align="left"><p>The <acronym class="acronym">GRASP</acronym> configuration file supports the file inclusion,
                        with the <code class="computeroutput">import</code> statement.
                        The included files must be given in a comma-separated list,
                        this can remain empty.
                    </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="section"></a><a href="#section-co"><img src="images/callouts/2.png" alt="2" border="0"></a> </p></td><td valign="top" align="left"><p>
                        The configuration is organized in sections. The structure is
                        defined by the explicit indentation. The order of the sections and
                        the elements in the sections doesn't matter, as long as the
                        structure and indentation are respected.
                    </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="comment"></a><a href="#comment-co"><img src="images/callouts/3.png" alt="3" border="0"></a> </p></td><td valign="top" align="left"><p>
                        Comments are supported: anything after a # sign is concidered as a comment.
                    </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="setting"></a><a href="#setting-co"><img src="images/callouts/4.png" alt="4" border="0"></a> </p></td><td valign="top" align="left"><p>
                        Access to fields from the command line (for overriding a setting, say)
                        is straightforward, using the common dotted notation: for instance,
                        the fully qualified name of <code class="computeroutput">number_layers</code>
                        is <code class="computeroutput">retrieval.general.number_layers</code>
                    </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="tagindex"></a><a href="#tagindex-co"><img src="images/callouts/5.png" alt="5" border="0"></a> </p></td><td valign="top" align="left"><p>
                        Section and property tags can be indexed, with a simple
                        bracket notation. A feature that is not supported by the
                        standard YAML format. This makes it easy to define arrays of
                        complex data structures.
                    </p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="list"></a><a href="#list-co"><img src="images/callouts/6.png" alt="6" border="0"></a> </p></td><td valign="top" align="left"><p>
                        Simple lists of data are supported (a standard feature of
                        YAML). The number of elements can be determined at runtime by
                        the configuration manager.
                    </p></td></tr></table></div><p>
                All these qualities make the new configuration files very easy to read, maintain and extend.
            </p></div></div><div class="sect1" title="3.7. Code repository and extensions"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="multi-repository"></a>3.7. Code repository and extensions</h2></div></div></div><p>
            The GRASP code is managed by GIT. If you have a version that doesn't use GIT (for example, by downloading it from a web server), we strongly recommend you
            to look for a version downloaded via GIT (see <a class="xref" href="ch03.php#access-repository" title="3.4. Access to GRASP Open repository">Section 3.4, “Access to <acronym class="acronym">GRASP</acronym> Open repository”</a>). It will allow you to 
            be connected to the server to make updates of the code. Additionally, the GRASP code can be extended in different parts. You can extend the input 
            module or the output module. Extensions in input module are classified as drivers and transformers.
            A driver is a module that is called to read input data. The most basic driver is the SDATA driver which reads a SDATA file (<a class="xref" href="ch04.php#sdata-format" title="4.2.1. The SDATA format">Section 4.2.1, “The SDATA format”</a>) but
            many other drivers can be implemented to read raw databases and inject, without using intermediate text files, data directly in the GRASP algorithm. A good example is to process satellite data,
            where the performance is a keystone to be able to process this kind of huge archives. Satellite data is not transformed to sdata format, instead of this, a specific
            driver is developed to connect raw satellite archive with GRASP. Transformers are another type of input extensions which allow to modify input data after reading it.
            An example of a transformer could be to load a climatology database to optimize input parameters. This action can be shared between different drivers and it is called after loading data by
            a driver. Output module can be extended with output functions. There are three types of output functions:
            </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><span class="bold"><strong>segment output function:</strong></span> It will be called after processing each segment of a tile</li><li class="listitem"><span class="bold"><strong>tile output function:</strong></span> It will be called after processing entire tile</li><li class="listitem"><span class="bold"><strong>current output function:</strong></span> It will be called after processing each segment, but it receives a partial tile as an argument. This function can print a tile with the current processed information</li></ul></div><p>
            Each extension is distributed separately of the core code (except if an extension is considered as a core, for example, sdata driver is essential). To install a new extension
            you can place the source code in the specific place or you can use the grasp-manager, an extra tool which will help you to manage the code and its extensions. It is described below (<a class="xref" href="ch03.php#grasp-manager" title="3.7.1. GRASP Manager">Section 3.7.1, “GRASP Manager”</a>),
            and here we will explain how to install manually an extension.
        </p><p>
            Extensions are the pieces of code that are detected and added during compilation. To install an extension, you have to place the code inside the core repository in a
            proper place and compile again. The corresponding places for each of the extensions are the following:
            </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
                    For input
                    <div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem">drivers have to be placed in <code class="filename">src/input/drivers</code></li><li class="listitem">transformers have to be placed in <code class="filename">src/input/transformers</code></li></ul></div></li><li class="listitem">
                    For output
                    <div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem">segment functions have to be placed in <code class="filename">src/output/segment_functions</code></li><li class="listitem">tile functions have to be placed in <code class="filename">src/output/tile_functions</code></li><li class="listitem">current functions have to be placed in <code class="filename">src/output/current_functions</code></li></ul></div></li><li class="listitem">
                    Kernels: They have to be placed in <code class="filename">src/retrieval/internal_files</code></li><li class="listitem">
                    Constants sets: They have to be placed in <code class="filename">src/retrieval/src/constants_sets</code></li></ul></div><p>

            The following diagram shows how the GRASP repository integrates extension repositories inside itself. 
            </p><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="100%"><tr><td align="center"><img src="figures/scheme-of-folder-and-repos.png" align="middle" height="360"></td></tr></table><p>

            Typing the command <span class="command"><strong>grasp</strong></span> without arguments, you will obtain information about how the software was compiled including available extensions.
            To know more details about the extensions and write one by your own, please go to <a class="link" href="http://www.grasp-open.com/tech-doc" target="_top">technical documentation.</a>
        </p><p>
            <span class="bold"><strong>Trick:</strong></span> Since the GRASP code files are tracked by GIT it is not recommended to modify them, except if you want to develop something.
            If you want to place your tests and examples near the code, use a folder called "home" (it is created during compilation but you can create it by yourself, if you wish).
            This folder will not be tracked by GIT, allowing you to have your tests with the code without having conflicts with GIT.
        </p><div class="sect2" title="3.7.1. GRASP Manager"><div class="titlepage"><div><div><h3 class="title"><a name="grasp-manager"></a>3.7.1. GRASP Manager</h3></div></div></div><p>
                GRASP Manager is a script placed in the GRASP root folder which simplify (even more) the update process. This script wraps Makefile system and adds a 
                mechanism to work with GIT and the multi-repository environment used by GRASP (see <a class="xref" href="ch03.php#multi-repository" title="3.7. Code repository and extensions">Section 3.7, “Code repository and extensions”</a>). Compilation of GRASP is always based on cmake. The make system wraps cmake, helping with the creation of a necessary folder structure, and
                grasp-manager script wraps make system, helping with the use of GIT, for users that don't feel comfortable using it. Also, it takes care of the extensions, 
                downloading and installing them in the correct places. GRASP Manager script is configured via <code class="filename">grasp-manager.yml</code> file. Since it is a configuration
                file it is not tracked by GIT. Instead of this, a template called <code class="filename">grasp-manager.yml.dist</code> is offerred by the system. If there is no
                <code class="filename">grasp-manager.yml</code> file, it will be created as a copy of <code class="filename">grasp-manager.yml.dist</code> file, first time you run grasp-manager script.
            </p><p>
                To know the list of actions offered by this script, you can just type <span class="command"><strong>./grasp-manager.sh</strong></span>. A list of available actions will be printed. In these sections we will
                explain the most interesting actions for the users, but there are more actions that can be interesting if you are a developer. Please remember to have a look
                at the technical documentation to know more about this script.
            </p><p>
                The basic actions for regular users are <span class="bold"><strong>update-grasp</strong></span> and <span class="bold"><strong>update-grasp-to-dev</strong></span>. They allow you
                to update the code and the extensions to the newest version. With <span class="bold"><strong>update-grasp</strong></span> you will get the last stable version and with
                <span class="bold"><strong>update-grasp-to-dev</strong></span> you will get the last unstable version (next code to be released), which is not recommended to use
                except if you know what you are doing ;-). These commands accept an argument that is called "environment". Environments are defined in <code class="filename">grasp-manager.yml</code>
                and allow you to customize the way to compile the code and the list of extensions that you want to have available. The documentation about how to write a configuration file
                for grasp-manager is written in the file <code class="filename">grasp-manager.yml.dist</code>. Please check that file, to know all available options. Note: Remember that in 
                YAML format, lines that start by # symbol are comments.
            </p><p>
                When you run grasp-manager script, a backup of your code is created. This backup contains the information about the previous GIT commit and unsaved changes in 
                the code. Please take into account that the repository has to be "clear" before performing any update actions, otherwise the changes will be undone and saved in a backup.
                You can find these backups in the <code class="filename">home/grasp-manager</code> folder. They are organized by time (when grasp-manager was executed) and you can apply them
                via <span class="bold"><strong>rollback</strong></span> (applies last backup) or <span class="bold"><strong>apply</strong></span> actions.
            </p><p>
                Finally, the next code will show an example of the use of grasp manager:
                </p><pre class="screen">        
    
$ # Following command will move the repository to dev branch using the environment defined
$ # as release in grasp-manager.yml
$ # It will install/uninstall extension in order to have exactly the extensions release environment specify
$ ./grasp-manager.sh checkout dev release 
$ # Then, we can compile the code using the compilation settings defined in 'release' environment
$ # Since the release environment was the last used, it can be omitted.
$ # When the environment argument is omitted, we use the constants used
$ # in the last command, but we don't install/uninstall extensions (available extensions are already in use)
$ ./grasp-manager.sh make
$ # Finally we are going to install the code with the system in the last version.
$ # This is the most important action for regular users.
$ # A user of GRASP can regularly update the system via the following command:
$ ./grasp-manager.sh update-grasp 
                </pre><p>

            </p></div></div><div class="sect1" title="3.8. Known problems"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="idm1030"></a>3.8. Known problems</h2></div></div></div>
        Listed here, are common problems found during installations process. 
        <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
                In MacOS system, some users receive fatal error: The remote end hung up unexpectedly; fatal: early EOF; fatal: index-pack failed
                <p>  It can be necessary to increase Git buffer size using the following command:git config --global http.postBuffer 1048576000</p></li></ul></div></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.idm605" href="#idm605" class="para">2</a>] </sup>
                    For the distinction between the <span class="emphasis"><em>free</em></span> and
                    <span class="emphasis"><em>open source</em></span> movements, see
                    <a class="link" href="http://www.gnu.org/philosophy/free-software-for-freedom.en.html" target="_top">http://www.gnu.org/philosophy/free-software-for-freedom.en.html</a>.
                </p></div><div class="footnote"><p><sup>[<a name="ftn.idm734" href="#idm734" class="para">3</a>] </sup>
                            That it is possible doesn't mean that it is recommended. In the current status of the project, <acronym class="acronym">GRASP</acronym> has not been tested extensively with other solvers than SuperLU and the support for other solvers is still quite sloppy.
                        </p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.php">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04.php">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. GRASP software package </td><td width="20%" align="center"><a accesskey="h" href="index.php">Home</a></td><td width="40%" align="right" valign="top"> Chapter 4. How to use GRASP</td></tr></table></div></div></div></div></div>
	<footer class="l-footer" itemscope itemtype="https://schema.org/WPFooter">
		<style type="text/css" data-type="vc_custom-css">#footer-row {
    font-size: 13px; 
    line-height: 20px;
}</style><section class="l-section wpb_row height_small color_footer-bottom" id="footer-row"><div class="l-section-h i-cf"><div class="g-cols vc_row type_default valign_middle"><div class="vc_col-sm-8 wpb_column vc_column_container"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<p style="text-align: left;">© 2015 All rights reserved. GRASP CODE is distributed by <a href="http://www.grasp-sas.com">GRASP SAS</a>.</p>

		</div>
	</div>
</div></div></div><div class="vc_col-sm-4 wpb_column vc_column_container"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="vc_wp_custommenu  layout_hor align_right"><div class="widget widget_nav_menu"><div class="menu-grasp-footer-container"><ul id="menu-grasp-footer" class="menu"><li id="menu-item-3845" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3845"><a href="https://www.grasp-open.com/legal-statement/">Legal Statement</a></li>
<li id="menu-item-3846" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3846"><a href="https://www.grasp-open.com/contact/">Contact</a></li>
<li id="menu-item-3997" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3997"><a href="http://www.grasp-open.com/wp-content/uploads/2016/05/GRASP-OPEN_press_kit.zip">Press Kit</a></li>
</ul></div></div></div></div></div></div></div></div></section>
	</footer>
		<a class="w-toplink pos_right" href="#" title="Back to top" aria-hidden="true"></a>
		<a class="w-header-show" href="javascript:void(0);"><span>Menu</span></a>
	<div class="w-header-overlay"></div>
	<script>
	// Store some global theme options used in JS
	if (window.$us === undefined) window.$us = {};
	$us.canvasOptions = ($us.canvasOptions || {});
	$us.canvasOptions.disableEffectsWidth = 900;
	$us.canvasOptions.responsive = true;
	$us.canvasOptions.backToTopDisplay = 100;
	$us.canvasOptions.scrollDuration = 1000;

	$us.langOptions = ($us.langOptions || {});
	$us.langOptions.magnificPopup = ($us.langOptions.magnificPopup || {});
	$us.langOptions.magnificPopup.tPrev = 'Previous (Left arrow key)';
	$us.langOptions.magnificPopup.tNext = 'Next (Right arrow key)';
	$us.langOptions.magnificPopup.tCounter = '%curr% of %total%';

	$us.navOptions = ($us.navOptions || {});
	$us.navOptions.mobileWidth = 951;
	$us.navOptions.togglable = true;
	$us.ajaxLoadJs = true;
	$us.templateDirectoryUri = '//www.grasp-open.com/wp-content/themes/Impreza';
</script>
<script>$us.headerSettings = {"default":{"options":{"breakpoint":"900px","orientation":"hor","sticky":true,"scroll_breakpoint":"100px","transparent":"0","width":"300px","elm_align":"center","shadow":"thin","top_show":true,"top_height":"40px","top_sticky_height":"0px","top_fullwidth":"0","top_centering":false,"middle_height":"100px","middle_sticky_height":"70px","middle_fullwidth":"0","middle_centering":false,"elm_valign":"top","bg_img":"","bg_img_wrapper_start":"","bg_img_size":"cover","bg_img_repeat":"repeat","bg_img_position":"top left","bg_img_attachment":true,"bg_img_wrapper_end":"","bottom_show":false,"bottom_height":"50px","bottom_sticky_height":"50px","bottom_fullwidth":"0","bottom_centering":false},"layout":{"top_left":["text:2","text:3"],"top_center":[],"top_right":["socials:1"],"middle_left":["image:1"],"middle_center":[],"middle_right":["menu:1","cart:1"],"bottom_left":[],"bottom_center":[],"bottom_right":[],"hidden":["text:1","search:1"]}},"tablets":{"options":{"breakpoint":"900px","orientation":"hor","sticky":true,"scroll_breakpoint":"100px","transparent":false,"width":"300px","elm_align":"center","shadow":"thin","top_show":true,"top_height":"40px","top_sticky_height":"0px","top_fullwidth":false,"top_centering":false,"middle_height":"80px","middle_sticky_height":"60px","middle_fullwidth":false,"middle_centering":false,"elm_valign":"top","bg_img":"","bg_img_wrapper_start":"","bg_img_size":"cover","bg_img_repeat":"repeat","bg_img_position":"top left","bg_img_attachment":true,"bg_img_wrapper_end":"","bottom_show":false,"bottom_height":"50px","bottom_sticky_height":"50px","bottom_fullwidth":false,"bottom_centering":false},"layout":{"top_left":["text:2","text:3"],"top_center":[],"top_right":["socials:1"],"middle_left":["image:1"],"middle_center":[],"middle_right":["menu:1","cart:1"],"bottom_left":[],"bottom_center":[],"bottom_right":[],"hidden":["text:1","search:1"]}},"mobiles":{"options":{"breakpoint":"600px","orientation":"hor","sticky":true,"scroll_breakpoint":"50px","transparent":false,"width":"300px","elm_align":"center","shadow":"thin","top_show":false,"top_height":"40px","top_sticky_height":"0px","top_fullwidth":false,"top_centering":false,"middle_height":"50px","middle_sticky_height":"50px","middle_fullwidth":false,"middle_centering":false,"elm_valign":"top","bg_img":"","bg_img_wrapper_start":"","bg_img_size":"cover","bg_img_repeat":"repeat","bg_img_position":"top left","bg_img_attachment":true,"bg_img_wrapper_end":"","bottom_show":false,"bottom_height":"50px","bottom_sticky_height":"50px","bottom_fullwidth":false,"bottom_centering":false},"layout":{"top_left":["text:2","text:3"],"top_center":[],"top_right":["socials:1"],"middle_left":["image:1"],"middle_center":[],"middle_right":["menu:1","cart:1"],"bottom_left":[],"bottom_center":[],"bottom_right":[],"hidden":["text:1","search:1"]}}};</script><script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/Impreza-child-2019/*","/wp-content/themes/Impreza/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script type="text/javascript">
document.addEventListener( 'wpcf7mailsent', function( event ) {
    if ( '3824' == event.detail.contactFormId ) {
        var url = 'https://access-request.grasp-sas.com/register';

        // Datos del usuario a registrar
        var data = {
            email: document.getElementById('signup-email').value,
            name: document.getElementById('signup-name').value,
            username: document.getElementById('signup-username').value,
            password: generateRandomString(10) // Asumiendo que tienes esta función definida en JS
        };

        fetch(url, {
            method: 'POST', // Método HTTP
            headers: {
                'Content-Type': 'application/json', // Tipo de contenido
            },
            body: JSON.stringify(data), // Cuerpo de la solicitud
        })
        .then(response => response.json()) // Convierte la respuesta a JSON
        .then(data => {
            console.log('Success:', data);
        })
        .catch((error) => {
            console.error('Error:', error);
        });
    }
}, false );

// Función para generar una cadena aleatoria en JavaScript
function generateRandomString(length) {
    var result           = '';
    var characters       = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var charactersLength = characters.length;
    for ( var i = 0; i < length; i++ ) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength));
    }
    return result;
}
</script>
<link rel='stylesheet' id='teachpress_front-css' href='https://www.grasp-open.com/wp-content/plugins/teachpress/styles/teachpress_front.css?ver=9.0.12&#038;ver=7.0' media='all' />
<link rel='stylesheet' id='academicons-css' href='https://www.grasp-open.com/wp-content/plugins/teachpress/includes/academicons/css/academicons.min.css?ver=7.0' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://www.grasp-open.com/wp-content/plugins/teachpress/includes/fontawesome/css/all.min.css?ver=7.0' media='all' />
<style id="global-styles-inline-css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
/*# sourceURL=global-styles-inline-css */
</style>
<link rel='stylesheet' id='us-fonts-css' href='https://fonts.googleapis.com/css?family=Noto+Sans:400,700%7COpen+Sans:400,700&#038;subset=latin&#038;ver=7.0' media='all' />
<script type="module" id="aioseo/js/src/vue/standalone/blocks/table-of-contents/frontend.js-js" src="https://www.grasp-open.com/wp-content/plugins/all-in-one-seo-pack/dist/Lite/assets/table-of-contents.95d0dfce.js?ver=4.9.0"></script>
<script id="wp-hooks-js" src="https://www.grasp-open.com/wp-includes/js/dist/hooks.min.js?ver=7496969728ca0f95732d"></script>
<script id="wp-i18n-js" src="https://www.grasp-open.com/wp-includes/js/dist/i18n.min.js?ver=781d11515ad3d91786ec"></script>
<script id="wp-i18n-js-after">
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
//# sourceURL=wp-i18n-js-after
</script>
<script id="swv-js" src="https://www.grasp-open.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.3"></script>
<script id="contact-form-7-js-before">
var wpcf7 = {
    "api": {
        "root": "https:\/\/www.grasp-open.com\/wp-json\/",
        "namespace": "contact-form-7\/v1"
    }
};
//# sourceURL=contact-form-7-js-before
</script>
<script id="contact-form-7-js" src="https://www.grasp-open.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.3"></script>
<script id="jquery-core-js" src="https://www.grasp-open.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
<script id="us-core-js" src="//www.grasp-open.com/wp-content/uploads/us-assets/www.grasp-open.com.js?ver=5.6.1"></script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.grasp-open.com/wp-includes/js/wp-emoji-release.min.js?ver=7.0"}}
</script>
<script type="module">
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=https://www.grasp-open.com/wp-includes/js/wp-emoji-loader.min.js
</script>
<script></script></body>
</html>


<!-- Page supported by LiteSpeed Cache 7.6.2 on 2026-06-04 10:11:16 -->