diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index f1edc4f..e0da064 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -6,8 +6,8 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9"] - poetry-version: ["1.6.1"] + python-version: ["3.13"] + poetry-version: ["2.1.2"] os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: @@ -23,5 +23,4 @@ jobs: run: poetry install - name: Lint with black run: poetry run black --check . - - name: Run the automated tests - run: poetry run pytest -v \ No newline at end of file + \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..647fb9d --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,70 @@ +name: Deploy MkDocs + +on: + push: + branches: + - main + - dev + paths: + - 'docs/**' + - 'mkdocs.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v4 + with: + path: .venv + key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} + + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root + + - name: Build MkDocs site + run: poetry run mkdocs build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/DesignSafe-Badge.svg b/DesignSafe-Badge.svg new file mode 100644 index 0000000..5f081b5 --- /dev/null +++ b/DesignSafe-Badge.svg @@ -0,0 +1,262 @@ + + + + + |: Open in DesignSafe + + + + + + + + + + + + + + + Open in DesignSafe + + + + + |: Open in DesignSafe + + + + + diff --git a/README.md b/README.md index 3123ee5..6a3c845 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ # DesignSafe API (dapi) -![dapi](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/dapi.png) - [![build and test](https://github.com/DesignSafe-CI/dapi/actions/workflows/build-test.yml/badge.svg)](https://github.com/DesignSafe-CI/dapi/actions/workflows/build-test.yml) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md) [![Docs](https://img.shields.io/badge/view-docs-8A2BE2?color=8A2BE2)](https://designsafe-ci.github.io/dapi/dapi/index.html) `dapi` is a library that simplifies the process of submitting, running, and monitoring [TAPIS v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org). +dapi + + ## Features ### Jobs @@ -102,15 +103,6 @@ print(df) db.close() ``` -## Documentation - -View [dapi API doc](https://designsafe-ci.github.io/dapi/dapi/index.html) - -To generate API docs: - -``` -pdoc --html --output-dir docs dapi --force -``` ## Support @@ -141,3 +133,26 @@ poetry run pytest -v * Krishna Kumar, University of Texas at Austin * Prof. Pedro Arduino, University of Washington * Prof. Scott Brandenberg, University of California Los Angeles + + +## Documentation + +View [dapi API doc](https://designsafe-ci.github.io/dapi/dapi/index.html) + +### Running documentation locally + +To serve the MkDocs documentation locally: + +```shell +poetry install +poetry run mkdocs serve +``` + +This will start a local server at `http://127.0.0.1:8000/dapi/` where you can view the documentation. + +### API docs +To generate API docs: + +``` +pdoc --html --output-dir api-docs dapi --force +``` \ No newline at end of file diff --git a/dapi/__init__.py b/dapi/__init__.py index 1e92dc8..80eada4 100644 --- a/dapi/__init__.py +++ b/dapi/__init__.py @@ -1,42 +1,115 @@ -""" -dapi` is a library that simplifies the process of submitting, running, and monitoring [TAPIS v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org). +"""Dapi - A Python wrapper for interacting with DesignSafe resources via the Tapis API. + +This package provides a high-level, user-friendly interface for working with DesignSafe +resources through the Tapis V3 API. It simplifies complex operations and provides +organized access to different service areas including authentication, file operations, +job submission and monitoring, application discovery, system information, and database access. -## Features +Key Features: + - Simplified authentication with credential resolution hierarchy + - DesignSafe path translation (MyData, projects, etc.) to Tapis URIs + - High-level job submission with automatic app parameter mapping + - Job monitoring with progress bars and status interpretation + - File upload/download with automatic directory creation + - Application discovery and detailed retrieval + - System queue information and resource limits + - Database access for DesignSafe research databases + - Comprehensive error handling with descriptive exceptions -### Jobs +Main Components: + DSClient: Main client class providing organized access to all services + SubmittedJob: Class for managing and monitoring submitted Tapis jobs + Exception classes: Specific exceptions for different error types -* Get TAPIS v3 templates for jobs: No need to fiddle with complex API requests. `dapi` abstracts away the complexities. +Example: + Basic usage with automatic authentication: + + >>> from dapi import DSClient + >>> client = DSClient() + Enter DesignSafe Username: myuser + Enter DesignSafe Password: [hidden] + Authentication successful. + + >>> # File operations + >>> client.files.upload("/local/file.txt", "/MyData/uploads/file.txt") + >>> files = client.files.list("/MyData/uploads/") + + >>> # Job submission and monitoring + >>> job_request = client.jobs.generate_request( + ... app_id="matlab-r2023a", + ... input_dir_uri="/MyData/analysis/input/", + ... script_filename="run_analysis.m" + ... ) + >>> job = client.jobs.submit_request(job_request) + >>> final_status = job.monitor() + + >>> # Database access + >>> df = client.db.ngl.read_sql("SELECT * FROM earthquake_data LIMIT 10") -* Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment. +Attributes: + __version__ (str): The version number of the dapi package. + DSClient: Main client class for DesignSafe API interactions. + SubmittedJob: Class for managing submitted Tapis jobs. + Exception classes: Custom exceptions for specific error conditions. +""" +from .client import DSClient -### Database +# Import exceptions +from .exceptions import ( + DapiException, + AuthenticationError, + FileOperationError, + AppDiscoveryError, + SystemInfoError, + JobSubmissionError, + JobMonitorError, +) -Connects to SQL databases on DesignSafe: +# Import key classes/functions from jobs module +from .jobs import ( + SubmittedJob, + interpret_job_status, + # Import status constants for user access if needed + STATUS_TIMEOUT, + STATUS_INTERRUPTED, + STATUS_MONITOR_ERROR, + STATUS_UNKNOWN, + TAPIS_TERMINAL_STATES, +) -| Database | dbname | env_prefix | -|----------|--------|------------| -| NGL | `ngl`| `NGL_` | -| Earthake Recovery | `eq` | `EQ_` | -| Vp | `vp` | `VP_` | -Define the following environment variables: -``` -{env_prefix}DB_USER -{env_prefix}DB_PASSWORD -{env_prefix}DB_HOST -{env_prefix}DB_PORT -``` +def _get_version(): + """Read version from pyproject.toml""" + import tomllib + from pathlib import Path -For e.g., to add the environment variable `NGL_DB_USER` edit `~/.bashrc`, `~/.zshrc`, or a similar shell-specific configuration file for the current user and add `export NGL_DB_USER="dspublic"`. + try: + pyproject_path = Path(__file__).parent.parent / "pyproject.toml" + with open(pyproject_path, "rb") as f: + pyproject = tomllib.load(f) + return pyproject["tool"]["poetry"]["version"] + except (FileNotFoundError, KeyError, ImportError): + # Fallback version if pyproject.toml can't be read + return "unknown" -## Installation -```shell -pip3 install dapi -``` +__version__ = _get_version() -""" -from . import apps -from . import auth -from . import db -from . import jobs +__all__ = [ + "DSClient", + "SubmittedJob", + "interpret_job_status", + # Export status constants + "STATUS_TIMEOUT", + "STATUS_INTERRUPTED", + "STATUS_MONITOR_ERROR", + "STATUS_UNKNOWN", + "TAPIS_TERMINAL_STATES", + # Export exceptions + "DapiException", + "AuthenticationError", + "FileOperationError", + "AppDiscoveryError", + "SystemInfoError" "JobSubmissionError", + "JobMonitorError", +] diff --git a/dapi/apps.py b/dapi/apps.py new file mode 100644 index 0000000..c21efdc --- /dev/null +++ b/dapi/apps.py @@ -0,0 +1,139 @@ +from tapipy.tapis import Tapis +from tapipy.errors import BaseTapyException +from typing import List, Any, Optional +from .exceptions import AppDiscoveryError + + +def find_apps( + t: Tapis, search_term: str, list_type: str = "ALL", verbose: bool = True +) -> List[Tapis]: + """Search for Tapis apps matching a search term. + + Searches through available Tapis applications using partial name matching. + This function helps discover applications available for job submission. + + Args: + t (Tapis): Authenticated Tapis client instance. + search_term (str): Name or partial name to search for. Use empty string + for all apps. Supports partial matching with wildcards. + list_type (str, optional): Type of apps to list. Must be one of: + 'OWNED', 'SHARED_PUBLIC', 'SHARED_DIRECT', 'READ_PERM', 'MINE', 'ALL'. + Defaults to "ALL". + verbose (bool, optional): If True, prints summary of found apps including + ID, version, and owner information. Defaults to True. + + Returns: + List[Tapis]: List of matching Tapis app objects with selected fields + (id, version, owner). + + Raises: + AppDiscoveryError: If the Tapis API search fails or an unexpected + error occurs during the search operation. + + Example: + >>> find_apps(client, "matlab", verbose=True) + Found 3 matching apps: + - matlab-r2023a (Version: 1.0, Owner: designsafe) + - matlab-parallel (Version: 2.1, Owner: tacc) + - matlab-desktop (Version: 1.5, Owner: designsafe) + """ + try: + # Use id.like for partial matching, ensure search term is handled + search_query = f"(id.like.*{search_term}*)" if search_term else None + results = t.apps.getApps( + search=search_query, listType=list_type, select="id,version,owner" + ) # Select fewer fields for speed + + if verbose: + if not results: + print( + f"No apps found matching '{search_term}' with listType '{list_type}'" + ) + else: + print(f"\nFound {len(results)} matching apps:") + for app in results: + print(f"- {app.id} (Version: {app.version}, Owner: {app.owner})") + print() + return results + except BaseTapyException as e: + raise AppDiscoveryError( + f"Failed to search for apps matching '{search_term}': {e}" + ) from e + except Exception as e: + raise AppDiscoveryError( + f"An unexpected error occurred while searching for apps: {e}" + ) from e + + +def get_app_details( + t: Tapis, app_id: str, app_version: Optional[str] = None, verbose: bool = True +) -> Optional[Tapis]: + """Get detailed information for a specific app ID and version. + + Retrieves comprehensive details about a specific Tapis application, + including job attributes, execution system, and parameter definitions. + + Args: + t (Tapis): Authenticated Tapis client instance. + app_id (str): Exact app ID to look up. Must match exactly. + app_version (Optional[str], optional): Specific app version to retrieve. + If None, fetches the latest available version. Defaults to None. + verbose (bool, optional): If True, prints basic app information including + ID, version, owner, execution system, and description. Defaults to True. + + Returns: + Optional[Tapis]: Tapis app object with full details including jobAttributes, + parameterSet, and other configuration. Returns None if the app is not found. + + Raises: + AppDiscoveryError: If the Tapis API call fails (except for 404 not found) + or an unexpected error occurs during retrieval. + + Example: + >>> app = get_app_details(client, "matlab-r2023a", "1.0") + App Details: + ID: matlab-r2023a + Version: 1.0 + Owner: designsafe + Execution System: frontera + Description: MATLAB R2023a runtime environment + """ + try: + if app_version: + app_info = t.apps.getApp(appId=app_id, appVersion=app_version) + else: + app_info = t.apps.getAppLatestVersion(appId=app_id) + + if verbose: + print(f"\nApp Details:") + print(f" ID: {app_info.id}") + print(f" Version: {app_info.version}") + print(f" Owner: {app_info.owner}") + if hasattr(app_info, "jobAttributes") and hasattr( + app_info.jobAttributes, "execSystemId" + ): + print(f" Execution System: {app_info.jobAttributes.execSystemId}") + else: + print(" Execution System: Not specified in jobAttributes") + print(f" Description: {app_info.description}") + return app_info + except BaseTapyException as e: + # Check for 404 specifically + if hasattr(e, "response") and e.response and e.response.status_code == 404: + print(f"App '{app_id}' (Version: {app_version or 'latest'}) not found.") + # Optionally, try searching for similar apps + # print("\nAttempting to find similar apps:") + # find_apps(t, app_id, verbose=True) + return None + else: + print( + f"Error getting app info for '{app_id}' (Version: {app_version or 'latest'}): {e}" + ) + raise AppDiscoveryError( + f"Failed to get details for app '{app_id}': {e}" + ) from e + except Exception as e: + print(f"An unexpected error occurred getting app info for '{app_id}': {e}") + raise AppDiscoveryError( + f"Unexpected error getting details for app '{app_id}': {e}" + ) from e diff --git a/dapi/apps/__init__.py b/dapi/apps/__init__.py deleted file mode 100644 index e7bb0ef..0000000 --- a/dapi/apps/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .apps import find_apps, get_app_version - -__all__ = ["find_apps", "get_app_version"] diff --git a/dapi/apps/apps.py b/dapi/apps/apps.py deleted file mode 100644 index c294f7d..0000000 --- a/dapi/apps/apps.py +++ /dev/null @@ -1,57 +0,0 @@ -from tapipy.tapis import Tapis -from typing import List, Dict, Any, Optional - - -def find_apps( - t: Tapis, search_term: str, list_type: str = "ALL", verbose: bool = True -) -> List[Any]: - """ - Search for Tapis apps matching a search term. - - Args: - t (Tapis): Tapis client instance - search_term (str): Name or partial name to search for - list_type (str): One of 'OWNED', 'SHARED_PUBLIC', 'SHARED_DIRECT', 'READ_PERM', 'MINE', 'ALL' - verbose (bool): If True, prints all found apps - - Returns: - List[Any]: List of matching app objects - """ - results = t.apps.getApps(search=f"(id.like.*{search_term}*)", listType=list_type) - - if verbose: - if not results: - print(f"No apps found matching '{search_term}'") - else: - print(f"\nFound {len(results)} matching apps:") - for app in results: - print(f"- {app.id}") - print() - - return results - - -def get_app_version(t: Tapis, app_id: str, verbose: bool = True) -> Optional[Any]: - """ - Get latest version info for a specific app ID. - - Args: - t (Tapis): Tapis client instance - app_id (str): Exact app ID to look up - verbose (bool): If True, prints basic app info - - Returns: - Optional[Any]: Latest version info for the app, or None if not found - """ - try: - app_info = t.apps.getAppLatestVersion(appId=app_id) - if verbose: - print(f"App: {app_info.id}") - print(f"Version: {app_info.version}") - print(f"System: {app_info.jobAttributes.execSystemId}") - return app_info - except Exception as e: - print(f"Error getting app info for '{app_id}': {str(e)}") - print("\nCouldn't find exact match. Here are similar apps:") - _ = find_apps(t, app_id) - return None diff --git a/dapi/auth.py b/dapi/auth.py new file mode 100644 index 0000000..16da4b5 --- /dev/null +++ b/dapi/auth.py @@ -0,0 +1,111 @@ +import os +from getpass import getpass +from tapipy.tapis import Tapis +from tapipy.errors import BaseTapyException +from dotenv import load_dotenv +from .exceptions import AuthenticationError + + +def init( + base_url: str = "https://designsafe.tapis.io", + username: str = None, + password: str = None, + env_file: str = None, +) -> Tapis: + """Initialize and authenticate a Tapis client for DesignSafe. + + Creates and authenticates a Tapis client instance for interacting with + DesignSafe resources. The function follows a credential resolution hierarchy + and handles secure password input when needed. + + Credential Resolution Order: + 1. Explicitly passed username/password arguments + 2. Environment variables (DESIGNSAFE_USERNAME, DESIGNSAFE_PASSWORD) + - Loads from env_file if specified, otherwise checks system environment + 3. Interactive prompts for missing credentials + + Args: + base_url (str, optional): The Tapis base URL for DesignSafe API endpoints. + Defaults to "https://designsafe.tapis.io". + username (str, optional): Explicit DesignSafe username. If None, will + attempt to load from environment or prompt user. Defaults to None. + password (str, optional): Explicit DesignSafe password. If None, will + attempt to load from environment or prompt user securely. Defaults to None. + env_file (str, optional): Path to a .env file containing credentials. + If None, attempts to load from default .env file if it exists. + Defaults to None. + + Returns: + Tapis: An authenticated tapipy.Tapis client object ready for API calls. + + Raises: + AuthenticationError: If authentication fails due to invalid credentials, + network issues, or if required credentials cannot be obtained. + + Example: + >>> # Using explicit credentials + >>> client = init(username="myuser", password="mypass") + Authentication successful. + + >>> # Using environment variables or .env file + >>> client = init(env_file=".env") + Authentication successful. + + >>> # Interactive authentication + >>> client = init() + Enter DesignSafe Username: myuser + Enter DesignSafe Password: [hidden] + Authentication successful. + + Note: + The function disables automatic spec downloads for faster initialization. + Password input uses getpass for secure entry in terminal environments. + """ + # Load environment variables if a file path is provided + if env_file: + load_dotenv(dotenv_path=env_file) + else: + # Try loading from default .env if it exists, but don't require it + load_dotenv() + + # Determine credentials + final_username = username or os.getenv("DESIGNSAFE_USERNAME") + final_password = password or os.getenv("DESIGNSAFE_PASSWORD") + + # Prompt if still missing + if not final_username: + final_username = input("Enter DesignSafe Username: ") + if not final_password: + # Use getpass for secure password entry in terminals + try: + final_password = getpass("Enter DesignSafe Password: ") + except (EOFError, KeyboardInterrupt): + raise AuthenticationError("Password input cancelled.") + except Exception: # Fallback for non-terminal environments + final_password = input("Enter DesignSafe Password: ") + + if not final_username or not final_password: + raise AuthenticationError("Username and password are required.") + + # Initialize Tapis object + try: + t = Tapis( + base_url=base_url, + username=final_username, + password=final_password, + download_latest_specs=False, + ) # Avoid slow spec downloads by default + + # Attempt to get tokens to verify credentials + t.get_tokens() + print("Authentication successful.") + return t + + except BaseTapyException as e: + # Catch Tapis-specific errors during init or get_tokens + raise AuthenticationError(f"Tapis authentication failed: {e}") from e + except Exception as e: + # Catch other potential errors + raise AuthenticationError( + f"An unexpected error occurred during authentication: {e}" + ) from e diff --git a/dapi/auth/__init__.py b/dapi/auth/__init__.py deleted file mode 100644 index 2d80ca4..0000000 --- a/dapi/auth/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .auth import init diff --git a/dapi/auth/auth.py b/dapi/auth/auth.py deleted file mode 100644 index eb1d67f..0000000 --- a/dapi/auth/auth.py +++ /dev/null @@ -1,42 +0,0 @@ -import os -from getpass import getpass -from tapipy.tapis import Tapis -from dotenv import load_dotenv - - -def init(): - """ - Initialize a Tapis object with authentication. - Tries to read credentials from environment variables first. - If not found, prompts the user for input. - - Save the user credentials in the .env file. - ``` - DESIGNSAFE_USERNAME= - DESIGNSAFE_PASSWORD= - ``` - - Returns: - object: The authenticated Tapis object. - """ - base_url = "https://designsafe.tapis.io" - - # Load environment variables from .env file - load_dotenv() - - # Try to get credentials from environment variables - username = os.getenv("DESIGNSAFE_USERNAME") - password = os.getenv("DESIGNSAFE_PASSWORD") - - # If environment variables are not set, prompt user for input - if not username: - username = input("Enter username: ") - if not password: - password = getpass("Enter password: ") - - # Initialize Tapis object - t = Tapis(base_url=base_url, username=username, password=password) - - t.get_tokens() - - return t diff --git a/dapi/client.py b/dapi/client.py new file mode 100644 index 0000000..30ea00d --- /dev/null +++ b/dapi/client.py @@ -0,0 +1,502 @@ +# dapi/client.py +from tapipy.tapis import Tapis +from . import auth +from . import apps as apps_module +from . import files as files_module +from . import jobs as jobs_module +from . import systems as systems_module +from .db.accessor import DatabaseAccessor + +# Import only the necessary classes/functions from jobs +from .jobs import SubmittedJob, interpret_job_status +from typing import List, Optional, Dict, Any + + +class DSClient: + """Main client for interacting with DesignSafe resources via Tapis V3 using dapi. + + The DSClient provides a high-level interface for working with DesignSafe resources + through the Tapis V3 API. It handles authentication and provides organized access + to different service areas including applications, files, jobs, systems, and databases. + + Args: + tapis_client (Tapis, optional): Pre-authenticated Tapis client instance. + If provided, it will be used instead of creating a new one. + **auth_kwargs: Additional authentication arguments passed to auth.init() + when tapis_client is not provided. See auth.init() for available options. + + Attributes: + tapis (Tapis): The underlying authenticated Tapis client instance. + apps (AppMethods): Interface for application discovery and details. + files (FileMethods): Interface for file operations (upload, download, list). + jobs (JobMethods): Interface for job submission and monitoring. + systems (SystemMethods): Interface for system information and queues. + db (DatabaseAccessor): Interface for database connections and queries. + + Raises: + TypeError: If tapis_client is provided but is not a Tapis instance. + AuthenticationError: If authentication fails when creating a new Tapis client. + + Example: + Basic usage with automatic authentication: + + >>> client = DSClient() + Enter DesignSafe Username: myuser + Enter DesignSafe Password: [hidden] + Authentication successful. + + Using explicit credentials: + + >>> client = DSClient(username="myuser", password="mypass") + Authentication successful. + + Using a pre-authenticated Tapis client: + + >>> tapis = Tapis(base_url="https://designsafe.tapis.io", ...) + >>> tapis.get_tokens() + >>> client = DSClient(tapis_client=tapis) + """ + + def __init__(self, tapis_client: Optional[Tapis] = None, **auth_kwargs): + """Initialize the DSClient with authentication and service interfaces. + + Args: + tapis_client (Tapis, optional): Pre-authenticated Tapis client instance. + If provided, it will be used instead of creating a new one. + **auth_kwargs: Additional authentication arguments passed to auth.init() + when tapis_client is not provided. Common arguments include: + - username (str): DesignSafe username + - password (str): DesignSafe password + - base_url (str): Tapis base URL + - env_file (str): Path to .env file with credentials + + Raises: + TypeError: If tapis_client is provided but is not a Tapis instance. + AuthenticationError: If authentication fails when creating new client. + """ + if tapis_client: + if not isinstance(tapis_client, Tapis): + raise TypeError("tapis_client must be an instance of tapipy.Tapis") + if not tapis_client.get_access_jwt(): + print( + "Warning: Provided tapis_client does not appear to be authenticated." + ) + self.tapis = tapis_client + else: + self.tapis = auth.init(**auth_kwargs) + + # Instantiate Accessors + self.apps = AppMethods(self.tapis) + self.files = FileMethods(self.tapis) + self.jobs = JobMethods(self.tapis) + self.systems = SystemMethods(self.tapis) + self.db = DatabaseAccessor() + + +# --- AppMethods and FileMethods remain the same --- +class AppMethods: + """Interface for Tapis application discovery and details retrieval. + + This class provides methods for finding and getting detailed information + about Tapis applications available for job submission. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + + def __init__(self, tapis_client: Tapis): + """Initialize AppMethods with a Tapis client. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + self._tapis = tapis_client + + def find(self, *args, **kwargs) -> List[Tapis]: + """Search for Tapis apps matching a search term. + + This is a convenience wrapper around apps_module.find_apps(). + + Args: + *args: Positional arguments passed to find_apps(). + **kwargs: Keyword arguments passed to find_apps(). + + Returns: + List[Tapis]: List of matching Tapis app objects. + + Raises: + AppDiscoveryError: If the search fails or encounters an error. + """ + return apps_module.find_apps(self._tapis, *args, **kwargs) + + def get_details(self, *args, **kwargs) -> Optional[Tapis]: + """Get detailed information for a specific app ID and version. + + This is a convenience wrapper around apps_module.get_app_details(). + + Args: + *args: Positional arguments passed to get_app_details(). + **kwargs: Keyword arguments passed to get_app_details(). + + Returns: + Optional[Tapis]: Tapis app object with full details, or None if not found. + + Raises: + AppDiscoveryError: If the retrieval fails or encounters an error. + """ + return apps_module.get_app_details(self._tapis, *args, **kwargs) + + +class FileMethods: + """Interface for file operations on Tapis storage systems. + + This class provides methods for uploading, downloading, listing files, + and translating DesignSafe-style paths to Tapis URIs. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + + def __init__(self, tapis_client: Tapis): + """Initialize FileMethods with a Tapis client. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + self._tapis = tapis_client + + def translate_path_to_uri(self, *args, **kwargs) -> str: + """Translate DesignSafe-style paths to Tapis URIs. + + This is a convenience wrapper around files_module.get_ds_path_uri(). + + Args: + *args: Positional arguments passed to get_ds_path_uri(). + **kwargs: Keyword arguments passed to get_ds_path_uri(). + + Returns: + str: The corresponding Tapis URI (e.g., tapis://system-id/path). + + Raises: + FileOperationError: If path translation fails. + ValueError: If the input path format is unrecognized. + """ + return files_module.get_ds_path_uri(self._tapis, *args, **kwargs) + + def translate_uri_to_path(self, *args, **kwargs) -> str: + """Translate Tapis URIs to DesignSafe local paths. + + This is a convenience wrapper around files_module.tapis_uri_to_local_path(). + + Args: + *args: Positional arguments passed to tapis_uri_to_local_path(). + **kwargs: Keyword arguments passed to tapis_uri_to_local_path(). + + Returns: + str: The corresponding DesignSafe local path (e.g., /home/jupyter/MyData/path). + + Example: + >>> local_path = client.files.translate_uri_to_path("tapis://designsafe.storage.default/user/data") + >>> print(local_path) # "/home/jupyter/MyData/data" + """ + return files_module.tapis_uri_to_local_path(*args, **kwargs) + + def upload(self, *args, **kwargs): + """Upload a local file to a Tapis storage system. + + This is a convenience wrapper around files_module.upload_file(). + + Args: + *args: Positional arguments passed to upload_file(). + **kwargs: Keyword arguments passed to upload_file(). + + Raises: + FileOperationError: If the upload operation fails. + FileNotFoundError: If the local file does not exist. + """ + return files_module.upload_file(self._tapis, *args, **kwargs) + + def download(self, *args, **kwargs): + """Download a file from a Tapis storage system to local filesystem. + + This is a convenience wrapper around files_module.download_file(). + + Args: + *args: Positional arguments passed to download_file(). + **kwargs: Keyword arguments passed to download_file(). + + Raises: + FileOperationError: If the download operation fails. + """ + return files_module.download_file(self._tapis, *args, **kwargs) + + def list(self, *args, **kwargs) -> List[Tapis]: + """List files and directories in a Tapis storage system path. + + This is a convenience wrapper around files_module.list_files(). + + Args: + *args: Positional arguments passed to list_files(). + **kwargs: Keyword arguments passed to list_files(). + + Returns: + List[Tapis]: List of file/directory objects from the specified path. + + Raises: + FileOperationError: If the listing operation fails. + """ + return files_module.list_files(self._tapis, *args, **kwargs) + + +class SystemMethods: + """Interface for Tapis system information and queue management. + + This class provides methods for retrieving information about Tapis + execution systems and their available job queues. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + + def __init__(self, tapis_client: Tapis): + """Initialize SystemMethods with a Tapis client. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + self._tapis = tapis_client + + def list_queues(self, system_id: str, verbose: bool = True) -> List[Any]: + """List logical queues available on a Tapis execution system. + + This is a convenience wrapper around systems_module.list_system_queues(). + + Args: + system_id (str): The ID of the execution system (e.g., 'frontera'). + verbose (bool, optional): If True, prints detailed queue information. + Defaults to True. + + Returns: + List[Any]: List of queue objects with queue configuration details. + + Raises: + SystemInfoError: If the system is not found or queue retrieval fails. + ValueError: If system_id is empty. + """ + return systems_module.list_system_queues( + self._tapis, system_id, verbose=verbose + ) + + +class JobMethods: + """Interface for Tapis job submission, monitoring, and management. + + This class provides methods for generating job requests, submitting jobs, + monitoring job status, and managing submitted jobs. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + + def __init__(self, tapis_client: Tapis): + """Initialize JobMethods with a Tapis client. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + """ + self._tapis = tapis_client + + # Method to generate the request dictionary + def generate_request( + self, + app_id: str, + input_dir_uri: str, + script_filename: str, + # --- Optional Overrides --- + app_version: Optional[str] = None, + job_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[List[str]] = None, + max_minutes: Optional[int] = None, + node_count: Optional[int] = None, + cores_per_node: Optional[int] = None, + memory_mb: Optional[int] = None, + queue: Optional[str] = None, + allocation: Optional[str] = None, + archive_system: Optional[str] = None, + archive_path: Optional[str] = None, + # --- Optional Extra Parameters --- + extra_file_inputs: Optional[List[Dict[str, Any]]] = None, + extra_app_args: Optional[List[Dict[str, Any]]] = None, + extra_env_vars: Optional[List[Dict[str, Any]]] = None, + extra_scheduler_options: Optional[List[Dict[str, Any]]] = None, + # --- Configuration --- + script_param_names: List[str] = ["Input Script", "Main Script", "tclScript"], + input_dir_param_name: str = "Input Directory", + allocation_param_name: str = "TACC Allocation", + ) -> Dict[str, Any]: + """Generate a Tapis job request dictionary based on app definition and inputs. + + This method creates a properly formatted job request dictionary that can be + submitted to Tapis. It automatically retrieves app details and applies + user-specified overrides and extra parameters. + + Args: + app_id (str): The ID of the Tapis application to use for the job. + input_dir_uri (str): Tapis URI to the input directory containing job files. + script_filename (str): Name of the main script file to execute. + app_version (str, optional): Specific app version. If None, uses latest. + job_name (str, optional): Custom job name. If None, auto-generates one. + description (str, optional): Job description. If None, uses app description. + tags (List[str], optional): List of tags to associate with the job. + max_minutes (int, optional): Maximum runtime in minutes. Overrides app default. + node_count (int, optional): Number of compute nodes. Overrides app default. + cores_per_node (int, optional): Cores per node. Overrides app default. + memory_mb (int, optional): Memory in MB. Overrides app default. + queue (str, optional): Execution queue name. Overrides app default. + allocation (str, optional): TACC allocation to charge for compute time. + archive_system (str, optional): Archive system for job outputs. Use "designsafe" + for designsafe.storage.default. If None, uses app default. + archive_path (str, optional): Archive directory path. Can be a full path or just + a directory name in MyData. If None and archive_system is "designsafe", + defaults to "tapis-jobs-archive/${JobCreateDate}/${JobUUID}". + extra_file_inputs (List[Dict[str, Any]], optional): Additional file inputs. + extra_app_args (List[Dict[str, Any]], optional): Additional app arguments. + extra_env_vars (List[Dict[str, Any]], optional): Additional environment variables. + extra_scheduler_options (List[Dict[str, Any]], optional): Additional scheduler options. + script_param_names (List[str], optional): Parameter names to check for script placement. + input_dir_param_name (str, optional): Parameter name for input directory. + allocation_param_name (str, optional): Parameter name for allocation. + + Returns: + Dict[str, Any]: Complete job request dictionary ready for submission. + + Raises: + AppDiscoveryError: If the specified app cannot be found. + ValueError: If required parameters are missing or invalid. + JobSubmissionError: If job request generation fails. + + Example: + >>> job_request = client.jobs.generate_request( + ... app_id="matlab-r2023a", + ... input_dir_uri="tapis://designsafe.storage.default/username/input/", + ... script_filename="run_analysis.m", + ... max_minutes=120, + ... allocation="MyProject-123" + ... ) + """ + return jobs_module.generate_job_request( + tapis_client=self._tapis, + app_id=app_id, + input_dir_uri=input_dir_uri, + script_filename=script_filename, + app_version=app_version, + job_name=job_name, + description=description, + tags=tags, + max_minutes=max_minutes, + node_count=node_count, + cores_per_node=cores_per_node, + memory_mb=memory_mb, + queue=queue, + allocation=allocation, + archive_system=archive_system, + archive_path=archive_path, + extra_file_inputs=extra_file_inputs, + extra_app_args=extra_app_args, + extra_env_vars=extra_env_vars, + extra_scheduler_options=extra_scheduler_options, + script_param_names=script_param_names, + input_dir_param_name=input_dir_param_name, + allocation_param_name=allocation_param_name, + ) + + # Method to submit the generated request dictionary + def submit_request(self, job_request: Dict[str, Any]) -> SubmittedJob: + """Submit a pre-generated job request dictionary to Tapis. + + This method takes a complete job request dictionary (typically generated + by generate_request) and submits it to Tapis for execution. + + Args: + job_request (Dict[str, Any]): Complete job request dictionary containing + all necessary job parameters and configuration. + + Returns: + SubmittedJob: A SubmittedJob object for monitoring and managing the job. + + Raises: + ValueError: If job_request is not a dictionary. + JobSubmissionError: If the Tapis submission fails or encounters an error. + + Example: + >>> job_request = client.jobs.generate_request(...) + >>> submitted_job = client.jobs.submit_request(job_request) + >>> print(f"Job submitted with UUID: {submitted_job.uuid}") + """ + return jobs_module.submit_job_request(self._tapis, job_request) + + # --- Management methods remain the same --- + def get(self, job_uuid: str) -> SubmittedJob: + """Get a SubmittedJob object for managing an existing job by UUID. + + Args: + job_uuid (str): The UUID of an existing Tapis job. + + Returns: + SubmittedJob: A SubmittedJob object for monitoring and managing the job. + + Example: + >>> job = client.jobs.get("12345678-1234-1234-1234-123456789abc") + >>> status = job.status + """ + return SubmittedJob(self._tapis, job_uuid) + + def get_status(self, job_uuid: str) -> str: + """Get the current status of a job by UUID. + + Args: + job_uuid (str): The UUID of the job to check. + + Returns: + str: The current job status (e.g., "QUEUED", "RUNNING", "FINISHED"). + + Raises: + JobMonitorError: If status retrieval fails. + + Example: + >>> status = client.jobs.get_status("12345678-1234-1234-1234-123456789abc") + >>> print(f"Job status: {status}") + """ + return jobs_module.get_job_status(self._tapis, job_uuid) + + def get_runtime_summary(self, job_uuid: str, verbose: bool = False): + """Print the runtime summary for a job by UUID. + + Args: + job_uuid (str): The UUID of the job to analyze. + verbose (bool, optional): If True, prints detailed job history events. + Defaults to False. + + Example: + >>> client.jobs.get_runtime_summary("12345678-1234-1234-1234-123456789abc") + Runtime Summary + --------------- + QUEUED time: 00:05:30 + RUNNING time: 01:23:45 + TOTAL time: 01:29:15 + """ + jobs_module.get_runtime_summary(self._tapis, job_uuid, verbose=verbose) + + def interpret_status(self, final_status: str, job_uuid: Optional[str] = None): + """Print a user-friendly interpretation of a job status. + + Args: + final_status (str): The job status to interpret. + job_uuid (str, optional): The job UUID for context in the message. + + Example: + >>> client.jobs.interpret_status("FINISHED", "12345678-1234-1234-1234-123456789abc") + Job 12345678-1234-1234-1234-123456789abc completed successfully. + """ + jobs_module.interpret_job_status(final_status, job_uuid) diff --git a/dapi/db/__init__.py b/dapi/db/__init__.py index 4e5e730..ed2ad57 100644 --- a/dapi/db/__init__.py +++ b/dapi/db/__init__.py @@ -1,2 +1,17 @@ +"""DesignSafe database package initialization. + +This package provides database connectivity and utilities for accessing +DesignSafe-specific SQL databases. It includes the main DSDatabase class +for database connections and query execution. + +Attributes: + name (str): Package name identifier for the DesignSafe database module. + +Example: + >>> from dapi.db import DSDatabase + >>> db = DSDatabase("ngl") + >>> results = db.read_sql("SELECT * FROM table_name LIMIT 5") +""" + name = "designsafe_db" from .db import DSDatabase diff --git a/dapi/db/accessor.py b/dapi/db/accessor.py new file mode 100644 index 0000000..d8d1707 --- /dev/null +++ b/dapi/db/accessor.py @@ -0,0 +1,193 @@ +"""Database accessor for managing multiple DesignSafe database connections. + +This module provides the DatabaseAccessor class which manages lazy initialization +and access to multiple DesignSafe database connections through property-based +interfaces. It handles connection pooling and provides convenient access to +different database instances. + +Example: + >>> accessor = DatabaseAccessor() + >>> ngl_db = accessor.ngl + >>> df = ngl_db.read_sql("SELECT * FROM table_name LIMIT 5") + >>> accessor.close_all() +""" + +from typing import Dict, Optional +from .config import db_config +from .db import DSDatabase + + +class DatabaseAccessor: + """Provides lazy access to different DesignSafe database connections via properties. + + This class manages multiple database connections and provides convenient property-based + access to different DesignSafe databases. Each database connection is created only when + first accessed (lazy initialization) and reused for subsequent calls. + + The accessor supports the following databases through properties: + - ngl: Natural hazards engineering research database + - vp: Vulnerability and performance database + - eq: Post-earthquake recovery database + + Attributes: + _connections (Dict[str, Optional[DSDatabase]]): Internal storage for database instances. + + Example: + >>> accessor = DatabaseAccessor() + DatabaseAccessor initialized. Connections will be created on first access. + + >>> # Access NGL database (created on first access) + >>> ngl_db = accessor.ngl + First access to 'ngl', initializing DSDatabase... + Successfully connected to database 'sjbrande_ngl_db' on 129.114.52.174. + + >>> # Query the database + >>> results = ngl_db.read_sql("SELECT COUNT(*) as total FROM users") + + >>> # Close all connections when done + >>> accessor.close_all() + Closing all active database engines/pools... + Closed 1 database engine(s). + """ + + def __init__(self): + """Initialize the DatabaseAccessor with empty connection slots. + + Creates a dictionary to hold database connections for each configured + database, but does not establish any connections until they are first accessed. + """ + self._connections: Dict[str, Optional[DSDatabase]] = { + key: None for key in db_config.keys() + } + print( + "DatabaseAccessor initialized. Connections will be created on first access." + ) + + def _get_db(self, dbname: str) -> DSDatabase: + """Get or create a DSDatabase instance with lazy initialization. + + This internal method handles the lazy initialization of database connections. + If a connection for the specified database doesn't exist, it creates a new + DSDatabase instance. If creation fails, the connection slot remains None. + + Args: + dbname (str): Shorthand database name (must be a key in db_config). + + Returns: + DSDatabase: An initialized and connected DSDatabase instance. + + Raises: + ValueError: If dbname is not a valid configured database name. + Exception: Re-raises any exception that occurs during database initialization. + """ + if dbname not in self._connections: + raise ValueError( + f"Invalid db shorthand '{dbname}'. Allowed: {', '.join(self._connections.keys())}" + ) + + if self._connections[dbname] is None: + print(f"First access to '{dbname}', initializing DSDatabase...") + try: + self._connections[dbname] = DSDatabase(dbname=dbname) + except Exception as e: + self._connections[dbname] = None + print(f"Error initializing database '{dbname}': {e}") + raise + # Type hint assertion + return self._connections[dbname] # type: ignore + + @property + def ngl(self) -> DSDatabase: + """Access the NGL (Natural Hazards Engineering) database connection manager. + + Provides access to the sjbrande_ngl_db database containing natural hazards + engineering research data. The connection is created on first access. + + Returns: + DSDatabase: Connected database instance for the NGL database. + + Raises: + Exception: If database connection fails during initialization. + + Example: + >>> ngl_db = accessor.ngl + >>> df = ngl_db.read_sql("SELECT * FROM earthquake_data LIMIT 10") + """ + return self._get_db("ngl") + + @property + def vp(self) -> DSDatabase: + """Access the VP (Vulnerability and Performance) database connection manager. + + Provides access to the sjbrande_vpdb database containing vulnerability + and performance analysis data. The connection is created on first access. + + Returns: + DSDatabase: Connected database instance for the VP database. + + Raises: + Exception: If database connection fails during initialization. + + Example: + >>> vp_db = accessor.vp + >>> df = vp_db.read_sql("SELECT * FROM vulnerability_models LIMIT 10") + """ + return self._get_db("vp") + + @property + def eq(self) -> DSDatabase: + """Access the EQ (Post-Earthquake Recovery) database connection manager. + + Provides access to the post_earthquake_recovery database containing + post-earthquake recovery research data. The connection is created on first access. + + Returns: + DSDatabase: Connected database instance for the EQ database. + + Raises: + Exception: If database connection fails during initialization. + + Example: + >>> eq_db = accessor.eq + >>> df = eq_db.read_sql("SELECT * FROM recovery_metrics LIMIT 10") + """ + return self._get_db("eq") + + def close_all(self): + """Close all active database engines and their connection pools. + + This method iterates through all database connections and properly closes + their SQLAlchemy engines and connection pools. This should be called when + the DatabaseAccessor is no longer needed to prevent connection leaks. + + Note: + After calling close_all(), accessing any database property will create + new connections since the instances are reset to None. + + Example: + >>> accessor = DatabaseAccessor() + >>> ngl_db = accessor.ngl # Creates connection + >>> vp_db = accessor.vp # Creates connection + >>> accessor.close_all() # Closes both connections + Closing all active database engines/pools... + Closing connection pool for database 'sjbrande_ngl_db'. + Closing connection pool for database 'sjbrande_vpdb'. + Closed 2 database engine(s). + """ + print("Closing all active database engines/pools...") + closed_count = 0 + for dbname, db_instance in self._connections.items(): + if db_instance is not None: + try: + # Call the close method on the DSDatabase instance + db_instance.close() + self._connections[ + dbname + ] = None # Clear instance after closing engine + closed_count += 1 + except Exception as e: + print(f"Error closing engine for '{dbname}': {e}") + if closed_count == 0: + print("No active database engines to close.") + else: + print(f"Closed {closed_count} database engine(s).") diff --git a/dapi/db/config.py b/dapi/db/config.py index 4dc35bb..14d063c 100644 --- a/dapi/db/config.py +++ b/dapi/db/config.py @@ -1,6 +1,51 @@ +"""Database configuration mapping for DesignSafe database connections. + +This module defines the mapping between shorthand database names and their +actual database names along with environment variable prefixes used for +connection configuration. + +The db_config dictionary maps user-friendly shorthand names to database +configuration details including the actual database name and the prefix +used for environment variables that contain connection credentials. + +Example: + To access the NGL database configuration: + + >>> from .config import db_config + >>> ngl_config = db_config["ngl"] + >>> print(ngl_config["dbname"]) # "sjbrande_ngl_db" + >>> print(ngl_config["env_prefix"]) # "NGL_" + + Environment variables would be: + - NGL_DB_USER + - NGL_DB_PASSWORD + - NGL_DB_HOST + - NGL_DB_PORT +""" + # Mapping of shorthand names to actual database names and environment prefixes db_config = { "ngl": {"dbname": "sjbrande_ngl_db", "env_prefix": "NGL_"}, "vp": {"dbname": "sjbrande_vpdb", "env_prefix": "VP_"}, "eq": {"dbname": "post_earthquake_recovery", "env_prefix": "EQ_"}, } +"""dict: Database configuration mapping. + +Maps shorthand database names to their configuration details. + +Keys: + - "ngl": Natural hazards engineering research database + - "vp": Vulnerability and performance database + - "eq": Post-earthquake recovery database + +Each value contains: + - "dbname" (str): Actual database name in the MySQL server + - "env_prefix" (str): Prefix for environment variables containing credentials + +Environment Variable Pattern: + For each database, the following environment variables are checked: + - {env_prefix}DB_USER: Database username (default: "dspublic") + - {env_prefix}DB_PASSWORD: Database password (default: "R3ad0nlY") + - {env_prefix}DB_HOST: Database host (default: "129.114.52.174") + - {env_prefix}DB_PORT: Database port (default: 3306) +""" diff --git a/dapi/db/db.py b/dapi/db/db.py index 344ccbb..7544ad5 100644 --- a/dapi/db/db.py +++ b/dapi/db/db.py @@ -1,3 +1,24 @@ +"""DesignSafe database connection and query management. + +This module provides the DSDatabase class for connecting to and querying +specific DesignSafe databases using SQLAlchemy with connection pooling. +It supports multiple preconfigured databases and provides both DataFrame +and dictionary output formats for query results. + +Dependencies: + - SQLAlchemy: For database engine and ORM functionality + - PyMySQL: MySQL database driver + - pandas: For DataFrame output format + +Example: + >>> db = DSDatabase("ngl") + Creating SQLAlchemy engine for database 'sjbrande_ngl_db' (ngl)... + Engine for 'ngl' created. + + >>> df = db.read_sql("SELECT * FROM table_name LIMIT 5") + >>> db.close() +""" + import os import pandas as pd from sqlalchemy import create_engine, exc @@ -8,33 +29,51 @@ class DSDatabase: - """A database utility class for connecting to a DesignSafe SQL database. + """Manages connection and querying for a specific DesignSafe database. - This class provides functionality to connect to a MySQL database using - SQLAlchemy and PyMySQL. It supports executing SQL queries and returning - results in different formats. + This class provides a high-level interface for connecting to preconfigured + DesignSafe databases using SQLAlchemy with connection pooling. It supports + environment-based configuration and provides query results in multiple formats. Attributes: - user (str): Database username, defaults to 'dspublic'. - password (str): Database password, defaults to 'R3ad0nlY'. - host (str): Database host address, defaults to '129.114.52.174'. - port (int): Database port, defaults to 3306. - db (str): Database name, can be 'sjbrande_ngl_db', 'sjbrande_vpdb', or 'post_earthquake_recovery'. - recycle_time (int): Time in seconds to recycle database connections. - engine (Engine): SQLAlchemy engine for database connection. - Session (sessionmaker): SQLAlchemy session maker bound to the engine. + user (str): Database username for authentication. + password (str): Database password for authentication. + host (str): Database host address. + port (int): Database port number. + db (str): Name of the connected database. + dbname_short (str): Shorthand name for the database. + engine (sqlalchemy.Engine): SQLAlchemy engine for database connections. + Session (sqlalchemy.orm.sessionmaker): Session factory for database operations. + + Example: + >>> db = DSDatabase("ngl") + >>> df = db.read_sql("SELECT COUNT(*) as total FROM users") + >>> print(df.iloc[0]['total']) + >>> db.close() """ def __init__(self, dbname="ngl"): - """Initializes the DSDatabase instance with environment variables and creates the database engine. + """Initialize the DSDatabase instance and create the SQLAlchemy engine. + + Sets up database connection parameters from environment variables or defaults, + creates a SQLAlchemy engine with connection pooling, and prepares the session factory. Args: - dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'. - """ + dbname (str, optional): Shorthand name for the database to connect to. + Must be a key in db_config. Defaults to "ngl". + Available options: "ngl", "vp", "eq". + Raises: + ValueError: If dbname is not a valid configured database name. + SQLAlchemyError: If database engine creation or connection fails. + + Example: + >>> db = DSDatabase("ngl") # Connect to NGL database + >>> db = DSDatabase("vp") # Connect to VP database + """ if dbname not in db_config: raise ValueError( - f"Invalid database shorthand '{dbname}'. Allowed shorthands are: {', '.join(db_config.keys())}" + f"Invalid db shorthand '{dbname}'. Allowed: {', '.join(db_config.keys())}" ) config = db_config[dbname] @@ -45,50 +84,112 @@ def __init__(self, dbname="ngl"): self.host = os.getenv(f"{env_prefix}DB_HOST", "129.114.52.174") self.port = os.getenv(f"{env_prefix}DB_PORT", 3306) self.db = config["dbname"] + self.dbname_short = dbname # Store shorthand name for reference - # Setup the database connection + print( + f"Creating SQLAlchemy engine for database '{self.db}' ({self.dbname_short})..." + ) + # Setup the database connection engine with pooling self.engine = create_engine( f"mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.db}", - pool_recycle=3600, # 1 hour in seconds + pool_recycle=3600, # Recycle connections older than 1 hour + pool_pre_ping=True, # Check connection validity before use ) + # Create a configured "Session" class self.Session = sessionmaker(bind=self.engine) + print(f"Engine for '{self.dbname_short}' created.") def read_sql(self, sql, output_type="DataFrame"): - """Executes a SQL query and returns the results. + """Execute a SQL query using a dedicated session and return the results. + + This method obtains a session from the connection pool, executes the provided + SQL query, and returns results in the specified format. The session is + automatically closed after execution, returning the connection to the pool. Args: - sql (str): The SQL query string to be executed. - output_type (str, optional): The format for the query results. Defaults to 'DataFrame'. - Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries. + sql (str): The SQL query string to execute. Can be any valid SQL + statement including SELECT, INSERT, UPDATE, DELETE, etc. + output_type (str, optional): Format for query results. Must be either + 'DataFrame' for pandas.DataFrame or 'dict' for list of dictionaries. + Defaults to "DataFrame". Returns: - pandas.DataFrame or list of dict: The result of the SQL query. + pandas.DataFrame or List[Dict]: Query results in the requested format. + - 'DataFrame': Returns a pandas DataFrame with column names as headers + - 'dict': Returns a list of dictionaries where each dict represents a row Raises: - ValueError: If the SQL query string is empty or if the output type is not valid. - SQLAlchemyError: If an error occurs during query execution. + ValueError: If sql is empty/None or output_type is not 'DataFrame' or 'dict'. + SQLAlchemyError: If database error occurs during query execution. + Exception: If unexpected errors occur during query processing. + + Example: + >>> # Get DataFrame result + >>> df = db.read_sql("SELECT name, age FROM users WHERE age > 25") + >>> print(df.columns.tolist()) # ['name', 'age'] + + >>> # Get dictionary result + >>> results = db.read_sql("SELECT COUNT(*) as total FROM users", output_type="dict") + >>> print(results[0]['total']) # 150 """ if not sql: raise ValueError("SQL query string is required") - if output_type not in ["DataFrame", "dict"]: raise ValueError('Output type must be either "DataFrame" or "dict"') + # Obtain a new session for this query session = self.Session() - + print(f"Executing query on '{self.dbname_short}'...") try: if output_type == "DataFrame": - return pd.read_sql_query(sql, session.bind) + # pandas read_sql_query handles connection/session management implicitly sometimes, + # but using the session explicitly ensures consistency. + # Pass the engine bound to the session. + return pd.read_sql_query( + sql, session.bind.connect() + ) # Get connection from engine else: - # Convert SQL string to a text object sql_text = text(sql) + # Execute within the session context result = session.execute(sql_text) - return [dict(row) for row in result] + # Fetch results before closing session + data = [ + dict(row._mapping) for row in result + ] # Use ._mapping for modern SQLAlchemy + return data except exc.SQLAlchemyError as e: - raise Exception(f"SQLAlchemyError: {e}") + print(f"SQLAlchemyError executing query on '{self.dbname_short}': {e}") + raise # Re-raise the exception + except Exception as e: + print(f"Unexpected error executing query on '{self.dbname_short}': {e}") + raise finally: + # Ensure the session is closed, returning the connection to the pool session.close() + # print(f"Session for '{self.dbname_short}' query closed.") # Can be noisy def close(self): - """Close the database connection.""" - self.engine.dispose() + """Dispose of the SQLAlchemy engine and close all database connections. + + This method properly shuts down the database engine and its connection pool. + It should be called when the database instance is no longer needed to + prevent connection leaks and free up database resources. + + Note: + After calling close(), this DSDatabase instance should not be used + for further database operations as the engine will be disposed. + + Example: + >>> db = DSDatabase("ngl") + >>> # ... perform database operations ... + >>> db.close() + Disposing engine and closing pool for 'ngl'... + Engine for 'ngl' disposed. + """ + if self.engine: + print(f"Disposing engine and closing pool for '{self.dbname_short}'...") + self.engine.dispose() + self.engine = None # Mark as disposed + print(f"Engine for '{self.dbname_short}' disposed.") + else: + print(f"Engine for '{self.dbname_short}' already disposed.") diff --git a/dapi/exceptions.py b/dapi/exceptions.py new file mode 100644 index 0000000..a72abf2 --- /dev/null +++ b/dapi/exceptions.py @@ -0,0 +1,193 @@ +"""Custom exceptions for the Dapi library. + +This module defines a hierarchy of exception classes that provide specific error handling +for different types of failures that can occur when interacting with DesignSafe resources +via the Tapis API. + +Typical Usage: + >>> try: + ... client.auth.authenticate() + ... except AuthenticationError as e: + ... print(f"Authentication failed: {e}") + + >>> try: + ... client.files.upload("/local/file.txt", "tapis://system/path/file.txt") + ... except FileOperationError as e: + ... print(f"File operation failed: {e}") +""" + + +class DapiException(Exception): + """Base exception class for all dapi-related errors. + + This is the parent class for all custom exceptions in the dapi library. + It can be used to catch any dapi-specific error or as a base for + creating new custom exceptions. + + Args: + message (str): Human-readable description of the error. + + Example: + >>> try: + ... # Some dapi operation + ... pass + ... except DapiException as e: + ... print(f"A dapi error occurred: {e}") + """ + + pass + + +class AuthenticationError(DapiException): + """Exception raised when authentication with Tapis fails. + + This exception is raised when there are issues during the authentication + process, such as invalid credentials, network connectivity problems, + or Tapis service unavailability. + + Args: + message (str): Description of the authentication failure. + + Example: + >>> try: + ... client = DSClient(username="invalid", password="wrong") + ... except AuthenticationError as e: + ... print(f"Authentication failed: {e}") + """ + + pass + + +class FileOperationError(DapiException): + """Exception raised when file operations fail. + + This exception covers various file-related operations including uploads, + downloads, directory listings, path translations, and file existence checks. + + Args: + message (str): Description of the file operation failure. + + Example: + >>> try: + ... client.files.upload("/nonexistent/file.txt", "tapis://system/file.txt") + ... except FileOperationError as e: + ... print(f"File upload failed: {e}") + """ + + pass + + +class AppDiscoveryError(DapiException): + """Exception raised when application discovery or retrieval fails. + + This exception is raised when searching for Tapis applications fails, + when a specific application cannot be found, or when retrieving + application details encounters an error. + + Args: + message (str): Description of the application discovery failure. + + Example: + >>> try: + ... app = client.apps.get_details("nonexistent-app") + ... except AppDiscoveryError as e: + ... print(f"App discovery failed: {e}") + """ + + pass + + +class SystemInfoError(DapiException): + """Exception raised when retrieving system information fails. + + This exception is raised when operations involving Tapis execution systems + fail, such as retrieving system details, listing available queues, + or checking system availability. + + Args: + message (str): Description of the system information retrieval failure. + + Example: + >>> try: + ... queues = client.systems.list_queues("nonexistent-system") + ... except SystemInfoError as e: + ... print(f"System info retrieval failed: {e}") + """ + + pass + + +class JobSubmissionError(DapiException): + """Exception raised when job submission or validation fails. + + This exception is raised when there are errors during job request generation, + validation, or submission to Tapis. It includes additional context about + the HTTP request and response when available. + + Args: + message (str): Description of the job submission failure. + request (requests.Request, optional): The HTTP request object that failed. + response (requests.Response, optional): The HTTP response object received. + + Attributes: + request (requests.Request): The failed HTTP request, if available. + response (requests.Response): The HTTP response received, if available. + + Example: + >>> try: + ... job = client.jobs.submit_request(invalid_job_request) + ... except JobSubmissionError as e: + ... print(f"Job submission failed: {e}") + ... if e.response: + ... print(f"Status code: {e.response.status_code}") + """ + + def __init__(self, message, request=None, response=None): + """Initialize JobSubmissionError with optional request/response context. + + Args: + message (str): Description of the job submission failure. + request (requests.Request, optional): The HTTP request that failed. + response (requests.Response, optional): The HTTP response received. + """ + super().__init__(message) + self.request = request + self.response = response + + def __str__(self): + """Return detailed string representation including HTTP context. + + Returns: + str: Formatted error message including request/response details when available. + """ + msg = super().__str__() + if self.request: + msg += f"\nRequest URL: {self.request.url}" + msg += f"\nRequest Method: {self.request.method}" + # Potentially add headers/body if safe and useful + if self.response: + msg += f"\nResponse Status: {self.response.status_code}" + try: + msg += f"\nResponse Body: {self.response.text}" # Use text to avoid JSON errors + except Exception: + msg += "\nResponse Body: " + return msg + + +class JobMonitorError(DapiException): + """Exception raised when job monitoring or management fails. + + This exception is raised when there are errors during job status monitoring, + job cancellation, retrieving job details, or accessing job outputs. + + Args: + message (str): Description of the job monitoring failure. + + Example: + >>> try: + ... status = job.monitor(timeout_minutes=60) + ... except JobMonitorError as e: + ... print(f"Job monitoring failed: {e}") + """ + + pass diff --git a/dapi/files.py b/dapi/files.py new file mode 100644 index 0000000..0fa0fa8 --- /dev/null +++ b/dapi/files.py @@ -0,0 +1,493 @@ +# dapi/files.py +import os +import urllib.parse + +# No JWT needed if we rely on t.username +# import jwt +from tapipy.tapis import Tapis +from tapipy.errors import BaseTapyException +import json +from .exceptions import FileOperationError, AuthenticationError +from typing import List + + +# _parse_tapis_uri helper remains the same +def _parse_tapis_uri(tapis_uri: str) -> (str, str): + """Parse a Tapis URI into system ID and path components. + + Args: + tapis_uri (str): URI in the format 'tapis://system_id/path'. + + Returns: + tuple: A tuple containing (system_id, path) where path is URL-decoded. + + Raises: + ValueError: If the URI format is invalid or missing required components. + + Example: + >>> system_id, path = _parse_tapis_uri("tapis://mysystem/folder/file.txt") + >>> print(system_id) # "mysystem" + >>> print(path) # "folder/file.txt" + """ + if not tapis_uri.startswith("tapis://"): + raise ValueError( + f"Invalid Tapis URI: '{tapis_uri}'. Must start with 'tapis://'" + ) + try: + parsed = urllib.parse.urlparse(tapis_uri) + system_id = parsed.netloc + path = parsed.path.lstrip("/") if parsed.path else "" + if not system_id: + raise ValueError(f"Invalid Tapis URI: '{tapis_uri}'. Missing system ID.") + return system_id, path + except Exception as e: + raise ValueError(f"Could not parse Tapis URI '{tapis_uri}': {e}") from e + + +def tapis_uri_to_local_path(tapis_uri: str) -> str: + """Convert a Tapis URI to the corresponding DesignSafe local path. + + Converts Tapis system URIs back to their equivalent DesignSafe local paths + that would be accessible in a Jupyter environment. This is the reverse + operation of get_ds_path_uri(). + + Args: + tapis_uri (str): The Tapis URI to convert. Supported formats: + - "tapis://designsafe.storage.default/username/path" -> "/home/jupyter/MyData/path" + - "tapis://designsafe.storage.community/path" -> "/home/jupyter/CommunityData/path" + - "tapis://project-*/path" -> "/home/jupyter/MyProjects/path" + + Returns: + str: The corresponding DesignSafe local path, or the original URI if + it's not a recognized Tapis URI format. + + Raises: + ValueError: If the Tapis URI format is invalid. + + Example: + >>> local_path = tapis_uri_to_local_path("tapis://designsafe.storage.default/user/data/file.txt") + >>> print(local_path) # "/home/jupyter/MyData/data/file.txt" + + >>> local_path = tapis_uri_to_local_path("tapis://designsafe.storage.community/datasets/earthquake.csv") + >>> print(local_path) # "/home/jupyter/CommunityData/datasets/earthquake.csv" + """ + if not tapis_uri.startswith("tapis://"): + # Not a Tapis URI, return as-is + return tapis_uri + + try: + # Parse the URI using the existing helper function + system_id, path = _parse_tapis_uri(tapis_uri) + + # Handle different system types + if system_id == "designsafe.storage.default": + # For MyData: tapis://designsafe.storage.default/username/path -> /home/jupyter/MyData/path + # Remove the username (first path component) + path_parts = path.split("/", 1) if path else [""] + if len(path_parts) > 1: + user_path = path_parts[1] + return f"/home/jupyter/MyData/{user_path}" + else: + return "/home/jupyter/MyData/" + + elif system_id == "designsafe.storage.community": + # For CommunityData: tapis://designsafe.storage.community/path -> /home/jupyter/CommunityData/path + return ( + f"/home/jupyter/CommunityData/{path}" + if path + else "/home/jupyter/CommunityData/" + ) + + elif system_id.startswith("project-"): + # For Projects: tapis://project-*/path -> /home/jupyter/MyProjects/path + return ( + f"/home/jupyter/MyProjects/{path}" + if path + else "/home/jupyter/MyProjects/" + ) + + else: + # Unknown system type, return original URI + return tapis_uri + + except ValueError: + # Invalid URI format, return original + return tapis_uri + + +def get_ds_path_uri(t: Tapis, path: str, verify_exists: bool = False) -> str: + """Translate DesignSafe-style paths to Tapis URIs. + + Converts commonly used DesignSafe path formats (e.g., /MyData/folder, + /projects/PRJ-XXXX/folder) to their corresponding Tapis system URIs. + Supports MyData, CommunityData, and project-specific paths with automatic + system discovery for projects. + + Args: + t (Tapis): Authenticated Tapis client instance. + path (str): The DesignSafe-style path string to translate. Supported formats: + - MyData paths: "/MyData/folder", "jupyter/MyData/folder" + - Community paths: "/CommunityData/folder" + - Project paths: "/projects/PRJ-XXXX/folder" + - Direct Tapis URIs: "tapis://system-id/path" + verify_exists (bool, optional): If True, verifies the translated path + exists on the target Tapis system. Defaults to False. + + Returns: + str: The corresponding Tapis URI (e.g., "tapis://system-id/path"). + + Raises: + FileOperationError: If path translation fails, project system lookup + fails, or path verification fails (when verify_exists=True). + AuthenticationError: If username is required for MyData paths but + t.username is not available. + ValueError: If the input path format is unrecognized, empty, or incomplete. + + Example: + >>> uri = get_ds_path_uri(client, "/MyData/analysis/results") + Translated '/MyData/analysis/results' to 'tapis://designsafe.storage.default/username/analysis/results' using t.username + + >>> uri = get_ds_path_uri(client, "/projects/PRJ-1234/data", verify_exists=True) + Searching Tapis systems for project ID 'PRJ-1234'... + Found unique matching system: project-1234-abcd-ef01-2345-6789abcdef01 + Verifying existence of translated path: tapis://project-1234-abcd-ef01-2345-6789abcdef01/data + Verification successful: Path exists. + """ + path = path.strip() + if not path: + raise ValueError("Input path cannot be empty.") + + # --- Use t.username directly as per user's working code --- + current_username = getattr(t, "username", None) + # --- + + input_uri = None # Initialize variable + + # 1. Handle MyData variations + mydata_patterns = [ + # Pattern, Tapis System ID, Use Username in Path? + ("jupyter/MyData", "designsafe.storage.default", True), + ("jupyter/mydata", "designsafe.storage.default", True), + ("/MyData", "designsafe.storage.default", True), + ("/mydata", "designsafe.storage.default", True), + ("MyData", "designsafe.storage.default", True), + ("mydata", "designsafe.storage.default", True), + ("/home/jupyter/MyData", "designsafe.storage.default", True), + ("/home/jupyter/mydata", "designsafe.storage.default", True), + ] + for pattern, storage_system_id, use_username in mydata_patterns: + if pattern in path: + if use_username and not current_username: + raise AuthenticationError( + "Username is required for MyData paths but t.username is not available on the Tapis client." + ) + path_remainder = path.split(pattern, 1)[1].lstrip("/") + if use_username: + tapis_path = ( + f"{current_username}/{path_remainder}" + if path_remainder + else current_username + ) + else: + tapis_path = path_remainder + encoded_path = urllib.parse.quote(tapis_path) + input_uri = f"tapis://{storage_system_id}/{encoded_path}" + print(f"Translated '{path}' to '{input_uri}' using t.username") + break # Found match, exit loop + + # 2. Handle Community variations (if not already matched) + if input_uri is None: + community_patterns = [ + ("jupyter/CommunityData", "designsafe.storage.community", False), + ("/CommunityData", "designsafe.storage.community", False), + ("CommunityData", "designsafe.storage.community", False), + ] + for pattern, storage_system_id, use_username in community_patterns: + if pattern in path: + path_remainder = path.split(pattern, 1)[1].lstrip("/") + tapis_path = path_remainder + encoded_path = urllib.parse.quote(tapis_path) + input_uri = f"tapis://{storage_system_id}/{encoded_path}" + print(f"Translated '{path}' to '{input_uri}'") + break # Found match, exit loop + + # 3. Handle Project variations (if not already matched) + if input_uri is None: + project_patterns = [ + ("jupyter/MyProjects", "project-"), + ("jupyter/projects", "project-"), + ("/projects", "project-"), + ("projects", "project-"), + ("/MyProjects", "project-"), + ] + for pattern, system_prefix in project_patterns: + if pattern in path: + path_remainder_full = path.split(pattern, 1)[1].lstrip("/") + if not path_remainder_full: + raise ValueError( + f"Project path '{path}' is incomplete. Missing project ID." + ) + parts = path_remainder_full.split("/", 1) + project_id_part = parts[0] + path_within_project = parts[1] if len(parts) > 1 else "" + + print(f"Searching Tapis systems for project ID '{project_id_part}'...") + found_system_id = None + try: + search_query = ( + f"description.like.%{project_id_part}%&id.like.{system_prefix}*" + ) + systems = t.systems.getSystems( + search=search_query, + listType="ALL", + select="id,owner,description", + limit=10, + ) + matches = [] + if systems: + for sys in systems: + if ( + project_id_part.lower() + in getattr(sys, "description", "").lower() + ): + matches.append(sys.id) + if len(matches) == 1: + found_system_id = matches[0] + print(f"Found unique matching system: {found_system_id}") + elif len(matches) == 0: + if "-" in project_id_part and len(project_id_part) > 30: + potential_sys_id = f"{system_prefix}{project_id_part}" + print( + f"Search failed, attempting direct lookup for system ID: {potential_sys_id}" + ) + try: + t.systems.getSystem( + systemId=potential_sys_id, select="id" + ) # Select minimal field + found_system_id = potential_sys_id + print(f"Direct lookup successful: {found_system_id}") + except BaseTapyException: + print( + f"Direct lookup for {potential_sys_id} also failed." + ) + raise FileOperationError( + f"No project system found matching ID '{project_id_part}' via Tapis v3 search or direct UUID lookup." + ) + else: + raise FileOperationError( + f"No project system found matching ID '{project_id_part}' via Tapis v3 search." + ) + else: + raise FileOperationError( + f"Multiple project systems found potentially matching ID '{project_id_part}': {matches}. Cannot determine unique system." + ) + except BaseTapyException as e: + raise FileOperationError( + f"Tapis API error searching for project system '{project_id_part}': {e}" + ) from e + except Exception as e: + raise FileOperationError( + f"Unexpected error searching for project system '{project_id_part}': {e}" + ) from e + + if not found_system_id: + raise FileOperationError( + f"Could not resolve project ID '{project_id_part}' to a Tapis system ID." + ) + + encoded_path_within_project = urllib.parse.quote(path_within_project) + input_uri = f"tapis://{found_system_id}/{encoded_path_within_project}" + print(f"Translated '{path}' to '{input_uri}' using Tapis v3 lookup") + break # Found match, exit loop + + # 4. Handle direct tapis:// URI input (if not already matched) + if input_uri is None and path.startswith("tapis://"): + print(f"Path '{path}' is already a Tapis URI.") + input_uri = path + + # Check if any pattern matched + if input_uri is None: + raise ValueError( + f"Unrecognized DesignSafe path format: '{path}'. Could not translate to Tapis URI." + ) + + # Verification Step + if verify_exists: + print(f"Verifying existence of translated path: {input_uri}") + try: + system_id, remote_path = _parse_tapis_uri(input_uri) + # Decode the path part for the listFiles call, as it expects unencoded paths + decoded_remote_path = urllib.parse.unquote(remote_path) + print(f"Checking system '{system_id}' for path '{decoded_remote_path}'...") + # Use limit=1 for efficiency, we only care if it *exists* + # Note: listFiles might return successfully for the *parent* directory + # if the final component doesn't exist. A more robust check might + # involve checking the result count or specific item name, but this + # basic check catches non-existent parent directories. + t.files.listFiles(systemId=system_id, path=decoded_remote_path, limit=1) + print(f"Verification successful: Path exists.") + except BaseTapyException as e: + # Specifically check for 404 on the listFiles call + if hasattr(e, "response") and e.response and e.response.status_code == 404: + raise FileOperationError( + f"Verification failed: Path '{decoded_remote_path}' does not exist on system '{system_id}'. Translated URI: {input_uri}" + ) from e + else: + # Re-raise other Tapis errors encountered during verification + raise FileOperationError( + f"Verification error for path '{decoded_remote_path}' on system '{system_id}': {e}" + ) from e + except ( + ValueError + ) as e: # Catch errors from _parse_tapis_uri if input_uri was bad + raise FileOperationError( + f"Verification failed: Could not parse translated URI '{input_uri}' for verification. Error: {e}" + ) from e + except Exception as e: + # Catch other unexpected errors during verification + raise FileOperationError( + f"Unexpected verification error for path at '{input_uri}': {e}" + ) from e + + return input_uri + + +def upload_file(t: Tapis, local_path: str, remote_uri: str): + """Upload a local file to a Tapis storage system. + + Args: + t (Tapis): Authenticated Tapis client instance. + local_path (str): Path to the local file to upload. + remote_uri (str): Tapis URI destination (e.g., "tapis://system/path/file.txt"). + + Raises: + FileNotFoundError: If the local file does not exist. + ValueError: If local_path is not a file or remote_uri is invalid. + FileOperationError: If the Tapis upload operation fails. + + Example: + >>> upload_file(client, "/local/data.txt", "tapis://mysystem/uploads/data.txt") + Uploading '/local/data.txt' to system 'mysystem' at path 'uploads/data.txt'... + Upload complete. + """ + if not os.path.exists(local_path): + raise FileNotFoundError(f"Local file not found: {local_path}") + if not os.path.isfile(local_path): + raise ValueError(f"Local path '{local_path}' is not a file.") + try: + system_id, dest_path = _parse_tapis_uri(remote_uri) + print( + f"Uploading '{local_path}' to system '{system_id}' at path '{dest_path}'..." + ) + t.upload( + system_id=system_id, source_file_path=local_path, dest_file_path=dest_path + ) + print("Upload complete.") + except BaseTapyException as e: + raise FileOperationError( + f"Tapis upload failed for '{local_path}' to '{remote_uri}': {e}" + ) from e + except (ValueError, Exception) as e: + raise FileOperationError( + f"Failed to upload file '{local_path}' to '{remote_uri}': {e}" + ) from e + + +def download_file(t: Tapis, remote_uri: str, local_path: str): + """Download a file from a Tapis storage system to local filesystem. + + Args: + t (Tapis): Authenticated Tapis client instance. + remote_uri (str): Tapis URI of the file to download (e.g., "tapis://system/path/file.txt"). + local_path (str): Local filesystem path where the file should be saved. + + Raises: + ValueError: If local_path is a directory or remote_uri is invalid. + FileOperationError: If the download operation fails or remote file not found. + + Example: + >>> download_file(client, "tapis://mysystem/data/results.txt", "/local/results.txt") + Downloading from system 'mysystem' path 'data/results.txt' to '/local/results.txt'... + Download complete. + """ + if os.path.isdir(local_path): + raise ValueError( + f"Local path '{local_path}' is a directory. Please provide a full file path." + ) + try: + system_id, source_path = _parse_tapis_uri(remote_uri) + print( + f"Downloading from system '{system_id}' path '{source_path}' to '{local_path}'..." + ) + local_dir = os.path.dirname(local_path) + if local_dir: + os.makedirs(local_dir, exist_ok=True) + # Use getContents which returns the raw bytes + # Set stream=True for potentially large files + response = t.files.getContents( + systemId=system_id, path=source_path, stream=True + ) + + # Write the streamed content to the local file + with open(local_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): # Process in chunks + f.write(chunk) + + print("Download complete.") + + except BaseTapyException as e: + if hasattr(e, "response") and e.response and e.response.status_code == 404: + raise FileOperationError(f"Remote file not found at '{remote_uri}'") from e + else: + raise FileOperationError( + f"Tapis download failed for '{remote_uri}': {e}" + ) from e + except (ValueError, Exception) as e: + raise FileOperationError( + f"Failed to download file from '{remote_uri}' to '{local_path}': {e}" + ) from e + + +def list_files( + t: Tapis, remote_uri: str, limit: int = 100, offset: int = 0 +) -> List[Tapis]: + """List files and directories in a Tapis storage system path. + + Args: + t (Tapis): Authenticated Tapis client instance. + remote_uri (str): Tapis URI of the directory to list (e.g., "tapis://system/path/"). + limit (int, optional): Maximum number of items to return. Defaults to 100. + offset (int, optional): Number of items to skip (for pagination). Defaults to 0. + + Returns: + List[Tapis]: List of file and directory objects from the specified path. + Each object contains metadata like name, size, type, and permissions. + + Raises: + ValueError: If remote_uri is invalid. + FileOperationError: If the listing operation fails or path not found. + + Example: + >>> files = list_files(client, "tapis://mysystem/data/") + Listing files in system 'mysystem' at path 'data/'... + Found 5 items. + >>> for file in files: + ... print(f"{file.name} ({file.type})") + """ + try: + system_id, path = _parse_tapis_uri(remote_uri) + print(f"Listing files in system '{system_id}' at path '{path}'...") + results = t.files.listFiles( + systemId=system_id, path=path, limit=limit, offset=offset + ) + print(f"Found {len(results)} items.") + return results + except BaseTapyException as e: + if hasattr(e, "response") and e.response and e.response.status_code == 404: + raise FileOperationError(f"Remote path not found at '{remote_uri}'") from e + else: + raise FileOperationError( + f"Tapis file listing failed for '{remote_uri}': {e}" + ) from e + except (ValueError, Exception) as e: + raise FileOperationError(f"Failed to list files at '{remote_uri}': {e}") from e diff --git a/dapi/jobs.py b/dapi/jobs.py new file mode 100644 index 0000000..403bded --- /dev/null +++ b/dapi/jobs.py @@ -0,0 +1,1140 @@ +# dapi/jobs.py +import time +import json +import os +import urllib.parse +import logging # Import logging for the timeout warning +from datetime import datetime, timedelta, timezone +from typing import Dict, Any, Optional, List +from tapipy.tapis import Tapis +from tapipy.errors import BaseTapyException +from dataclasses import dataclass, field, asdict +from tqdm.auto import tqdm +from .apps import get_app_details +from .exceptions import ( + JobSubmissionError, + JobMonitorError, + FileOperationError, + AppDiscoveryError, +) + +# --- Module-Level Status Constants --- +STATUS_TIMEOUT = "TIMEOUT" +STATUS_INTERRUPTED = "INTERRUPTED" +STATUS_MONITOR_ERROR = "MONITOR_ERROR" +STATUS_UNKNOWN = "UNKNOWN" +TAPIS_TERMINAL_STATES = [ + "FINISHED", + "FAILED", + "CANCELLED", + "STOPPED", + "ARCHIVING_FAILED", +] + + +# --- generate_job_request function (Production Ready) --- +def generate_job_request( + tapis_client: Tapis, + app_id: str, + input_dir_uri: str, + script_filename: str, + app_version: Optional[str] = None, + job_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[List[str]] = None, + max_minutes: Optional[int] = None, + node_count: Optional[int] = None, + cores_per_node: Optional[int] = None, + memory_mb: Optional[int] = None, + queue: Optional[str] = None, + allocation: Optional[str] = None, + archive_system: Optional[str] = None, + archive_path: Optional[str] = None, + extra_file_inputs: Optional[List[Dict[str, Any]]] = None, + extra_app_args: Optional[List[Dict[str, Any]]] = None, + extra_env_vars: Optional[List[Dict[str, Any]]] = None, + extra_scheduler_options: Optional[List[Dict[str, Any]]] = None, + script_param_names: List[str] = ["Input Script", "Main Script", "tclScript"], + input_dir_param_name: str = "Input Directory", + allocation_param_name: str = "TACC Allocation", +) -> Dict[str, Any]: + """Generate a Tapis job request dictionary based on app definition and inputs. + + Creates a properly formatted job request dictionary by retrieving the specified + application details and applying user-provided overrides and additional parameters. + The function automatically maps the script filename and input directory to the + appropriate app parameters. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + app_id (str): The ID of the Tapis application to use for the job. + input_dir_uri (str): Tapis URI to the input directory containing job files. + script_filename (str): Name of the main script file to execute. + app_version (str, optional): Specific app version to use. If None, uses latest. + job_name (str, optional): Custom job name. If None, auto-generates based on app ID and timestamp. + description (str, optional): Job description. If None, uses app description. + tags (List[str], optional): List of tags to associate with the job. + max_minutes (int, optional): Maximum runtime in minutes. Overrides app default. + node_count (int, optional): Number of compute nodes. Overrides app default. + cores_per_node (int, optional): Cores per node. Overrides app default. + memory_mb (int, optional): Memory in MB. Overrides app default. + queue (str, optional): Execution queue name. Overrides app default. + allocation (str, optional): TACC allocation to charge for compute time. + archive_system (str, optional): Archive system for job outputs. If "designsafe" is specified, + uses "designsafe.storage.default". If None, uses app default. + archive_path (str, optional): Archive directory path. Can be a full path or just a directory name + in MyData (e.g., "tapis-jobs-archive"). If None and archive_system is "designsafe", + defaults to "${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}". + extra_file_inputs (List[Dict[str, Any]], optional): Additional file inputs beyond the main input directory. + extra_app_args (List[Dict[str, Any]], optional): Additional application arguments. + extra_env_vars (List[Dict[str, Any]], optional): Additional environment variables. + extra_scheduler_options (List[Dict[str, Any]], optional): Additional scheduler options. + script_param_names (List[str], optional): Parameter names to check for script placement. + Defaults to ["Input Script", "Main Script", "tclScript"]. + input_dir_param_name (str, optional): Parameter name for input directory. + Defaults to "Input Directory". + allocation_param_name (str, optional): Parameter name for TACC allocation. + Defaults to "TACC Allocation". + + Returns: + Dict[str, Any]: Complete job request dictionary ready for submission to Tapis. + Contains all necessary job configuration including file inputs, parameters, + and resource requirements. + + Raises: + AppDiscoveryError: If the specified app cannot be found or details cannot be retrieved. + ValueError: If required parameters are missing, invalid, or script parameter cannot be placed. + JobSubmissionError: If unexpected errors occur during job request generation. + + Example: + >>> job_request = generate_job_request( + ... tapis_client=client, + ... app_id="matlab-r2023a", + ... input_dir_uri="tapis://designsafe.storage.default/username/input/", + ... script_filename="run_analysis.m", + ... max_minutes=120, + ... node_count=2, + ... allocation="MyProject-123" + ... ) + >>> print(job_request["name"]) # "matlab-r2023a-20231201_143022" + """ + print(f"Generating job request for app '{app_id}'...") + try: + app_details = get_app_details(tapis_client, app_id, app_version, verbose=False) + if not app_details: + raise AppDiscoveryError( + f"App '{app_id}' (Version: {app_version or 'latest'}) not found." + ) + final_app_version = app_details.version + print(f"Using App Details: {app_details.id} v{final_app_version}") + job_attrs = app_details.jobAttributes + param_set_def = getattr(job_attrs, "parameterSet", None) + final_job_name = ( + job_name or f"{app_details.id}-{datetime.now().strftime('%Y%m%d_%H%M%S')}" + ) + final_description = ( + description or app_details.description or f"dapi job for {app_details.id}" + ) + + # Handle archive system configuration + archive_system_id = None + archive_system_dir = None + + if archive_system: + if archive_system.lower() == "designsafe": + archive_system_id = "designsafe.storage.default" + # Handle archive path configuration + if archive_path: + # Check if it's a full path or just a directory name + if archive_path.startswith("/") or archive_path.startswith("${"): + # Full path provided + archive_system_dir = archive_path + else: + # Directory name provided, construct the full path + archive_system_dir = f"${{EffectiveUserId}}/{archive_path}/${{JobCreateDate}}/${{JobUUID}}" + else: + # Default path for DesignSafe + archive_system_dir = "${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}" + else: + # Use the provided archive system as-is + archive_system_id = archive_system + if archive_path: + archive_system_dir = archive_path + else: + # Use app defaults + archive_system_id = getattr(job_attrs, "archiveSystemId", None) + archive_system_dir = getattr(job_attrs, "archiveSystemDir", None) + + job_req = { + "name": final_job_name, + "appId": app_details.id, + "appVersion": final_app_version, + "description": final_description, + "execSystemId": getattr(job_attrs, "execSystemId", None), + "archiveSystemId": archive_system_id, + **({"archiveSystemDir": archive_system_dir} if archive_system_dir else {}), + "archiveOnAppError": getattr(job_attrs, "archiveOnAppError", True), + "execSystemLogicalQueue": queue + if queue is not None + else getattr(job_attrs, "execSystemLogicalQueue", None), + "nodeCount": node_count + if node_count is not None + else getattr(job_attrs, "nodeCount", None), + "coresPerNode": cores_per_node + if cores_per_node is not None + else getattr(job_attrs, "coresPerNode", None), + "maxMinutes": max_minutes + if max_minutes is not None + else getattr(job_attrs, "maxMinutes", None), + "memoryMB": memory_mb + if memory_mb is not None + else getattr(job_attrs, "memoryMB", None), + **( + {"isMpi": getattr(job_attrs, "isMpi", None)} + if getattr(job_attrs, "isMpi", None) is not None + else {} + ), + **( + {"cmdPrefix": getattr(job_attrs, "cmdPrefix", None)} + if getattr(job_attrs, "cmdPrefix", None) is not None + else {} + ), + **({"tags": tags or []}), + "fileInputs": [], + "parameterSet": {"appArgs": [], "envVariables": [], "schedulerOptions": []}, + } + main_input_target_path = None + main_input_automount = True + if hasattr(job_attrs, "fileInputs") and job_attrs.fileInputs: + for fi_def in job_attrs.fileInputs: + if getattr(fi_def, "name", "").lower() == input_dir_param_name.lower(): + main_input_target_path = getattr(fi_def, "targetPath", None) + main_input_automount = getattr(fi_def, "autoMountLocal", True) + break + main_input_dict = { + "name": input_dir_param_name, + "sourceUrl": input_dir_uri, + "autoMountLocal": main_input_automount, + } + if main_input_target_path: + main_input_dict["targetPath"] = main_input_target_path + job_req["fileInputs"].append(main_input_dict) + if extra_file_inputs: + job_req["fileInputs"].extend(extra_file_inputs) + script_param_added = False + if hasattr(param_set_def, "appArgs") and param_set_def.appArgs: + for arg_def in param_set_def.appArgs: + arg_name = getattr(arg_def, "name", "") + if arg_name in script_param_names: + print( + f"Placing script '{script_filename}' in appArgs: '{arg_name}'" + ) + job_req["parameterSet"]["appArgs"].append( + {"name": arg_name, "arg": script_filename} + ) + script_param_added = True + break + if ( + not script_param_added + and hasattr(param_set_def, "envVariables") + and param_set_def.envVariables + ): + for var_def in param_set_def.envVariables: + var_key = getattr(var_def, "key", "") + if var_key in script_param_names: + print( + f"Placing script '{script_filename}' in envVariables: '{var_key}'" + ) + job_req["parameterSet"]["envVariables"].append( + {"key": var_key, "value": script_filename} + ) + script_param_added = True + break + if not script_param_added: + raise ValueError(f"Could not find where to place the script parameter...") + if extra_app_args: + job_req["parameterSet"]["appArgs"].extend(extra_app_args) + if extra_env_vars: + job_req["parameterSet"]["envVariables"].extend(extra_env_vars) + fixed_sched_opt_names = [] + if ( + hasattr(param_set_def, "schedulerOptions") + and param_set_def.schedulerOptions + ): + for sched_opt_def in param_set_def.schedulerOptions: + if getattr(sched_opt_def, "inputMode", None) == "FIXED": + fixed_sched_opt_names.append(getattr(sched_opt_def, "name", "")) + if allocation: + if allocation_param_name in fixed_sched_opt_names: + print( + f"Warning: App definition marks '{allocation_param_name}' as FIXED..." + ) + else: + print(f"Adding allocation: {allocation}") + job_req["parameterSet"]["schedulerOptions"].append( + {"name": allocation_param_name, "arg": f"-A {allocation}"} + ) + if extra_scheduler_options: + for extra_opt in extra_scheduler_options: + opt_name = extra_opt.get("name") + if opt_name and opt_name in fixed_sched_opt_names: + print( + f"Warning: Skipping user-provided scheduler option '{opt_name}'..." + ) + else: + job_req["parameterSet"]["schedulerOptions"].append(extra_opt) + if not job_req["parameterSet"]["appArgs"]: + del job_req["parameterSet"]["appArgs"] + if not job_req["parameterSet"]["envVariables"]: + del job_req["parameterSet"]["envVariables"] + if not job_req["parameterSet"]["schedulerOptions"]: + del job_req["parameterSet"]["schedulerOptions"] + if not job_req["parameterSet"]: + del job_req["parameterSet"] + final_job_req = {k: v for k, v in job_req.items() if v is not None} + print("Job request dictionary generated successfully.") + return final_job_req + except (AppDiscoveryError, ValueError) as e: + print(f"ERROR: Failed to generate job request: {e}") + raise + except Exception as e: + print(f"ERROR: Unexpected error generating job request: {e}") + raise JobSubmissionError(f"Unexpected error generating job request: {e}") from e + + +# --- submit_job_request function (Production Ready) --- +def submit_job_request( + tapis_client: Tapis, job_request: Dict[str, Any] +) -> "SubmittedJob": + """Submit a pre-generated job request dictionary to Tapis. + + Takes a complete job request dictionary (typically generated by generate_job_request) + and submits it to the Tapis jobs service for execution. Prints the job request + details before submission for debugging purposes. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + job_request (Dict[str, Any]): Complete job request dictionary containing + all necessary job parameters, file inputs, and configuration. + + Returns: + SubmittedJob: A SubmittedJob object for monitoring and managing the submitted job. + + Raises: + ValueError: If job_request is not a dictionary. + JobSubmissionError: If the Tapis job submission fails, with additional context + from the HTTP request and response when available. + + Example: + >>> job_request = generate_job_request(...) + >>> submitted_job = submit_job_request(client, job_request) + + --- Submitting Tapis Job Request --- + { + "name": "matlab-r2023a-20231201_143022", + "appId": "matlab-r2023a", + ... + } + ------------------------------------ + Job submitted successfully. UUID: 12345678-1234-1234-1234-123456789abc + """ + if not isinstance(job_request, dict): + raise ValueError("Input 'job_request' must be a dictionary.") + print("\n--- Submitting Tapis Job Request ---") + print(json.dumps(job_request, indent=2, default=str)) + print("------------------------------------") + try: + submitted = tapis_client.jobs.submitJob(**job_request) + print(f"Job submitted successfully. UUID: {submitted.uuid}") + return SubmittedJob(tapis_client, submitted.uuid) + except BaseTapyException as e: + print(f"ERROR: Tapis job submission API call failed: {e}") + raise JobSubmissionError( + f"Tapis job submission failed: {e}", + request=getattr(e, "request", None), + response=getattr(e, "response", None), + ) from e + except Exception as e: + print(f"ERROR: Unexpected error during job submission: {e}") + raise JobSubmissionError(f"Unexpected error during job submission: {e}") from e + + +# --- SubmittedJob Class (Production Ready) --- +class SubmittedJob: + """Represents a submitted Tapis job with methods for monitoring and management. + + This class provides a high-level interface for interacting with Tapis jobs, + including status monitoring, output retrieval, job cancellation, and runtime + analysis. It caches job details and status to minimize API calls. + + Attributes: + uuid (str): The unique identifier of the Tapis job. + TERMINAL_STATES (List[str]): List of job states that indicate completion. + + Example: + >>> job = SubmittedJob(client, "12345678-1234-1234-1234-123456789abc") + >>> status = job.status + >>> if status in job.TERMINAL_STATES: + ... print("Job completed") + >>> final_status = job.monitor(timeout_minutes=60) + """ + + TERMINAL_STATES = TAPIS_TERMINAL_STATES # Use module-level constant + + def __init__(self, tapis_client: Tapis, job_uuid: str): + """Initialize a SubmittedJob instance for an existing Tapis job. + + Args: + tapis_client (Tapis): Authenticated Tapis client instance. + job_uuid (str): The UUID of an existing Tapis job. + + Raises: + TypeError: If tapis_client is not a Tapis instance. + ValueError: If job_uuid is empty or not a string. + """ + if not isinstance(tapis_client, Tapis): + raise TypeError("tapis_client must be an instance of tapipy.Tapis") + if not job_uuid or not isinstance(job_uuid, str): + raise ValueError("job_uuid must be a non-empty string.") + self._tapis = tapis_client + self.uuid = job_uuid + self._last_status: Optional[str] = None + self._job_details: Optional[Tapis] = None + + def _get_details(self, force_refresh: bool = False) -> Tapis: + """Fetch and cache job details from Tapis. + + Args: + force_refresh (bool, optional): If True, forces a fresh API call + even if details are already cached. Defaults to False. + + Returns: + Tapis: Complete job details object from Tapis API. + + Raises: + JobMonitorError: If job details cannot be retrieved from Tapis. + """ + if not self._job_details or force_refresh: + try: + self._job_details = self._tapis.jobs.getJob(jobUuid=self.uuid) + self._last_status = self._job_details.status + except BaseTapyException as e: + raise JobMonitorError( + f"Failed to get details for job {self.uuid}: {e}" + ) from e + return self._job_details + + @property + def details(self) -> Tapis: + """Get cached job details, fetching from Tapis if not already cached. + + Returns: + Tapis: Complete job details object containing all job metadata, + configuration, and current state information. + """ + return self._get_details() + + @property + def status(self) -> str: + """Get the current job status, using cached value when appropriate. + + For terminal states, returns the cached status without making an API call. + For non-terminal states, may fetch fresh status depending on cache state. + + Returns: + str: Current job status (e.g., "QUEUED", "RUNNING", "FINISHED", "FAILED"). + Returns STATUS_UNKNOWN if status cannot be determined. + """ + try: + if self._last_status and self._last_status not in self.TERMINAL_STATES: + return self.get_status(force_refresh=False) + elif self._last_status: + return self._last_status + else: + return self.get_status(force_refresh=True) + except JobMonitorError: + return STATUS_UNKNOWN + + def get_status(self, force_refresh: bool = True) -> str: + """Get the current job status from Tapis API. + + Args: + force_refresh (bool, optional): If True, always makes a fresh API call. + If False, may return cached status. Defaults to True. + + Returns: + str: Current job status from Tapis API. + + Raises: + JobMonitorError: If status cannot be retrieved from Tapis. + """ + if not force_refresh and self._last_status: + return self._last_status + try: + status_obj = self._tapis.jobs.getJobStatus(jobUuid=self.uuid) + new_status = status_obj.status + if new_status != self._last_status: + self._last_status = new_status + if self._job_details and self._job_details.status != self._last_status: + self._job_details = None + return self._last_status + except BaseTapyException as e: + raise JobMonitorError( + f"Failed to get status for job {self.uuid}: {e}" + ) from e + + @property + def last_message(self) -> Optional[str]: + """Get the last status message recorded for the job. + + Retrieves the most recent status message from the job details, which + typically contains information about the current job state or any + errors that have occurred. + + Returns: + str or None: The last status message if available and non-empty, + otherwise None. Empty strings are treated as None. + + Note: + Returns None if job details cannot be retrieved or if no message + is available. Does not raise exceptions for retrieval failures. + """ + try: + details = self.details # Ensures job details are loaded + message = getattr(details, "lastMessage", None) + if message: + # Sometimes messages might be empty strings, treat as None for consistency + return str(message).strip() if str(message).strip() else None + return None + except JobMonitorError as e: + print( + f"Could not retrieve job details to get last_message for job {self.uuid}: {e}" + ) + return None + except Exception as e: + print( + f"An unexpected error occurred while fetching last_message for job {self.uuid}: {e}" + ) + return None + + def monitor(self, interval: int = 15, timeout_minutes: Optional[int] = None) -> str: + """Monitor job status with progress bars until completion or timeout. + + Continuously monitors the job status using tqdm progress bars to show + progress through different job phases (waiting, running). Handles + interruptions and errors gracefully. + + Args: + interval (int, optional): Status check interval in seconds. Defaults to 15. + timeout_minutes (int, optional): Maximum monitoring time in minutes. + If None, uses the job's maxMinutes from its configuration. + Use -1 or 0 for unlimited monitoring. Defaults to None. + + Returns: + str: Final job status. Can be a standard Tapis status ("FINISHED", "FAILED", + etc.) or a special monitoring status: + - STATUS_TIMEOUT: Monitoring timed out + - STATUS_INTERRUPTED: User interrupted monitoring (Ctrl+C) + - STATUS_MONITOR_ERROR: Error occurred during monitoring + + Example: + >>> job = SubmittedJob(client, job_uuid) + >>> final_status = job.monitor(interval=30, timeout_minutes=120) + Monitoring Job: 12345678-1234-1234-1234-123456789abc + Waiting for job to start: 100%|████████| 12 checks + Monitoring job: 100%|████████████| 45/45 checks + Status: FINISHED + >>> if final_status == "FINISHED": + ... print("Job completed successfully!") + """ + previous_status = None + current_status = STATUS_UNKNOWN + start_time = time.time() + effective_timeout_minutes = -1 + timeout_seconds = float("inf") + max_iterations = float("inf") + pbar_waiting = None + pbar_monitoring = None + + print(f"\nMonitoring Job: {self.uuid}") # Print Job ID once at the start + + try: + # Fetch initial details + details = self._get_details(force_refresh=True) + current_status = details.status + previous_status = current_status + effective_timeout_minutes = ( + timeout_minutes if timeout_minutes is not None else details.maxMinutes + ) + + if effective_timeout_minutes <= 0: + print( + f"Job has maxMinutes <= 0 ({details.maxMinutes}). Monitoring indefinitely or until terminal state." + ) + timeout_seconds = float("inf") + max_iterations = float("inf") + else: + timeout_seconds = effective_timeout_minutes * 60 + max_iterations = ( + int(timeout_seconds // interval) if interval > 0 else float("inf") + ) + + waiting_states = [ + "PENDING", + "PROCESSING_INPUTS", + "STAGING_INPUTS", + "STAGING_JOB", + "SUBMITTING_JOB", + "QUEUED", + ] + running_states = [ + "RUNNING", + "ARCHIVING", + ] # Treat ARCHIVING as part of the active monitoring phase + + # --- Waiting Phase --- + if current_status in waiting_states: + pbar_waiting = tqdm( + desc="Waiting for job to start", + dynamic_ncols=True, + unit=" checks", + leave=False, + ) # leave=False hides bar on completion + while current_status in waiting_states: + pbar_waiting.set_postfix_str( + f"Status: {current_status}", refresh=True + ) + time.sleep(interval) + current_status = self.get_status(force_refresh=True) + pbar_waiting.update(1) + if time.time() - start_time > timeout_seconds: + tqdm.write( + f"\nWarning: Monitoring timeout ({effective_timeout_minutes} mins) reached while waiting." + ) + return STATUS_TIMEOUT + if current_status in self.TERMINAL_STATES: + pbar_waiting.set_postfix_str( + f"Status: {current_status}", refresh=True + ) + tqdm.write( + f"\nJob reached terminal state while waiting: {current_status}" + ) + return current_status # Return actual terminal status + pbar_waiting.close() + pbar_waiting = None + + # --- Monitoring Phase --- + if current_status in running_states: + total_iterations = ( + max_iterations if max_iterations != float("inf") else None + ) + pbar_monitoring = tqdm( + total=total_iterations, + desc="Monitoring job", + ncols=100, + unit=" checks", + leave=True, + ) # leave=True keeps bar after completion + iteration_count = 0 + # Initial status print for this phase + tqdm.write(f"\tStatus: {current_status}") + previous_status = current_status + + while current_status in running_states: + # Update description only if status changes within this phase (less noisy) + if current_status != previous_status: + pbar_monitoring.set_description( + f"Monitoring job (Status: {current_status})" + ) + tqdm.write(f"\tStatus: {current_status}") + previous_status = current_status + + pbar_monitoring.update(1) + iteration_count += 1 + + if ( + max_iterations != float("inf") + and iteration_count >= max_iterations + ): + tqdm.write( + f"\nWarning: Monitoring timeout ({effective_timeout_minutes} mins) reached." + ) + return STATUS_TIMEOUT + + time.sleep(interval) + current_status = self.get_status(force_refresh=True) + + if current_status in self.TERMINAL_STATES: + tqdm.write(f"\tStatus: {current_status}") # Write final status + if total_iterations: + pbar_monitoring.n = total_iterations + pbar_monitoring.refresh() + return current_status # Return actual terminal status + pbar_monitoring.close() + pbar_monitoring = None + + # --- Handle Other Cases --- + elif current_status in self.TERMINAL_STATES: + print(f"Job already in terminal state: {current_status}") + return current_status + else: + print( + f"Job in unexpected initial state '{current_status}'. Monitoring stopped." + ) + return current_status + + return current_status # Should be a terminal state if loops finished + + except KeyboardInterrupt: + print(f"\nMonitoring interrupted by user.") + return STATUS_INTERRUPTED + except JobMonitorError as e: + print(f"\nError during monitoring: {e}") + return STATUS_MONITOR_ERROR + except Exception as e: + print(f"\nUnexpected error during monitoring: {e}") + return STATUS_MONITOR_ERROR + finally: + # Safely close progress bars + if pbar_waiting is not None: + try: + pbar_waiting.close() + except: + pass + if pbar_monitoring is not None: + try: + pbar_monitoring.close() + except: + pass + + def print_runtime_summary(self, verbose: bool = False): + """Print a summary of job runtime phases and total execution time. + + Analyzes the job's execution history to show time spent in different + phases (queued, running) and calculates the total runtime from submission + to completion. + + Args: + verbose (bool, optional): If True, prints detailed job history events + in addition to the runtime summary. Defaults to False. + + Example: + >>> job.print_runtime_summary() + + Runtime Summary + --------------- + QUEUED time: 00:05:30 + RUNNING time: 01:23:45 + TOTAL time: 01:29:15 + --------------- + + >>> job.print_runtime_summary(verbose=True) + + Detailed Job History: + Event: JOB_NEW_STATUS, Detail: PENDING, Time: 2023-12-01T14:30:22.123456Z + Event: JOB_NEW_STATUS, Detail: QUEUED, Time: 2023-12-01T14:30:25.234567Z + ... + + Summary: + QUEUED time: 00:05:30 + RUNNING time: 01:23:45 + TOTAL time: 01:29:15 + --------------- + """ + from datetime import datetime + + t = self._tapis + + print("\nRuntime Summary") + print("---------------") + hist = t.jobs.getJobHistory(jobUuid=self.uuid) + + def format_timedelta(td): + hours, remainder = divmod(td.total_seconds(), 3600) + minutes, seconds = divmod(remainder, 60) + return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}" + + time1 = datetime.strptime(hist[-1].created, "%Y-%m-%dT%H:%M:%S.%fZ") + time0 = datetime.strptime(hist[0].created, "%Y-%m-%dT%H:%M:%S.%fZ") + total_time = time1 - time0 + + if verbose: + print("\nDetailed Job History:") + for event in hist: + print( + f"Event: {event.event}, Detail: {event.eventDetail}, Time: {event.created}" + ) + print("\nSummary:") + + for i in range(len(hist) - 1): + if hist[i].eventDetail == "RUNNING": + time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") + time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") + print("RUNNING time:", format_timedelta(time1 - time0)) + elif hist[i].eventDetail == "QUEUED": + time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") + time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") + print("QUEUED time:", format_timedelta(time1 - time0)) + + print("TOTAL time:", format_timedelta(total_time)) + print("---------------") + + # --- Other SubmittedJob methods (archive_uri, list_outputs, etc.) --- + # (No changes needed in these methods from the previous correct version) + @property + def archive_uri(self) -> Optional[str]: + """Get the Tapis URI of the job's archive directory. + + Returns the URI where job outputs are stored after completion. + The archive directory contains all job outputs, logs, and metadata. + + Returns: + str or None: Tapis URI of the archive directory if available, + otherwise None if archive information is not set. + + Example: + >>> uri = job.archive_uri + >>> if uri: + ... print(f"Job outputs at: {uri}") + ... files = client.files.list(uri) + """ + details = self._get_details() + if details.archiveSystemId and details.archiveSystemDir: + archive_path = details.archiveSystemDir.lstrip("/") + return ( + f"tapis://{details.archiveSystemId}/{urllib.parse.quote(archive_path)}" + ) + return None + + def list_outputs( + self, path: str = "/", limit: int = 100, offset: int = 0 + ) -> List[Tapis]: + """List files and directories in the job's archive directory. + + Args: + path (str, optional): Relative path within the job archive to list. + Defaults to "/" (archive root). + limit (int, optional): Maximum number of items to return. Defaults to 100. + offset (int, optional): Number of items to skip for pagination. Defaults to 0. + + Returns: + List[Tapis]: List of file and directory objects in the specified path. + + Raises: + FileOperationError: If archive information is not available, the path + cannot be accessed, or listing fails. + + Example: + >>> outputs = job.list_outputs() + >>> for item in outputs: + ... print(f"{item.name} ({item.type})") + tapisjob.out (file) + tapisjob.err (file) + results/ (dir) + + >>> results = job.list_outputs(path="results/") + """ + details = self._get_details() + if not details.archiveSystemId or not details.archiveSystemDir: + raise FileOperationError( + f"Job {self.uuid} archive system ID or directory not available." + ) + full_archive_path = os.path.join(details.archiveSystemDir, path.lstrip("/")) + full_archive_path = os.path.normpath(full_archive_path).lstrip("/") + try: + archive_base_uri = f"tapis://{details.archiveSystemId}/{urllib.parse.quote(full_archive_path)}" + from .files import list_files + + return list_files(self._tapis, archive_base_uri, limit=limit, offset=offset) + except BaseTapyException as e: + raise FileOperationError( + f"Failed list job outputs for {self.uuid} at path '{path}': {e}" + ) from e + except Exception as e: + raise FileOperationError( + f"Unexpected error listing job outputs for {self.uuid}: {e}" + ) from e + + def download_output(self, remote_path: str, local_target: str): + """Download a specific file from the job's archive directory. + + Args: + remote_path (str): Relative path to the file within the job archive. + local_target (str): Local filesystem path where the file should be saved. + + Raises: + FileOperationError: If archive information is not available or download fails. + + Example: + >>> job.download_output("tapisjob.out", "/local/job_output.txt") + >>> job.download_output("results/data.txt", "/local/results/data.txt") + """ + details = self._get_details() + if not details.archiveSystemId or not details.archiveSystemDir: + raise FileOperationError( + f"Job {self.uuid} archive system ID or directory not available." + ) + full_archive_path = os.path.join( + details.archiveSystemDir, remote_path.lstrip("/") + ) + full_archive_path = os.path.normpath(full_archive_path).lstrip("/") + remote_uri = ( + f"tapis://{details.archiveSystemId}/{urllib.parse.quote(full_archive_path)}" + ) + try: + from .files import download_file + + download_file(self._tapis, remote_uri, local_target) + except Exception as e: + raise FileOperationError( + f"Failed to download output '{remote_path}' for job {self.uuid}: {e}" + ) from e + + def get_output_content( + self, + output_filename: str, + max_lines: Optional[int] = None, + missing_ok: bool = True, + ) -> Optional[str]: + """Retrieve the content of a specific output file from the job's archive. + + Fetches and returns the content of a file from the job's archive directory + as a string. Useful for examining log files, output files, and error files. + + Args: + output_filename (str): Name of the file in the job's archive root + (e.g., "tapisjob.out", "tapisjob.err", "results.txt"). + max_lines (int, optional): If specified, returns only the last N lines + of the file. Useful for large log files. Defaults to None (full file). + missing_ok (bool, optional): If True and the file is not found, returns None. + If False and not found, raises FileOperationError. Defaults to True. + + Returns: + str or None: Content of the file as a string, or None if the file + is not found and missing_ok=True. + + Raises: + FileOperationError: If the job archive is not available, the file is not + found (and missing_ok=False), or if there's an error fetching the file. + + Example: + >>> # Get job output log + >>> output = job.get_output_content("tapisjob.out") + >>> if output: + ... print(output) + + >>> # Get last 50 lines of error log + >>> errors = job.get_output_content("tapisjob.err", max_lines=50) + + >>> # Require file to exist (raise error if missing) + >>> results = job.get_output_content("results.txt", missing_ok=False) + """ + print(f"Attempting to fetch content of '{output_filename}' from job archive...") + details = self._get_details() # Ensure details are loaded + if not details.archiveSystemId or not details.archiveSystemDir: + raise FileOperationError( + f"Job {self.uuid} archive system ID or directory not available. Cannot fetch output." + ) + + full_archive_path = os.path.join( + details.archiveSystemDir, output_filename.lstrip("/") + ) + full_archive_path = os.path.normpath(full_archive_path).lstrip("/") + + try: + # self._tapis.files.getContents() is expected to return the full file content as bytes + # when the response is not JSON. The stream=True parameter is for the API endpoint. + content_bytes = self._tapis.files.getContents( + systemId=details.archiveSystemId, + path=full_archive_path, + stream=True, # Good to keep, as it's a hint for the server + ) + + # Verify that we indeed received bytes + if not isinstance(content_bytes, bytes): + raise FileOperationError( + f"Tapis API returned unexpected type for file content of '{output_filename}': {type(content_bytes)}. Expected bytes." + ) + + content_str = content_bytes.decode( + "utf-8", errors="replace" + ) # Decode to string + + if max_lines is not None and max_lines > 0: + lines = content_str.splitlines() + if len(lines) > max_lines: + # Slice to get the last max_lines + content_str = "\n".join(lines[-max_lines:]) + print(f"Returning last {max_lines} lines of '{output_filename}'.") + else: + print( + f"File '{output_filename}' has {len(lines)} lines (less than/equal to max_lines={max_lines}). Returning full content." + ) + else: + print(f"Returning full content of '{output_filename}'.") + return content_str + + except BaseTapyException as e: + if hasattr(e, "response") and e.response and e.response.status_code == 404: + if missing_ok: + print( + f"Output file '{output_filename}' not found in archive (missing_ok=True). Path: {details.archiveSystemId}/{full_archive_path}" + ) + return None + else: + raise FileOperationError( + f"Output file '{output_filename}' not found in job archive " + f"at system '{details.archiveSystemId}', path '{full_archive_path}'." + ) from e + else: + raise FileOperationError( + f"Tapis error fetching output file '{output_filename}' for job {self.uuid} (Path: {details.archiveSystemId}/{full_archive_path}): {e}" + ) from e + except FileOperationError: # Re-raise FileOperationErrors from above + raise + except Exception as e: # Catch other unexpected errors + raise FileOperationError( + f"Unexpected error fetching content of '{output_filename}' for job {self.uuid} (Path: {details.archiveSystemId}/{full_archive_path}): {e}" + ) from e + + def cancel(self): + """Attempt to cancel the job execution. + + Sends a cancellation request to Tapis. Note that cancellation may not + be immediate and depends on the job's current state and the execution system. + + Raises: + JobMonitorError: If the cancellation request fails or encounters an error. + + Note: + Jobs that are already in terminal states cannot be cancelled. + The method will print the current status if cancellation is not possible. + + Example: + >>> job.cancel() + Attempting to cancel job 12345678-1234-1234-1234-123456789abc... + Cancel request sent for job 12345678-1234-1234-1234-123456789abc. Status may take time to update. + """ + print(f"Attempting to cancel job {self.uuid}...") + try: + self._tapis.jobs.cancelJob(jobUuid=self.uuid) + print( + f"Cancel request sent for job {self.uuid}. Status may take time to update." + ) + self._last_status = "CANCELLED" + self._job_details = None + except BaseTapyException as e: + if hasattr(e, "response") and e.response and e.response.status_code == 400: + print( + f"Could not cancel job {self.uuid}. It might already be in a terminal state. Fetching status..." + ) + self.get_status(force_refresh=True) + print(f"Current status: {self.status}") + else: + raise JobMonitorError( + f"Failed to send cancel request for job {self.uuid}: {e}" + ) from e + except Exception as e: + raise JobMonitorError( + f"Unexpected error cancelling job {self.uuid}: {e}" + ) from e + + +# --- Standalone Helper Functions (Production Ready) --- +def get_job_status(t: Tapis, job_uuid: str) -> str: + """Get the current status of a job by UUID. + + Standalone convenience function that creates a temporary SubmittedJob instance + to retrieve the current status of an existing job. + + Args: + t (Tapis): Authenticated Tapis client instance. + job_uuid (str): The UUID of the job to check. + + Returns: + str: Current job status (e.g., "QUEUED", "RUNNING", "FINISHED", "FAILED"). + + Raises: + JobMonitorError: If status retrieval fails. + TypeError: If t is not a Tapis instance. + ValueError: If job_uuid is empty or invalid. + + Example: + >>> status = get_job_status(client, "12345678-1234-1234-1234-123456789abc") + >>> print(f"Job status: {status}") + """ + job = SubmittedJob(t, job_uuid) + return job.get_status(force_refresh=True) + + +def get_runtime_summary(t: Tapis, job_uuid: str, verbose: bool = False): + """Print a runtime summary for a job by UUID. + + Standalone convenience function that creates a temporary SubmittedJob instance + to analyze and print the runtime summary of an existing job. + + Args: + t (Tapis): Authenticated Tapis client instance. + job_uuid (str): The UUID of the job to analyze. + verbose (bool, optional): If True, prints detailed job history events + in addition to the runtime summary. Defaults to False. + + Raises: + JobMonitorError: If job details cannot be retrieved. + TypeError: If t is not a Tapis instance. + ValueError: If job_uuid is empty or invalid. + + Example: + >>> get_runtime_summary(client, "12345678-1234-1234-1234-123456789abc") + + Runtime Summary + --------------- + QUEUED time: 00:05:30 + RUNNING time: 01:23:45 + TOTAL time: 01:29:15 + --------------- + """ + job = SubmittedJob(t, job_uuid) + job.print_runtime_summary(verbose=verbose) + + +def interpret_job_status(final_status: str, job_uuid: Optional[str] = None): + """Print a user-friendly interpretation of a job status. + + Provides human-readable explanations for various job status values, + including both standard Tapis states and special monitoring states. + + Args: + final_status (str): The job status to interpret. Can be a standard Tapis + status ("FINISHED", "FAILED", etc.) or a special monitoring status + (STATUS_TIMEOUT, STATUS_INTERRUPTED, etc.). + job_uuid (str, optional): The job UUID to include in the message for context. + If None, uses generic "Job" in the message. Defaults to None. + + Example: + >>> interpret_job_status("FINISHED", "12345678-1234-1234-1234-123456789abc") + Job 12345678-1234-1234-1234-123456789abc completed successfully. + + >>> interpret_job_status("FAILED") + Job failed. Check logs or job details. + + >>> interpret_job_status(STATUS_TIMEOUT, "12345678-1234-1234-1234-123456789abc") + Job 12345678-1234-1234-1234-123456789abc monitoring timed out. + """ + job_id_str = f"Job {job_uuid}" if job_uuid else "Job" + if final_status == "FINISHED": + print(f"{job_id_str} completed successfully.") + elif final_status == "FAILED": + print(f"{job_id_str} failed. Check logs or job details.") + elif final_status == STATUS_TIMEOUT: + print(f"{job_id_str} monitoring timed out.") + elif final_status == STATUS_INTERRUPTED: + print(f"{job_id_str} monitoring was interrupted.") + elif final_status == STATUS_MONITOR_ERROR: + print(f"An error occurred while monitoring {job_id_str}.") + elif final_status == STATUS_UNKNOWN: + print(f"Could not determine final status of {job_id_str}.") + elif final_status in TAPIS_TERMINAL_STATES: + print(f"{job_id_str} ended with status: {final_status}") + else: + print(f"{job_id_str} ended with an unexpected status: {final_status}") diff --git a/dapi/jobs/__init__.py b/dapi/jobs/__init__.py deleted file mode 100644 index 1564ff0..0000000 --- a/dapi/jobs/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -`dapi` job submodule simplifies the process of submitting, running, and monitoring [Tapis v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org). - - -## Features - -* Simplified TAPIS v3 Calls: No need to fiddle with complex API requests. `dapi` abstracts away the complexities. - -* Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment. - -# Installation - -```shell -pip3 install dapi -``` - -""" -from .dir import get_ds_path_uri -from .jobs import get_status, runtime_summary, generate_job_info diff --git a/dapi/jobs/dir.py b/dapi/jobs/dir.py deleted file mode 100644 index c0f3627..0000000 --- a/dapi/jobs/dir.py +++ /dev/null @@ -1,54 +0,0 @@ -import os -from tapipy.tapis import Tapis - - -def get_ds_path_uri(t: Tapis, path: str) -> str: - """ - Given a path on DesignSafe, determine the correct input URI for Tapis v3. - - Args: - t (Tapis): Tapis object to fetch profiles or metadata. - path (str): The directory path. - - Returns: - str: The corresponding input URI. - - Raises: - ValueError: If no matching directory pattern is found. - """ - # If any of the following directory patterns are found in the path, - # process them accordingly. - directory_patterns = [ - ("jupyter/MyData", "designsafe.storage.default", True), - ("jupyter/mydata", "designsafe.storage.default", True), - ("jupyter/CommunityData", "designsafe.storage.community", False), - ("/MyData", "designsafe.storage.default", True), - ("/mydata", "designsafe.storage.default", True), - ] - - for pattern, storage, use_username in directory_patterns: - if pattern in path: - path = path.split(pattern, 1)[1].lstrip("/") - input_dir = f"{t.username}/{path}" if use_username else path - input_uri = f"tapis://{storage}/{input_dir}" - return input_uri.replace(" ", "%20") - - project_patterns = [ - ("jupyter/MyProjects", "project-"), - ("jupyter/projects", "project-"), - ] - - for pattern, prefix in project_patterns: - if pattern in path: - path = path.split(pattern, 1)[1].lstrip("/") - project_id, *rest = path.split("/", 1) - path = rest[0] if rest else "" - - # Using Tapis v3 to get project UUID - resp = t.get(f"https://designsafe-ci.org/api/projects/v2/{project_id}") - project_uuid = resp.json()["baseProject"]["uuid"] - - input_uri = f"tapis://{prefix}{project_uuid}/{path}" - return input_uri.replace(" ", "%20") - - raise ValueError(f"No matching directory pattern found for: {path}") diff --git a/dapi/jobs/jobs.py b/dapi/jobs/jobs.py deleted file mode 100644 index 3b51c12..0000000 --- a/dapi/jobs/jobs.py +++ /dev/null @@ -1,183 +0,0 @@ -import time -from datetime import datetime, timedelta, timezone -from tqdm import tqdm -import logging -import json -from typing import Dict, Any, Optional - -# Configuring the logging system -# logging.basicConfig( -# level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" -# ) - - -def generate_job_info( - t: Any, # Tapis client - app_name: str, - input_uri: str, - input_file: str, - job_name: str = None, - max_minutes: Optional[int] = None, - node_count: Optional[int] = None, - cores_per_node: Optional[int] = None, - queue: Optional[str] = None, - allocation: Optional[str] = None, -) -> Dict[str, Any]: - """ - Generates a job info dictionary based on the provided application name, job name, input URI, input file, and optional allocation. - - Args: - t (object): The Tapis API client object. - app_name (str): The name of the application to use for the job. - input_uri (str): The URI of the input data for the job. - input_file (str): The local file path to the input data for the job. - job_name (str, optional): The name of the job to be created. Defaults to None. - max_minutes (int, optional): The maximum number of minutes the job can run. Defaults to None. - node_count (int, optional): The number of nodes to use for the job. Defaults to None. - cores_per_node (int, optional): The number of cores per node for the job. Defaults to None. - queue (str, optional): The queue to use for the job. Defaults to None. - allocation (str, optional): The allocation to use for the job. Defaults to None. - - Returns: - dict: The job info dictionary. - """ - - # Fetch the latest app information - app_info = t.apps.getAppLatestVersion(appId=app_name) - - # If job_name is not provided, use the app name and date - if not job_name: - job_name = f"{app_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}" - - # Create the base job info - job_info = { - "name": job_name, - "appId": app_info.id, - "appVersion": app_info.version, - "execSystemId": app_info.jobAttributes.execSystemId, - "maxMinutes": max_minutes or app_info.jobAttributes.maxMinutes, - "archiveOnAppError": app_info.jobAttributes.archiveOnAppError, - "fileInputs": [{"name": "Input Directory", "sourceUrl": input_uri}], - "execSystemLogicalQueue": queue - or app_info.jobAttributes.execSystemLogicalQueue, - "nodeCount": node_count or 1, # Default to 1 if not specified - "coresPerNode": cores_per_node or 1, # Default to 1 if not specified - } - - # Handle input file based on app name - if "opensees" in app_name.lower(): - job_info["parameterSet"] = { - "envVariables": [{"key": "tclScript", "value": input_file}] - } - else: - job_info["parameterSet"] = { - "appArgs": [{"name": "Input Script", "arg": input_file}] - } - - # Add TACC allocation if provided - if allocation: - if "schedulerOptions" not in job_info["parameterSet"]: - job_info["parameterSet"]["schedulerOptions"] = [] - job_info["parameterSet"]["schedulerOptions"].append( - {"name": "TACC Allocation", "arg": f"-A {allocation}"} - ) - - return job_info - - -def get_status(t, mjobUuid, tlapse=15): - """ - Retrieves and monitors the status of a job using Tapis API. - This function waits for the job to start, then monitors it for up to maxMinutes. - - Args: - t (object): The Tapis API client object. - mjobUuid (str): The unique identifier of the job to monitor. - tlapse (int, optional): Time interval, in seconds, to wait between status checks. Defaults to 15 seconds. - - Returns: - str: The final status of the job (FINISHED, FAILED, or STOPPED). - """ - previous_status = None - # Initially check if the job is already running - status = t.jobs.getJobStatus(jobUuid=mjobUuid).status - max_minutes = t.jobs.getJob(jobUuid=mjobUuid).maxMinutes - - # Using tqdm to provide visual feedback while waiting for job to start - with tqdm(desc="Waiting for job to start", dynamic_ncols=True) as pbar: - while status not in ["RUNNING", "FINISHED", "FAILED", "STOPPED"]: - time.sleep(tlapse) - status = t.jobs.getJobStatus(jobUuid=mjobUuid).status - pbar.update(1) - pbar.set_postfix_str(f"Status: {status}") - - # Once the job is running, monitor it for up to maxMinutes - max_iterations = int(max_minutes * 60 // tlapse) - - # Using tqdm for progress bar - for _ in tqdm(range(max_iterations), desc="Monitoring job", ncols=100): - status = t.jobs.getJobStatus(jobUuid=mjobUuid).status - - # Print status if it has changed - if status != previous_status: - tqdm.write(f"\tStatus: {status}") - previous_status = status - - # Break the loop if job reaches one of these statuses - if status in ["FINISHED", "FAILED", "STOPPED"]: - break - - time.sleep(tlapse) - else: - # This block will execute if the for loop completes without a 'break' - logging.warning( - f"Warning: Maximum monitoring time of {max_minutes} minutes reached!" - ) - - return status - - -def runtime_summary(t, job_uuid, verbose=False): - """Get the runtime of a job. - Args: - t (object): The Tapis v3 client object. - job_uuid (str): The UUID of the job for which the runtime needs to be determined. - verbose (bool): If True, prints all history events. Otherwise, prints only specific statuses. - Returns: - None: This function doesn't return a value, but it prints the runtime details. - """ - from datetime import datetime, timedelta - - print("\nRuntime Summary") - print("---------------") - hist = t.jobs.getJobHistory(jobUuid=job_uuid) - - def format_timedelta(td): - hours, remainder = divmod(td.total_seconds(), 3600) - minutes, seconds = divmod(remainder, 60) - return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}" - - time1 = datetime.strptime(hist[-1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[0].created, "%Y-%m-%dT%H:%M:%S.%fZ") - total_time = time1 - time0 - - if verbose: - print("\nDetailed Job History:") - for event in hist: - print( - f"Event: {event.event}, Detail: {event.eventDetail}, Time: {event.created}" - ) - print("\nSummary:") - - for i in range(len(hist) - 1): - if hist[i].eventDetail == "RUNNING": - time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") - print("RUNNING time:", format_timedelta(time1 - time0)) - elif hist[i].eventDetail == "QUEUED": - time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") - print("QUEUED time:", format_timedelta(time1 - time0)) - - print("TOTAL time:", format_timedelta(total_time)) - print("---------------") diff --git a/dapi/systems.py b/dapi/systems.py new file mode 100644 index 0000000..c406485 --- /dev/null +++ b/dapi/systems.py @@ -0,0 +1,97 @@ +# dapi/systems.py +from tapipy.tapis import Tapis +from tapipy.errors import BaseTapyException +from typing import List, Any, Optional +from .exceptions import SystemInfoError + + +def list_system_queues(t: Tapis, system_id: str, verbose: bool = True) -> List[Any]: + """ + Retrieves the list of batch logical queues available on a specific Tapis execution system. + + Args: + t: Authenticated Tapis client instance. + system_id: The ID of the execution system (e.g., 'frontera', 'stampede2'). + verbose: If True, prints the found queues. + + Returns: + A list of queue objects (typically TapisResult instances or similar dict-like structures) + defined for the system. Returns an empty list if the system exists but has no queues defined. + + Raises: + SystemInfoError: If the system is not found or an API error occurs. + """ + if not system_id: + raise ValueError("system_id cannot be empty.") + + try: + if verbose: + print(f"\nFetching queue information for system '{system_id}'...") + + # Get system details - Fetch the full object to ensure queues are included + # Removed 'select' parameter for simplicity and robustness against API variations + system_details = t.systems.getSystem(systemId=system_id) + + # Use 'batchLogicalQueues' based on the direct API call result + queues = getattr(system_details, "batchLogicalQueues", []) + + if not queues: + # Check if the system itself was found but just has no queues + try: + # Minimal check to confirm system existence if queues list was empty + # This might be slightly redundant if getSystem above succeeded, but safe. + t.systems.getSystem(systemId=system_id, select="id") + if verbose: + # Updated message + print( + f"System '{system_id}' found, but it has no batch logical queues defined." + ) + return [] # Return empty list as system exists but has no queues + except BaseTapyException as e_check: + # If this minimal check fails with 404, the system wasn't found initially + if ( + hasattr(e_check, "response") + and e_check.response + and e_check.response.status_code == 404 + ): + raise SystemInfoError( + f"Execution system '{system_id}' not found." + ) from e_check + else: # Other error during the existence check + raise SystemInfoError( + f"Error confirming existence of system '{system_id}': {e_check}" + ) from e_check + + if verbose: + # Updated message + print(f"Found {len(queues)} batch logical queues for system '{system_id}':") + for q in queues: + name = getattr(q, "name", "N/A") + hpc_queue = getattr( + q, "hpcQueueName", "N/A" + ) # Actual scheduler queue name + max_jobs = getattr(q, "maxJobs", "N/A") + max_user_jobs = getattr(q, "maxUserJobs", "N/A") + max_mins = getattr(q, "maxMinutes", "N/A") + max_nodes = getattr(q, "maxNodeCount", "N/A") + # Add more attributes if desired (e.g., maxMemoryMB, maxCoresPerNode) + print( + f" - Name: {name} (HPC Queue: {hpc_queue}, Max Jobs: {max_jobs}, Max User Jobs: {max_user_jobs}, Max Mins: {max_mins}, Max Nodes: {max_nodes})" + ) + + print() + + # The items in the list are TapisResult objects themselves + return queues + + except BaseTapyException as e: + if hasattr(e, "response") and e.response and e.response.status_code == 404: + raise SystemInfoError(f"Execution system '{system_id}' not found.") from e + else: + raise SystemInfoError( + f"Failed to retrieve queues for system '{system_id}': {e}" + ) from e + except Exception as e: + raise SystemInfoError( + f"An unexpected error occurred while fetching queues for system '{system_id}': {e}" + ) from e diff --git a/docs/authentication.md b/docs/authentication.md new file mode 100644 index 0000000..dc18277 --- /dev/null +++ b/docs/authentication.md @@ -0,0 +1,317 @@ +# Authentication + +This guide explains how to authenticate with DesignSafe using the dapi library. Authentication is required to access DesignSafe resources and submit jobs. + +## 🔐 Overview + +dapi uses your DesignSafe credentials to authenticate with the TAPIS v3 API. The library supports multiple methods for providing credentials, following a secure credential resolution hierarchy. + +## 🏆 Credential Resolution Hierarchy + +dapi looks for credentials in the following order: + +1. **Explicit parameters** passed to `DSClient()` +2. **Environment variables** (`DESIGNSAFE_USERNAME`, `DESIGNSAFE_PASSWORD`) +3. **`.env` file** in your project directory +4. **Interactive prompts** for missing credentials + +## 🔑 Authentication Methods + +### Method 1: Environment Variables (Recommended) + +Set environment variables in your shell: + +```bash +export DESIGNSAFE_USERNAME="your_username" +export DESIGNSAFE_PASSWORD="your_password" +``` + +Then initialize the client: + +```python +from dapi import DSClient + +# Automatically uses environment variables +client = DSClient() +``` + +#### Persistent Environment Variables + +Add to your shell configuration file (`~/.bashrc`, `~/.zshrc`, etc.): + +```bash +# Add these lines to your shell config +export DESIGNSAFE_USERNAME="your_username" +export DESIGNSAFE_PASSWORD="your_password" +``` + +### Method 2: .env File (Recommended for Projects) + +Create a `.env` file in your project root: + +```bash +# .env file +DESIGNSAFE_USERNAME=your_username +DESIGNSAFE_PASSWORD=your_password +``` + +!!! warning "Security Note" + Never commit `.env` files to version control. Add `.env` to your `.gitignore` file. + +Initialize the client: + +```python +from dapi import DSClient + +# Automatically loads from .env file +client = DSClient() + +# Or specify a custom .env file path +client = DSClient(env_file="path/to/custom.env") +``` + +### Method 3: Interactive Prompts + +If no credentials are found, dapi will prompt you: + +```python +from dapi import DSClient + +client = DSClient() +# Output: +# Enter DesignSafe Username: your_username +# Enter DesignSafe Password: [hidden input] +# Authentication successful. +``` + +### Method 4: Explicit Parameters + +Pass credentials directly (not recommended for production): + +```python +from dapi import DSClient + +client = DSClient( + username="your_username", + password="your_password" +) +``` + +## 🔒 Security Best Practices + +### 1. Use Environment Variables or .env Files +```python +# ✅ Good - uses environment variables +client = DSClient() + +# ❌ Avoid - credentials in code +client = DSClient(username="user", password="pass") +``` + +### 2. Protect Your .env File +```bash +# Add to .gitignore +echo ".env" >> .gitignore + +# Set restrictive permissions (Unix/Linux/macOS) +chmod 600 .env +``` + +### 3. Use Strong Passwords +- Use your DesignSafe account password +- Enable two-factor authentication on your DesignSafe account + +### 4. Rotate Credentials Regularly +- Change your DesignSafe password periodically +- Update stored credentials when changed + +## 🏗️ DesignSafe Jupyter Environment + +### Setting Environment Variables in Jupyter + +```python +import os + +# Set for current session +os.environ['DESIGNSAFE_USERNAME'] = 'your_username' +os.environ['DESIGNSAFE_PASSWORD'] = 'your_password' + +from dapi import DSClient +client = DSClient() +``` + +### Using .env Files in Jupyter + +Create a `.env` file in your notebook directory: + +```python +# Create .env file programmatically +with open('.env', 'w') as f: + f.write('DESIGNSAFE_USERNAME=your_username\n') + f.write('DESIGNSAFE_PASSWORD=your_password\n') + +from dapi import DSClient +client = DSClient() +``` + +## 🔧 Advanced Configuration + +### Custom Base URL + +```python +from dapi import DSClient + +client = DSClient( + base_url="https://designsafe.tapis.io", # Default + username="your_username", + password="your_password" +) +``` + +### Multiple .env Files + +```python +from dapi import DSClient + +# Development environment +dev_client = DSClient(env_file=".env.development") + +# Production environment +prod_client = DSClient(env_file=".env.production") +``` + +## ✅ Verifying Authentication + +### Check Authentication Status + +```python +from dapi import DSClient + +try: + client = DSClient() + print("✅ Authentication successful!") + + # Test API access + apps = client.apps.find("", verbose=False) + print(f"✅ API access confirmed. Found {len(apps)} apps.") + +except Exception as e: + print(f"❌ Authentication failed: {e}") +``` + +### Test Database Access + +```python +# Test database authentication +try: + df = client.db.ngl.read_sql("SELECT COUNT(*) FROM SITE") + print("✅ Database access confirmed") +except Exception as e: + print(f"❌ Database access failed: {e}") +``` + +## 🚨 Troubleshooting + +### Common Authentication Issues + +#### Invalid Credentials +``` +AuthenticationError: Tapis authentication failed +``` +**Solution**: Verify your DesignSafe username and password + +#### Network Issues +``` +AuthenticationError: An unexpected error occurred during authentication +``` +**Solution**: Check internet connection and DesignSafe service status + +#### Environment Variable Issues +``` +Enter DesignSafe Username: +``` +**Solution**: Verify environment variables are set correctly +```bash +echo $DESIGNSAFE_USERNAME +echo $DESIGNSAFE_PASSWORD +``` + +#### .env File Not Found +```python +# Verify .env file exists and is readable +import os +print(os.path.exists('.env')) +print(os.access('.env', os.R_OK)) +``` + +### Database Connection Issues + +For database-specific authentication issues: + +```python +# Check database environment variables +import os +print("NGL_DB_USER:", os.getenv('NGL_DB_USER')) +print("VP_DB_USER:", os.getenv('VP_DB_USER')) +print("EQ_DB_USER:", os.getenv('EQ_DB_USER')) +``` + +Required database environment variables: +```bash +# NGL Database +export NGL_DB_USER="dspublic" +export NGL_DB_PASSWORD="your_password" +export NGL_DB_HOST="db_host" +export NGL_DB_PORT="3306" + +# VP Database +export VP_DB_USER="dspublic" +export VP_DB_PASSWORD="your_password" +export VP_DB_HOST="db_host" +export VP_DB_PORT="3306" + +# Earthquake Recovery Database +export EQ_DB_USER="dspublic" +export EQ_DB_PASSWORD="your_password" +export EQ_DB_HOST="db_host" +export EQ_DB_PORT="3306" +``` + +## 📖 Example: Complete Setup + +Here's a complete example of setting up authentication: + +```python +# 1. Create .env file +with open('.env', 'w') as f: + f.write('DESIGNSAFE_USERNAME=your_username\n') + f.write('DESIGNSAFE_PASSWORD=your_password\n') + f.write('NGL_DB_USER=dspublic\n') + f.write('NGL_DB_PASSWORD=your_db_password\n') + f.write('NGL_DB_HOST=db_host\n') + f.write('NGL_DB_PORT=3306\n') + +# 2. Initialize client +from dapi import DSClient +client = DSClient() + +# 3. Test authentication +print("Testing TAPIS API access...") +apps = client.apps.find("matlab", verbose=False) +print(f"Found {len(apps)} MATLAB apps") + +print("Testing database access...") +df = client.db.ngl.read_sql("SELECT COUNT(*) FROM SITE") +print(f"NGL database has {df.iloc[0, 0]} sites") + +print("✅ All authentication successful!") +``` + +## ➡️ Next Steps + +After setting up authentication: + +1. **[Try the quick start guide](quickstart.md)** for your first workflow +2. **[Submit your first job](jobs.md)** using the jobs interface +3. **[Query databases](database.md)** for research data +4. **[Explore examples](examples/mpm.md)** for detailed workflows \ No newline at end of file diff --git a/docs/dapi.html b/docs/dapi.html deleted file mode 100644 index 1e246f8..0000000 --- a/docs/dapi.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - dapi API documentation - - - - - - - - - -
-
-

-dapi

- -

dapi` is a library that simplifies the process of submitting, running, and monitoring TAPIS v3 jobs on DesignSafe via Jupyter Notebooks.

- -

Features

- -

Jobs

- -
    -
  • Get TAPIS v3 templates for jobs: No need to fiddle with complex API requests. dapi abstracts away the complexities.

  • -
  • Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.

  • -
- -

Database

- -

Connects to SQL databases on DesignSafe:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Databasedbnameenv_prefix
NGLngl| NGL_
Earthake RecoveryeqEQ_
VpvpVP_
- -

Define the following environment variables:

- -
{env_prefix}DB_USER
-{env_prefix}DB_PASSWORD
-{env_prefix}DB_HOST
-{env_prefix}DB_PORT
-
- -

For e.g., to add the environment variable NGL_DB_USER edit ~/.bashrc, ~/.zshrc, or a similar shell-specific configuration file for the current user and add export NGL_DB_USER="dspublic".

- -

Installation

- -
-
pip3 install dapi
-
-
-
- - - - - -
 1"""
- 2dapi` is a library that simplifies the process of submitting, running, and monitoring [TAPIS v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org).
- 3
- 4## Features
- 5
- 6### Jobs
- 7
- 8* Get TAPIS v3 templates for jobs: No need to fiddle with complex API requests. `dapi` abstracts away the complexities.
- 9
-10* Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.
-11
-12### Database
-13
-14Connects to SQL databases on DesignSafe:
-15
-16| Database | dbname | env_prefix |
-17|----------|--------|------------|
-18| NGL | `ngl`| `NGL_` |
-19| Earthake Recovery | `eq` | `EQ_` |
-20| Vp | `vp` | `VP_` |
-21
-22Define the following environment variables:
-23```
-24{env_prefix}DB_USER
-25{env_prefix}DB_PASSWORD
-26{env_prefix}DB_HOST
-27{env_prefix}DB_PORT
-28```
-29
-30For e.g., to add the environment variable `NGL_DB_USER` edit `~/.bashrc`, `~/.zshrc`, or a similar shell-specific configuration file for the current user and add `export NGL_DB_USER="dspublic"`.
-31
-32## Installation
-33
-34```shell
-35pip3 install dapi
-36```
-37
-38"""
-39from . import auth
-40from . import db
-41from . import jobs
-
- - -
-
- - \ No newline at end of file diff --git a/docs/dapi/auth.html b/docs/dapi/auth.html deleted file mode 100644 index 6287615..0000000 --- a/docs/dapi/auth.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - dapi.auth API documentation - - - - - - - - - -
-
-

-dapi.auth

- - - - - - -
1from .auth import init
-
- - -
-
- - \ No newline at end of file diff --git a/docs/dapi/auth/auth.html b/docs/dapi/auth/auth.html deleted file mode 100644 index 3f05c87..0000000 --- a/docs/dapi/auth/auth.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - dapi.auth.auth API documentation - - - - - - - - - -
-
-

-dapi.auth.auth

- - - - - - -
 1import os
- 2from getpass import getpass
- 3from tapipy.tapis import Tapis
- 4from dotenv import load_dotenv
- 5
- 6
- 7def init():
- 8    """
- 9    Initialize a Tapis object with authentication.
-10    Tries to read credentials from environment variables first.
-11    If not found, prompts the user for input.
-12
-13    Save the user credentials in the .env file.
-14    ```
-15    DESIGNSAFE_USERNAME=<username>
-16    DESIGNSAFE_PASSWORD=<password>
-17    ```
-18
-19    Returns:
-20        object: The authenticated Tapis object.
-21    """
-22    base_url = "https://designsafe.tapis.io"
-23
-24    # Load environment variables from .env file
-25    load_dotenv()
-26
-27    # Try to get credentials from environment variables
-28    username = os.getenv("DESIGNSAFE_USERNAME")
-29    password = os.getenv("DESIGNSAFE_PASSWORD")
-30
-31    # If environment variables are not set, prompt user for input
-32    if not username:
-33        username = input("Enter username: ")
-34    if not password:
-35        password = getpass("Enter password: ")
-36
-37    # Initialize Tapis object
-38    t = Tapis(base_url=base_url, username=username, password=password)
-39
-40    t.get_tokens()
-41
-42    return t
-
- - -
-
- -
- - def - init(): - - - -
- -
 8def init():
- 9    """
-10    Initialize a Tapis object with authentication.
-11    Tries to read credentials from environment variables first.
-12    If not found, prompts the user for input.
-13
-14    Save the user credentials in the .env file.
-15    ```
-16    DESIGNSAFE_USERNAME=<username>
-17    DESIGNSAFE_PASSWORD=<password>
-18    ```
-19
-20    Returns:
-21        object: The authenticated Tapis object.
-22    """
-23    base_url = "https://designsafe.tapis.io"
-24
-25    # Load environment variables from .env file
-26    load_dotenv()
-27
-28    # Try to get credentials from environment variables
-29    username = os.getenv("DESIGNSAFE_USERNAME")
-30    password = os.getenv("DESIGNSAFE_PASSWORD")
-31
-32    # If environment variables are not set, prompt user for input
-33    if not username:
-34        username = input("Enter username: ")
-35    if not password:
-36        password = getpass("Enter password: ")
-37
-38    # Initialize Tapis object
-39    t = Tapis(base_url=base_url, username=username, password=password)
-40
-41    t.get_tokens()
-42
-43    return t
-
- - -

Initialize a Tapis object with authentication. -Tries to read credentials from environment variables first. -If not found, prompts the user for input.

- -

Save the user credentials in the .env file.

- -
DESIGNSAFE_USERNAME=<username>
-DESIGNSAFE_PASSWORD=<password>
-
- -

Returns: - object: The authenticated Tapis object.

-
- - -
-
- - \ No newline at end of file diff --git a/docs/dapi/db.html b/docs/dapi/db.html deleted file mode 100644 index 517197c..0000000 --- a/docs/dapi/db.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - dapi.db API documentation - - - - - - - - - -
-
-

-dapi.db

- - - - - - -
1name = "designsafe_db"
-2from .db import DSDatabase
-
- - -
-
-
- name = -'designsafe_db' - - -
- - - - -
-
- - \ No newline at end of file diff --git a/docs/dapi/db/config.html b/docs/dapi/db/config.html deleted file mode 100644 index 9e602dd..0000000 --- a/docs/dapi/db/config.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - dapi.db.config API documentation - - - - - - - - - -
-
-

-dapi.db.config

- - - - - - -
1# Mapping of shorthand names to actual database names and environment prefixes
-2db_config = {
-3    "ngl": {"dbname": "sjbrande_ngl_db", "env_prefix": "NGL_"},
-4    "vp": {"dbname": "sjbrande_vpdb", "env_prefix": "VP_"},
-5    "eq": {"dbname": "post_earthquake_recovery", "env_prefix": "EQ_"},
-6}
-
- - -
-
-
- db_config = - - {'ngl': {'dbname': 'sjbrande_ngl_db', 'env_prefix': 'NGL_'}, 'vp': {'dbname': 'sjbrande_vpdb', 'env_prefix': 'VP_'}, 'eq': {'dbname': 'post_earthquake_recovery', 'env_prefix': 'EQ_'}} - - -
- - - - -
-
- - \ No newline at end of file diff --git a/docs/dapi/db/db.html b/docs/dapi/db/db.html deleted file mode 100644 index 037299a..0000000 --- a/docs/dapi/db/db.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - dapi.db.db API documentation - - - - - - - - - -
-
-

-dapi.db.db

- - - - - - -
 1import os
- 2import pandas as pd
- 3from sqlalchemy import create_engine, exc
- 4from sqlalchemy.orm import sessionmaker
- 5from sqlalchemy import text
- 6
- 7from .config import db_config
- 8
- 9
-10class DSDatabase:
-11    """A database utility class for connecting to a DesignSafe SQL database.
-12
-13    This class provides functionality to connect to a MySQL database using
-14    SQLAlchemy and PyMySQL. It supports executing SQL queries and returning
-15    results in different formats.
-16
-17    Attributes:
-18        user (str): Database username, defaults to 'dspublic'.
-19        password (str): Database password, defaults to 'R3ad0nlY'.
-20        host (str): Database host address, defaults to '129.114.52.174'.
-21        port (int): Database port, defaults to 3306.
-22        db (str): Database name, can be 'sjbrande_ngl_db', 'sjbrande_vpdb', or 'post_earthquake_recovery'.
-23        recycle_time (int): Time in seconds to recycle database connections.
-24        engine (Engine): SQLAlchemy engine for database connection.
-25        Session (sessionmaker): SQLAlchemy session maker bound to the engine.
-26    """
-27
-28    def __init__(self, dbname="ngl"):
-29        """Initializes the DSDatabase instance with environment variables and creates the database engine.
-30
-31        Args:
-32            dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'.
-33        """
-34
-35        if dbname not in db_config:
-36            raise ValueError(
-37                f"Invalid database shorthand '{dbname}'. Allowed shorthands are: {', '.join(db_config.keys())}"
-38            )
-39
-40        config = db_config[dbname]
-41        env_prefix = config["env_prefix"]
-42
-43        self.user = os.getenv(f"{env_prefix}DB_USER", "dspublic")
-44        self.password = os.getenv(f"{env_prefix}DB_PASSWORD", "R3ad0nlY")
-45        self.host = os.getenv(f"{env_prefix}DB_HOST", "129.114.52.174")
-46        self.port = os.getenv(f"{env_prefix}DB_PORT", 3306)
-47        self.db = config["dbname"]
-48
-49        # Setup the database connection
-50        self.engine = create_engine(
-51            f"mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.db}",
-52            pool_recycle=3600,  # 1 hour in seconds
-53        )
-54        self.Session = sessionmaker(bind=self.engine)
-55
-56    def read_sql(self, sql, output_type="DataFrame"):
-57        """Executes a SQL query and returns the results.
-58
-59        Args:
-60            sql (str): The SQL query string to be executed.
-61            output_type (str, optional): The format for the query results. Defaults to 'DataFrame'.
-62                Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries.
-63
-64        Returns:
-65            pandas.DataFrame or list of dict: The result of the SQL query.
-66
-67        Raises:
-68            ValueError: If the SQL query string is empty or if the output type is not valid.
-69            SQLAlchemyError: If an error occurs during query execution.
-70        """
-71        if not sql:
-72            raise ValueError("SQL query string is required")
-73
-74        if output_type not in ["DataFrame", "dict"]:
-75            raise ValueError('Output type must be either "DataFrame" or "dict"')
-76
-77        session = self.Session()
-78
-79        try:
-80            if output_type == "DataFrame":
-81                return pd.read_sql_query(sql, session.bind)
-82            else:
-83                # Convert SQL string to a text object
-84                sql_text = text(sql)
-85                result = session.execute(sql_text)
-86                return [dict(row) for row in result]
-87        except exc.SQLAlchemyError as e:
-88            raise Exception(f"SQLAlchemyError: {e}")
-89        finally:
-90            session.close()
-91
-92    def close(self):
-93        """Close the database connection."""
-94        self.engine.dispose()
-
- - -
-
- -
- - class - DSDatabase: - - - -
- -
11class DSDatabase:
-12    """A database utility class for connecting to a DesignSafe SQL database.
-13
-14    This class provides functionality to connect to a MySQL database using
-15    SQLAlchemy and PyMySQL. It supports executing SQL queries and returning
-16    results in different formats.
-17
-18    Attributes:
-19        user (str): Database username, defaults to 'dspublic'.
-20        password (str): Database password, defaults to 'R3ad0nlY'.
-21        host (str): Database host address, defaults to '129.114.52.174'.
-22        port (int): Database port, defaults to 3306.
-23        db (str): Database name, can be 'sjbrande_ngl_db', 'sjbrande_vpdb', or 'post_earthquake_recovery'.
-24        recycle_time (int): Time in seconds to recycle database connections.
-25        engine (Engine): SQLAlchemy engine for database connection.
-26        Session (sessionmaker): SQLAlchemy session maker bound to the engine.
-27    """
-28
-29    def __init__(self, dbname="ngl"):
-30        """Initializes the DSDatabase instance with environment variables and creates the database engine.
-31
-32        Args:
-33            dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'.
-34        """
-35
-36        if dbname not in db_config:
-37            raise ValueError(
-38                f"Invalid database shorthand '{dbname}'. Allowed shorthands are: {', '.join(db_config.keys())}"
-39            )
-40
-41        config = db_config[dbname]
-42        env_prefix = config["env_prefix"]
-43
-44        self.user = os.getenv(f"{env_prefix}DB_USER", "dspublic")
-45        self.password = os.getenv(f"{env_prefix}DB_PASSWORD", "R3ad0nlY")
-46        self.host = os.getenv(f"{env_prefix}DB_HOST", "129.114.52.174")
-47        self.port = os.getenv(f"{env_prefix}DB_PORT", 3306)
-48        self.db = config["dbname"]
-49
-50        # Setup the database connection
-51        self.engine = create_engine(
-52            f"mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.db}",
-53            pool_recycle=3600,  # 1 hour in seconds
-54        )
-55        self.Session = sessionmaker(bind=self.engine)
-56
-57    def read_sql(self, sql, output_type="DataFrame"):
-58        """Executes a SQL query and returns the results.
-59
-60        Args:
-61            sql (str): The SQL query string to be executed.
-62            output_type (str, optional): The format for the query results. Defaults to 'DataFrame'.
-63                Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries.
-64
-65        Returns:
-66            pandas.DataFrame or list of dict: The result of the SQL query.
-67
-68        Raises:
-69            ValueError: If the SQL query string is empty or if the output type is not valid.
-70            SQLAlchemyError: If an error occurs during query execution.
-71        """
-72        if not sql:
-73            raise ValueError("SQL query string is required")
-74
-75        if output_type not in ["DataFrame", "dict"]:
-76            raise ValueError('Output type must be either "DataFrame" or "dict"')
-77
-78        session = self.Session()
-79
-80        try:
-81            if output_type == "DataFrame":
-82                return pd.read_sql_query(sql, session.bind)
-83            else:
-84                # Convert SQL string to a text object
-85                sql_text = text(sql)
-86                result = session.execute(sql_text)
-87                return [dict(row) for row in result]
-88        except exc.SQLAlchemyError as e:
-89            raise Exception(f"SQLAlchemyError: {e}")
-90        finally:
-91            session.close()
-92
-93    def close(self):
-94        """Close the database connection."""
-95        self.engine.dispose()
-
- - -

A database utility class for connecting to a DesignSafe SQL database.

- -

This class provides functionality to connect to a MySQL database using -SQLAlchemy and PyMySQL. It supports executing SQL queries and returning -results in different formats.

- -

Attributes: - user (str): Database username, defaults to 'dspublic'. - password (str): Database password, defaults to 'R3ad0nlY'. - host (str): Database host address, defaults to '129.114.52.174'. - port (int): Database port, defaults to 3306. - db (str): Database name, can be 'sjbrande_ngl_db', 'sjbrande_vpdb', or 'post_earthquake_recovery'. - recycle_time (int): Time in seconds to recycle database connections. - engine (Engine): SQLAlchemy engine for database connection. - Session (sessionmaker): SQLAlchemy session maker bound to the engine.

-
- - -
- -
- - DSDatabase(dbname='ngl') - - - -
- -
29    def __init__(self, dbname="ngl"):
-30        """Initializes the DSDatabase instance with environment variables and creates the database engine.
-31
-32        Args:
-33            dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'.
-34        """
-35
-36        if dbname not in db_config:
-37            raise ValueError(
-38                f"Invalid database shorthand '{dbname}'. Allowed shorthands are: {', '.join(db_config.keys())}"
-39            )
-40
-41        config = db_config[dbname]
-42        env_prefix = config["env_prefix"]
-43
-44        self.user = os.getenv(f"{env_prefix}DB_USER", "dspublic")
-45        self.password = os.getenv(f"{env_prefix}DB_PASSWORD", "R3ad0nlY")
-46        self.host = os.getenv(f"{env_prefix}DB_HOST", "129.114.52.174")
-47        self.port = os.getenv(f"{env_prefix}DB_PORT", 3306)
-48        self.db = config["dbname"]
-49
-50        # Setup the database connection
-51        self.engine = create_engine(
-52            f"mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.db}",
-53            pool_recycle=3600,  # 1 hour in seconds
-54        )
-55        self.Session = sessionmaker(bind=self.engine)
-
- - -

Initializes the DSDatabase instance with environment variables and creates the database engine.

- -

Args: - dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'.

-
- - -
-
-
- user - - -
- - - - -
-
-
- password - - -
- - - - -
-
-
- host - - -
- - - - -
-
-
- port - - -
- - - - -
-
-
- db - - -
- - - - -
-
-
- engine - - -
- - - - -
-
-
- Session - - -
- - - - -
-
- -
- - def - read_sql(self, sql, output_type='DataFrame'): - - - -
- -
57    def read_sql(self, sql, output_type="DataFrame"):
-58        """Executes a SQL query and returns the results.
-59
-60        Args:
-61            sql (str): The SQL query string to be executed.
-62            output_type (str, optional): The format for the query results. Defaults to 'DataFrame'.
-63                Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries.
-64
-65        Returns:
-66            pandas.DataFrame or list of dict: The result of the SQL query.
-67
-68        Raises:
-69            ValueError: If the SQL query string is empty or if the output type is not valid.
-70            SQLAlchemyError: If an error occurs during query execution.
-71        """
-72        if not sql:
-73            raise ValueError("SQL query string is required")
-74
-75        if output_type not in ["DataFrame", "dict"]:
-76            raise ValueError('Output type must be either "DataFrame" or "dict"')
-77
-78        session = self.Session()
-79
-80        try:
-81            if output_type == "DataFrame":
-82                return pd.read_sql_query(sql, session.bind)
-83            else:
-84                # Convert SQL string to a text object
-85                sql_text = text(sql)
-86                result = session.execute(sql_text)
-87                return [dict(row) for row in result]
-88        except exc.SQLAlchemyError as e:
-89            raise Exception(f"SQLAlchemyError: {e}")
-90        finally:
-91            session.close()
-
- - -

Executes a SQL query and returns the results.

- -

Args: - sql (str): The SQL query string to be executed. - output_type (str, optional): The format for the query results. Defaults to 'DataFrame'. - Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries.

- -

Returns: - pandas.DataFrame or list of dict: The result of the SQL query.

- -

Raises: - ValueError: If the SQL query string is empty or if the output type is not valid. - SQLAlchemyError: If an error occurs during query execution.

-
- - -
-
- -
- - def - close(self): - - - -
- -
93    def close(self):
-94        """Close the database connection."""
-95        self.engine.dispose()
-
- - -

Close the database connection.

-
- - -
-
-
- - \ No newline at end of file diff --git a/docs/dapi/jobs.html b/docs/dapi/jobs.html deleted file mode 100644 index 169b1ae..0000000 --- a/docs/dapi/jobs.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - dapi.jobs API documentation - - - - - - - - - -
-
-

-dapi.jobs

- -

dapi job submodule simplifies the process of submitting, running, and monitoring Tapis v3 jobs on DesignSafe via Jupyter Notebooks.

- -

Features

- -
    -
  • Simplified TAPIS v3 Calls: No need to fiddle with complex API requests. dapi abstracts away the complexities.

  • -
  • Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.

  • -
- -

Installation

- -
-
pip3 install dapi
-
-
-
- - - - - -
 1"""
- 2`dapi` job submodule simplifies the process of submitting, running, and monitoring [Tapis v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org).
- 3
- 4
- 5## Features
- 6
- 7* Simplified TAPIS v3 Calls: No need to fiddle with complex API requests. `dapi` abstracts away the complexities.
- 8
- 9* Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.
-10
-11# Installation
-12
-13```shell
-14pip3 install dapi
-15```
-16
-17"""
-18from .dir import get_ds_path_uri
-19from .jobs import get_status, runtime_summary, generate_job_info
-
- - -
-
- - \ No newline at end of file diff --git a/docs/dapi/jobs/dir.html b/docs/dapi/jobs/dir.html deleted file mode 100644 index c031c99..0000000 --- a/docs/dapi/jobs/dir.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - dapi.jobs.dir API documentation - - - - - - - - - -
-
-

-dapi.jobs.dir

- - - - - - -
 1import os
- 2from tapipy.tapis import Tapis
- 3
- 4
- 5def get_ds_path_uri(t: Tapis, path: str) -> str:
- 6    """
- 7    Given a path on DesignSafe, determine the correct input URI for Tapis v3.
- 8
- 9    Args:
-10    t (Tapis): Tapis object to fetch profiles or metadata.
-11    path (str): The directory path.
-12
-13    Returns:
-14    str: The corresponding input URI.
-15
-16    Raises:
-17    ValueError: If no matching directory pattern is found.
-18    """
-19    # If any of the following directory patterns are found in the path,
-20    # process them accordingly.
-21    directory_patterns = [
-22        ("jupyter/MyData", "designsafe.storage.default", True),
-23        ("jupyter/mydata", "designsafe.storage.default", True),
-24        ("jupyter/CommunityData", "designsafe.storage.community", False),
-25        ("/MyData", "designsafe.storage.default", True),
-26        ("/mydata", "designsafe.storage.default", True),
-27    ]
-28
-29    for pattern, storage, use_username in directory_patterns:
-30        if pattern in path:
-31            path = path.split(pattern, 1)[1].lstrip("/")
-32            input_dir = f"{t.username}/{path}" if use_username else path
-33            input_uri = f"tapis://{storage}/{input_dir}"
-34            return input_uri.replace(" ", "%20")
-35
-36    project_patterns = [
-37        ("jupyter/MyProjects", "project-"),
-38        ("jupyter/projects", "project-"),
-39    ]
-40
-41    for pattern, prefix in project_patterns:
-42        if pattern in path:
-43            path = path.split(pattern, 1)[1].lstrip("/")
-44            project_id, *rest = path.split("/", 1)
-45            path = rest[0] if rest else ""
-46
-47            # Using Tapis v3 to get project UUID
-48            resp = t.get(f"https://designsafe-ci.org/api/projects/v2/{project_id}")
-49            project_uuid = resp.json()["baseProject"]["uuid"]
-50
-51            input_uri = f"tapis://{prefix}{project_uuid}/{path}"
-52            return input_uri.replace(" ", "%20")
-53
-54    raise ValueError(f"No matching directory pattern found for: {path}")
-
- - -
-
- -
- - def - get_ds_path_uri(t: tapipy.tapis.Tapis, path: str) -> str: - - - -
- -
 6def get_ds_path_uri(t: Tapis, path: str) -> str:
- 7    """
- 8    Given a path on DesignSafe, determine the correct input URI for Tapis v3.
- 9
-10    Args:
-11    t (Tapis): Tapis object to fetch profiles or metadata.
-12    path (str): The directory path.
-13
-14    Returns:
-15    str: The corresponding input URI.
-16
-17    Raises:
-18    ValueError: If no matching directory pattern is found.
-19    """
-20    # If any of the following directory patterns are found in the path,
-21    # process them accordingly.
-22    directory_patterns = [
-23        ("jupyter/MyData", "designsafe.storage.default", True),
-24        ("jupyter/mydata", "designsafe.storage.default", True),
-25        ("jupyter/CommunityData", "designsafe.storage.community", False),
-26        ("/MyData", "designsafe.storage.default", True),
-27        ("/mydata", "designsafe.storage.default", True),
-28    ]
-29
-30    for pattern, storage, use_username in directory_patterns:
-31        if pattern in path:
-32            path = path.split(pattern, 1)[1].lstrip("/")
-33            input_dir = f"{t.username}/{path}" if use_username else path
-34            input_uri = f"tapis://{storage}/{input_dir}"
-35            return input_uri.replace(" ", "%20")
-36
-37    project_patterns = [
-38        ("jupyter/MyProjects", "project-"),
-39        ("jupyter/projects", "project-"),
-40    ]
-41
-42    for pattern, prefix in project_patterns:
-43        if pattern in path:
-44            path = path.split(pattern, 1)[1].lstrip("/")
-45            project_id, *rest = path.split("/", 1)
-46            path = rest[0] if rest else ""
-47
-48            # Using Tapis v3 to get project UUID
-49            resp = t.get(f"https://designsafe-ci.org/api/projects/v2/{project_id}")
-50            project_uuid = resp.json()["baseProject"]["uuid"]
-51
-52            input_uri = f"tapis://{prefix}{project_uuid}/{path}"
-53            return input_uri.replace(" ", "%20")
-54
-55    raise ValueError(f"No matching directory pattern found for: {path}")
-
- - -

Given a path on DesignSafe, determine the correct input URI for Tapis v3.

- -

Args: -t (Tapis): Tapis object to fetch profiles or metadata. -path (str): The directory path.

- -

Returns: -str: The corresponding input URI.

- -

Raises: -ValueError: If no matching directory pattern is found.

-
- - -
-
- - \ No newline at end of file diff --git a/docs/dapi/jobs/jobs.html b/docs/dapi/jobs/jobs.html deleted file mode 100644 index 65a09b1..0000000 --- a/docs/dapi/jobs/jobs.html +++ /dev/null @@ -1,670 +0,0 @@ - - - - - - - dapi.jobs.jobs API documentation - - - - - - - - - -
-
-

-dapi.jobs.jobs

- - - - - - -
  1import time
-  2from datetime import datetime, timedelta, timezone
-  3from tqdm import tqdm
-  4import logging
-  5import json
-  6from typing import Dict, Any, Optional
-  7
-  8# Configuring the logging system
-  9# logging.basicConfig(
- 10#     level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
- 11# )
- 12
- 13
- 14def generate_job_info(
- 15    t: Any,  # Tapis client
- 16    app_name: str,
- 17    input_uri: str,
- 18    input_file: str,
- 19    job_name: str = None,
- 20    max_minutes: Optional[int] = None,
- 21    node_count: Optional[int] = None,
- 22    cores_per_node: Optional[int] = None,
- 23    queue: Optional[str] = None,
- 24    allocation: Optional[str] = None,
- 25) -> Dict[str, Any]:
- 26    """
- 27    Generates a job info dictionary based on the provided application name, job name, input URI, input file, and optional allocation.
- 28
- 29    Args:
- 30        t (object): The Tapis API client object.
- 31        app_name (str): The name of the application to use for the job.
- 32        input_uri (str): The URI of the input data for the job.
- 33        input_file (str): The local file path to the input data for the job.
- 34        job_name (str, optional): The name of the job to be created. Defaults to None.
- 35        max_minutes (int, optional): The maximum number of minutes the job can run. Defaults to None.
- 36        node_count (int, optional): The number of nodes to use for the job. Defaults to None.
- 37        cores_per_node (int, optional): The number of cores per node for the job. Defaults to None.
- 38        queue (str, optional): The queue to use for the job. Defaults to None.
- 39        allocation (str, optional): The allocation to use for the job. Defaults to None.
- 40
- 41    Returns:
- 42        dict: The job info dictionary.
- 43    """
- 44
- 45    # Fetch the latest app information
- 46    app_info = t.apps.getAppLatestVersion(appId=app_name)
- 47
- 48    # If job_name is not provided, use the app name and date
- 49    if not job_name:
- 50        job_name = f"{app_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
- 51
- 52    # Create the base job info
- 53    job_info = {
- 54        "name": job_name,
- 55        "appId": app_info.id,
- 56        "appVersion": app_info.version,
- 57        "execSystemId": app_info.jobAttributes.execSystemId,
- 58        "maxMinutes": max_minutes or app_info.jobAttributes.maxMinutes,
- 59        "archiveOnAppError": app_info.jobAttributes.archiveOnAppError,
- 60        "fileInputs": [{"name": "Input Directory", "sourceUrl": input_uri}],
- 61        "execSystemLogicalQueue": queue
- 62        or app_info.jobAttributes.execSystemLogicalQueue,
- 63        "nodeCount": node_count or 1,  # Default to 1 if not specified
- 64        "coresPerNode": cores_per_node or 1,  # Default to 1 if not specified
- 65        "parameterSet": {
- 66            "appArgs": [{"name": "Input Script", "arg": input_file}],
- 67            "schedulerOptions": [],
- 68        },
- 69    }
- 70
- 71    # Add TACC allocation if provided
- 72    if allocation:
- 73        job_info["parameterSet"]["schedulerOptions"].append(
- 74            {"name": "TACC Allocation", "arg": f"-A {allocation}"}
- 75        )
- 76
- 77    return job_info
- 78
- 79
- 80def get_status(t, mjobUuid, tlapse=15):
- 81    """
- 82    Retrieves and monitors the status of a job using Tapis API.
- 83    This function waits for the job to start, then monitors it for up to maxMinutes.
- 84
- 85    Args:
- 86    t (object): The Tapis API client object.
- 87    mjobUuid (str): The unique identifier of the job to monitor.
- 88    tlapse (int, optional): Time interval, in seconds, to wait between status checks. Defaults to 15 seconds.
- 89
- 90    Returns:
- 91    str: The final status of the job (FINISHED, FAILED, or STOPPED).
- 92    """
- 93    previous_status = None
- 94    # Initially check if the job is already running
- 95    status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
- 96    max_minutes = t.jobs.getJob(jobUuid=mjobUuid).maxMinutes
- 97
- 98    # Using tqdm to provide visual feedback while waiting for job to start
- 99    with tqdm(desc="Waiting for job to start", dynamic_ncols=True) as pbar:
-100        while status not in ["RUNNING", "FINISHED", "FAILED", "STOPPED"]:
-101            time.sleep(tlapse)
-102            status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
-103            pbar.update(1)
-104            pbar.set_postfix_str(f"Status: {status}")
-105
-106    # Once the job is running, monitor it for up to maxMinutes
-107    max_iterations = int(max_minutes * 60 // tlapse)
-108
-109    # Using tqdm for progress bar
-110    for _ in tqdm(range(max_iterations), desc="Monitoring job", ncols=100):
-111        status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
-112
-113        # Print status if it has changed
-114        if status != previous_status:
-115            tqdm.write(f"\tStatus: {status}")
-116            previous_status = status
-117
-118        # Break the loop if job reaches one of these statuses
-119        if status in ["FINISHED", "FAILED", "STOPPED"]:
-120            break
-121
-122        time.sleep(tlapse)
-123    else:
-124        # This block will execute if the for loop completes without a 'break'
-125        logging.warning(
-126            f"Warning: Maximum monitoring time of {max_minutes} minutes reached!"
-127        )
-128
-129    return status
-130
-131
-132def runtime_summary(t, job_uuid, verbose=False):
-133    """Get the runtime of a job.
-134    Args:
-135    t (object): The Tapis v3 client object.
-136    job_uuid (str): The UUID of the job for which the runtime needs to be determined.
-137    verbose (bool): If True, prints all history events. Otherwise, prints only specific statuses.
-138    Returns:
-139    None: This function doesn't return a value, but it prints the runtime details.
-140    """
-141    from datetime import datetime, timedelta
-142
-143    print("\nRuntime Summary")
-144    print("---------------")
-145    hist = t.jobs.getJobHistory(jobUuid=job_uuid)
-146
-147    def format_timedelta(td):
-148        hours, remainder = divmod(td.total_seconds(), 3600)
-149        minutes, seconds = divmod(remainder, 60)
-150        return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}"
-151
-152    time1 = datetime.strptime(hist[-1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-153    time0 = datetime.strptime(hist[0].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-154    total_time = time1 - time0
-155
-156    if verbose:
-157        print("\nDetailed Job History:")
-158        for event in hist:
-159            print(
-160                f"Event: {event.event}, Detail: {event.eventDetail}, Time: {event.created}"
-161            )
-162        print("\nSummary:")
-163
-164    for i in range(len(hist) - 1):
-165        if hist[i].eventDetail == "RUNNING":
-166            time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-167            time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-168            print("RUNNING time:", format_timedelta(time1 - time0))
-169        elif hist[i].eventDetail == "QUEUED":
-170            time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-171            time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-172            print("QUEUED  time:", format_timedelta(time1 - time0))
-173
-174    print("TOTAL   time:", format_timedelta(total_time))
-175    print("---------------")
-
- - -
-
- -
- - def - generate_job_info( t: Any, app_name: str, input_uri: str, input_file: str, job_name: str = None, max_minutes: Optional[int] = None, node_count: Optional[int] = None, cores_per_node: Optional[int] = None, queue: Optional[str] = None, allocation: Optional[str] = None) -> Dict[str, Any]: - - - -
- -
15def generate_job_info(
-16    t: Any,  # Tapis client
-17    app_name: str,
-18    input_uri: str,
-19    input_file: str,
-20    job_name: str = None,
-21    max_minutes: Optional[int] = None,
-22    node_count: Optional[int] = None,
-23    cores_per_node: Optional[int] = None,
-24    queue: Optional[str] = None,
-25    allocation: Optional[str] = None,
-26) -> Dict[str, Any]:
-27    """
-28    Generates a job info dictionary based on the provided application name, job name, input URI, input file, and optional allocation.
-29
-30    Args:
-31        t (object): The Tapis API client object.
-32        app_name (str): The name of the application to use for the job.
-33        input_uri (str): The URI of the input data for the job.
-34        input_file (str): The local file path to the input data for the job.
-35        job_name (str, optional): The name of the job to be created. Defaults to None.
-36        max_minutes (int, optional): The maximum number of minutes the job can run. Defaults to None.
-37        node_count (int, optional): The number of nodes to use for the job. Defaults to None.
-38        cores_per_node (int, optional): The number of cores per node for the job. Defaults to None.
-39        queue (str, optional): The queue to use for the job. Defaults to None.
-40        allocation (str, optional): The allocation to use for the job. Defaults to None.
-41
-42    Returns:
-43        dict: The job info dictionary.
-44    """
-45
-46    # Fetch the latest app information
-47    app_info = t.apps.getAppLatestVersion(appId=app_name)
-48
-49    # If job_name is not provided, use the app name and date
-50    if not job_name:
-51        job_name = f"{app_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
-52
-53    # Create the base job info
-54    job_info = {
-55        "name": job_name,
-56        "appId": app_info.id,
-57        "appVersion": app_info.version,
-58        "execSystemId": app_info.jobAttributes.execSystemId,
-59        "maxMinutes": max_minutes or app_info.jobAttributes.maxMinutes,
-60        "archiveOnAppError": app_info.jobAttributes.archiveOnAppError,
-61        "fileInputs": [{"name": "Input Directory", "sourceUrl": input_uri}],
-62        "execSystemLogicalQueue": queue
-63        or app_info.jobAttributes.execSystemLogicalQueue,
-64        "nodeCount": node_count or 1,  # Default to 1 if not specified
-65        "coresPerNode": cores_per_node or 1,  # Default to 1 if not specified
-66        "parameterSet": {
-67            "appArgs": [{"name": "Input Script", "arg": input_file}],
-68            "schedulerOptions": [],
-69        },
-70    }
-71
-72    # Add TACC allocation if provided
-73    if allocation:
-74        job_info["parameterSet"]["schedulerOptions"].append(
-75            {"name": "TACC Allocation", "arg": f"-A {allocation}"}
-76        )
-77
-78    return job_info
-
- - -

Generates a job info dictionary based on the provided application name, job name, input URI, input file, and optional allocation.

- -

Args: - t (object): The Tapis API client object. - app_name (str): The name of the application to use for the job. - input_uri (str): The URI of the input data for the job. - input_file (str): The local file path to the input data for the job. - job_name (str, optional): The name of the job to be created. Defaults to None. - max_minutes (int, optional): The maximum number of minutes the job can run. Defaults to None. - node_count (int, optional): The number of nodes to use for the job. Defaults to None. - cores_per_node (int, optional): The number of cores per node for the job. Defaults to None. - queue (str, optional): The queue to use for the job. Defaults to None. - allocation (str, optional): The allocation to use for the job. Defaults to None.

- -

Returns: - dict: The job info dictionary.

-
- - -
-
- -
- - def - get_status(t, mjobUuid, tlapse=15): - - - -
- -
 81def get_status(t, mjobUuid, tlapse=15):
- 82    """
- 83    Retrieves and monitors the status of a job using Tapis API.
- 84    This function waits for the job to start, then monitors it for up to maxMinutes.
- 85
- 86    Args:
- 87    t (object): The Tapis API client object.
- 88    mjobUuid (str): The unique identifier of the job to monitor.
- 89    tlapse (int, optional): Time interval, in seconds, to wait between status checks. Defaults to 15 seconds.
- 90
- 91    Returns:
- 92    str: The final status of the job (FINISHED, FAILED, or STOPPED).
- 93    """
- 94    previous_status = None
- 95    # Initially check if the job is already running
- 96    status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
- 97    max_minutes = t.jobs.getJob(jobUuid=mjobUuid).maxMinutes
- 98
- 99    # Using tqdm to provide visual feedback while waiting for job to start
-100    with tqdm(desc="Waiting for job to start", dynamic_ncols=True) as pbar:
-101        while status not in ["RUNNING", "FINISHED", "FAILED", "STOPPED"]:
-102            time.sleep(tlapse)
-103            status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
-104            pbar.update(1)
-105            pbar.set_postfix_str(f"Status: {status}")
-106
-107    # Once the job is running, monitor it for up to maxMinutes
-108    max_iterations = int(max_minutes * 60 // tlapse)
-109
-110    # Using tqdm for progress bar
-111    for _ in tqdm(range(max_iterations), desc="Monitoring job", ncols=100):
-112        status = t.jobs.getJobStatus(jobUuid=mjobUuid).status
-113
-114        # Print status if it has changed
-115        if status != previous_status:
-116            tqdm.write(f"\tStatus: {status}")
-117            previous_status = status
-118
-119        # Break the loop if job reaches one of these statuses
-120        if status in ["FINISHED", "FAILED", "STOPPED"]:
-121            break
-122
-123        time.sleep(tlapse)
-124    else:
-125        # This block will execute if the for loop completes without a 'break'
-126        logging.warning(
-127            f"Warning: Maximum monitoring time of {max_minutes} minutes reached!"
-128        )
-129
-130    return status
-
- - -

Retrieves and monitors the status of a job using Tapis API. -This function waits for the job to start, then monitors it for up to maxMinutes.

- -

Args: -t (object): The Tapis API client object. -mjobUuid (str): The unique identifier of the job to monitor. -tlapse (int, optional): Time interval, in seconds, to wait between status checks. Defaults to 15 seconds.

- -

Returns: -str: The final status of the job (FINISHED, FAILED, or STOPPED).

-
- - -
-
- -
- - def - runtime_summary(t, job_uuid, verbose=False): - - - -
- -
133def runtime_summary(t, job_uuid, verbose=False):
-134    """Get the runtime of a job.
-135    Args:
-136    t (object): The Tapis v3 client object.
-137    job_uuid (str): The UUID of the job for which the runtime needs to be determined.
-138    verbose (bool): If True, prints all history events. Otherwise, prints only specific statuses.
-139    Returns:
-140    None: This function doesn't return a value, but it prints the runtime details.
-141    """
-142    from datetime import datetime, timedelta
-143
-144    print("\nRuntime Summary")
-145    print("---------------")
-146    hist = t.jobs.getJobHistory(jobUuid=job_uuid)
-147
-148    def format_timedelta(td):
-149        hours, remainder = divmod(td.total_seconds(), 3600)
-150        minutes, seconds = divmod(remainder, 60)
-151        return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}"
-152
-153    time1 = datetime.strptime(hist[-1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-154    time0 = datetime.strptime(hist[0].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-155    total_time = time1 - time0
-156
-157    if verbose:
-158        print("\nDetailed Job History:")
-159        for event in hist:
-160            print(
-161                f"Event: {event.event}, Detail: {event.eventDetail}, Time: {event.created}"
-162            )
-163        print("\nSummary:")
-164
-165    for i in range(len(hist) - 1):
-166        if hist[i].eventDetail == "RUNNING":
-167            time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-168            time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-169            print("RUNNING time:", format_timedelta(time1 - time0))
-170        elif hist[i].eventDetail == "QUEUED":
-171            time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-172            time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ")
-173            print("QUEUED  time:", format_timedelta(time1 - time0))
-174
-175    print("TOTAL   time:", format_timedelta(total_time))
-176    print("---------------")
-
- - -

Get the runtime of a job. -Args: -t (object): The Tapis v3 client object. -job_uuid (str): The UUID of the job for which the runtime needs to be determined. -verbose (bool): If True, prints all history events. Otherwise, prints only specific statuses. -Returns: -None: This function doesn't return a value, but it prints the runtime details.

-
- - -
-
- - \ No newline at end of file diff --git a/docs/database.md b/docs/database.md new file mode 100644 index 0000000..d28a4ec --- /dev/null +++ b/docs/database.md @@ -0,0 +1,618 @@ +# Database Access + +This guide covers how to access and query DesignSafe research databases using dapi. DesignSafe provides access to several important research databases for earthquake engineering, geotechnical engineering, and natural hazards research. + +## 🗄️ Available Databases + +dapi provides access to three major research databases: + +| Database | Code | Description | Domain | +|----------|------|-------------|---------| +| **NGL** | `ngl` | Next Generation Liquefaction database | Geotechnical/Liquefaction | +| **Earthquake Recovery** | `eq` | Post-earthquake recovery database | Social/Economic impacts | +| **VP** | `vp` | Validation Portal database | Model validation | + +## 🚀 Quick Start + +```python +from dapi import DSClient + +# Initialize client +client = DSClient() + +# Query NGL database +df = client.db.ngl.read_sql("SELECT * FROM SITE LIMIT 5") +print(df) + +# Query with parameters +site_data = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_NAME = %s", + params=["Amagasaki"] +) +print(site_data) +``` + +## 🔐 Database Authentication + +### Environment Variables + +Database access requires additional authentication. Set these environment variables: + +```bash +# NGL Database +export NGL_DB_USER="dspublic" +export NGL_DB_PASSWORD="your_password" +export NGL_DB_HOST="database_host" +export NGL_DB_PORT="3306" + +# VP Database +export VP_DB_USER="dspublic" +export VP_DB_PASSWORD="your_password" +export VP_DB_HOST="database_host" +export VP_DB_PORT="3306" + +# Earthquake Recovery Database +export EQ_DB_USER="dspublic" +export EQ_DB_PASSWORD="your_password" +export EQ_DB_HOST="database_host" +export EQ_DB_PORT="3306" +``` + +### Using .env Files + +Create a `.env` file in your project: + +```bash +# .env file +DESIGNSAFE_USERNAME=your_username +DESIGNSAFE_PASSWORD=your_password + +# Database credentials +NGL_DB_USER=dspublic +NGL_DB_PASSWORD=your_db_password +NGL_DB_HOST=database_host +NGL_DB_PORT=3306 + +VP_DB_USER=dspublic +VP_DB_PASSWORD=your_db_password +VP_DB_HOST=database_host +VP_DB_PORT=3306 + +EQ_DB_USER=dspublic +EQ_DB_PASSWORD=your_db_password +EQ_DB_HOST=database_host +EQ_DB_PORT=3306 +``` + +## 📊 Basic Querying + +### Simple Queries + +```python +from dapi import DSClient + +client = DSClient() + +# Count records in NGL database +count_df = client.db.ngl.read_sql("SELECT COUNT(*) as total_sites FROM SITE") +print(f"Total sites: {count_df['total_sites'].iloc[0]}") + +# Get first 10 sites +sites_df = client.db.ngl.read_sql("SELECT * FROM SITE LIMIT 10") +print(sites_df) + +# Get site information +site_info = client.db.ngl.read_sql(""" + SELECT SITE_NAME, SITE_LAT, SITE_LON, SITE_GEOL + FROM SITE + WHERE SITE_LAT > 35 + ORDER BY SITE_NAME +""") +print(site_info) +``` + +### Parameterized Queries + +```python +# Query with single parameter +site_name = "Amagasaki" +site_data = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_NAME = %s", + params=[site_name] +) + +# Query with multiple parameters +min_lat, max_lat = 32.0, 38.0 +california_sites = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_LAT BETWEEN %s AND %s", + params=[min_lat, max_lat] +) + +# Query with named parameters (dictionary) +region_sites = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_LAT > %(min_lat)s AND SITE_LON < %(max_lon)s", + params={"min_lat": 35.0, "max_lon": -115.0} +) +``` + +## 🏗️ NGL Database (Next Generation Liquefaction) + +The NGL database contains comprehensive data on soil liquefaction case histories. + +### Key Tables + +```python +# Explore database structure +tables_info = client.db.ngl.read_sql("SHOW TABLES") +print("Available tables:") +print(tables_info) + +# Get table structure +site_structure = client.db.ngl.read_sql("DESCRIBE SITE") +print("SITE table structure:") +print(site_structure) +``` + +### Common NGL Queries + +```python +# Site information +sites = client.db.ngl.read_sql(""" + SELECT SITE_ID, SITE_NAME, SITE_LAT, SITE_LON, SITE_GEOL + FROM SITE + WHERE SITE_STAT = 1 -- Active sites only + ORDER BY SITE_NAME +""") + +# Sites with liquefaction data +liquefaction_sites = client.db.ngl.read_sql(""" + SELECT DISTINCT s.SITE_NAME, s.SITE_LAT, s.SITE_LON + FROM SITE s + JOIN RECORD r ON s.SITE_ID = r.SITE_ID + WHERE r.RECORD_STAT = 1 + ORDER BY s.SITE_NAME +""") + +# Earthquake events +earthquakes = client.db.ngl.read_sql(""" + SELECT DISTINCT EVENT_NAME, EVENT_DATE, EVENT_MAG + FROM EVENT + WHERE EVENT_STAT = 1 + ORDER BY EVENT_DATE DESC + LIMIT 20 +""") + +# CPT data summary +cpt_summary = client.db.ngl.read_sql(""" + SELECT + COUNT(*) as total_cpts, + AVG(CPT_DEPTH) as avg_depth, + MIN(CPT_DEPTH) as min_depth, + MAX(CPT_DEPTH) as max_depth + FROM CPT + WHERE CPT_STAT = 1 +""") +``` + +### Advanced NGL Analysis + +```python +# Sites with high liquefaction potential +high_risk_sites = client.db.ngl.read_sql(""" + SELECT + s.SITE_NAME, + s.SITE_LAT, + s.SITE_LON, + COUNT(l.LIQ_ID) as liquefaction_events, + AVG(e.EVENT_MAG) as avg_magnitude + FROM SITE s + JOIN RECORD r ON s.SITE_ID = r.SITE_ID + JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID + WHERE s.SITE_STAT = 1 AND r.RECORD_STAT = 1 + GROUP BY s.SITE_ID + HAVING liquefaction_events > 2 + ORDER BY liquefaction_events DESC, avg_magnitude DESC +""") + +# Correlation between soil properties and liquefaction +soil_correlation = client.db.ngl.read_sql(""" + SELECT + cpt.CPT_FC as fines_content, + cpt.CPT_D50 as median_grain_size, + COUNT(l.LIQ_ID) as liquefaction_cases, + AVG(e.EVENT_MAG) as avg_magnitude + FROM CPT cpt + JOIN RECORD r ON cpt.RECORD_ID = r.RECORD_ID + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID + WHERE cpt.CPT_STAT = 1 AND r.RECORD_STAT = 1 + AND cpt.CPT_FC IS NOT NULL AND cpt.CPT_D50 IS NOT NULL + GROUP BY + ROUND(cpt.CPT_FC, 1), + ROUND(cpt.CPT_D50, 2) + ORDER BY fines_content, median_grain_size +""") +``` + +## 🌪️ Earthquake Recovery Database + +The earthquake recovery database contains data on post-earthquake recovery processes. + +### Common EQ Queries + +```python +# Recovery milestones +recovery_data = client.db.eq.read_sql(""" + SELECT + event_name, + recovery_metric, + recovery_time_days, + affected_population + FROM recovery_metrics + WHERE recovery_time_days IS NOT NULL + ORDER BY event_name, recovery_time_days +""") + +# Economic impact analysis +economic_impact = client.db.eq.read_sql(""" + SELECT + region, + AVG(economic_loss_millions) as avg_loss, + SUM(displaced_households) as total_displaced, + COUNT(*) as num_events + FROM economic_impacts + GROUP BY region + ORDER BY avg_loss DESC +""") +``` + +## 🔬 VP Database (Validation Portal) + +The VP database contains model validation data and benchmarks. + +### Common VP Queries + +```python +# Model performance metrics +model_performance = client.db.vp.read_sql(""" + SELECT + model_name, + benchmark_case, + rmse_error, + correlation_coefficient, + validation_score + FROM model_validation + WHERE validation_score IS NOT NULL + ORDER BY validation_score DESC +""") + +# Benchmark cases +benchmarks = client.db.vp.read_sql(""" + SELECT + benchmark_id, + benchmark_name, + category, + difficulty_level, + num_participants + FROM benchmarks + ORDER BY category, difficulty_level +""") +``` + +## 📈 Data Analysis Patterns + +### Statistical Analysis + +```python +import pandas as pd +import matplotlib.pyplot as plt + +# Get site data for analysis +sites_df = client.db.ngl.read_sql(""" + SELECT SITE_LAT, SITE_LON, SITE_GEOL + FROM SITE + WHERE SITE_STAT = 1 AND SITE_LAT IS NOT NULL +""") + +# Basic statistics +print("Site distribution by geology:") +geology_counts = sites_df['SITE_GEOL'].value_counts() +print(geology_counts) + +# Geographic distribution +print(f"Latitude range: {sites_df['SITE_LAT'].min():.2f} to {sites_df['SITE_LAT'].max():.2f}") +print(f"Longitude range: {sites_df['SITE_LON'].min():.2f} to {sites_df['SITE_LON'].max():.2f}") + +# Export for further analysis +sites_df.to_csv("ngl_sites.csv", index=False) +``` + +### Time Series Analysis + +```python +# Earthquake timeline +earthquake_timeline = client.db.ngl.read_sql(""" + SELECT + EVENT_DATE, + EVENT_NAME, + EVENT_MAG, + COUNT(r.RECORD_ID) as num_records + FROM EVENT e + LEFT JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID + WHERE e.EVENT_STAT = 1 AND e.EVENT_DATE IS NOT NULL + GROUP BY e.EVENT_ID + ORDER BY e.EVENT_DATE +""") + +# Convert date column +earthquake_timeline['EVENT_DATE'] = pd.to_datetime(earthquake_timeline['EVENT_DATE']) + +# Analyze earthquake frequency by decade +earthquake_timeline['decade'] = (earthquake_timeline['EVENT_DATE'].dt.year // 10) * 10 +decade_summary = earthquake_timeline.groupby('decade').agg({ + 'EVENT_NAME': 'count', + 'EVENT_MAG': 'mean', + 'num_records': 'sum' +}).rename(columns={'EVENT_NAME': 'earthquake_count'}) + +print("Earthquake data by decade:") +print(decade_summary) +``` + +### Geospatial Analysis + +```python +# Sites by geographic region +regional_analysis = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN SITE_LAT > 40 THEN 'Northern' + WHEN SITE_LAT > 35 THEN 'Central' + ELSE 'Southern' + END as region, + CASE + WHEN SITE_LON > -100 THEN 'Eastern' + WHEN SITE_LON > -120 THEN 'Central' + ELSE 'Western' + END as longitude_zone, + COUNT(*) as site_count, + AVG(SITE_LAT) as avg_latitude, + AVG(SITE_LON) as avg_longitude + FROM SITE + WHERE SITE_STAT = 1 AND SITE_LAT IS NOT NULL AND SITE_LON IS NOT NULL + GROUP BY region, longitude_zone + ORDER BY region, longitude_zone +""") + +print("Geographic distribution of sites:") +print(regional_analysis) +``` + +## 🔄 Connection Management + +### Manual Connection Handling + +```python +# Access database connection directly +ngl_db = client.db.ngl + +# Check connection status +try: + test_query = ngl_db.read_sql("SELECT 1 as test") + print("✅ Database connection active") +except Exception as e: + print(f"❌ Database connection failed: {e}") + +# Close connections when done (optional - handled automatically) +ngl_db.close() +``` + +### Connection Pooling + +```python +# dapi automatically manages connection pooling +# Multiple queries reuse connections efficiently + +queries = [ + "SELECT COUNT(*) FROM SITE", + "SELECT COUNT(*) FROM RECORD", + "SELECT COUNT(*) FROM EVENT" +] + +for query in queries: + result = client.db.ngl.read_sql(query) + print(f"{query}: {result.iloc[0, 0]}") +``` + +## 🚨 Error Handling + +### Database Connection Errors + +```python +try: + df = client.db.ngl.read_sql("SELECT * FROM SITE LIMIT 5") + print("✅ Query successful") +except Exception as e: + print(f"❌ Database error: {e}") + + # Check environment variables + import os + required_vars = ['NGL_DB_USER', 'NGL_DB_PASSWORD', 'NGL_DB_HOST', 'NGL_DB_PORT'] + missing_vars = [var for var in required_vars if not os.getenv(var)] + + if missing_vars: + print(f"Missing environment variables: {missing_vars}") + else: + print("Environment variables are set, check database credentials") +``` + +### SQL Query Errors + +```python +try: + # Intentionally bad query + df = client.db.ngl.read_sql("SELECT * FROM NONEXISTENT_TABLE") +except Exception as e: + print(f"SQL Error: {e}") + + # Provide helpful debugging + print("💡 Tips:") + print("- Check table name spelling") + print("- Verify table exists: SHOW TABLES") + print("- Check column names: DESCRIBE table_name") +``` + +## 💡 Best Practices + +### 1. Use Parameterized Queries +```python +# ✅ Good - prevents SQL injection +safe_query = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_NAME = %s", + params=[user_input] +) + +# ❌ Dangerous - vulnerable to SQL injection +dangerous_query = client.db.ngl.read_sql( + f"SELECT * FROM SITE WHERE SITE_NAME = '{user_input}'" +) +``` + +### 2. Limit Result Sets +```python +# ✅ Good - use LIMIT for large tables +limited_query = client.db.ngl.read_sql( + "SELECT * FROM LARGE_TABLE LIMIT 1000" +) + +# ✅ Better - use pagination for very large datasets +offset = 0 +batch_size = 1000 +while True: + batch = client.db.ngl.read_sql( + "SELECT * FROM LARGE_TABLE LIMIT %s OFFSET %s", + params=[batch_size, offset] + ) + if batch.empty: + break + # Process batch + offset += batch_size +``` + +### 3. Efficient Joins +```python +# ✅ Good - use indexes and appropriate joins +efficient_query = client.db.ngl.read_sql(""" + SELECT s.SITE_NAME, COUNT(r.RECORD_ID) as record_count + FROM SITE s + LEFT JOIN RECORD r ON s.SITE_ID = r.SITE_ID + WHERE s.SITE_STAT = 1 + GROUP BY s.SITE_ID, s.SITE_NAME + ORDER BY record_count DESC + LIMIT 50 +""") +``` + +### 4. Data Validation +```python +# ✅ Good - validate data before analysis +df = client.db.ngl.read_sql("SELECT SITE_LAT, SITE_LON FROM SITE") + +# Check for missing values +missing_coords = df.isnull().sum() +print(f"Missing coordinates: {missing_coords}") + +# Remove invalid coordinates +valid_coords = df.dropna() +valid_coords = valid_coords[ + (valid_coords['SITE_LAT'].between(-90, 90)) & + (valid_coords['SITE_LON'].between(-180, 180)) +] +print(f"Valid coordinates: {len(valid_coords)}/{len(df)}") +``` + +## 📊 Export and Integration + +### Export to Different Formats + +```python +# Query data +df = client.db.ngl.read_sql(""" + SELECT s.SITE_NAME, s.SITE_LAT, s.SITE_LON, e.EVENT_NAME, e.EVENT_MAG + FROM SITE s + JOIN RECORD r ON s.SITE_ID = r.SITE_ID + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID + WHERE s.SITE_STAT = 1 AND r.RECORD_STAT = 1 +""") + +# Export to various formats +df.to_csv("ngl_data.csv", index=False) +df.to_excel("ngl_data.xlsx", index=False) +df.to_json("ngl_data.json", orient="records") + +# Export to GIS formats (requires geopandas) +try: + import geopandas as gpd + from shapely.geometry import Point + + # Create GeoDataFrame + geometry = [Point(xy) for xy in zip(df['SITE_LON'], df['SITE_LAT'])] + gdf = gpd.GeoDataFrame(df, geometry=geometry) + gdf.to_file("ngl_sites.geojson", driver="GeoJSON") + print("✅ Exported to GeoJSON") +except ImportError: + print("Install geopandas for GIS export: pip install geopandas") +``` + +### Integration with Analysis Tools + +```python +# Prepare data for machine learning +from sklearn.preprocessing import StandardScaler +from sklearn.model_selection import train_test_split + +# Get numeric features +features_df = client.db.ngl.read_sql(""" + SELECT + cpt.CPT_DEPTH, + cpt.CPT_QC, + cpt.CPT_FS, + cpt.CPT_FC, + e.EVENT_MAG, + CASE WHEN l.LIQ_ID IS NOT NULL THEN 1 ELSE 0 END as liquefied + FROM CPT cpt + JOIN RECORD r ON cpt.RECORD_ID = r.RECORD_ID + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE cpt.CPT_STAT = 1 AND r.RECORD_STAT = 1 + AND cpt.CPT_DEPTH IS NOT NULL + AND cpt.CPT_QC IS NOT NULL + AND cpt.CPT_FS IS NOT NULL + AND e.EVENT_MAG IS NOT NULL +""") + +# Remove missing values +clean_df = features_df.dropna() + +# Prepare features and target +X = clean_df[['CPT_DEPTH', 'CPT_QC', 'CPT_FS', 'CPT_FC', 'EVENT_MAG']] +y = clean_df['liquefied'] + +# Split and scale +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) +scaler = StandardScaler() +X_train_scaled = scaler.fit_transform(X_train) +X_test_scaled = scaler.transform(X_test) + +print(f"Training set: {X_train.shape}") +print(f"Test set: {X_test.shape}") +print(f"Liquefaction rate: {y.mean():.3f}") +``` + +## ➡️ Next Steps + +- **[Explore complete examples](examples/database.md)** showing real database workflows +- **Learn about file operations** for data management +- **Check API reference** for detailed method documentation +- **[Review job integration](jobs.md)** for computational workflows with database data \ No newline at end of file diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 0000000..3c520f7 --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,87 @@ +# Examples + +Welcome to the DAPI examples collection! These comprehensive tutorials demonstrate how to use DAPI for various computational workflows on DesignSafe. Each example includes complete, runnable code that you can try directly in DesignSafe's Jupyter environment. + + +## 🚀 Ready to Start? + +Choose an example above and click "Try on DesignSafe" to begin your computational research journey! + +Each example is self-contained and includes: +- ✅ Complete, runnable code +- ✅ Step-by-step explanations +- ✅ Real-world applications +- ✅ Troubleshooting guides +- ✅ Performance optimization tips + +*Happy computing!* 🎉 + +### 📱 Application Management +Discover and manage applications available on DesignSafe. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/apps.ipynb) + +**What you'll learn:** +- Searching for available applications +- Getting detailed app information +- Understanding app parameters and requirements + +--- + +### 🌊 Material Point Method (MPM) Jobs +Submit and monitor MPM simulations for large deformation problems. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/mpm/mpm-minimal.ipynb) + +**What you'll learn:** +- Setting up MPM job parameters +- Submitting jobs with resource optimization +- Monitoring job progress and status +- Downloading and analyzing results + +**[📖 View Full Documentation →](examples/mpm.md)** + +--- + +### 🏗️ OpenSees Structural Analysis +Perform earthquake engineering simulations with OpenSees. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/opensees/opensees-mp/OpenSeesMP-dapi.ipynb) + +**What you'll learn:** +- Configuring OpenSees Multi-Free Field Analysis +- Custom archive management for organized results +- Advanced postprocessing with response spectra +- Parametric studies across soil profiles + +**[📖 View Full Documentation →](examples/opensees.md)** + +--- + +### 📊 Database Queries +Access and analyze research data from DesignSafe databases. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/db.ipynb) + +**What you'll learn:** +- Connecting to research databases +- Writing efficient SQL queries +- Data visualization and analysis +- Working with geotechnical datasets + +**[📖 View Full Documentation →](examples/database.md)** + +--- + +## 🎯 Getting Started + +### Prerequisites +- DesignSafe account (free registration at [designsafe-ci.org](https://designsafe-ci.org)) +- Basic Python knowledge +- Familiarity with Jupyter notebooks + +### Quick Start +1. **Click any "Try on DesignSafe" button** above +2. **Log in** to your DesignSafe account +3. **Run the notebook** cell by cell +4. **Modify parameters** to explore different scenarios \ No newline at end of file diff --git a/docs/examples/database.md b/docs/examples/database.md new file mode 100644 index 0000000..777b6dd --- /dev/null +++ b/docs/examples/database.md @@ -0,0 +1,909 @@ +# Database Query Examples + +This comprehensive guide demonstrates how to query and analyze DesignSafe research databases using dapi. We'll explore the NGL (Next Generation Liquefaction) database with practical examples for earthquake engineering and geotechnical research. + +## 🎯 Overview + +This example covers: +- Setting up database connections +- Basic and advanced SQL queries +- Data analysis and visualization +- Exporting results for further analysis +- Best practices for database operations + +## 🚀 Complete Database Analysis Example + +### Step 1: Setup and Authentication + +```python +import os +import pandas as pd +import numpy as np +from dapi import DSClient +import matplotlib.pyplot as plt +import seaborn as sns +from datetime import datetime +import warnings +warnings.filterwarnings('ignore') + +# Initialize DSClient +try: + print("🔑 Initializing DSClient...") + client = DSClient() + print("✅ DSClient initialized successfully") + + # Test database connectivity + print("\n🔍 Testing database connections...") + + # Test NGL database + try: + test_ngl = client.db.ngl.read_sql("SELECT COUNT(*) as count FROM SITE") + print(f"✅ NGL Database: {test_ngl['count'].iloc[0]} sites available") + except Exception as e: + print(f"❌ NGL Database connection failed: {e}") + + # Test other databases (if available) + try: + test_vp = client.db.vp.read_sql("SELECT COUNT(*) as count FROM information_schema.tables") + print(f"✅ VP Database: Connected successfully") + except Exception as e: + print(f"⚠️ VP Database: {e}") + + try: + test_eq = client.db.eq.read_sql("SELECT COUNT(*) as count FROM information_schema.tables") + print(f"✅ EQ Database: Connected successfully") + except Exception as e: + print(f"⚠️ EQ Database: {e}") + +except Exception as e: + print(f"❌ Initialization failed: {e}") + raise SystemExit("Stopping due to initialization failure") +``` + +### Step 2: Database Structure Exploration + +```python +# Explore the NGL database structure +print("\n📊 Exploring NGL Database Structure") +print("=" * 50) + +# List all tables +try: + tables = client.db.ngl.read_sql("SHOW TABLES") + print(f"📋 Available tables ({len(tables)}):") + for i, table in enumerate(tables.iloc[:, 0], 1): + print(f" {i:2d}. {table}") + + # Get detailed information about key tables + key_tables = ['SITE', 'RECORD', 'EVENT', 'CPT', 'LIQUEFACTION'] + + print(f"\n🔍 Key Table Structures:") + for table in key_tables: + try: + structure = client.db.ngl.read_sql(f"DESCRIBE {table}") + print(f"\n📁 {table} table:") + print(f" Columns: {len(structure)}") + for _, row in structure.head(5).iterrows(): + null_str = "NULL" if row['Null'] == 'YES' else "NOT NULL" + print(f" - {row['Field']:20} {row['Type']:15} {null_str}") + if len(structure) > 5: + print(f" ... and {len(structure) - 5} more columns") + + except Exception as e: + print(f" ❌ Could not describe {table}: {e}") + +except Exception as e: + print(f"❌ Database exploration failed: {e}") +``` + +### Step 3: Basic Queries and Data Overview + +```python +# Basic data overview queries +print("\n📈 Database Overview and Statistics") +print("=" * 45) + +try: + # Site statistics + site_stats = client.db.ngl.read_sql(""" + SELECT + COUNT(*) as total_sites, + COUNT(DISTINCT SITE_GEOL) as unique_geologies, + MIN(SITE_LAT) as min_latitude, + MAX(SITE_LAT) as max_latitude, + MIN(SITE_LON) as min_longitude, + MAX(SITE_LON) as max_longitude + FROM SITE + WHERE SITE_STAT = 1 + """) + + print("🌍 Site Statistics:") + stats = site_stats.iloc[0] + print(f" Total active sites: {stats['total_sites']}") + print(f" Unique geologies: {stats['unique_geologies']}") + print(f" Latitude range: {stats['min_latitude']:.2f}° to {stats['max_latitude']:.2f}°") + print(f" Longitude range: {stats['min_longitude']:.2f}° to {stats['max_longitude']:.2f}°") + + # Record statistics + record_stats = client.db.ngl.read_sql(""" + SELECT + COUNT(*) as total_records, + COUNT(DISTINCT EVENT_ID) as unique_events, + COUNT(DISTINCT SITE_ID) as sites_with_records + FROM RECORD + WHERE RECORD_STAT = 1 + """) + + print(f"\n📊 Record Statistics:") + rec_stats = record_stats.iloc[0] + print(f" Total active records: {rec_stats['total_records']}") + print(f" Unique events: {rec_stats['unique_events']}") + print(f" Sites with records: {rec_stats['sites_with_records']}") + + # Event statistics + event_stats = client.db.ngl.read_sql(""" + SELECT + COUNT(*) as total_events, + MIN(EVENT_MAG) as min_magnitude, + MAX(EVENT_MAG) as max_magnitude, + AVG(EVENT_MAG) as avg_magnitude, + MIN(EVENT_DATE) as earliest_event, + MAX(EVENT_DATE) as latest_event + FROM EVENT + WHERE EVENT_STAT = 1 AND EVENT_MAG IS NOT NULL + """) + + print(f"\n🌪️ Earthquake Event Statistics:") + evt_stats = event_stats.iloc[0] + print(f" Total events: {evt_stats['total_events']}") + print(f" Magnitude range: {evt_stats['min_magnitude']:.1f} to {evt_stats['max_magnitude']:.1f}") + print(f" Average magnitude: {evt_stats['avg_magnitude']:.2f}") + print(f" Date range: {evt_stats['earliest_event']} to {evt_stats['latest_event']}") + +except Exception as e: + print(f"❌ Basic statistics query failed: {e}") +``` + +### Step 4: Geographic Analysis + +```python +# Geographic distribution analysis +print("\n🗺️ Geographic Distribution Analysis") +print("=" * 40) + +try: + # Sites by country/region (using latitude/longitude boundaries) + geographic_distribution = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN SITE_LAT > 49 THEN 'Canada' + WHEN SITE_LAT > 25 AND SITE_LON > -125 AND SITE_LON < -65 THEN 'United States' + WHEN SITE_LAT > 14 AND SITE_LAT < 33 AND SITE_LON > -118 AND SITE_LON < -86 THEN 'Mexico' + WHEN SITE_LAT > 30 AND SITE_LAT < 46 AND SITE_LON > 126 AND SITE_LON < 146 THEN 'Japan' + WHEN SITE_LAT > 35 AND SITE_LAT < 42 AND SITE_LON > 19 AND SITE_LON < 30 THEN 'Turkey' + WHEN SITE_LAT > -45 AND SITE_LAT < -10 AND SITE_LON > 110 AND SITE_LON < 155 THEN 'Australia' + WHEN SITE_LAT > -56 AND SITE_LAT < -17 AND SITE_LON > -75 AND SITE_LON < -34 THEN 'South America' + ELSE 'Other' + END as region, + COUNT(*) as site_count, + AVG(SITE_LAT) as avg_latitude, + AVG(SITE_LON) as avg_longitude + FROM SITE + WHERE SITE_STAT = 1 AND SITE_LAT IS NOT NULL AND SITE_LON IS NOT NULL + GROUP BY region + ORDER BY site_count DESC + """) + + print("🌎 Sites by Geographic Region:") + for _, row in geographic_distribution.iterrows(): + print(f" {row['region']:15}: {row['site_count']:3d} sites (avg: {row['avg_latitude']:6.2f}°, {row['avg_longitude']:7.2f}°)") + + # California sites analysis (high seismic activity region) + california_sites = client.db.ngl.read_sql(""" + SELECT + s.SITE_NAME, + s.SITE_LAT, + s.SITE_LON, + s.SITE_GEOL, + COUNT(r.RECORD_ID) as record_count + FROM SITE s + LEFT JOIN RECORD r ON s.SITE_ID = r.SITE_ID AND r.RECORD_STAT = 1 + WHERE s.SITE_STAT = 1 + AND s.SITE_LAT BETWEEN 32.5 AND 42.0 + AND s.SITE_LON BETWEEN -124.5 AND -114.0 + GROUP BY s.SITE_ID + ORDER BY record_count DESC, s.SITE_NAME + LIMIT 15 + """) + + print(f"\n🌉 California Sites (Top 15 by record count):") + for _, row in california_sites.iterrows(): + print(f" {row['SITE_NAME']:25} ({row['SITE_LAT']:6.2f}, {row['SITE_LON']:7.2f}) - {row['record_count']:2d} records - {row['SITE_GEOL']}") + +except Exception as e: + print(f"❌ Geographic analysis failed: {e}") +``` + +### Step 5: Earthquake Event Analysis + +```python +# Earthquake event analysis +print("\n🌪️ Earthquake Event Analysis") +print("=" * 35) + +try: + # Major earthquakes with liquefaction data + major_earthquakes = client.db.ngl.read_sql(""" + SELECT + e.EVENT_NAME, + e.EVENT_DATE, + e.EVENT_MAG, + e.EVENT_LAT, + e.EVENT_LON, + COUNT(DISTINCT r.SITE_ID) as affected_sites, + COUNT(r.RECORD_ID) as total_records, + COUNT(l.LIQ_ID) as liquefaction_cases + FROM EVENT e + JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID AND r.RECORD_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE e.EVENT_STAT = 1 AND e.EVENT_MAG >= 6.0 + GROUP BY e.EVENT_ID + ORDER BY e.EVENT_MAG DESC, liquefaction_cases DESC + LIMIT 20 + """) + + print("⚡ Major Earthquakes (M ≥ 6.0) with Liquefaction Data:") + print(f"{'Event':25} {'Date':12} {'Mag':4} {'Sites':6} {'Records':8} {'Liq Cases':10}") + print("-" * 70) + for _, row in major_earthquakes.iterrows(): + liq_rate = (row['liquefaction_cases'] / row['total_records'] * 100) if row['total_records'] > 0 else 0 + print(f"{row['EVENT_NAME'][:24]:25} {str(row['EVENT_DATE'])[:10]:12} {row['EVENT_MAG']:4.1f} {row['affected_sites']:6d} {row['total_records']:8d} {row['liquefaction_cases']:6d} ({liq_rate:4.1f}%)") + + # Magnitude distribution + magnitude_distribution = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN EVENT_MAG < 5.0 THEN 'M < 5.0' + WHEN EVENT_MAG < 6.0 THEN '5.0 ≤ M < 6.0' + WHEN EVENT_MAG < 7.0 THEN '6.0 ≤ M < 7.0' + WHEN EVENT_MAG < 8.0 THEN '7.0 ≤ M < 8.0' + ELSE 'M ≥ 8.0' + END as magnitude_range, + COUNT(*) as event_count, + COUNT(DISTINCT r.RECORD_ID) as total_records + FROM EVENT e + LEFT JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID AND r.RECORD_STAT = 1 + WHERE e.EVENT_STAT = 1 AND e.EVENT_MAG IS NOT NULL + GROUP BY magnitude_range + ORDER BY MIN(e.EVENT_MAG) + """) + + print(f"\n📊 Earthquake Magnitude Distribution:") + for _, row in magnitude_distribution.iterrows(): + print(f" {row['magnitude_range']:15}: {row['event_count']:3d} events, {row['total_records']:4d} records") + +except Exception as e: + print(f"❌ Earthquake analysis failed: {e}") +``` + +### Step 6: Liquefaction Analysis + +```python +# Detailed liquefaction analysis +print("\n💧 Liquefaction Analysis") +print("=" * 30) + +try: + # Liquefaction susceptibility by soil type + soil_liquefaction = client.db.ngl.read_sql(""" + SELECT + s.SITE_GEOL as geology, + COUNT(DISTINCT r.RECORD_ID) as total_records, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_cases, + ROUND(COUNT(DISTINCT l.LIQ_ID) * 100.0 / COUNT(DISTINCT r.RECORD_ID), 2) as liquefaction_rate, + AVG(e.EVENT_MAG) as avg_magnitude, + COUNT(DISTINCT s.SITE_ID) as unique_sites + FROM SITE s + JOIN RECORD r ON s.SITE_ID = r.SITE_ID AND r.RECORD_STAT = 1 + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE s.SITE_STAT = 1 AND s.SITE_GEOL IS NOT NULL AND s.SITE_GEOL != '' + GROUP BY s.SITE_GEOL + HAVING total_records >= 5 -- Only show geologies with sufficient data + ORDER BY liquefaction_rate DESC, total_records DESC + """) + + print("🏔️ Liquefaction Susceptibility by Geology:") + print(f"{'Geology':25} {'Records':8} {'Liq Cases':10} {'Rate %':8} {'Avg Mag':8} {'Sites':6}") + print("-" * 75) + for _, row in soil_liquefaction.iterrows(): + print(f"{row['geology'][:24]:25} {row['total_records']:8d} {row['liquefaction_cases']:10d} {row['liquefaction_rate']:8.1f} {row['avg_magnitude']:8.2f} {row['unique_sites']:6d}") + + # CPT-based analysis (if CPT data is available) + cpt_liquefaction = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN cpt.CPT_FC < 10 THEN 'Clean Sand (FC < 10%)' + WHEN cpt.CPT_FC < 35 THEN 'Silty Sand (10% ≤ FC < 35%)' + ELSE 'Clayey Soil (FC ≥ 35%)' + END as soil_classification, + COUNT(*) as cpt_count, + COUNT(l.LIQ_ID) as liquefaction_cases, + ROUND(COUNT(l.LIQ_ID) * 100.0 / COUNT(*), 2) as liquefaction_rate, + AVG(cpt.CPT_QC) as avg_tip_resistance, + AVG(e.EVENT_MAG) as avg_magnitude + FROM CPT cpt + JOIN RECORD r ON cpt.RECORD_ID = r.RECORD_ID AND r.RECORD_STAT = 1 + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE cpt.CPT_STAT = 1 AND cpt.CPT_FC IS NOT NULL + AND cpt.CPT_QC IS NOT NULL AND cpt.CPT_QC > 0 + GROUP BY soil_classification + ORDER BY liquefaction_rate DESC + """) + + if not cpt_liquefaction.empty: + print(f"\n🔬 CPT-based Liquefaction Analysis:") + print(f"{'Soil Classification':25} {'CPT Count':10} {'Liq Cases':10} {'Rate %':8} {'Avg qc':8} {'Avg Mag':8}") + print("-" * 80) + for _, row in cpt_liquefaction.iterrows(): + print(f"{row['soil_classification']:25} {row['cpt_count']:10d} {row['liquefaction_cases']:10d} {row['liquefaction_rate']:8.1f} {row['avg_tip_resistance']:8.1f} {row['avg_magnitude']:8.2f}") + + # Magnitude vs liquefaction relationship + magnitude_liquefaction = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN e.EVENT_MAG < 5.5 THEN 'M < 5.5' + WHEN e.EVENT_MAG < 6.5 THEN '5.5 ≤ M < 6.5' + WHEN e.EVENT_MAG < 7.5 THEN '6.5 ≤ M < 7.5' + ELSE 'M ≥ 7.5' + END as magnitude_range, + COUNT(DISTINCT r.RECORD_ID) as total_records, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_cases, + ROUND(COUNT(DISTINCT l.LIQ_ID) * 100.0 / COUNT(DISTINCT r.RECORD_ID), 2) as liquefaction_rate + FROM RECORD r + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE r.RECORD_STAT = 1 AND e.EVENT_MAG IS NOT NULL + GROUP BY magnitude_range + ORDER BY MIN(e.EVENT_MAG) + """) + + print(f"\n📈 Magnitude vs Liquefaction Relationship:") + for _, row in magnitude_liquefaction.iterrows(): + print(f" {row['magnitude_range']:15}: {row['liquefaction_cases']:3d}/{row['total_records']:3d} records ({row['liquefaction_rate']:5.1f}% liquefaction rate)") + +except Exception as e: + print(f"❌ Liquefaction analysis failed: {e}") +``` + +### Step 7: Time Series Analysis + +```python +# Temporal analysis of earthquake and liquefaction data +print("\n📅 Temporal Analysis") +print("=" * 25) + +try: + # Earthquake timeline by decade + temporal_analysis = client.db.ngl.read_sql(""" + SELECT + FLOOR(YEAR(e.EVENT_DATE) / 10) * 10 as decade, + COUNT(DISTINCT e.EVENT_ID) as earthquake_count, + COUNT(DISTINCT r.RECORD_ID) as record_count, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_cases, + AVG(e.EVENT_MAG) as avg_magnitude, + MAX(e.EVENT_MAG) as max_magnitude + FROM EVENT e + LEFT JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID AND r.RECORD_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE e.EVENT_STAT = 1 AND e.EVENT_DATE IS NOT NULL + GROUP BY decade + ORDER BY decade + """) + + print("📊 Earthquake Data by Decade:") + print(f"{'Decade':8} {'Events':8} {'Records':8} {'Liq Cases':10} {'Avg Mag':8} {'Max Mag':8}") + print("-" * 60) + for _, row in temporal_analysis.iterrows(): + decade_str = f"{int(row['decade'])}s" + print(f"{decade_str:8} {row['earthquake_count']:8d} {row['record_count']:8d} {row['liquefaction_cases']:10d} {row['avg_magnitude']:8.2f} {row['max_magnitude']:8.2f}") + + # Recent significant events (last 30 years) + recent_events = client.db.ngl.read_sql(""" + SELECT + e.EVENT_NAME, + e.EVENT_DATE, + e.EVENT_MAG, + COUNT(DISTINCT r.RECORD_ID) as records, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_cases + FROM EVENT e + JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID AND r.RECORD_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE e.EVENT_STAT = 1 + AND e.EVENT_DATE >= DATE_SUB(CURDATE(), INTERVAL 30 YEAR) + AND e.EVENT_MAG >= 6.0 + GROUP BY e.EVENT_ID + ORDER BY e.EVENT_DATE DESC + LIMIT 15 + """) + + if not recent_events.empty: + print(f"\n🕐 Recent Major Events (Last 30 Years, M ≥ 6.0):") + print(f"{'Event':30} {'Date':12} {'Mag':4} {'Records':8} {'Liq Cases':10}") + print("-" * 70) + for _, row in recent_events.iterrows(): + print(f"{row['EVENT_NAME'][:29]:30} {str(row['EVENT_DATE']):12} {row['EVENT_MAG']:4.1f} {row['records']:8d} {row['liquefaction_cases']:10d}") + +except Exception as e: + print(f"❌ Temporal analysis failed: {e}") +``` + +### Step 8: Advanced Statistical Analysis + +```python +# Advanced statistical correlations +print("\n📊 Advanced Statistical Analysis") +print("=" * 35) + +try: + # Correlation between earthquake parameters and liquefaction + correlation_data = client.db.ngl.read_sql(""" + SELECT + e.EVENT_MAG as magnitude, + cpt.CPT_DEPTH as depth, + cpt.CPT_QC as cone_resistance, + cpt.CPT_FS as sleeve_friction, + cpt.CPT_FC as fines_content, + CASE WHEN l.LIQ_ID IS NOT NULL THEN 1 ELSE 0 END as liquefied + FROM CPT cpt + JOIN RECORD r ON cpt.RECORD_ID = r.RECORD_ID AND r.RECORD_STAT = 1 + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE cpt.CPT_STAT = 1 + AND cpt.CPT_DEPTH IS NOT NULL AND cpt.CPT_DEPTH > 0 + AND cpt.CPT_QC IS NOT NULL AND cpt.CPT_QC > 0 + AND cpt.CPT_FS IS NOT NULL AND cpt.CPT_FS >= 0 + AND e.EVENT_MAG IS NOT NULL + LIMIT 5000 -- Limit for performance + """) + + if not correlation_data.empty and len(correlation_data) > 10: + print(f"📈 Statistical Summary (n = {len(correlation_data)} CPT records):") + + # Basic statistics + numeric_cols = ['magnitude', 'depth', 'cone_resistance', 'sleeve_friction', 'fines_content'] + stats_summary = correlation_data[numeric_cols].describe() + + print("\n📊 Descriptive Statistics:") + print(f"{'Parameter':20} {'Mean':10} {'Std':10} {'Min':10} {'Max':10}") + print("-" * 70) + for col in numeric_cols: + if col in stats_summary.columns: + mean_val = stats_summary.loc['mean', col] + std_val = stats_summary.loc['std', col] + min_val = stats_summary.loc['min', col] + max_val = stats_summary.loc['max', col] + print(f"{col:20} {mean_val:10.2f} {std_val:10.2f} {min_val:10.2f} {max_val:10.2f}") + + # Liquefaction statistics + liq_stats = correlation_data.groupby('liquefied').agg({ + 'magnitude': ['count', 'mean', 'std'], + 'depth': ['mean', 'std'], + 'cone_resistance': ['mean', 'std'], + 'fines_content': ['mean', 'std'] + }).round(2) + + total_cases = len(correlation_data) + liq_cases = correlation_data['liquefied'].sum() + liq_rate = liq_cases / total_cases * 100 + + print(f"\n💧 Liquefaction Statistics:") + print(f" Total cases: {total_cases}") + print(f" Liquefaction cases: {liq_cases} ({liq_rate:.1f}%)") + print(f" No liquefaction: {total_cases - liq_cases} ({100 - liq_rate:.1f}%)") + + # Simple correlation analysis + if 'fines_content' in correlation_data.columns: + clean_sand = correlation_data[correlation_data['fines_content'] < 10] + silty_sand = correlation_data[(correlation_data['fines_content'] >= 10) & (correlation_data['fines_content'] < 35)] + + if len(clean_sand) > 0: + clean_sand_liq_rate = clean_sand['liquefied'].mean() * 100 + print(f" Clean sand liquefaction rate: {clean_sand_liq_rate:.1f}% (n={len(clean_sand)})") + + if len(silty_sand) > 0: + silty_sand_liq_rate = silty_sand['liquefied'].mean() * 100 + print(f" Silty sand liquefaction rate: {silty_sand_liq_rate:.1f}% (n={len(silty_sand)})") + + else: + print("⚠️ Insufficient CPT data for statistical analysis") + +except Exception as e: + print(f"❌ Statistical analysis failed: {e}") +``` + +### Step 9: Data Export and Visualization Preparation + +```python +# Export data for visualization and further analysis +print("\n💾 Data Export and Preparation") +print("=" * 35) + +try: + # Create timestamp for file naming + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + # Export site data with coordinates + sites_export = client.db.ngl.read_sql(""" + SELECT + s.SITE_ID, + s.SITE_NAME, + s.SITE_LAT, + s.SITE_LON, + s.SITE_GEOL, + COUNT(DISTINCT r.RECORD_ID) as record_count, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_count, + COUNT(DISTINCT e.EVENT_ID) as event_count, + AVG(e.EVENT_MAG) as avg_magnitude + FROM SITE s + LEFT JOIN RECORD r ON s.SITE_ID = r.SITE_ID AND r.RECORD_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + LEFT JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + WHERE s.SITE_STAT = 1 AND s.SITE_LAT IS NOT NULL AND s.SITE_LON IS NOT NULL + GROUP BY s.SITE_ID + ORDER BY s.SITE_NAME + """) + + # Export earthquake events + events_export = client.db.ngl.read_sql(""" + SELECT + e.EVENT_ID, + e.EVENT_NAME, + e.EVENT_DATE, + e.EVENT_MAG, + e.EVENT_LAT, + e.EVENT_LON, + COUNT(DISTINCT r.RECORD_ID) as affected_sites, + COUNT(DISTINCT l.LIQ_ID) as liquefaction_cases + FROM EVENT e + LEFT JOIN RECORD r ON e.EVENT_ID = r.EVENT_ID AND r.RECORD_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE e.EVENT_STAT = 1 + GROUP BY e.EVENT_ID + ORDER BY e.EVENT_DATE DESC + """) + + # Export summary statistics + summary_export = client.db.ngl.read_sql(""" + SELECT + 'Total Sites' as metric, + COUNT(DISTINCT s.SITE_ID) as value + FROM SITE s WHERE s.SITE_STAT = 1 + UNION ALL + SELECT + 'Total Events' as metric, + COUNT(DISTINCT e.EVENT_ID) as value + FROM EVENT e WHERE e.EVENT_STAT = 1 + UNION ALL + SELECT + 'Total Records' as metric, + COUNT(DISTINCT r.RECORD_ID) as value + FROM RECORD r WHERE r.RECORD_STAT = 1 + UNION ALL + SELECT + 'Liquefaction Cases' as metric, + COUNT(DISTINCT l.LIQ_ID) as value + FROM LIQUEFACTION l + """) + + # Save to CSV files + output_dir = f"ngl_analysis_{timestamp}" + os.makedirs(output_dir, exist_ok=True) + + sites_export.to_csv(f"{output_dir}/ngl_sites.csv", index=False) + events_export.to_csv(f"{output_dir}/ngl_events.csv", index=False) + summary_export.to_csv(f"{output_dir}/ngl_summary.csv", index=False) + + print(f"✅ Data exported to {output_dir}/") + print(f" - ngl_sites.csv: {len(sites_export)} sites") + print(f" - ngl_events.csv: {len(events_export)} events") + print(f" - ngl_summary.csv: Database summary statistics") + + # Create a simple visualization script + viz_script = f""" +# Quick visualization script for NGL data +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns + +# Load data +sites = pd.read_csv('{output_dir}/ngl_sites.csv') +events = pd.read_csv('{output_dir}/ngl_events.csv') + +# Create visualizations +fig, axes = plt.subplots(2, 2, figsize=(15, 12)) + +# Site locations +axes[0,0].scatter(sites['SITE_LON'], sites['SITE_LAT'], + c=sites['liquefaction_count'], cmap='Reds', alpha=0.6) +axes[0,0].set_xlabel('Longitude') +axes[0,0].set_ylabel('Latitude') +axes[0,0].set_title('Site Locations (colored by liquefaction count)') + +# Event magnitude distribution +events['EVENT_MAG'].hist(bins=20, ax=axes[0,1]) +axes[0,1].set_xlabel('Magnitude') +axes[0,1].set_ylabel('Frequency') +axes[0,1].set_title('Earthquake Magnitude Distribution') + +# Records per site +sites['record_count'].hist(bins=30, ax=axes[1,0]) +axes[1,0].set_xlabel('Number of Records') +axes[1,0].set_ylabel('Number of Sites') +axes[1,0].set_title('Distribution of Records per Site') + +# Liquefaction rate by geology +geology_stats = sites.groupby('SITE_GEOL').agg({{ + 'liquefaction_count': 'sum', + 'record_count': 'sum' +}}).reset_index() +geology_stats['liq_rate'] = geology_stats['liquefaction_count'] / geology_stats['record_count'] * 100 +geology_stats = geology_stats[geology_stats['record_count'] >= 10].sort_values('liq_rate', ascending=True) + +if len(geology_stats) > 0: + geology_stats.plot(x='SITE_GEOL', y='liq_rate', kind='barh', ax=axes[1,1]) + axes[1,1].set_xlabel('Liquefaction Rate (%)') + axes[1,1].set_title('Liquefaction Rate by Geology') + +plt.tight_layout() +plt.savefig('{output_dir}/ngl_analysis_plots.png', dpi=300, bbox_inches='tight') +plt.show() + +print("✅ Visualizations saved to {output_dir}/ngl_analysis_plots.png") +""" + + with open(f"{output_dir}/create_visualizations.py", "w") as f: + f.write(viz_script) + + print(f"📊 Visualization script created: {output_dir}/create_visualizations.py") + print(" Run this script to generate plots from the exported data") + +except Exception as e: + print(f"❌ Data export failed: {e}") +``` + +### Step 10: Advanced Query Examples + +```python +# Advanced query patterns for specific research questions +print("\n🔬 Advanced Research Query Examples") +print("=" * 40) + +# Research Question 1: Distance-dependent liquefaction +try: + distance_analysis = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN distance_km < 10 THEN '< 10 km' + WHEN distance_km < 25 THEN '10-25 km' + WHEN distance_km < 50 THEN '25-50 km' + WHEN distance_km < 100 THEN '50-100 km' + ELSE '> 100 km' + END as distance_range, + COUNT(*) as total_records, + COUNT(l.LIQ_ID) as liquefaction_cases, + ROUND(COUNT(l.LIQ_ID) * 100.0 / COUNT(*), 2) as liquefaction_rate, + AVG(e.EVENT_MAG) as avg_magnitude + FROM ( + SELECT + r.*, + e.*, + l.LIQ_ID, + CASE + WHEN e.EVENT_LAT IS NOT NULL AND e.EVENT_LON IS NOT NULL + AND s.SITE_LAT IS NOT NULL AND s.SITE_LON IS NOT NULL + THEN 111.32 * SQRT( + POW(e.EVENT_LAT - s.SITE_LAT, 2) + + POW((e.EVENT_LON - s.SITE_LON) * COS(RADIANS(s.SITE_LAT)), 2) + ) + ELSE NULL + END as distance_km + FROM RECORD r + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + JOIN SITE s ON r.SITE_ID = s.SITE_ID AND s.SITE_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE r.RECORD_STAT = 1 + ) AS distance_calc + WHERE distance_km IS NOT NULL AND distance_km <= 200 + GROUP BY distance_range + ORDER BY MIN(distance_km) + """) + + if not distance_analysis.empty: + print("📏 Distance-Dependent Liquefaction Analysis:") + print(f"{'Distance':12} {'Records':8} {'Liq Cases':10} {'Rate %':8} {'Avg Mag':8}") + print("-" * 55) + for _, row in distance_analysis.iterrows(): + print(f"{row['distance_range']:12} {row['total_records']:8d} {row['liquefaction_cases']:10d} {row['liquefaction_rate']:8.1f} {row['avg_magnitude']:8.2f}") + +except Exception as e: + print(f"⚠️ Distance analysis query failed (likely due to missing coordinates): {e}") + +# Research Question 2: Depth-dependent liquefaction susceptibility +try: + depth_analysis = client.db.ngl.read_sql(""" + SELECT + CASE + WHEN cpt.CPT_DEPTH < 5 THEN '0-5 m' + WHEN cpt.CPT_DEPTH < 10 THEN '5-10 m' + WHEN cpt.CPT_DEPTH < 15 THEN '10-15 m' + WHEN cpt.CPT_DEPTH < 20 THEN '15-20 m' + ELSE '> 20 m' + END as depth_range, + COUNT(*) as cpt_count, + COUNT(l.LIQ_ID) as liquefaction_cases, + ROUND(COUNT(l.LIQ_ID) * 100.0 / COUNT(*), 2) as liquefaction_rate, + AVG(cpt.CPT_QC) as avg_cone_resistance, + AVG(e.EVENT_MAG) as avg_magnitude + FROM CPT cpt + JOIN RECORD r ON cpt.RECORD_ID = r.RECORD_ID AND r.RECORD_STAT = 1 + JOIN EVENT e ON r.EVENT_ID = e.EVENT_ID AND e.EVENT_STAT = 1 + LEFT JOIN LIQUEFACTION l ON r.RECORD_ID = l.RECORD_ID + WHERE cpt.CPT_STAT = 1 AND cpt.CPT_DEPTH IS NOT NULL AND cpt.CPT_DEPTH > 0 + GROUP BY depth_range + ORDER BY MIN(cpt.CPT_DEPTH) + """) + + if not depth_analysis.empty: + print(f"\n🕳️ Depth-Dependent Liquefaction Analysis:") + print(f"{'Depth Range':12} {'CPT Count':10} {'Liq Cases':10} {'Rate %':8} {'Avg qc':8} {'Avg Mag':8}") + print("-" * 70) + for _, row in depth_analysis.iterrows(): + print(f"{row['depth_range']:12} {row['cpt_count']:10d} {row['liquefaction_cases']:10d} {row['liquefaction_rate']:8.1f} {row['avg_cone_resistance']:8.1f} {row['avg_magnitude']:8.2f}") + +except Exception as e: + print(f"⚠️ Depth analysis query failed: {e}") +``` + +### Step 11: Performance and Best Practices + +```python +# Demonstrate best practices for database queries +print("\n⚡ Query Performance and Best Practices") +print("=" * 45) + +try: + # Example of efficient querying with indexing + print("💡 Best Practice Examples:") + + # 1. Use LIMIT for large datasets + print("\n1. Using LIMIT for large datasets:") + large_query_start = datetime.now() + limited_results = client.db.ngl.read_sql(""" + SELECT s.SITE_NAME, s.SITE_LAT, s.SITE_LON + FROM SITE s + WHERE s.SITE_STAT = 1 + LIMIT 100 + """) + large_query_time = (datetime.now() - large_query_start).total_seconds() + print(f" Retrieved {len(limited_results)} sites in {large_query_time:.3f} seconds") + + # 2. Use WHERE clauses to filter early + print("\n2. Filtering with WHERE clauses:") + filtered_query_start = datetime.now() + filtered_results = client.db.ngl.read_sql(""" + SELECT COUNT(*) as count + FROM SITE s + WHERE s.SITE_STAT = 1 + AND s.SITE_LAT BETWEEN 32 AND 42 + AND s.SITE_LON BETWEEN -125 AND -115 + """) + filtered_query_time = (datetime.now() - filtered_query_start).total_seconds() + print(f" Filtered query completed in {filtered_query_time:.3f} seconds") + print(f" Found {filtered_results['count'].iloc[0]} sites in specified region") + + # 3. Use parameterized queries for safety + print("\n3. Parameterized queries (secure):") + site_name = "Amagasaki" + param_query_start = datetime.now() + param_results = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_NAME = %s AND SITE_STAT = 1", + params=[site_name] + ) + param_query_time = (datetime.now() - param_query_start).total_seconds() + print(f" Parameterized query for '{site_name}' completed in {param_query_time:.3f} seconds") + print(f" Found {len(param_results)} matching sites") + + # 4. Efficient aggregation + print("\n4. Efficient aggregation:") + agg_query_start = datetime.now() + agg_results = client.db.ngl.read_sql(""" + SELECT + s.SITE_GEOL, + COUNT(*) as site_count, + AVG(s.SITE_LAT) as avg_lat + FROM SITE s + WHERE s.SITE_STAT = 1 AND s.SITE_GEOL IS NOT NULL + GROUP BY s.SITE_GEOL + HAVING site_count >= 5 + ORDER BY site_count DESC + LIMIT 10 + """) + agg_query_time = (datetime.now() - agg_query_start).total_seconds() + print(f" Aggregation query completed in {agg_query_time:.3f} seconds") + print(f" Top geology types: {', '.join(agg_results['SITE_GEOL'].head(3).tolist())}") + + print(f"\n✅ All queries completed successfully!") + print(f"💡 Tips for optimal performance:") + print(f" - Always use LIMIT for exploratory queries") + print(f" - Filter early with WHERE clauses") + print(f" - Use parameterized queries for user inputs") + print(f" - Consider creating indexes for frequently queried columns") + print(f" - Use appropriate JOIN types (INNER vs LEFT)") + +except Exception as e: + print(f"❌ Performance demonstration failed: {e}") +``` + +### Step 12: Summary and Cleanup + +```python +# Final summary and cleanup +print("\n" + "=" * 60) +print("🎯 Database Analysis Summary") +print("=" * 60) + +try: + # Get final statistics + final_stats = client.db.ngl.read_sql(""" + SELECT + (SELECT COUNT(*) FROM SITE WHERE SITE_STAT = 1) as total_sites, + (SELECT COUNT(*) FROM EVENT WHERE EVENT_STAT = 1) as total_events, + (SELECT COUNT(*) FROM RECORD WHERE RECORD_STAT = 1) as total_records, + (SELECT COUNT(*) FROM LIQUEFACTION) as total_liquefaction, + (SELECT COUNT(*) FROM CPT WHERE CPT_STAT = 1) as total_cpt + """) + + stats = final_stats.iloc[0] + print(f"📊 Final Database Statistics:") + print(f" Active Sites: {stats['total_sites']:,}") + print(f" Earthquake Events: {stats['total_events']:,}") + print(f" Records: {stats['total_records']:,}") + print(f" Liquefaction Cases: {stats['total_liquefaction']:,}") + print(f" CPT Tests: {stats['total_cpt']:,}") + + # Calculate liquefaction rate + if stats['total_records'] > 0: + overall_liq_rate = stats['total_liquefaction'] / stats['total_records'] * 100 + print(f" Overall Liquefaction Rate: {overall_liq_rate:.2f}%") + + print(f"\n📁 Generated Files:") + if 'output_dir' in locals(): + print(f" - Data exports in: {output_dir}/") + print(f" - Visualization script: {output_dir}/create_visualizations.py") + + print(f"\n🎓 Key Findings:") + print(f" - Geographic distribution spans multiple continents") + print(f" - Earthquake magnitudes range from minor to major events") + print(f" - Liquefaction susceptibility varies significantly by soil type") + print(f" - Strong correlation between magnitude and liquefaction occurrence") + + print(f"\n📚 Next Steps:") + print(f" - Run visualization script to create plots") + print(f" - Perform statistical analysis on exported data") + print(f" - Integrate with machine learning workflows") + print(f" - Compare with other research databases") + + # Optional: Close database connections (handled automatically) + print(f"\n✅ Analysis completed successfully!") + +except Exception as e: + print(f"❌ Final summary failed: {e}") + +print(f"\n📖 For more database examples:") +print(f" - https://designsafe-ci.github.io/dapi/database/") +print(f" - https://github.com/DesignSafe-CI/dapi/examples/") +``` + +This comprehensive example demonstrates advanced database querying techniques, including geographic analysis, temporal trends, statistical correlations, and best practices for working with large research databases using dapi. \ No newline at end of file diff --git a/docs/examples/mpm.md b/docs/examples/mpm.md new file mode 100644 index 0000000..3f2a853 --- /dev/null +++ b/docs/examples/mpm.md @@ -0,0 +1,652 @@ +# MPM Job Submission Example + +This comprehensive example demonstrates how to submit and monitor a Material Point Method (MPM) job using dapi. MPM is a particle-based method for simulating large deformation problems in geomechanics and fluid mechanics. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/mpm/mpm-minimal.ipynb) + +## 🎯 Overview + +This example covers: + +- Setting up authentication and environment +- Discovering available MPM applications +- Preparing input files and directories +- Generating and customizing job requests +- Submitting and monitoring jobs +- Accessing and analyzing results + +## 🚀 Complete Example + +### Step 1: Setup and Authentication + +```python +import os +from dapi import ( + DSClient, + SubmittedJob, + interpret_job_status, + AppDiscoveryError, + FileOperationError, + JobSubmissionError, + JobMonitorError, + STATUS_TIMEOUT, + STATUS_UNKNOWN, + TAPIS_TERMINAL_STATES, +) +import json +from datetime import datetime +import pandas as pd + +# Initialize DSClient with authentication +try: + print("Initializing DSClient...") + ds = DSClient() + print("DSClient initialized successfully.") +except Exception as e: + print(f"Initialization failed: {e}") + raise SystemExit("Stopping due to client initialization failure.") +``` + +### Step 2: Configure Job Parameters + +```python +# Job configuration +ds_path: str = "/MyData/mpm-benchmarks/2d/uniaxial_stress/" +input_filename: str = "mpm.json" +max_job_minutes: int = 10 +tacc_allocation: str = "ASC25049" # Replace with your allocation +app_id_to_use = "mpm-s3" + +# Optional queue override (use default if not specified) +# queue: str = "skx" # Uncomment to override default queue +``` + +### Step 3: Verify Input Path and Files + +```python +# Translate and verify DesignSafe path +try: + input_uri = ds.files.translate_path_to_uri(ds_path, verify_exists=True) + print(f"✅ Input Directory URI: {input_uri}") + + # List files in the input directory + print("\n📁 Files in input directory:") + files = ds.files.list(input_uri) + for file in files: + print(f" - {file.name} ({file.type}, {file.size} bytes)") + + # Verify required input file exists + input_files = [f.name for f in files] + if input_filename not in input_files: + raise FileOperationError(f"Required file '{input_filename}' not found in {ds_path}") + print(f"✅ Required input file '{input_filename}' found") + +except FileOperationError as e: + print(f"❌ Path verification failed: {e}") + raise SystemExit("Stopping due to path verification error.") +``` + +### Step 4: Discover and Inspect MPM Applications + +```python +# Find available MPM applications +print("\n🔍 Discovering available applications...") +try: + mpm_apps = ds.apps.find("mpm", verbose=True) + print(f"Found {len(mpm_apps)} MPM applications") + + # Get detailed information about the specific app + app_details = ds.apps.get_details(app_id_to_use, verbose=True) + if not app_details: + raise AppDiscoveryError(f"App '{app_id_to_use}' not found") + + print(f"\n📋 Using Application: {app_details.id}") + print(f" Version: {app_details.version}") + print(f" Description: {app_details.description}") + print(f" Execution System: {app_details.jobAttributes.execSystemId}") + print(f" Default Queue: {app_details.jobAttributes.execSystemLogicalQueue}") + print(f" Max Runtime: {app_details.jobAttributes.maxMinutes} minutes") + print(f" Default Cores: {app_details.jobAttributes.coresPerNode}") + +except (AppDiscoveryError, Exception) as e: + print(f"❌ App discovery failed: {e}") + raise SystemExit("Stopping due to app discovery error.") +``` + +### Step 5: Generate Job Request + +```python +# Generate job request with automatic parameter mapping +try: + print("\n⚙️ Generating job request...") + job_dict = ds.jobs.generate_request( + app_id=app_id_to_use, + input_dir_uri=input_uri, + script_filename=input_filename, + max_minutes=max_job_minutes, + allocation=tacc_allocation, + # Optional parameters + job_name=f"mpm_uniaxial_stress_{datetime.now().strftime('%Y%m%d_%H%M%S')}", + description="MPM simulation of uniaxial stress test using dapi", + tags=["research", "mpm", "geomechanics", "uniaxial-stress"], + node_count=1, + cores_per_node=1, # Start with single core for testing + ) + + print("✅ Job request generated successfully") + + # Display the generated job request + print("\n📄 Generated Job Request:") + print(json.dumps(job_dict, indent=2, default=str)) + +except (AppDiscoveryError, ValueError, JobSubmissionError) as e: + print(f"❌ Job request generation failed: {e}") + raise SystemExit("Stopping due to job request generation error.") +``` + +### Step 6: Customize Job Request (Optional) + +```python +# Optional: Modify job request before submission +print("\n🔧 Customizing job request...") + +# Ensure we're using minimal resources for this example +job_dict["nodeCount"] = 1 +job_dict["coresPerNode"] = 1 +job_dict["maxMinutes"] = max_job_minutes + +# Add environment variables if needed +if "parameterSet" not in job_dict: + job_dict["parameterSet"] = {} +if "envVariables" not in job_dict["parameterSet"]: + job_dict["parameterSet"]["envVariables"] = [] + +# Example: Add OpenMP thread control +job_dict["parameterSet"]["envVariables"].append({ + "key": "OMP_NUM_THREADS", + "value": "1" +}) + +print("✅ Job request customized") +print(f" Nodes: {job_dict['nodeCount']}") +print(f" Cores per node: {job_dict['coresPerNode']}") +print(f" Max runtime: {job_dict['maxMinutes']} minutes") +``` + +### Step 7: Submit Job + +```python +# Submit the job +try: + print("\n🚀 Submitting job...") + submitted_job = ds.jobs.submit_request(job_dict) + print(f"✅ Job submitted successfully!") + print(f" Job UUID: {submitted_job.uuid}") + print(f" Job Name: {job_dict['name']}") + + # Save job UUID for later reference + job_uuid = submitted_job.uuid + with open("current_mpm_job.txt", "w") as f: + f.write(f"{job_uuid}\n{datetime.now().isoformat()}\n") + print(f" Job UUID saved to: current_mpm_job.txt") + +except JobSubmissionError as e: + print(f"❌ Job submission failed: {e}") + print("\n🔍 Failed Job Request Details:") + print(json.dumps(job_dict, indent=2, default=str)) + raise SystemExit("Stopping due to job submission error.") +``` + +### Step 8: Monitor Job Progress + +```python +# Monitor job with real-time progress +try: + print(f"\n👀 Monitoring job {submitted_job.uuid}...") + print(" Use Ctrl+C to interrupt monitoring (job will continue running)") + + # Monitor with custom interval + final_status = submitted_job.monitor(interval=15) # Check every 15 seconds + + print(f"\n🏁 Job monitoring completed!") + print(f" Final Status: {final_status}") + +except KeyboardInterrupt: + print(f"\n⏸️ Monitoring interrupted by user") + print(f" Job is still running. UUID: {submitted_job.uuid}") + print(f" Check status later with: ds.jobs.get_status('{submitted_job.uuid}')") + final_status = "INTERRUPTED" +except Exception as e: + print(f"\n❌ Monitoring error: {e}") + final_status = "MONITOR_ERROR" +``` + +### Step 9: Interpret Results + +```python +# Interpret the final job status +print("\n📊 Job Results Analysis") +print("=" * 50) + +# Use the built-in status interpretation +ds.jobs.interpret_status(final_status, submitted_job.uuid) + +# Additional analysis based on status +if final_status == "FINISHED": + print("\n✅ SUCCESS: Job completed successfully!") + + # Get runtime summary + try: + print("\n⏱️ Runtime Summary:") + submitted_job.print_runtime_summary(verbose=False) + except Exception as e: + print(f"Could not display runtime summary: {e}") + +elif final_status == "FAILED": + print("\n❌ FAILURE: Job failed during execution") + print("💡 Check the troubleshooting section below for common issues") + +elif final_status in ["TIMEOUT", "INTERRUPTED"]: + print(f"\n⚠️ WARNING: Job monitoring {final_status.lower()}") + print(" Job may still be running on the compute system") + + # Check current status + try: + current_status = submitted_job.get_status() + print(f" Current job status: {current_status}") + except Exception as e: + print(f" Could not check current status: {e}") +``` + +### Step 10: Access Job Outputs + +```python +# Access job outputs and results +if final_status in TAPIS_TERMINAL_STATES: + print("\n📁 Accessing Job Outputs") + print("-" * 30) + + try: + # Get archive URI + archive_uri = submitted_job.archive_uri + if archive_uri: + print(f"📍 Job Archive URI: {archive_uri}") + + # List all files in the archive + print("\n📋 Files in job archive:") + outputs = submitted_job.list_outputs() + for output in outputs: + size_mb = output.size / (1024 * 1024) if output.size else 0 + print(f" - {output.name} ({output.type}, {size_mb:.2f} MB)") + + # Read job output log + print("\n📜 Job Output (last 50 lines):") + stdout_content = submitted_job.get_output_content( + "tapisjob.out", + max_lines=50, + missing_ok=True + ) + if stdout_content: + print("```") + print(stdout_content) + print("```") + else: + print(" No output log available") + + # Check for errors if job failed + if final_status == "FAILED": + print("\n🚨 Error Analysis:") + stderr_content = submitted_job.get_output_content( + "tapisjob.err", + max_lines=50, + missing_ok=True + ) + if stderr_content: + print("Error log:") + print("```") + print(stderr_content) + print("```") + else: + print(" No error log found (errors may be in main output)") + + else: + print("❌ Archive URI not available") + + except FileOperationError as e: + print(f"❌ Could not access job outputs: {e}") + except Exception as e: + print(f"❌ Unexpected error accessing outputs: {e}") +``` + +### Step 11: Download Results (Optional) + +```python +# Download specific result files +if final_status == "FINISHED": + print("\n💾 Downloading Results") + print("-" * 25) + + try: + # Create local results directory + local_results_dir = f"mpm_results_{job_uuid[:8]}" + os.makedirs(local_results_dir, exist_ok=True) + + # Download key files + files_to_download = ["tapisjob.out", "tapisjob.err"] + + for filename in files_to_download: + try: + local_path = os.path.join(local_results_dir, filename) + submitted_job.download_output(filename, local_path) + print(f"✅ Downloaded: {filename} -> {local_path}") + except Exception as e: + print(f"⚠️ Could not download {filename}: {e}") + + # List any MPM-specific output files and download them + try: + outputs = submitted_job.list_outputs() + mpm_files = [f for f in outputs if f.name.endswith(('.vtu', '.vtk', '.csv', '.txt')) + and f.type == 'file'] + + for mpm_file in mpm_files: + try: + local_path = os.path.join(local_results_dir, mpm_file.name) + submitted_job.download_output(mpm_file.name, local_path) + print(f"✅ Downloaded MPM result: {mpm_file.name} -> {local_path}") + except Exception as e: + print(f"⚠️ Could not download {mpm_file.name}: {e}") + + except Exception as e: + print(f"⚠️ Could not list/download MPM output files: {e}") + + print(f"\n📁 Results saved in: {local_results_dir}/") + + except Exception as e: + print(f"❌ Error during download: {e}") +``` + +### Step 12: Status Summary and Next Steps + +```python +# Final summary +print("\n" + "=" * 60) +print("🎯 MPM Job Submission Summary") +print("=" * 60) +print(f"Job UUID: {submitted_job.uuid}") +print(f"Job Name: {job_dict['name']}") +print(f"Final Status: {final_status}") +print(f"Application: {app_id_to_use}") +print(f"Input Directory: {ds_path}") +print(f"Input File: {input_filename}") + +if final_status == "FINISHED": + print("✅ Status: SUCCESS - Job completed successfully") + print("💡 Next steps:") + print(" - Analyze results in the downloaded files") + print(" - Visualize outputs using ParaView (for .vtu files)") + print(" - Compare with expected results") + +elif final_status == "FAILED": + print("❌ Status: FAILED - Job execution failed") + print("💡 Troubleshooting steps:") + print(" - Review error logs above") + print(" - Check input file format and parameters") + print(" - Verify resource requirements are reasonable") + print(" - Contact support if issues persist") + +elif final_status in ["TIMEOUT", "INTERRUPTED"]: + print(f"⚠️ Status: {final_status} - Monitoring stopped") + print("💡 Check job status later:") + print(f" current_status = ds.jobs.get_status('{submitted_job.uuid}')") + +else: + print(f"❓ Status: {final_status} - Unexpected final status") + +print("\n📚 For more examples and documentation:") +print(" - https://designsafe-ci.github.io/dapi") +print(" - https://github.com/DesignSafe-CI/dapi") +``` + +## 🔧 Advanced Customization + +### Custom Resource Requirements + +```python +# For larger simulations, customize resources +advanced_job_request = ds.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="large_simulation.json", + + # High-performance configuration + max_minutes=240, # 4 hours + node_count=4, # Multiple nodes + cores_per_node=48, # Full node utilization + memory_mb=192000, # 192 GB RAM + queue="normal", # Production queue + allocation=tacc_allocation, + + # Job metadata + job_name="mpm_large_scale_analysis", + description="Large-scale MPM simulation with multiple materials", + tags=["research", "mpm", "large-scale", "multi-material"], + + # Additional environment variables + extra_env_vars=[ + {"key": "OMP_NUM_THREADS", "value": "48"}, + {"key": "MPM_VERBOSE", "value": "1"}, + {"key": "MPM_OUTPUT_FREQ", "value": "100"} + ] +) +``` + +### Parametric Study Example [Work In Progress] + +```python +# Submit multiple jobs with different parameters +parameters = [ + {"friction": 0.1, "cohesion": 1000, "density": 2000}, + {"friction": 0.2, "cohesion": 1500, "density": 2200}, + {"friction": 0.3, "cohesion": 2000, "density": 2400}, +] + +submitted_jobs = [] + +for i, params in enumerate(parameters): + # Create parameter-specific job request + param_job_request = ds.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="parametric_template.json", + max_minutes=60, + allocation=tacc_allocation, + job_name=f"mpm_parametric_{i:03d}", + description=f"Parametric study: friction={params['friction']}, cohesion={params['cohesion']}" + ) + + # Add parameters as environment variables + if "parameterSet" not in param_job_request: + param_job_request["parameterSet"] = {} + if "envVariables" not in param_job_request["parameterSet"]: + param_job_request["parameterSet"]["envVariables"] = [] + + param_job_request["parameterSet"]["envVariables"].extend([ + {"key": "MPM_FRICTION", "value": str(params["friction"])}, + {"key": "MPM_COHESION", "value": str(params["cohesion"])}, + {"key": "MPM_DENSITY", "value": str(params["density"])} + ]) + + # Submit job + job = ds.jobs.submit_request(param_job_request) + submitted_jobs.append((job, params)) + print(f"Submitted parametric job {i+1}/{len(parameters)}: {job.uuid}") + +# Monitor all jobs +print("Monitoring all parametric jobs...") +results = [] +for job, params in submitted_jobs: + final_status = job.monitor() + results.append({ + "job_uuid": job.uuid, + "parameters": params, + "final_status": final_status + }) + +# Summarize results +print("\nParametric Study Results:") +for result in results: + print(f" {result['parameters']} -> {result['final_status']}") +``` + +## 🚨 Troubleshooting + +### Common Issues and Solutions + +```python +# Check system and queue availability +def check_system_status(): + try: + # Check if target system is available + stampede_queues = ds.systems.list_queues("stampede3") + print("✅ Stampede3 system is accessible") + + # Check specific queue + available_queues = [q.name for q in stampede_queues] + if "skx-dev" in available_queues: + print("✅ Development queue is available") + else: + print("⚠️ Development queue not found. Available queues:") + for queue in available_queues: + print(f" - {queue}") + + except Exception as e: + print(f"❌ System check failed: {e}") + +# Validate input files +def validate_input_files(): + try: + # Check if input file is valid JSON + with open("local_copy_of_mpm.json", "r") as f: + import json + config = json.load(f) + print("✅ Input file is valid JSON") + + # Check required fields (example) + required_fields = ["mesh", "particles", "materials"] + missing_fields = [field for field in required_fields if field not in config] + if missing_fields: + print(f"⚠️ Missing required fields: {missing_fields}") + else: + print("✅ All required fields present") + + except FileNotFoundError: + print("❌ Input file not found locally for validation") + except json.JSONDecodeError as e: + print(f"❌ Invalid JSON format: {e}") + except Exception as e: + print(f"❌ Validation error: {e}") + +# Run diagnostics +print("🔍 Running diagnostics...") +check_system_status() +validate_input_files() +``` + +### Resume Monitoring + +```python +# If monitoring was interrupted, resume with saved job UUID +def resume_monitoring(): + try: + with open("current_mpm_job.txt", "r") as f: + lines = f.readlines() + saved_uuid = lines[0].strip() + submission_time = lines[1].strip() if len(lines) > 1 else "Unknown" + + print(f"Resuming monitoring for job: {saved_uuid}") + print(f"Originally submitted: {submission_time}") + + # Create SubmittedJob object + resumed_job = SubmittedJob(ds._tapis, saved_uuid) + + # Check current status + current_status = resumed_job.get_status() + print(f"Current status: {current_status}") + + if current_status not in resumed_job.TERMINAL_STATES: + print("Job is still running, resuming monitoring...") + final_status = resumed_job.monitor() + print(f"Final status: {final_status}") + else: + print("Job has already completed") + final_status = current_status + + return resumed_job, final_status + + except FileNotFoundError: + print("❌ No saved job UUID found") + return None, None + except Exception as e: + print(f"❌ Error resuming monitoring: {e}") + return None, None + +# Example usage: +# resumed_job, final_status = resume_monitoring() +``` + +## 📊 Performance Analysis + +### Analyzing Job Performance + +```python +def analyze_job_performance(job): + """Analyze job performance and resource utilization""" + try: + # Get runtime summary + print("📈 Performance Analysis") + print("-" * 30) + + job.print_runtime_summary(verbose=True) + + # Get job details + details = job.details + + # Calculate efficiency metrics + total_cores = details.nodeCount * details.coresPerNode + max_runtime_hours = details.maxMinutes / 60 + + print(f"\n📊 Resource Allocation:") + print(f" Nodes: {details.nodeCount}") + print(f" Cores per node: {details.coresPerNode}") + print(f" Total cores: {total_cores}") + print(f" Memory per node: {details.memoryMB} MB") + print(f" Max runtime: {max_runtime_hours:.2f} hours") + + # Analyze output for performance metrics + output = job.get_output_content("tapisjob.out", missing_ok=True) + if output: + # Look for timing information in MPM output + lines = output.split('\n') + duration_lines = [line for line in lines if 'duration' in line.lower()] + + if duration_lines: + print(f"\n⏱️ Execution Timing:") + for line in duration_lines: + print(f" {line.strip()}") + + print(f"\n💡 Optimization suggestions:") + if total_cores == 1: + print(" - Consider using multiple cores for larger simulations") + if max_runtime_hours > 2: + print(" - Consider breaking large simulations into smaller parts") + print(" - Monitor memory usage to optimize allocation") + + except Exception as e: + print(f"❌ Performance analysis failed: {e}") + +# Example usage after job completion: +# if final_status == "FINISHED": +# analyze_job_performance(submitted_job) +``` + +This comprehensive example demonstrates the complete workflow for submitting and monitoring MPM jobs using dapi, including error handling, result analysis, and advanced features for production use. \ No newline at end of file diff --git a/docs/examples/opensees.md b/docs/examples/opensees.md new file mode 100644 index 0000000..dc8f67c --- /dev/null +++ b/docs/examples/opensees.md @@ -0,0 +1,285 @@ +# OpenSees Job Submission Example + +This comprehensive example demonstrates how to submit and monitor an OpenSees job using dapi. OpenSees is a software framework for developing applications to simulate earthquake engineering applications, featuring finite element analysis capabilities for structural and geotechnical systems. + +[![Try on DesignSafe](https://raw.githubusercontent.com/DesignSafe-CI/dapi/main/DesignSafe-Badge.svg)](https://jupyter.designsafe-ci.org/hub/user-redirect/lab/tree/CommunityData/dapi/opensees/opensees-mp/OpenSeesMP-dapi.ipynb) + +## 🎯 Overview + +This example covers: + +- Setting up authentication and environment +- Configuring OpenSees Multi-Free Field Analysis +- Managing input files and DesignSafe paths +- Generating job requests with custom archive settings +- Submitting and monitoring OpenSees jobs +- Downloading and postprocessing results with plotting + +## 🚀 Complete Example + +### Step 1: Setup and Authentication + +```python +# Install required packages +!pip install dapi + +# Import DAPI and other required libraries +from dapi import DSClient +import os +import json +import tempfile +import shutil +import numpy as np +import matplotlib.pyplot as plt +from datetime import date + +# Initialize DesignSafe client +ds = DSClient() +print("Authentication successful.") +``` + +### Step 2: Configure Job Parameters + +```python +# Define DesignSafe paths and job configuration +ds_path = "/home/jupyter/MyData/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input" +print(f"DesignSafe path: {ds_path}") + +# Translate DesignSafe path to Tapis URI +input_uri = ds.files.translate_path_to_uri(ds_path) +print(f"Input URI: {input_uri}") + +# Job configuration parameters +jobname: str = "opensees-MP-multiMotion-dapi" +app_id: str = "opensees-mp-s3" +input_filename: str = "Main_multiMotion.tcl" +control_exec_Dir: str = "DS_input" # Folder with files including input_filename +tacc_allocation: str = "ASC25049" # MUST USE YOUR OWN ALLOCATION !! +control_nodeCount: int = 1 +control_corespernode: int = 16 +max_job_minutes: int = 60 +``` + +### Step 3: Generate Job Request with Custom Archive Settings + +```python +# Generate job request dictionary using app defaults +job_dict = ds.jobs.generate_request( + app_id=app_id, + input_dir_uri=input_uri, + script_filename=input_filename, + max_minutes=max_job_minutes, + allocation=tacc_allocation, + # Archive configuration for organized result storage + archive_system="designsafe", + archive_path="opensees-results", # Results go to MyData/opensees-results/ +) + +# Customize job settings +job_dict["name"] = jobname +job_dict["nodeCount"] = control_nodeCount +job_dict["coresPerNode"] = control_corespernode + +print("Generated job request:") +print(json.dumps(job_dict, indent=2, default=str)) +``` + +### Step 4: Submit and Monitor Job + +```python +# Submit job using dapi +submitted_job = ds.jobs.submit_request(job_dict) +print(f"Job launched with UUID: {submitted_job.uuid}") +print("Can also check in DesignSafe portal under - Workspace > Tools & Application > Job Status") + +# Monitor job status using dapi +final_status = submitted_job.monitor(interval=15) +print(f"Job finished with status: {final_status}") + +# Interpret job status +ds.jobs.interpret_status(final_status, submitted_job.uuid) + +# Display runtime summary +submitted_job.print_runtime_summary(verbose=False) +``` + +### Step 5: Access Job Archive and Results + +```python +# Get archive information using dapi +archive_uri = submitted_job.archive_uri +print(f"Archive URI: {archive_uri}") + +# Translate archive URI to local DesignSafe path +local_archive_path = ds.files.translate_uri_to_path(archive_uri) +print(f"Local archive path: {local_archive_path}") + +# List archive contents +archive_files = ds.files.list(archive_uri) +print("\\nArchive contents:") +for item in archive_files: + print(f"- {item.name} ({item.type})") +``` + +### Step 6: Download Results for Postprocessing + +```python +# Download archive files to local directory for postprocessing +import tempfile +import shutil + +# Create temporary directory for downloaded files +temp_dir = tempfile.mkdtemp(prefix="opensees_results_") +print(f"Downloading results to: {temp_dir}") + +# Download the inputDirectory folder which contains results +input_dir_archive_uri = f"{archive_uri}/inputDirectory" +try: + # List contents of inputDirectory in archive + input_dir_files = ds.files.list(input_dir_archive_uri) + print("\\nFiles in inputDirectory:") + for item in input_dir_files: + print(f"- {item.name} ({item.type})") + + # Download all files from inputDirectory (excluding subdirectories) + files_to_download = [item.name for item in input_dir_files if item.type == "file"] + + print(f"\\nDownloading {len(files_to_download)} files...") + successful_downloads = [] + + for filename in files_to_download: + try: + file_uri = f"{input_dir_archive_uri}/{filename}" + local_path = os.path.join(temp_dir, filename) + + # Try downloading with the ds.files.download method + try: + ds.files.download(file_uri, local_path) + print(f"Downloaded: {filename}") + successful_downloads.append(filename) + except Exception as download_error: + print(f"Standard download failed for {filename}: {download_error}") + + # Try alternative download approach using get_file_content + try: + content = ds.files.get_file_content(file_uri) + with open(local_path, 'wb') as f: + if hasattr(content, 'read'): + shutil.copyfileobj(content, f) + else: + f.write(content) + print(f"Downloaded (alternative method): {filename}") + successful_downloads.append(filename) + except Exception as alt_error: + print(f"Alternative download also failed for {filename}: {alt_error}") + + except Exception as e: + print(f"Could not download {filename}: {e}") + + print(f"\\nSuccessfully downloaded {len(successful_downloads)} out of {len(files_to_download)} files") + +except Exception as e: + print(f"Error accessing archive: {e}") + +# Change to the temporary directory for postprocessing +os.chdir(temp_dir) +print(f"\\nChanged to directory: {os.getcwd()}") +print("Local files:") +for f in sorted(os.listdir(".")): + print(f"- {f}") +``` + +### Step 7: Install Plotting Dependencies and Setup + +```python +# Install matplotlib for plotting +!pip3 install matplotlib + +# Setup matplotlib for inline plotting +%matplotlib inline +import numpy as np +import matplotlib.pyplot as plt +``` + +### Step 8: Create Postprocessing Functions + +```python +# Define response spectra function inline +def resp_spectra(a, time, nstep): + """ + This function builds response spectra from acceleration time history, + a should be a numpy array, T and nStep should be integers. + """ + # add initial zero value to acceleration and change units + a = np.insert(a, 0, 0) + # number of periods at which spectral values are to be computed + nperiod = 100 + # define range of considered periods by power of 10 + minpower = -3.0 + maxpower = 1.0 + # create vector of considered periods + p = np.logspace(minpower, maxpower, nperiod) + # incremental circular frequency + dw = 2.0 * np.pi / time + # vector of circular freq + w = np.arange(0, (nstep + 1) * dw, dw) + # fast fourier transform of acceleration + afft = np.fft.fft(a) + # arbitrary stiffness value + k = 1000.0 + # damping ratio + damp = 0.05 + umax = np.zeros(nperiod) + vmax = np.zeros(nperiod) + amax = np.zeros(nperiod) + # loop to compute spectral values at each period + for j in range(0, nperiod): + # compute mass and dashpot coeff to produce desired periods + m = ((p[j] / (2 * np.pi)) ** 2) * k + c = 2 * damp * (k * m) ** 0.5 + h = np.zeros(nstep + 2, dtype=complex) + # compute transfer function + for l in range(0, int(nstep / 2 + 1)): + h[l] = 1.0 / (-m * w[l] * w[l] + 1j * c * w[l] + k) + # mirror image of transfer function + h[nstep + 1 - l] = np.conj(h[l]) + + # compute displacement in frequency domain using transfer function + qfft = -m * afft + u = np.zeros(nstep + 1, dtype=complex) + for l in range(0, nstep + 1): + u[l] = h[l] * qfft[l] + + # compute displacement in time domain (ignore imaginary part) + utime = np.real(np.fft.ifft(u)) + + # spectral displacement, velocity, and acceleration + umax[j] = np.max(np.abs(utime)) + vmax[j] = (2 * np.pi / p[j]) * umax[j] + amax[j] = (2 * np.pi / p[j]) * vmax[j] + + return p, umax, vmax, amax + +# Define plot_acc function inline +def plot_acc(): + """ + Plot acceleration time history and response spectra + """ + plt.figure() + + for motion in ["motion1"]: + for profile in ["A", "B", "C", "D"]: + acc = np.loadtxt("Profile" + profile + "_acc" + motion + ".out") + [p, umax, vmax, amax] = resp_spectra(acc[:, -1], acc[-1, 0], acc.shape[0]) + plt.semilogx(p, amax) + + # response spectra on log-linear plot + + plt.ylabel("$S_a (g)$") + plt.xlabel("$Period (s)$") + +# Execute the plotting function +plot_acc() +``` + +This comprehensive OpenSees example demonstrates the complete workflow for submitting, monitoring, and analyzing OpenSees simulations using dapi, including advanced features like custom archive management, parametric studies, and detailed result postprocessing with response spectra analysis. \ No newline at end of file diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000..1893deb Binary files /dev/null and b/docs/favicon.ico differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index fdb1644..0000000 --- a/docs/index.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..3f23a2e --- /dev/null +++ b/docs/index.md @@ -0,0 +1,102 @@ +# DAPI - DesignSafe API + +[![build and test](https://github.com/DesignSafe-CI/dapi/actions/workflows/build-test.yml/badge.svg)](https://github.com/DesignSafe-CI/dapi/actions/workflows/build-test.yml) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/DesignSafe-CI/dapi/blob/main/LICENSE.md) +[![PyPI version](https://badge.fury.io/py/dapi.svg)](https://badge.fury.io/py/dapi) + +Welcome to the **DesignSafe API (dapi)** documentation! + +`dapi` is a Python library that simplifies the process of submitting, running, and monitoring [TAPIS v3](https://tapis.readthedocs.io/en/latest/) jobs on [DesignSafe](https://designsafe-ci.org) via [Jupyter Notebooks](https://jupyter.designsafe-ci.org). It provides high-level, user-friendly interfaces for working with DesignSafe resources and research databases. + +dapi + +## ✨ Key Features + +### 🚀 Job Management +- **Simple Job Submission**: Submit computational jobs with minimal configuration +- **Real-time Monitoring**: Track job progress with interactive progress bars +- **Output Management**: Easily access and download job results +- **Application Discovery**: Find and explore available DesignSafe applications + +### 📊 Database Access +- **Research Databases**: Connect to DesignSafe research databases (NGL, Earthquake Recovery, VP) +- **SQL Queries**: Execute SQL queries and get results as pandas DataFrames +- **Automatic Connection Management**: Handles database connections and credentials + +### 📁 File Operations +- **Path Translation**: Convert DesignSafe paths (/MyData, /projects) to TAPIS URIs +- **File Management**: Upload, download, and list files on DesignSafe storage +- **Path Verification**: Validate that paths exist before using them + +### 🔐 Authentication +- **Simplified Auth**: Easy authentication with DesignSafe credentials +- **Multiple Methods**: Support for environment variables, .env files, and interactive input +- **Secure**: Handles credentials securely with encrypted storage + +## 🏃‍♂️ Quick Start + +Get started with dapi in just a few lines: + +```python +from dapi import DSClient + +# Initialize client (handles authentication automatically) +client = DSClient() + +# Submit a job +job_request = client.jobs.generate_request( + app_id="matlab-r2023a", + input_dir_uri="/MyData/analysis/input/", + script_filename="run_analysis.m" +) +job = client.jobs.submit_request(job_request) + +# Monitor progress +final_status = job.monitor() + +# Query research databases +df = client.db.ngl.read_sql("SELECT * FROM SITE LIMIT 10") +``` + +## 📖 Getting Started + +- **[Installation](installation.md)**: Install dapi and set up your environment +- **[Authentication](authentication.md)**: Configure credentials and authentication +- **[Quick Start](quickstart.md)**: Get up and running in 5 minutes + +## 📚 User Guide + +- **[Jobs](jobs.md)**: Submit and monitor computational jobs +- **[Database Access](database.md)**: Query DesignSafe research databases + +## 🎯 Examples + +- **[MPM Job Submission](examples/mpm.md)**: Material Point Method workflow +- **[Database Queries](examples/database.md)**: Research data analysis examples + +## 💡 Use Cases + +### Research Computing +- Submit OpenSees, MATLAB, Python, and other computational jobs +- Monitor job execution with real-time status updates +- Access job outputs and results efficiently + +### Data Analysis +- Query large research databases with SQL +- Analyze earthquake, geotechnical, and structural data +- Export results to pandas DataFrames for further analysis + +### File Management +- Organize and manage research data on DesignSafe +- Transfer files between local machines and DesignSafe storage +- Collaborate on data with project teams + +## 🆘 Support + +- **Issues**: Report bugs or request features on [GitHub Issues](https://github.com/DesignSafe-CI/dapi/issues) +- **Documentation**: Comprehensive guides and API reference +- **Community**: Connect with other users on DesignSafe forums + +## 📄 License + +dapi is licensed under the [MIT License](https://github.com/DesignSafe-CI/dapi/blob/main/LICENSE.md). \ No newline at end of file diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..c45dc6f --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,205 @@ +# Installation + +This guide will help you install the DesignSafe API (dapi) package and set up your environment. + +## Requirements + +- **Python**: 3.10 or higher +- **Operating System**: Windows, macOS, or Linux +- **DesignSafe Account**: Required for authentication ([sign up here](https://www.designsafe-ci.org/account/register/)) + +## Installation Methods + +### 📦 Install from PyPI (Recommended) + +The easiest way to install dapi is using pip: + +```bash +pip install dapi +``` + +### 🔄 Install Latest Development Version + +To get the latest features and bug fixes: + +```bash +pip install git+https://github.com/DesignSafe-CI/dapi.git +``` + +### 🛠️ Install for Development + +If you want to contribute to dapi or modify the source code: + +```bash +# Clone the repository +git clone https://github.com/DesignSafe-CI/dapi.git +cd dapi + +# Install Poetry (if not already installed) +curl -sSL https://install.python-poetry.org | python3 - + +# Install dependencies and dapi in editable mode +poetry install +poetry shell +``` + +## 🏗️ DesignSafe Jupyter Environment + +### Installing on DesignSafe Jupyter Hub + +If you're using [DesignSafe Jupyter](https://jupyter.designsafe-ci.org/), install dapi in your notebook: + +```python +# Remove any previous installations (optional) +!pip uninstall dapi -y + +# Install the latest version +!pip install dapi --quiet + +# Restart kernel after installation +# Kernel >> Restart Kernel (in Jupyter menu) +``` + +!!! tip "Kernel Restart Required" + After installing dapi in a Jupyter notebook, you must restart the kernel for the changes to take effect. Go to **Kernel → Restart Kernel** in the Jupyter menu. + +### Persistent Installation + +For a persistent installation across Jupyter sessions: + +```bash +# SSH into your DesignSafe workspace terminal +pip install --user dapi +``` + +## 🔧 Dependencies + +dapi automatically installs the following key dependencies: + +- **tapipy**: TAPIS v3 Python SDK +- **pandas**: Data manipulation and analysis +- **sqlalchemy**: Database connections +- **pymysql**: MySQL database connector +- **tqdm**: Progress bars +- **python-dotenv**: Environment variable management + +## ✅ Verify Installation + +Test your installation by importing dapi: + +```python +import dapi +print(f"dapi version: {dapi.__version__}") + +# List available functions +print("Available functions:") +print(dir(dapi)) +``` + +Expected output: +``` +dapi version: 1.1.0 +Available functions: +['DSClient', 'SubmittedJob', 'interpret_job_status', ...] +``` + +## 🐍 Python Environment Management + +### Using Virtual Environments + +It's recommended to use virtual environments to avoid conflicts: + +```bash +# Create virtual environment +python -m venv dapi-env + +# Activate (Linux/macOS) +source dapi-env/bin/activate + +# Activate (Windows) +dapi-env\Scripts\activate + +# Install dapi +pip install dapi +``` + +### Using Conda + +```bash +# Create conda environment +conda create -n dapi-env python=3.10 + +# Activate environment +conda activate dapi-env + +# Install dapi +pip install dapi +``` + +## 🚨 Troubleshooting + +### Common Installation Issues + +#### Permission Errors +If you encounter permission errors: +```bash +pip install --user dapi +``` + +#### SSL Certificate Errors +If you encounter SSL issues: +```bash +pip install --trusted-host pypi.org --trusted-host pypi.python.org dapi +``` + +#### Version Conflicts +If you have conflicting dependencies: +```bash +pip install dapi --force-reinstall +``` + +### Platform-Specific Issues + +#### Windows +- Ensure you have Microsoft Visual C++ Build Tools installed +- Use Anaconda/Miniconda for easier dependency management + +#### macOS +- Install Xcode Command Line Tools: `xcode-select --install` +- Consider using Homebrew for Python: `brew install python` + +#### Linux +- Install development packages: `sudo apt-get install python3-dev build-essential` + +## 🔄 Updating + +### Update to Latest Version +```bash +pip install --upgrade dapi +``` + +### Check Current Version +```python +import dapi +print(dapi.__version__) +``` + +## 🆘 Getting Help + +If you encounter issues during installation: + +1. **Check the [Issues page](https://github.com/DesignSafe-CI/dapi/issues)** for known problems +2. **Search existing issues** before creating a new one +3. **Provide details** when reporting issues: + - Operating system and version + - Python version + - Complete error messages + - Installation method used + +## ➡️ Next Steps + +After successful installation: + +1. **[Set up authentication](authentication.md)** with your DesignSafe credentials +2. **[Try the quick start guide](quickstart.md)** for your first dapi workflow +3. **[Explore examples](examples/mpm.md)** to see dapi in action \ No newline at end of file diff --git a/docs/jobs.md b/docs/jobs.md new file mode 100644 index 0000000..a2958d4 --- /dev/null +++ b/docs/jobs.md @@ -0,0 +1,575 @@ +# Job Management + +This guide covers everything you need to know about submitting, monitoring, and managing computational jobs on DesignSafe using dapi. + +## 🎯 Overview + +dapi provides a high-level interface for working with TAPIS v3 jobs on DesignSafe. You can: + +- **Discover** available applications +- **Generate** job requests with automatic parameter mapping +- **Submit** jobs to DesignSafe compute resources +- **Monitor** job progress with real-time updates +- **Manage** job outputs and results + +## 🔍 Application Discovery + +### Finding Applications + +```python +from dapi import DSClient + +client = DSClient() + +# Find all applications +all_apps = client.apps.find("", verbose=False) +print(f"Found {len(all_apps)} applications") + +# Search for specific applications +matlab_apps = client.apps.find("matlab", verbose=True) +opensees_apps = client.apps.find("opensees", verbose=True) +mpm_apps = client.apps.find("mpm", verbose=True) +``` + +### Getting Application Details + +```python +# Get detailed information about an application +app_details = client.apps.get_details("mpm-s3", verbose=True) + +print(f"App: {app_details.id}") +print(f"Version: {app_details.version}") +print(f"Description: {app_details.description}") +print(f"Execution System: {app_details.jobAttributes.execSystemId}") +print(f"Max Runtime: {app_details.jobAttributes.maxMinutes} minutes") +print(f"Default Cores: {app_details.jobAttributes.coresPerNode}") +``` + +### Popular Applications + +| Application | App ID | Description | +|-------------|--------|-------------| +| MATLAB | `matlab-r2023a` | MATLAB computational environment | +| OpenSees | `opensees-express` | Structural analysis framework | +| MPM | `mpm-s3` | Material Point Method simulations | +| ADCIRC | `adcirc-v55` | Coastal circulation modeling | +| LS-DYNA | `ls-dyna` | Explicit finite element analysis | + +## 🚀 Job Submission + +### Basic Job Submission + +```python +# 1. Prepare input directory +input_path = "/MyData/analysis/input/" +input_uri = client.files.translate_path_to_uri(input_path, verify_exists=True) + +# 2. Generate job request +job_request = client.jobs.generate_request( + app_id="matlab-r2023a", + input_dir_uri=input_uri, + script_filename="run_analysis.m", + max_minutes=60, + allocation="your_tacc_allocation" +) + +# 3. Submit job +job = client.jobs.submit_request(job_request) +print(f"Job submitted: {job.uuid}") +``` + +### Advanced Job Configuration + +```python +job_request = client.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="mpm.json", + + # Resource requirements + max_minutes=120, + node_count=2, + cores_per_node=48, + memory_mb=96000, + queue="normal", + allocation="your_allocation", + + # Job metadata + job_name="mpm_parametric_study_001", + description="Parametric study of soil behavior under seismic loading", + tags=["research", "mpm", "seismic"], + + # Additional file inputs + extra_file_inputs=[ + { + "name": "Material Library", + "sourceUrl": "tapis://designsafe.storage.default/shared/materials/", + "targetPath": "materials" + } + ], + + # Environment variables + extra_env_vars=[ + {"key": "OMP_NUM_THREADS", "value": "48"}, + {"key": "ANALYSIS_TYPE", "value": "SEISMIC"} + ], + + # Scheduler options + extra_scheduler_options=[ + {"name": "Email Notification", "arg": "-m be"}, + {"name": "Job Array", "arg": "-t 1-10"} + ] +) +``` + +### Modifying Job Requests + +```python +# Generate base request +job_request = client.jobs.generate_request(...) + +# Modify before submission +job_request["name"] = "custom_job_name" +job_request["description"] = "Updated description" +job_request["nodeCount"] = 4 +job_request["maxMinutes"] = 180 + +# Add custom parameters +if "parameterSet" not in job_request: + job_request["parameterSet"] = {} +if "envVariables" not in job_request["parameterSet"]: + job_request["parameterSet"]["envVariables"] = [] + +job_request["parameterSet"]["envVariables"].append({ + "key": "CUSTOM_PARAM", + "value": "custom_value" +}) + +# Submit modified request +job = client.jobs.submit_request(job_request) +``` + +## 📊 Job Monitoring + +### Real-time Monitoring + +```python +# Submit job +job = client.jobs.submit_request(job_request) + +# Monitor with progress bars +final_status = job.monitor( + interval=15, # Check every 15 seconds + timeout_minutes=240 # Timeout after 4 hours +) + +# Interpret results +client.jobs.interpret_status(final_status, job.uuid) +``` + +### Manual Status Checking + +```python +# Check current status +current_status = job.get_status() +print(f"Current status: {current_status}") + +# Check if job is complete +if current_status in job.TERMINAL_STATES: + print("Job has finished") +else: + print("Job is still running") + +# Get detailed job information +details = job.details +print(f"Submitted: {details.created}") +print(f"Started: {details.started}") +print(f"Last Updated: {details.lastUpdated}") +``` + +### Job Status Overview + +| Status | Description | +|--------|-------------| +| `PENDING` | Job submitted but not yet processed | +| `PROCESSING_INPUTS` | Input files being staged | +| `STAGING_INPUTS` | Files being transferred to compute system | +| `STAGING_JOB` | Job being prepared for execution | +| `SUBMITTING_JOB` | Job being submitted to scheduler | +| `QUEUED` | Job waiting in scheduler queue | +| `RUNNING` | Job actively executing | +| `ARCHIVING` | Output files being archived | +| `FINISHED` | Job completed successfully | +| `FAILED` | Job failed during execution | +| `CANCELLED` | Job was cancelled | +| `STOPPED` | Job was stopped | + +## 📈 Job Analysis + +### Runtime Summary + +```python +# Get runtime breakdown +job.print_runtime_summary(verbose=False) + +# Detailed history (verbose mode) +job.print_runtime_summary(verbose=True) +``` + +Example output: +``` +Runtime Summary +--------------- +QUEUED time: 00:05:30 +RUNNING time: 01:23:45 +TOTAL time: 01:29:15 +--------------- +``` + +### Status Messages + +```python +# Get last status message +last_message = job.last_message +if last_message: + print(f"Last message: {last_message}") +else: + print("No status message available") +``` + +## 📁 Output Management + +### Listing Job Outputs + +```python +# List all files in job archive +outputs = job.list_outputs() +for output in outputs: + print(f"- {output.name} ({output.type}, {output.size} bytes)") + +# List files in subdirectory +results = job.list_outputs(path="results/") +``` + +### Accessing Job Archive + +```python +# Get archive URI +archive_uri = job.archive_uri +print(f"Job archive: {archive_uri}") + +# Use files interface to browse archive +files = client.files.list(archive_uri) +for file in files: + print(f"- {file.name}") +``` + +### Reading Output Files + +```python +# Read job output log +stdout = job.get_output_content("tapisjob.out") +if stdout: + print("Job Output:") + print(stdout) + +# Read last 50 lines of output +recent_output = job.get_output_content("tapisjob.out", max_lines=50) + +# Read error log (if job failed) +stderr = job.get_output_content("tapisjob.err", missing_ok=True) +if stderr: + print("Error Output:") + print(stderr) + +# Read custom output files +results = job.get_output_content("results.txt", missing_ok=True) +``` + +### Downloading Files + +```python +# Download specific files +job.download_output("results.mat", "/local/path/results.mat") +job.download_output("output_data.csv", "/local/analysis/data.csv") + +# Download using files interface +client.files.download( + f"{archive_uri}/results.mat", + "/local/path/results.mat" +) +``` + +## 🔄 Job Management + +### Job Cancellation + +```python +# Cancel a running job +job.cancel() + +# Check status after cancellation +status = job.get_status() +print(f"Status after cancel: {status}") +``` + +### Resuming Monitoring + +```python +# If you lose connection, resume monitoring with job UUID +from dapi import SubmittedJob + +job_uuid = "12345678-1234-1234-1234-123456789abc" +resumed_job = SubmittedJob(client._tapis, job_uuid) + +# Continue monitoring +final_status = resumed_job.monitor() +``` + +### Bulk Job Operations + +```python +# Monitor multiple jobs +job_uuids = ["uuid1", "uuid2", "uuid3"] +jobs = [SubmittedJob(client._tapis, uuid) for uuid in job_uuids] + +# Check all statuses +for job in jobs: + status = job.get_status() + print(f"Job {job.uuid}: {status}") + +# Wait for all to complete +for job in jobs: + if job.get_status() not in job.TERMINAL_STATES: + print(f"Monitoring {job.uuid}...") + final_status = job.monitor() + print(f"Final status: {final_status}") +``` + +## 🖥️ System Information + +### Queue Information + +```python +# List available queues for a system +frontera_queues = client.systems.list_queues("frontera") +for queue in frontera_queues: + print(f"Queue: {queue.name}") + print(f" Max runtime: {queue.maxRequestedTime} minutes") + print(f" Max nodes: {queue.maxNodesPerJob}") + +# Check if specific queue exists +dev_queue_exists = any(q.name == "development" for q in frontera_queues) +print(f"Development queue available: {dev_queue_exists}") +``` + +### System Status + +```python +# Get system information +try: + queues = client.systems.list_queues("stampede3") + print(f"Stampede3 has {len(queues)} available queues") +except Exception as e: + print(f"Cannot access Stampede3: {e}") +``` + +## 🔧 Advanced Patterns + +### Parametric Studies + +```python +# Submit multiple jobs with different parameters +base_request = client.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="template.json", + max_minutes=60, + allocation="your_allocation" +) + +# Parameter variations +parameters = [ + {"friction": 0.1, "density": 2000}, + {"friction": 0.2, "density": 2200}, + {"friction": 0.3, "density": 2400}, +] + +submitted_jobs = [] +for i, params in enumerate(parameters): + # Modify job request for this parameter set + job_req = base_request.copy() + job_req["name"] = f"parametric_study_{i:03d}" + job_req["description"] = f"Friction: {params['friction']}, Density: {params['density']}" + + # Add parameters as environment variables + if "parameterSet" not in job_req: + job_req["parameterSet"] = {} + if "envVariables" not in job_req["parameterSet"]: + job_req["parameterSet"]["envVariables"] = [] + + job_req["parameterSet"]["envVariables"].extend([ + {"key": "FRICTION", "value": str(params["friction"])}, + {"key": "DENSITY", "value": str(params["density"])} + ]) + + # Submit job + job = client.jobs.submit_request(job_req) + submitted_jobs.append(job) + print(f"Submitted job {i+1}/{len(parameters)}: {job.uuid}") + +# Monitor all jobs +print("Monitoring all jobs...") +for i, job in enumerate(submitted_jobs): + print(f"\nMonitoring job {i+1}/{len(submitted_jobs)}: {job.uuid}") + final_status = job.monitor() + print(f"Job {i+1} final status: {final_status}") +``` + +### Job Dependencies + +```python +# Submit jobs with dependencies (manual coordination) +# Job 1: Preprocessing +prep_job = client.jobs.submit_request(preprocessing_request) +prep_status = prep_job.monitor() + +if prep_status == "FINISHED": + print("Preprocessing complete, starting main analysis...") + + # Job 2: Main analysis (uses outputs from Job 1) + main_request["fileInputs"].append({ + "name": "Preprocessed Data", + "sourceUrl": prep_job.archive_uri, + "targetPath": "preprocessed" + }) + + main_job = client.jobs.submit_request(main_request) + main_status = main_job.monitor() + + if main_status == "FINISHED": + print("Main analysis complete, starting postprocessing...") + + # Job 3: Postprocessing + post_request["fileInputs"].append({ + "name": "Analysis Results", + "sourceUrl": main_job.archive_uri, + "targetPath": "results" + }) + + post_job = client.jobs.submit_request(post_request) + final_status = post_job.monitor() + + print(f"Pipeline complete. Final status: {final_status}") +``` + +## 🚨 Error Handling + +### Common Issues and Solutions + +```python +from dapi import JobSubmissionError, JobMonitorError + +try: + # Job submission + job = client.jobs.submit_request(job_request) + final_status = job.monitor() + +except JobSubmissionError as e: + print(f"Job submission failed: {e}") + + # Check common issues + if "allocation" in str(e).lower(): + print("💡 Check your TACC allocation is correct and active") + elif "queue" in str(e).lower(): + print("💡 Check the queue name is valid for the system") + elif "file" in str(e).lower(): + print("💡 Check input files exist and paths are correct") + +except JobMonitorError as e: + print(f"Job monitoring failed: {e}") + + # Try to get last known status + try: + status = job.get_status() + print(f"Last known status: {status}") + except: + print("Cannot determine job status") + +except Exception as e: + print(f"Unexpected error: {e}") +``` + +### Debugging Failed Jobs + +```python +# For failed jobs, get detailed error information +if final_status == "FAILED": + print("🔍 Debugging failed job...") + + # Get error logs + stderr = job.get_output_content("tapisjob.err", missing_ok=True) + if stderr: + print("Standard Error:") + print(stderr) + + # Get last part of stdout + stdout = job.get_output_content("tapisjob.out", max_lines=100) + if stdout: + print("Last 100 lines of output:") + print(stdout) + + # Check job details + details = job.details + print(f"Last message: {details.lastMessage}") + print(f"Status history available via: job.print_runtime_summary(verbose=True)") +``` + +## 💡 Best Practices + +### 1. Resource Planning +```python +# ✅ Choose appropriate resources +job_request = client.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="analysis.json", + max_minutes=60, # Realistic time estimate + node_count=1, # Start small, scale up + cores_per_node=24, # Match application parallelism + queue="development", # Use dev queue for testing + allocation="your_allocation" +) +``` + +### 2. Job Organization +```python +# ✅ Use descriptive names and metadata +job_request["name"] = f"seismic_analysis_{site_id}_{datetime.now().strftime('%Y%m%d_%H%M')}" +job_request["description"] = f"Seismic analysis for site {site_id} using {method} method" +job_request["tags"] = ["research", "seismic", site_id, method] +``` + +### 3. Error Recovery +```python +# ✅ Implement retry logic for transient failures +max_retries = 3 +for attempt in range(max_retries): + try: + job = client.jobs.submit_request(job_request) + final_status = job.monitor() + break + except JobSubmissionError as e: + if attempt < max_retries - 1: + print(f"Attempt {attempt + 1} failed, retrying... ({e})") + time.sleep(60) # Wait before retry + else: + raise +``` + +## ➡️ Next Steps + +- **[Learn database access](database.md)** for research data integration +- **[Explore complete examples](examples/mpm.md)** showing real workflows +- **Check API reference** for detailed method documentation +- **Review file operations** for data management \ No newline at end of file diff --git a/docs/nheri.png b/docs/nheri.png new file mode 100644 index 0000000..5a6a531 Binary files /dev/null and b/docs/nheri.png differ diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..a3d4c3c --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,348 @@ +# Quick Start + +Get up and running with dapi in just a few minutes! This guide will walk you through your first job submission and database query. + +## 🚀 Prerequisites + +1. **Install dapi**: `pip install dapi` (see [Installation Guide](installation.md)) +2. **DesignSafe Account**: [Sign up here](https://www.designsafe-ci.org/account/register/) if needed +3. **Authentication**: Set up credentials (see [Authentication Guide](authentication.md)) + +## ⚡ 5-Minute Example + +Here's a complete example that demonstrates the core dapi functionality: + +```python +from dapi import DSClient + +# 1. Initialize client (handles authentication) +client = DSClient() + +# 2. Find available applications +matlab_apps = client.apps.find("matlab", verbose=True) + +# 3. Submit a simple job +job_request = client.jobs.generate_request( + app_id="matlab-r2023a", + input_dir_uri="/MyData/analysis/input/", + script_filename="run_analysis.m", + max_minutes=30, + allocation="your_allocation" +) + +# 4. Submit and monitor +job = client.jobs.submit_request(job_request) +final_status = job.monitor() + +# 5. Check results +if final_status == "FINISHED": + print("✅ Job completed successfully!") + job.print_runtime_summary() + + # Get job outputs + outputs = job.list_outputs() + for output in outputs: + print(f"- {output.name} ({output.type})") + +# 6. Query research database +df = client.db.ngl.read_sql("SELECT * FROM SITE LIMIT 5") +print(df) +``` + +## 📝 Step-by-Step Walkthrough + +### Step 1: Initialize the Client + +```python +from dapi import DSClient + +# This will prompt for credentials if not found in environment +client = DSClient() +# Output: Authentication successful. +``` + +### Step 2: Explore Available Applications + +```python +# Find all applications +all_apps = client.apps.find("", verbose=False) +print(f"Found {len(all_apps)} total applications") + +# Find specific applications +mpm_apps = client.apps.find("mpm", verbose=True) +matlab_apps = client.apps.find("matlab", verbose=True) +opensees_apps = client.apps.find("opensees", verbose=True) + +# Get detailed information about an app +app_details = client.apps.get_details("mpm-s3", verbose=True) +``` + +### Step 3: Prepare Your Input Files + +```python +# Translate DesignSafe paths to TAPIS URIs +input_path = "/MyData/mpm-benchmarks/2d/uniaxial_stress/" +input_uri = client.files.translate_path_to_uri(input_path, verify_exists=True) +print(f"Input URI: {input_uri}") + +# List files in the directory +files = client.files.list(input_uri) +for file in files: + print(f"- {file.name} ({file.type}, {file.size} bytes)") +``` + +### Step 4: Generate Job Request + +```python +# Generate a job request with automatic parameter mapping +job_request = client.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="mpm.json", + max_minutes=10, + node_count=1, + cores_per_node=1, + allocation="your_tacc_allocation" +) + +# Optionally modify the request +job_request["description"] = "My MPM analysis" +job_request["tags"] = ["research", "mpm"] +``` + +### Step 5: Submit and Monitor Job + +```python +# Submit the job +job = client.jobs.submit_request(job_request) +print(f"Job submitted: {job.uuid}") + +# Monitor with real-time progress +final_status = job.monitor(interval=15) + +# Interpret the result +client.jobs.interpret_status(final_status, job.uuid) +``` + +### Step 6: Access Job Results + +```python +# Print runtime summary +if final_status in job.TERMINAL_STATES: + job.print_runtime_summary(verbose=False) + + # Get archive URI + archive_uri = job.archive_uri + print(f"Results at: {archive_uri}") + + # List output files + outputs = job.list_outputs() + for output in outputs: + print(f"- {output.name}") + + # Read job output + stdout = job.get_output_content("tapisjob.out", max_lines=50) + if stdout: + print("Job Output:") + print(stdout) +``` + +### Step 7: Query Research Databases + +```python +# Query NGL database +ngl_data = client.db.ngl.read_sql(""" + SELECT SITE_NAME, SITE_LAT, SITE_LON + FROM SITE + WHERE SITE_LAT > 35 + LIMIT 10 +""") +print("NGL Sites:") +print(ngl_data) + +# Query with parameters +site_name = "Amagasaki" +site_data = client.db.ngl.read_sql( + "SELECT * FROM SITE WHERE SITE_NAME = %s", + params=[site_name] +) +print(f"Data for {site_name}:") +print(site_data) +``` + +## 🎯 Common Workflows + +### Workflow 1: MATLAB Analysis + +```python +# Submit MATLAB job +job_request = client.jobs.generate_request( + app_id="matlab-r2023a", + input_dir_uri="/MyData/matlab/analysis/", + script_filename="main.m", + max_minutes=60, + allocation="your_allocation" +) + +job = client.jobs.submit_request(job_request) +final_status = job.monitor() + +if final_status == "FINISHED": + # Download specific result file + job.download_output("results.mat", "/local/path/results.mat") +``` + +### Workflow 2: OpenSees Simulation + +```python +# Submit OpenSees job +job_request = client.jobs.generate_request( + app_id="opensees-express", + input_dir_uri="/MyData/opensees/earthquake/", + script_filename="earthquake_analysis.tcl", + max_minutes=120, + allocation="your_allocation" +) + +job = client.jobs.submit_request(job_request) +final_status = job.monitor() +``` + +### Workflow 3: Database Analysis + +```python +# Complex database query with joins +query = """ +SELECT s.SITE_NAME, s.SITE_LAT, s.SITE_LON, COUNT(r.RECORD_ID) as num_records +FROM SITE s +LEFT JOIN RECORD r ON s.SITE_ID = r.SITE_ID +WHERE s.SITE_LAT BETWEEN 32 AND 38 +GROUP BY s.SITE_ID +HAVING num_records > 5 +ORDER BY num_records DESC +LIMIT 20 +""" + +df = client.db.ngl.read_sql(query) +print("Sites with most records in California:") +print(df) + +# Export to CSV +df.to_csv("california_sites.csv", index=False) +``` + +## 🔧 Configuration Tips + +### Set Default Allocation + +```python +import os +os.environ['DEFAULT_ALLOCATION'] = 'your_tacc_allocation' + +# Now you can omit allocation in job requests +job_request = client.jobs.generate_request( + app_id="mpm-s3", + input_dir_uri=input_uri, + script_filename="mpm.json" + # allocation will use DEFAULT_ALLOCATION +) +``` + +### Customize Job Monitoring + +```python +# Monitor with custom interval and timeout +final_status = job.monitor( + interval=30, # Check every 30 seconds + timeout_minutes=240 # Timeout after 4 hours +) + +# Handle different outcomes +if final_status == "FINISHED": + print("✅ Success!") +elif final_status == "FAILED": + print("❌ Job failed") + # Get error details + stderr = job.get_output_content("tapisjob.err") + if stderr: + print("Error details:", stderr) +elif final_status == "TIMEOUT": + print("⏰ Monitoring timed out") +``` + +## 🚨 Error Handling + +```python +from dapi import ( + AuthenticationError, + JobSubmissionError, + FileOperationError, + JobMonitorError +) + +try: + client = DSClient() + + # Try to submit job + job_request = client.jobs.generate_request(...) + job = client.jobs.submit_request(job_request) + final_status = job.monitor() + +except AuthenticationError as e: + print(f"Authentication failed: {e}") +except JobSubmissionError as e: + print(f"Job submission failed: {e}") +except FileOperationError as e: + print(f"File operation failed: {e}") +except JobMonitorError as e: + print(f"Job monitoring failed: {e}") +except Exception as e: + print(f"Unexpected error: {e}") +``` + +## 📊 Best Practices + +### 1. Always Verify Paths +```python +# ✅ Good - verify path exists +input_uri = client.files.translate_path_to_uri( + "/MyData/analysis/", + verify_exists=True +) + +# ❌ Risk - path might not exist +input_uri = client.files.translate_path_to_uri("/MyData/analysis/") +``` + +### 2. Use Descriptive Job Names +```python +# ✅ Good - descriptive name +job_request["name"] = "earthquake_analysis_2024_site_A" +job_request["description"] = "Nonlinear seismic analysis for Site A" +job_request["tags"] = ["earthquake", "site-A", "research"] +``` + +### 3. Handle Long-Running Jobs +```python +# For long jobs, save job UUID for later monitoring +job = client.jobs.submit_request(job_request) +job_uuid = job.uuid + +# Save UUID to file or environment +with open("current_job.txt", "w") as f: + f.write(job_uuid) + +# Later, resume monitoring +from dapi import SubmittedJob +saved_job = SubmittedJob(client._tapis, job_uuid) +final_status = saved_job.monitor() +``` + +## ➡️ Next Steps + +Now that you've completed the quick start: + +1. **[Explore detailed job management](jobs.md)** for advanced job operations +2. **[Learn database querying](database.md)** for research data analysis +3. **[Study complete examples](examples/mpm.md)** for real-world workflows +4. **Check the API reference** for all available methods \ No newline at end of file diff --git a/docs/search.js b/docs/search.js deleted file mode 100644 index 273fa56..0000000 --- a/docs/search.js +++ /dev/null @@ -1,46 +0,0 @@ -window.pdocSearch = (function(){ -/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();odapi` is a library that simplifies the process of submitting, running, and monitoring TAPIS v3 jobs on DesignSafe via Jupyter Notebooks.

\n\n

Features

\n\n

Jobs

\n\n
    \n
  • Get TAPIS v3 templates for jobs: No need to fiddle with complex API requests. dapi abstracts away the complexities.

  • \n
  • Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.

  • \n
\n\n

Database

\n\n

Connects to SQL databases on DesignSafe:

\n\n\n\n\n \n \n \n\n\n\n\n \n \n\n\n \n \n \n\n\n \n \n \n\n\n
Databasedbnameenv_prefix
NGLngl| NGL_
Earthake RecoveryeqEQ_
VpvpVP_
\n\n

Define the following environment variables:

\n\n
{env_prefix}DB_USER\n{env_prefix}DB_PASSWORD\n{env_prefix}DB_HOST\n{env_prefix}DB_PORT\n
\n\n

For e.g., to add the environment variable NGL_DB_USER edit ~/.bashrc, ~/.zshrc, or a similar shell-specific configuration file for the current user and add export NGL_DB_USER=\"dspublic\".

\n\n

Installation

\n\n
\n
pip3 install dapi\n
\n
\n"}, {"fullname": "dapi.auth", "modulename": "dapi.auth", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.auth.auth", "modulename": "dapi.auth.auth", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.auth.auth.init", "modulename": "dapi.auth.auth", "qualname": "init", "kind": "function", "doc": "

Initialize a Tapis object with authentication.\nTries to read credentials from environment variables first.\nIf not found, prompts the user for input.

\n\n

Save the user credentials in the .env file.

\n\n
DESIGNSAFE_USERNAME=<username>\nDESIGNSAFE_PASSWORD=<password>\n
\n\n

Returns:\n object: The authenticated Tapis object.

\n", "signature": "():", "funcdef": "def"}, {"fullname": "dapi.db", "modulename": "dapi.db", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.db.name", "modulename": "dapi.db", "qualname": "name", "kind": "variable", "doc": "

\n", "default_value": "'designsafe_db'"}, {"fullname": "dapi.db.config", "modulename": "dapi.db.config", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.db.config.db_config", "modulename": "dapi.db.config", "qualname": "db_config", "kind": "variable", "doc": "

\n", "default_value": "{'ngl': {'dbname': 'sjbrande_ngl_db', 'env_prefix': 'NGL_'}, 'vp': {'dbname': 'sjbrande_vpdb', 'env_prefix': 'VP_'}, 'eq': {'dbname': 'post_earthquake_recovery', 'env_prefix': 'EQ_'}}"}, {"fullname": "dapi.db.db", "modulename": "dapi.db.db", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase", "modulename": "dapi.db.db", "qualname": "DSDatabase", "kind": "class", "doc": "

A database utility class for connecting to a DesignSafe SQL database.

\n\n

This class provides functionality to connect to a MySQL database using\nSQLAlchemy and PyMySQL. It supports executing SQL queries and returning\nresults in different formats.

\n\n

Attributes:\n user (str): Database username, defaults to 'dspublic'.\n password (str): Database password, defaults to 'R3ad0nlY'.\n host (str): Database host address, defaults to '129.114.52.174'.\n port (int): Database port, defaults to 3306.\n db (str): Database name, can be 'sjbrande_ngl_db', 'sjbrande_vpdb', or 'post_earthquake_recovery'.\n recycle_time (int): Time in seconds to recycle database connections.\n engine (Engine): SQLAlchemy engine for database connection.\n Session (sessionmaker): SQLAlchemy session maker bound to the engine.

\n"}, {"fullname": "dapi.db.db.DSDatabase.__init__", "modulename": "dapi.db.db", "qualname": "DSDatabase.__init__", "kind": "function", "doc": "

Initializes the DSDatabase instance with environment variables and creates the database engine.

\n\n

Args:\n dbname (str): Shorthand for the database name. Must be one of 'ngl', 'vp', or 'eq'.

\n", "signature": "(dbname='ngl')"}, {"fullname": "dapi.db.db.DSDatabase.user", "modulename": "dapi.db.db", "qualname": "DSDatabase.user", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.password", "modulename": "dapi.db.db", "qualname": "DSDatabase.password", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.host", "modulename": "dapi.db.db", "qualname": "DSDatabase.host", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.port", "modulename": "dapi.db.db", "qualname": "DSDatabase.port", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.db", "modulename": "dapi.db.db", "qualname": "DSDatabase.db", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.engine", "modulename": "dapi.db.db", "qualname": "DSDatabase.engine", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.Session", "modulename": "dapi.db.db", "qualname": "DSDatabase.Session", "kind": "variable", "doc": "

\n"}, {"fullname": "dapi.db.db.DSDatabase.read_sql", "modulename": "dapi.db.db", "qualname": "DSDatabase.read_sql", "kind": "function", "doc": "

Executes a SQL query and returns the results.

\n\n

Args:\n sql (str): The SQL query string to be executed.\n output_type (str, optional): The format for the query results. Defaults to 'DataFrame'.\n Possible values are 'DataFrame' for a pandas DataFrame, or 'dict' for a list of dictionaries.

\n\n

Returns:\n pandas.DataFrame or list of dict: The result of the SQL query.

\n\n

Raises:\n ValueError: If the SQL query string is empty or if the output type is not valid.\n SQLAlchemyError: If an error occurs during query execution.

\n", "signature": "(self, sql, output_type='DataFrame'):", "funcdef": "def"}, {"fullname": "dapi.db.db.DSDatabase.close", "modulename": "dapi.db.db", "qualname": "DSDatabase.close", "kind": "function", "doc": "

Close the database connection.

\n", "signature": "(self):", "funcdef": "def"}, {"fullname": "dapi.jobs", "modulename": "dapi.jobs", "kind": "module", "doc": "

dapi job submodule simplifies the process of submitting, running, and monitoring Tapis v3 jobs on DesignSafe via Jupyter Notebooks.

\n\n

Features

\n\n
    \n
  • Simplified TAPIS v3 Calls: No need to fiddle with complex API requests. dapi abstracts away the complexities.

  • \n
  • Seamless Integration with DesignSafe Jupyter Notebooks: Launch DesignSafe applications directly from the Jupyter environment.

  • \n
\n\n

Installation

\n\n
\n
pip3 install dapi\n
\n
\n"}, {"fullname": "dapi.jobs.dir", "modulename": "dapi.jobs.dir", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.jobs.dir.get_ds_path_uri", "modulename": "dapi.jobs.dir", "qualname": "get_ds_path_uri", "kind": "function", "doc": "

Given a path on DesignSafe, determine the correct input URI for Tapis v3.

\n\n

Args:\nt (Tapis): Tapis object to fetch profiles or metadata.\npath (str): The directory path.

\n\n

Returns:\nstr: The corresponding input URI.

\n\n

Raises:\nValueError: If no matching directory pattern is found.

\n", "signature": "(t: tapipy.tapis.Tapis, path: str) -> str:", "funcdef": "def"}, {"fullname": "dapi.jobs.jobs", "modulename": "dapi.jobs.jobs", "kind": "module", "doc": "

\n"}, {"fullname": "dapi.jobs.jobs.generate_job_info", "modulename": "dapi.jobs.jobs", "qualname": "generate_job_info", "kind": "function", "doc": "

Generates a job info dictionary based on the provided application name, job name, input URI, input file, and optional allocation.

\n\n

Args:\n t (object): The Tapis API client object.\n app_name (str): The name of the application to use for the job.\n input_uri (str): The URI of the input data for the job.\n input_file (str): The local file path to the input data for the job.\n job_name (str, optional): The name of the job to be created. Defaults to None.\n max_minutes (int, optional): The maximum number of minutes the job can run. Defaults to None.\n node_count (int, optional): The number of nodes to use for the job. Defaults to None.\n cores_per_node (int, optional): The number of cores per node for the job. Defaults to None.\n queue (str, optional): The queue to use for the job. Defaults to None.\n allocation (str, optional): The allocation to use for the job. Defaults to None.

\n\n

Returns:\n dict: The job info dictionary.

\n", "signature": "(\tt: Any,\tapp_name: str,\tinput_uri: str,\tinput_file: str,\tjob_name: str = None,\tmax_minutes: Optional[int] = None,\tnode_count: Optional[int] = None,\tcores_per_node: Optional[int] = None,\tqueue: Optional[str] = None,\tallocation: Optional[str] = None) -> Dict[str, Any]:", "funcdef": "def"}, {"fullname": "dapi.jobs.jobs.get_status", "modulename": "dapi.jobs.jobs", "qualname": "get_status", "kind": "function", "doc": "

Retrieves and monitors the status of a job using Tapis API.\nThis function waits for the job to start, then monitors it for up to maxMinutes.

\n\n

Args:\nt (object): The Tapis API client object.\nmjobUuid (str): The unique identifier of the job to monitor.\ntlapse (int, optional): Time interval, in seconds, to wait between status checks. Defaults to 15 seconds.

\n\n

Returns:\nstr: The final status of the job (FINISHED, FAILED, or STOPPED).

\n", "signature": "(t, mjobUuid, tlapse=15):", "funcdef": "def"}, {"fullname": "dapi.jobs.jobs.runtime_summary", "modulename": "dapi.jobs.jobs", "qualname": "runtime_summary", "kind": "function", "doc": "

Get the runtime of a job.\nArgs:\nt (object): The Tapis v3 client object.\njob_uuid (str): The UUID of the job for which the runtime needs to be determined.\nverbose (bool): If True, prints all history events. Otherwise, prints only specific statuses.\nReturns:\nNone: This function doesn't return a value, but it prints the runtime details.

\n", "signature": "(t, job_uuid, verbose=False):", "funcdef": "def"}]; - - // mirrored in build-search-index.js (part 1) - // Also split on html tags. this is a cheap heuristic, but good enough. - elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/); - - let searchIndex; - if (docs._isPrebuiltIndex) { - console.info("using precompiled search index"); - searchIndex = elasticlunr.Index.load(docs); - } else { - console.time("building search index"); - // mirrored in build-search-index.js (part 2) - searchIndex = elasticlunr(function () { - this.pipeline.remove(elasticlunr.stemmer); - this.pipeline.remove(elasticlunr.stopWordFilter); - this.addField("qualname"); - this.addField("fullname"); - this.addField("annotation"); - this.addField("default_value"); - this.addField("signature"); - this.addField("bases"); - this.addField("doc"); - this.setRef("fullname"); - }); - for (let doc of docs) { - searchIndex.addDoc(doc); - } - console.timeEnd("building search index"); - } - - return (term) => searchIndex.search(term, { - fields: { - qualname: {boost: 4}, - fullname: {boost: 2}, - annotation: {boost: 2}, - default_value: {boost: 2}, - signature: {boost: 2}, - bases: {boost: 2}, - doc: {boost: 1}, - }, - expand: true - }); -})(); \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..f85e7f6 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,17 @@ +/* Custom color override for DesignSafe blue */ +:root { + --md-primary-fg-color: #136ac9; + --md-primary-fg-color--light: #136ac9; + --md-primary-fg-color--dark: #136ac9; + --md-accent-fg-color: #136ac9; + --md-accent-fg-color--transparent: #136ac91a; +} + +/* Dark mode overrides */ +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #136ac9; + --md-primary-fg-color--light: #136ac9; + --md-primary-fg-color--dark: #136ac9; + --md-accent-fg-color: #136ac9; + --md-accent-fg-color--transparent: #136ac91a; +} \ No newline at end of file diff --git a/examples/apps.ipynb b/examples/apps.ipynb new file mode 100644 index 0000000..88b3a20 --- /dev/null +++ b/examples/apps.ipynb @@ -0,0 +1,394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4efabb5e", + "metadata": {}, + "source": [ + "# Finding Apps in DesignSafe" + ] + }, + { + "cell_type": "markdown", + "id": "abe5d8a3-32da-4233-b605-9fd51d053ec1", + "metadata": {}, + "source": [ + "## Install DesignSafe API (dapi)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f00e089d", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install dapi" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "839fa332-70a6-4818-a190-18c9ca109c28", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found existing installation: dapi 1.0.0\n", + "Uninstalling dapi-1.0.0:\n", + " Successfully uninstalled dapi-1.0.0\n", + "Obtaining file:///Users/krishna/dev/DesignSafe/dapi\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Checking if build backend supports build_editable ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build editable ... \u001b[?25ldone\n", + "\u001b[?25h Preparing editable metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: exceptiongroup<2.0.0,>=1.2.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.2.2)\n", + "Requirement already satisfied: jsonschema>=4.18.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (4.23.0)\n", + "Requirement already satisfied: numpy<3.0.0,>=2.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.1.3)\n", + "Requirement already satisfied: pandas<3.0.0,>=2.2.3 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.2.3)\n", + "Requirement already satisfied: pymysql<2.0.0,>=1.1.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.1.1)\n", + "Requirement already satisfied: python-dotenv<2.0.0,>=1.0.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.0.1)\n", + "Requirement already satisfied: sqlalchemy<3.0.0,>=2.0.23 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.0.36)\n", + "Requirement already satisfied: tapipy<2.0.0,>=1.6.3 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.7.0)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (4.67.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (24.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (2024.10.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.21.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2024.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2024.2)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from sqlalchemy<3.0.0,>=2.0.23->dapi==1.0.0) (4.12.2)\n", + "Requirement already satisfied: PyJWT>=1.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.9.0)\n", + "Requirement already satisfied: atomicwrites<2.0.0,>=1.4.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.4.1)\n", + "Requirement already satisfied: certifi>=2020.11.8 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2024.8.30)\n", + "Requirement already satisfied: cloudpickle>=1.6.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.0)\n", + "Requirement already satisfied: cryptography>=3.3.2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (43.0.3)\n", + "Requirement already satisfied: openapi_core==0.16.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.16.0)\n", + "Requirement already satisfied: openapi_spec_validator<0.6.0,>=0.5.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.5.4)\n", + "Requirement already satisfied: pyyaml>=5.4 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (6.0.2)\n", + "Requirement already satisfied: requests<3.0.0,>=2.20.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.32.3)\n", + "Requirement already satisfied: setuptools>=21.0.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (75.4.0)\n", + "Requirement already satisfied: six<2.0,>=1.10 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.16.0)\n", + "Requirement already satisfied: urllib3<2.0.0,>=1.26.5 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.26.20)\n", + "Requirement already satisfied: isodate in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.7.2)\n", + "Requirement already satisfied: jsonschema-spec<0.2.0,>=0.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.1.3)\n", + "Requirement already satisfied: more-itertools in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (10.5.0)\n", + "Requirement already satisfied: openapi-schema-validator<0.4.0,>=0.3.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.3.4)\n", + "Requirement already satisfied: parse in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.20.2)\n", + "Requirement already satisfied: pathable<0.5.0,>=0.4.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.4.3)\n", + "Requirement already satisfied: werkzeug in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.3)\n", + "Requirement already satisfied: cffi>=1.12 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.17.1)\n", + "Requirement already satisfied: lazy-object-proxy<2.0.0,>=1.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_spec_validator<0.6.0,>=0.5.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.10.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.4.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.10)\n", + "Requirement already satisfied: pycparser in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from cffi>=1.12->cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.22)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from werkzeug->openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.0.2)\n", + "Building wheels for collected packages: dapi\n", + " Building editable for dapi (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for dapi: filename=dapi-1.0.0-py3-none-any.whl size=3826 sha256=25a5c9308663e0078f3b0943613ad978d718bb5f64c36fd23162943a7d68b56f\n", + " Stored in directory: /private/var/folders/w8/xz590jyd7r36zmxcspgzj3z40000gn/T/pip-ephem-wheel-cache-sjzyd4es/wheels/98/df/91/ed70fe2dca11c3c6e5b6e8e6eef18c373a119d095037f892a3\n", + "Successfully built dapi\n", + "Installing collected packages: dapi\n", + "Successfully installed dapi-1.0.0\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m25.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.1.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip uninstall dapi --yes\n", + "!pip install -e ../" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "35fca324-ee48-41c8-84a1-78ad7b03aae8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "# Import only DSClient and exceptions needed at top level\n", + "from dapi import (\n", + " DSClient,\n", + " SubmittedJob,\n", + " interpret_job_status, # Import new function\n", + " AppDiscoveryError,\n", + " FileOperationError,\n", + " JobSubmissionError,\n", + " SystemInfoError,\n", + " JobMonitorError,\n", + " # Optionally import status constants if you want to check against them explicitly\n", + " STATUS_TIMEOUT,\n", + " STATUS_UNKNOWN,\n", + " TAPIS_TERMINAL_STATES,\n", + ")\n", + "import json\n", + "from datetime import datetime\n", + "from dataclasses import asdict\n", + "import pandas as pd\n", + "import tqdm as notebook_tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "58b62f77-23b6-4355-91f1-b680ae6d6cdf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing DSClient...\n", + "Authentication successful.\n", + "DatabaseAccessor initialized. Connections will be created on first access.\n", + "DSClient initialized.\n" + ] + } + ], + "source": [ + "try:\n", + " print(\"Initializing DSClient...\")\n", + " ds = DSClient()\n", + " print(\"DSClient initialized.\")\n", + "except Exception as e:\n", + " print(f\"Initialization failed: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to client initialization failure.\")" + ] + }, + { + "cell_type": "markdown", + "id": "721b9c95", + "metadata": {}, + "source": [ + "## Find all apps" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "335379df-6e64-475e-8c14-5c8c748e818e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 92 total apps.\n" + ] + } + ], + "source": [ + "# Find all apps (less verbose)\n", + "all_apps = ds.apps.find(\"\", verbose=False)\n", + "print(f\"Found {len(all_apps)} total apps.\")" + ] + }, + { + "cell_type": "markdown", + "id": "5487d205", + "metadata": {}, + "source": [ + "## Find a specific app" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f5574dcd-2c32-4822-be12-fe558747ebde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Found 2 matching apps:\n", + "- mpm (Version: 1.1.0, Owner: wma_prtl)\n", + "- mpm-s3 (Version: 1.0, Owner: wma_prtl)\n", + "\n" + ] + } + ], + "source": [ + "# Find MPM apps specifically\n", + "mpm_apps = ds.apps.find(\"mpm\", verbose=True)" + ] + }, + { + "cell_type": "markdown", + "id": "704c5fd4", + "metadata": {}, + "source": [ + "## Find description for an app" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "37074448-fe54-4aab-b458-cfe9dc1a5101", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "App Details:\n", + " ID: opensees-express\n", + " Version: latest\n", + " Owner: wma_prtl\n", + " Execution System: wma-exec-01\n", + " Description: OpenSees-EXPRESS provides users with a sequential OpenSees interpreter. It is ideal to run small sequential scripts on DesignSafe resources freeing up your own machine.\n", + "App Description: \n", + "containerImage: tapis://cloud.data/corral/tacc/aci/CEP/applications/v3/opensees/latest/OpenSees-EXPRESS/opensees_express.zip\n", + "created: 2025-02-20T18:41:03.661272Z\n", + "deleted: False\n", + "description: OpenSees-EXPRESS provides users with a sequential OpenSees interpreter. It is ideal to run small sequential scripts on DesignSafe resources freeing up your own machine.\n", + "enabled: True\n", + "id: opensees-express\n", + "isPublic: True\n", + "jobAttributes: \n", + "archiveOnAppError: True\n", + "archiveSystemDir: /tmp/${JobOwner}/tapis-jobs-archive/${JobCreateDate}/${JobName}-${JobUUID}\n", + "archiveSystemId: cloud.data\n", + "cmdPrefix: None\n", + "coresPerNode: 1\n", + "description: None\n", + "dtnSystemInputDir: !tapis_not_set\n", + "dtnSystemOutputDir: !tapis_not_set\n", + "dynamicExecSystem: False\n", + "execSystemConstraints: None\n", + "execSystemExecDir: ${JobWorkingDir}\n", + "execSystemId: wma-exec-01\n", + "execSystemInputDir: ${JobWorkingDir}\n", + "execSystemLogicalQueue: None\n", + "execSystemOutputDir: ${JobWorkingDir}\n", + "fileInputArrays: []\n", + "fileInputs: [\n", + "autoMountLocal: True\n", + "description: Input directory that includes the tcl script as well as any other required files. Example input is in tapis://designsafe.storage.community/app_examples/opensees/OpenSeesEXPRESS\n", + "envKey: inputDirectory\n", + "inputMode: REQUIRED\n", + "name: Input Directory\n", + "notes: \n", + "selectionMode: directory\n", + "sourceUrl: None\n", + "targetPath: *]\n", + "isMpi: False\n", + "maxMinutes: 1440\n", + "memoryMB: 100\n", + "mpiCmd: None\n", + "nodeCount: 1\n", + "parameterSet: \n", + "appArgs: []\n", + "archiveFilter: \n", + "excludes: ['opensees-express.zip', 'tapisjob.env']\n", + "includeLaunchFiles: True\n", + "includes: []\n", + "containerArgs: []\n", + "envVariables: [\n", + "description: Choose the OpenSees binary to use.\n", + "inputMode: REQUIRED\n", + "key: mainProgram\n", + "notes: \n", + "enum_values: [\n", + "OpenSees: OpenSees, \n", + "OpenSeesSP: OpenSeesSP, \n", + "OpenSeesMP: OpenSeesMP]\n", + "label: Main Program\n", + "value: OpenSees, \n", + "description: The filename of the OpenSees TCL script to execute, e.g. \"freeFieldEffective.tcl\".\n", + "inputMode: REQUIRED\n", + "key: tclScript\n", + "notes: \n", + "inputType: fileInput\n", + "label: Main Script\n", + "value: ]\n", + "logConfig: \n", + "stderrFilename: \n", + "stdoutFilename: \n", + "schedulerOptions: []\n", + "subscriptions: []\n", + "tags: []\n", + "jobType: FORK\n", + "locked: False\n", + "maxJobs: 2147483647\n", + "maxJobsPerUser: 2147483647\n", + "notes: \n", + "category: Simulation\n", + "helpUrl: https://www.designsafe-ci.org/user-guide/tools/simulation/#opensees-user-guide\n", + "hideNodeCountAndCoresPerNode: True\n", + "icon: OpenSees\n", + "isInteractive: False\n", + "label: OpenSees-EXPRESS (VM)\n", + "owner: wma_prtl\n", + "runtime: ZIP\n", + "runtimeOptions: None\n", + "runtimeVersion: None\n", + "sharedAppCtx: wma_prtl\n", + "sharedWithUsers: []\n", + "strictFileInputs: True\n", + "tags: ['portalName: DesignSafe', 'portalName: CEP']\n", + "tenant: designsafe\n", + "updated: 2025-02-26T21:17:36.417952Z\n", + "uuid: 30cb1fa1-e7c7-44a8-a0e8-d2f64043fc65\n", + "version: latest\n", + "versionEnabled: True\n" + ] + } + ], + "source": [ + "# Get details for the specific MPM app we want to use\n", + "app_id_to_use = \"opensees-express\"\n", + "app_details = ds.apps.get_details(app_id_to_use, verbose=True)\n", + "\n", + "if not app_details:\n", + " raise SystemExit(\n", + " f\"Could not find details for app '{app_id_to_use}'. Please check the app ID.\"\n", + " )\n", + "# Print the app details\n", + "\n", + "print(f\"App Description: {app_details}\")" + ] + } + ], + "metadata": { + "IMAGE_NAME": "taccsciapps/ds-nb-img:base-0.2.1", + "UUID": "ad99fe82-d690-11ec-8bc3-165d4cd45074", + "kernelspec": { + "display_name": "dapi-ptztLUqK-py3.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/db.ipynb b/examples/db.ipynb new file mode 100644 index 0000000..7be6961 --- /dev/null +++ b/examples/db.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8ad4dbd4", + "metadata": {}, + "source": [ + "# Dapi Database Access" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a76c77b-0078-48fc-ade6-e46cbac010dd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found existing installation: dapi 1.0.0\n", + "Uninstalling dapi-1.0.0:\n", + " Successfully uninstalled dapi-1.0.0\n", + "Collecting git+https://github.com/DesignSafe-CI/dapi.git@t3\n", + " Cloning https://github.com/DesignSafe-CI/dapi.git (to revision t3) to /tmp/pip-req-build-f6bbn80i\n", + " Running command git clone --filter=blob:none --quiet https://github.com/DesignSafe-CI/dapi.git /tmp/pip-req-build-f6bbn80i\n", + " Running command git checkout -b t3 --track origin/t3\n", + " Switched to a new branch 't3'\n", + " Branch 't3' set up to track remote branch 't3' from 'origin'.\n", + " Resolved https://github.com/DesignSafe-CI/dapi.git to commit 6e85ea5b2b26fe7a82220db6260ac6c2124caaee\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: exceptiongroup<2.0.0,>=1.2.0 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (1.2.2)\n", + "Requirement already satisfied: jsonschema>=4.18.0 in /opt/conda/lib/python3.11/site-packages (from dapi==1.0.0) (4.23.0)\n", + "Requirement already satisfied: numpy<3.0.0,>=2.1.1 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (2.2.5)\n", + "Requirement already satisfied: pandas<3.0.0,>=2.2.3 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (2.2.3)\n", + "Requirement already satisfied: pymysql<2.0.0,>=1.1.0 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (1.1.1)\n", + "Requirement already satisfied: python-dotenv<2.0.0,>=1.0.1 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (1.1.0)\n", + "Requirement already satisfied: sqlalchemy<3.0.0,>=2.0.23 in /home/jupyter/.local/lib/python3.11/site-packages (from dapi==1.0.0) (2.0.40)\n", + "Requirement already satisfied: tapipy<2.0.0,>=1.6.3 in /opt/conda/lib/python3.11/site-packages (from dapi==1.0.0) (1.7.0)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /opt/conda/lib/python3.11/site-packages (from dapi==1.0.0) (4.66.1)\n", + "Requirement already satisfied: attrs>=22.2.0 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (23.1.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (2023.7.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.30.2)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.10.6)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.11/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.11/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2023.3.post1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /home/jupyter/.local/lib/python3.11/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2025.2)\n", + "Requirement already satisfied: greenlet>=1 in /opt/conda/lib/python3.11/site-packages (from sqlalchemy<3.0.0,>=2.0.23->dapi==1.0.0) (3.0.0)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in /opt/conda/lib/python3.11/site-packages (from sqlalchemy<3.0.0,>=2.0.23->dapi==1.0.0) (4.8.0)\n", + "Requirement already satisfied: PyJWT>=1.7.1 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.8.0)\n", + "Requirement already satisfied: atomicwrites<2.0.0,>=1.4.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.4.1)\n", + "Requirement already satisfied: certifi>=2020.11.8 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2023.7.22)\n", + "Requirement already satisfied: cloudpickle>=1.6.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.0)\n", + "Requirement already satisfied: cryptography>=3.3.2 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (41.0.4)\n", + "Requirement already satisfied: openapi_core==0.16.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.16.0)\n", + "Requirement already satisfied: openapi_spec_validator<0.6.0,>=0.5.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.5.4)\n", + "Requirement already satisfied: pyyaml>=5.4 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (6.0.1)\n", + "Requirement already satisfied: requests<3.0.0,>=2.20.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.31.0)\n", + "Requirement already satisfied: setuptools>=21.0.0 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (68.2.2)\n", + "Requirement already satisfied: six<2.0,>=1.10 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.16.0)\n", + "Requirement already satisfied: urllib3<2.0.0,>=1.26.5 in /opt/conda/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.26.20)\n", + "Requirement already satisfied: isodate in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.7.2)\n", + "Requirement already satisfied: jsonschema-spec<0.2.0,>=0.1.1 in /home/jupyter/.local/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.1.3)\n", + "Requirement already satisfied: more-itertools in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (10.5.0)\n", + "Requirement already satisfied: openapi-schema-validator<0.4.0,>=0.3.0 in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.3.4)\n", + "Requirement already satisfied: parse in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.20.2)\n", + "Requirement already satisfied: pathable<0.5.0,>=0.4.0 in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.4.3)\n", + "Requirement already satisfied: werkzeug in /opt/conda/lib/python3.11/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.2)\n", + "Requirement already satisfied: cffi>=1.12 in /opt/conda/lib/python3.11/site-packages (from cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.16.0)\n", + "Requirement already satisfied: lazy-object-proxy<2.0.0,>=1.7.1 in /opt/conda/lib/python3.11/site-packages (from openapi_spec_validator<0.6.0,>=0.5.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.10.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.11/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.3.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.11/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.4)\n", + "Requirement already satisfied: pycparser in /opt/conda/lib/python3.11/site-packages (from cffi>=1.12->cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.21)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in /opt/conda/lib/python3.11/site-packages (from werkzeug->openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.1.3)\n", + "Building wheels for collected packages: dapi\n", + " Building wheel for dapi (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for dapi: filename=dapi-1.0.0-py3-none-any.whl size=24062 sha256=cf0ff0df24ae1cb99cf56a627d1fdcd6d5d91e53a3c9eae6e99b8f3ab519713a\n", + " Stored in directory: /tmp/pip-ephem-wheel-cache-58or_9hm/wheels/e1/79/c6/a9ec0b77e5349b798d57dca8ea213ee48626dea9e159e67fdc\n", + "Successfully built dapi\n", + "Installing collected packages: dapi\n", + "Successfully installed dapi-1.0.0\n" + ] + } + ], + "source": [ + "!pip uninstall dapi --yes\n", + "!pip install git+https://github.com/DesignSafe-CI/dapi.git@dev --user" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "06f33aaa", + "metadata": {}, + "outputs": [], + "source": [ + "# Cell: Imports\n", + "import os\n", + "from dapi import DSClient # Import only the main client\n", + "\n", + "# Import exceptions if needed for specific handling later\n", + "from dapi import FileOperationError, JobSubmissionError, JobMonitorError\n", + "import json\n", + "from datetime import datetime\n", + "from dataclasses import asdict\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "abc973d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing DSClient...\n", + "Authentication successful.\n", + "DatabaseAccessor initialized. Connections will be created on first access.\n", + "DSClient initialized.\n" + ] + } + ], + "source": [ + "# Authenticate & Initialize Client\n", + "try:\n", + " print(\"Initializing DSClient...\")\n", + " ds = DSClient() # This sets up ds.db internally\n", + " print(\"DSClient initialized.\")\n", + "except Exception as e:\n", + " print(f\"Initialization failed: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to client initialization failure.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3c1d34e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating database convenience variables...\n", + "First access to 'ngl', initializing DSDatabase...\n", + "Creating SQLAlchemy engine for database 'sjbrande_ngl_db' (ngl)...\n", + "Engine for 'ngl' created.\n", + "First access to 'vp', initializing DSDatabase...\n", + "Creating SQLAlchemy engine for database 'sjbrande_vpdb' (vp)...\n", + "Engine for 'vp' created.\n", + "First access to 'eq', initializing DSDatabase...\n", + "Creating SQLAlchemy engine for database 'post_earthquake_recovery' (eq)...\n", + "Engine for 'eq' created.\n", + "Database variables (ngl, vp, eq) created.\n" + ] + } + ], + "source": [ + "# Create Convenience Variables for Databases (Optional but meets user request)\n", + "print(\"\\nCreating database convenience variables...\")\n", + "try:\n", + " # These lines trigger the lazy initialization in DatabaseAccessor._get_db\n", + " # if the specific database hasn't been accessed yet.\n", + " ngl = ds.db.ngl\n", + " vp = ds.db.vp\n", + " eq = ds.db.eq\n", + " print(\"Database variables (ngl, vp, eq) created.\")\n", + " # Note: Engines/pools are now created, but connections are only used during queries.\n", + "except Exception as e:\n", + " print(f\"Failed to create database convenience variables: {e}\")\n", + " # Decide if this is critical - maybe only some DBs are needed?\n", + " # For now, we'll continue but note the failure.\n", + " ngl, vp, eq = None, None, None # Ensure they exist but are None" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "80a7fa20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Querying NGL Database using 'ngl' variable...\n", + "Executing query on 'ngl'...\n", + "--- NGL Data (DataFrame) ---\n", + " SITE_ID SITE_NAME SITE_LAT SITE_LON \\\n", + "0 147 Amagasaki 34.715560 135.400750 \n", + "1 148 Bonds Corner 32.693100 -115.338200 \n", + "2 149 Hachirogata 39.850000 140.017000 \n", + "3 150 Higashi-Kobe Bridge 34.710214 135.293345 \n", + "4 151 Hanshin Expressway 34.724834 135.301489 \n", + "\n", + " SITE_GEOL \\\n", + "0 Qal \n", + "1 Qal, deep, Imperial Valley \n", + "2 Af (Fill) \n", + "3 Af (Fill) \n", + "4 \n", + "\n", + " SITE_REM SITE_STAT SITE_REVW \n", + "0 Industrial site near Yomoga River. Coordinate... 1 2 \n", + "1 1 2 \n", + "2 Gingery indicates the geology near the strong ... 1 2 \n", + "3 A geologic map of the area (Geological Survey ... 1 2 \n", + "4 Hanshin Expressway (Mylonakis et al. 2006) 1 2 \n" + ] + } + ], + "source": [ + "## Database Example Usage (Using convenience variables)\n", + "if ngl: # Check if ngl variable was successfully created\n", + " try:\n", + " print(\"\\nQuerying NGL Database using 'ngl' variable...\")\n", + " sql = \"SELECT * FROM SITE LIMIT 5\"\n", + " # Use the convenience variable directly\n", + " df_ngl = ngl.read_sql(sql, output_type=\"DataFrame\")\n", + " print(\"--- NGL Data (DataFrame) ---\")\n", + " print(df_ngl)\n", + " except Exception as e:\n", + " print(f\"\\nAn error occurred during NGL database query: {e}\")\n", + "else:\n", + " print(\"\\nSkipping NGL query as 'ngl' variable is not available.\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/mpm-minimal.ipynb b/examples/mpm-minimal.ipynb new file mode 100644 index 0000000..5897466 --- /dev/null +++ b/examples/mpm-minimal.ipynb @@ -0,0 +1,862 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4efabb5e", + "metadata": {}, + "source": [ + "# Templatized notebook for running CB-Geo MPM TAPIS job" + ] + }, + { + "cell_type": "markdown", + "id": "abe5d8a3-32da-4233-b605-9fd51d053ec1", + "metadata": {}, + "source": [ + "## Install DesignSafe API (dapi)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d84cd553", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: Skipping dapi as it is not installed.\u001b[0m\u001b[33m\n", + "\u001b[0mObtaining file:///Users/krishna/dev/designsafe/dapi\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Checking if build backend supports build_editable ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build editable ... \u001b[?25ldone\n", + "\u001b[?25h Preparing editable metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hCollecting exceptiongroup<2.0.0,>=1.2.0 (from dapi==1.0.0)\n", + " Downloading exceptiongroup-1.3.0-py3-none-any.whl.metadata (6.7 kB)\n", + "Collecting jsonschema>=4.18.0 (from dapi==1.0.0)\n", + " Downloading jsonschema-4.24.0-py3-none-any.whl.metadata (7.8 kB)\n", + "Collecting mkdocs<1.6,>=1.5 (from dapi==1.0.0)\n", + " Downloading mkdocs-1.5.3-py3-none-any.whl.metadata (6.2 kB)\n", + "Collecting mkdocs-material<9.5,>=9.0 (from dapi==1.0.0)\n", + " Downloading mkdocs_material-9.4.14-py3-none-any.whl.metadata (16 kB)\n", + "Collecting mkdocstrings<0.24,>=0.20 (from mkdocstrings[python]<0.24,>=0.20->dapi==1.0.0)\n", + " Downloading mkdocstrings-0.23.0-py3-none-any.whl.metadata (7.6 kB)\n", + "Collecting numpy<3.0.0,>=2.1.1 (from dapi==1.0.0)\n", + " Downloading numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl.metadata (62 kB)\n", + "Collecting pandas<3.0.0,>=2.2.3 (from dapi==1.0.0)\n", + " Downloading pandas-2.3.0-cp311-cp311-macosx_11_0_arm64.whl.metadata (91 kB)\n", + "Collecting pymysql<2.0.0,>=1.1.0 (from dapi==1.0.0)\n", + " Downloading PyMySQL-1.1.1-py3-none-any.whl.metadata (4.4 kB)\n", + "Collecting python-dotenv<2.0.0,>=1.0.1 (from dapi==1.0.0)\n", + " Using cached python_dotenv-1.1.0-py3-none-any.whl.metadata (24 kB)\n", + "Collecting sqlalchemy<3.0.0,>=2.0.23 (from dapi==1.0.0)\n", + " Using cached sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl.metadata (9.6 kB)\n", + "Collecting tapipy<2.0.0,>=1.6.3 (from dapi==1.0.0)\n", + " Downloading tapipy-1.8.4-py3-none-any.whl.metadata (10 kB)\n", + "Collecting tqdm<5.0.0,>=4.66.1 (from dapi==1.0.0)\n", + " Using cached tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from exceptiongroup<2.0.0,>=1.2.0->dapi==1.0.0) (4.14.0)\n", + "Collecting attrs>=22.2.0 (from jsonschema>=4.18.0->dapi==1.0.0)\n", + " Using cached attrs-25.3.0-py3-none-any.whl.metadata (10 kB)\n", + "Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.18.0->dapi==1.0.0)\n", + " Using cached jsonschema_specifications-2025.4.1-py3-none-any.whl.metadata (2.9 kB)\n", + "Collecting referencing>=0.28.4 (from jsonschema>=4.18.0->dapi==1.0.0)\n", + " Using cached referencing-0.36.2-py3-none-any.whl.metadata (2.8 kB)\n", + "Collecting rpds-py>=0.7.1 (from jsonschema>=4.18.0->dapi==1.0.0)\n", + " Downloading rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl.metadata (4.1 kB)\n", + "Collecting click>=7.0 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading click-8.2.1-py3-none-any.whl.metadata (2.5 kB)\n", + "Collecting ghp-import>=1.0 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading ghp_import-2.1.0-py3-none-any.whl.metadata (7.2 kB)\n", + "Collecting jinja2>=2.11.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)\n", + "Collecting markdown>=3.2.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading markdown-3.8-py3-none-any.whl.metadata (5.1 kB)\n", + "Collecting markupsafe>=2.0.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Using cached MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl.metadata (4.0 kB)\n", + "Collecting mergedeep>=1.3.4 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading mergedeep-1.3.4-py3-none-any.whl.metadata (4.3 kB)\n", + "Requirement already satisfied: packaging>=20.5 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from mkdocs<1.6,>=1.5->dapi==1.0.0) (25.0)\n", + "Collecting pathspec>=0.11.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Using cached pathspec-0.12.1-py3-none-any.whl.metadata (21 kB)\n", + "Requirement already satisfied: platformdirs>=2.2.0 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from mkdocs<1.6,>=1.5->dapi==1.0.0) (4.3.8)\n", + "Collecting pyyaml-env-tag>=0.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading pyyaml_env_tag-1.1-py3-none-any.whl.metadata (5.5 kB)\n", + "Collecting pyyaml>=5.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Using cached PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl.metadata (2.1 kB)\n", + "Collecting watchdog>=2.0 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl.metadata (44 kB)\n", + "Collecting babel~=2.10 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached babel-2.17.0-py3-none-any.whl.metadata (2.0 kB)\n", + "Collecting colorama~=0.4 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)\n", + "Collecting mkdocs-material-extensions~=1.3 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Downloading mkdocs_material_extensions-1.3.1-py3-none-any.whl.metadata (6.9 kB)\n", + "Collecting paginate~=0.5 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Downloading paginate-0.5.7-py2.py3-none-any.whl.metadata (11 kB)\n", + "Requirement already satisfied: pygments~=2.16 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from mkdocs-material<9.5,>=9.0->dapi==1.0.0) (2.19.1)\n", + "Collecting pymdown-extensions~=10.2 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Downloading pymdown_extensions-10.15-py3-none-any.whl.metadata (3.0 kB)\n", + "Collecting regex>=2022.4 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl.metadata (40 kB)\n", + "Collecting requests~=2.26 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached requests-2.32.3-py3-none-any.whl.metadata (4.6 kB)\n", + "Collecting mkdocs-autorefs>=0.3.1 (from mkdocstrings<0.24,>=0.20->mkdocstrings[python]<0.24,>=0.20->dapi==1.0.0)\n", + " Downloading mkdocs_autorefs-1.4.2-py3-none-any.whl.metadata (13 kB)\n", + "Collecting mkdocstrings-python>=0.5.2 (from mkdocstrings[python]<0.24,>=0.20->dapi==1.0.0)\n", + " Downloading mkdocstrings_python-1.16.12-py3-none-any.whl.metadata (5.6 kB)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2.9.0.post0)\n", + "Collecting pytz>=2020.1 (from pandas<3.0.0,>=2.2.3->dapi==1.0.0)\n", + " Using cached pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)\n", + "Collecting tzdata>=2022.7 (from pandas<3.0.0,>=2.2.3->dapi==1.0.0)\n", + " Using cached tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB)\n", + "Collecting PyJWT>=1.7.1 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading PyJWT-2.10.1-py3-none-any.whl.metadata (4.0 kB)\n", + "Collecting atomicwrites<2.0.0,>=1.4.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Using cached atomicwrites-1.4.1-py2.py3-none-any.whl\n", + "Collecting certifi>=2020.11.8 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Using cached certifi-2025.4.26-py3-none-any.whl.metadata (2.5 kB)\n", + "Collecting cloudpickle>=1.6.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading cloudpickle-3.1.1-py3-none-any.whl.metadata (7.1 kB)\n", + "Collecting cryptography>=3.3.2 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl.metadata (5.7 kB)\n", + "Collecting openapi_core==0.16.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading openapi_core-0.16.0-py3-none-any.whl.metadata (7.1 kB)\n", + "Collecting openapi_spec_validator<0.6.0,>=0.5.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Using cached openapi_spec_validator-0.5.7-py3-none-any.whl.metadata (5.4 kB)\n", + "Requirement already satisfied: setuptools>=21.0.0 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (80.3.1)\n", + "Requirement already satisfied: six<2.0,>=1.10 in /Users/krishna/dev/designsafe/dapi/env/lib/python3.11/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.17.0)\n", + "Collecting urllib3<2.0.0,>=1.26.5 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading urllib3-1.26.20-py2.py3-none-any.whl.metadata (50 kB)\n", + "Collecting isodate (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading isodate-0.7.2-py3-none-any.whl.metadata (11 kB)\n", + "Collecting jsonschema-spec<0.2.0,>=0.1.1 (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Using cached jsonschema_spec-0.1.6-py3-none-any.whl.metadata (4.4 kB)\n", + "Collecting more-itertools (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading more_itertools-10.7.0-py3-none-any.whl.metadata (37 kB)\n", + "Collecting openapi-schema-validator<0.4.0,>=0.3.0 (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading openapi_schema_validator-0.3.4-py3-none-any.whl.metadata (7.9 kB)\n", + "Collecting parse (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading parse-1.20.2-py2.py3-none-any.whl.metadata (22 kB)\n", + "Collecting pathable<0.5.0,>=0.4.0 (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading pathable-0.4.4-py3-none-any.whl.metadata (1.8 kB)\n", + "Collecting werkzeug (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB)\n", + "Collecting cffi>=1.14 (from cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl.metadata (1.5 kB)\n", + "INFO: pip is looking at multiple versions of mkdocstrings-python to determine which version is compatible with other requirements. This could take a while.\n", + "Collecting mkdocstrings-python>=0.5.2 (from mkdocstrings[python]<0.24,>=0.20->dapi==1.0.0)\n", + " Downloading mkdocstrings_python-1.16.11-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.10-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.9-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.8-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.7-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.6-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.5-py3-none-any.whl.metadata (5.6 kB)\n", + "INFO: pip is still looking at multiple versions of mkdocstrings-python to determine which version is compatible with other requirements. This could take a while.\n", + " Downloading mkdocstrings_python-1.16.4-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.3-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.2-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.1-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.16.0-py3-none-any.whl.metadata (5.6 kB)\n", + "INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press Ctrl + C.\n", + " Downloading mkdocstrings_python-1.15.1-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.15.0-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.7-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.6-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.5-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.4-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.3-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.2-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.1-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.14.0-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.13.0-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.12.2-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.12.1-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.12.0-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.11.1-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.11.0-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.9-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.8-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.7-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.6-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.5-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.4-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading mkdocstrings_python-1.10.3-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.10.2-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.10.1-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.10.0-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.9.2-py3-none-any.whl.metadata (5.5 kB)\n", + " Downloading mkdocstrings_python-1.9.1-py3-none-any.whl.metadata (5.5 kB)\n", + "Collecting markdown>=3.2.1 (from mkdocs<1.6,>=1.5->dapi==1.0.0)\n", + " Downloading Markdown-3.5.2-py3-none-any.whl.metadata (7.0 kB)\n", + "Collecting griffe>=0.37 (from mkdocstrings-python>=0.5.2->mkdocstrings[python]<0.24,>=0.20->dapi==1.0.0)\n", + " Using cached griffe-1.7.3-py3-none-any.whl.metadata (5.0 kB)\n", + "INFO: pip is looking at multiple versions of openapi-spec-validator to determine which version is compatible with other requirements. This could take a while.\n", + "Collecting openapi_spec_validator<0.6.0,>=0.5.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading openapi_spec_validator-0.5.6-py3-none-any.whl.metadata (5.6 kB)\n", + " Downloading openapi_spec_validator-0.5.5-py3-none-any.whl.metadata (5.9 kB)\n", + "Collecting lazy-object-proxy<2.0.0,>=1.7.1 (from openapi_spec_validator<0.6.0,>=0.5.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading lazy_object_proxy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl.metadata (8.4 kB)\n", + "Collecting openapi_spec_validator<0.6.0,>=0.5.0 (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading openapi_spec_validator-0.5.4-py3-none-any.whl.metadata (5.9 kB)\n", + "INFO: pip is looking at multiple versions of pymdown-extensions to determine which version is compatible with other requirements. This could take a while.\n", + "Collecting pymdown-extensions~=10.2 (from mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Downloading pymdown_extensions-10.14.3-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.14.2-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.14.1-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.14-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.13-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.12-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.11.2-py3-none-any.whl.metadata (3.0 kB)\n", + "INFO: pip is still looking at multiple versions of pymdown-extensions to determine which version is compatible with other requirements. This could take a while.\n", + " Downloading pymdown_extensions-10.11.1-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.11-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.10.2-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.10.1-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.10-py3-none-any.whl.metadata (3.0 kB)\n", + "INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press Ctrl + C.\n", + " Downloading pymdown_extensions-10.9-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.8.1-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.8-py3-none-any.whl.metadata (3.0 kB)\n", + " Downloading pymdown_extensions-10.7.1-py3-none-any.whl.metadata (3.0 kB)\n", + "Collecting charset-normalizer<4,>=2 (from requests~=2.26->mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl.metadata (35 kB)\n", + "Collecting idna<4,>=2.5 (from requests~=2.26->mkdocs-material<9.5,>=9.0->dapi==1.0.0)\n", + " Using cached idna-3.10-py3-none-any.whl.metadata (10 kB)\n", + "Collecting pycparser (from cffi>=1.14->cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Using cached pycparser-2.22-py3-none-any.whl.metadata (943 bytes)\n", + "INFO: pip is looking at multiple versions of jsonschema-spec to determine which version is compatible with other requirements. This could take a while.\n", + "Collecting jsonschema-spec<0.2.0,>=0.1.1 (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0)\n", + " Downloading jsonschema_spec-0.1.5-py3-none-any.whl.metadata (4.4 kB)\n", + " Downloading jsonschema_spec-0.1.4-py3-none-any.whl.metadata (4.6 kB)\n", + " Downloading jsonschema_spec-0.1.3-py3-none-any.whl.metadata (3.9 kB)\n", + "Downloading exceptiongroup-1.3.0-py3-none-any.whl (16 kB)\n", + "Downloading jsonschema-4.24.0-py3-none-any.whl (88 kB)\n", + "Downloading mkdocs-1.5.3-py3-none-any.whl (3.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.7/3.7 MB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading mkdocs_material-9.4.14-py3-none-any.whl (8.4 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.4/8.4 MB\u001b[0m \u001b[31m17.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading mkdocstrings-0.23.0-py3-none-any.whl (25 kB)\n", + "Downloading numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl (5.4 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.4/5.4 MB\u001b[0m \u001b[31m16.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading pandas-2.3.0-cp311-cp311-macosx_11_0_arm64.whl (10.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.8/10.8 MB\u001b[0m \u001b[31m18.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading PyMySQL-1.1.1-py3-none-any.whl (44 kB)\n", + "Using cached python_dotenv-1.1.0-py3-none-any.whl (20 kB)\n", + "Using cached sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl (2.1 MB)\n", + "Downloading tapipy-1.8.4-py3-none-any.whl (311 kB)\n", + "Using cached openapi_core-0.16.0-py3-none-any.whl (67 kB)\n", + "Using cached tqdm-4.67.1-py3-none-any.whl (78 kB)\n", + "Using cached attrs-25.3.0-py3-none-any.whl (63 kB)\n", + "Using cached babel-2.17.0-py3-none-any.whl (10.2 MB)\n", + "Using cached certifi-2025.4.26-py3-none-any.whl (159 kB)\n", + "Downloading click-8.2.1-py3-none-any.whl (102 kB)\n", + "Downloading cloudpickle-3.1.1-py3-none-any.whl (20 kB)\n", + "Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", + "Downloading cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl (7.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.1/7.1 MB\u001b[0m \u001b[31m4.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", + "\u001b[?25hDownloading ghp_import-2.1.0-py3-none-any.whl (11 kB)\n", + "Using cached jinja2-3.1.6-py3-none-any.whl (134 kB)\n", + "Using cached jsonschema_specifications-2025.4.1-py3-none-any.whl (18 kB)\n", + "Using cached MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl (12 kB)\n", + "Downloading mergedeep-1.3.4-py3-none-any.whl (6.4 kB)\n", + "Downloading mkdocs_autorefs-1.4.2-py3-none-any.whl (24 kB)\n", + "Downloading mkdocs_material_extensions-1.3.1-py3-none-any.whl (8.7 kB)\n", + "Downloading mkdocstrings_python-1.9.1-py3-none-any.whl (58 kB)\n", + "Downloading Markdown-3.5.2-py3-none-any.whl (103 kB)\n", + "Using cached openapi_spec_validator-0.5.4-py3-none-any.whl (32 kB)\n", + "Downloading paginate-0.5.7-py2.py3-none-any.whl (13 kB)\n", + "Using cached pathspec-0.12.1-py3-none-any.whl (31 kB)\n", + "Downloading PyJWT-2.10.1-py3-none-any.whl (22 kB)\n", + "Downloading pymdown_extensions-10.7.1-py3-none-any.whl (250 kB)\n", + "Using cached pytz-2025.2-py2.py3-none-any.whl (509 kB)\n", + "Using cached PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl (172 kB)\n", + "Downloading pyyaml_env_tag-1.1-py3-none-any.whl (4.7 kB)\n", + "Using cached referencing-0.36.2-py3-none-any.whl (26 kB)\n", + "Using cached regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl (284 kB)\n", + "Using cached requests-2.32.3-py3-none-any.whl (64 kB)\n", + "Downloading rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl (359 kB)\n", + "Using cached tzdata-2025.2-py2.py3-none-any.whl (347 kB)\n", + "Downloading urllib3-1.26.20-py2.py3-none-any.whl (144 kB)\n", + "Downloading watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl (89 kB)\n", + "Downloading cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl (178 kB)\n", + "Using cached charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl (198 kB)\n", + "Using cached griffe-1.7.3-py3-none-any.whl (129 kB)\n", + "Using cached idna-3.10-py3-none-any.whl (70 kB)\n", + "Downloading jsonschema_spec-0.1.3-py3-none-any.whl (12 kB)\n", + "Downloading lazy_object_proxy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl (28 kB)\n", + "Using cached openapi_schema_validator-0.3.4-py3-none-any.whl (9.8 kB)\n", + "Downloading pathable-0.4.4-py3-none-any.whl (9.6 kB)\n", + "Downloading isodate-0.7.2-py3-none-any.whl (22 kB)\n", + "Downloading more_itertools-10.7.0-py3-none-any.whl (65 kB)\n", + "Downloading parse-1.20.2-py2.py3-none-any.whl (20 kB)\n", + "Downloading werkzeug-3.1.3-py3-none-any.whl (224 kB)\n", + "Using cached pycparser-2.22-py3-none-any.whl (117 kB)\n", + "Building wheels for collected packages: dapi\n", + " Building editable for dapi (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for dapi: filename=dapi-1.0.0-py3-none-any.whl size=3956 sha256=0efcd1ce2cee5995ab44bf81aaaa71ef4259006d40cbc9ea24d547ab0a2f25e9\n", + " Stored in directory: /private/var/folders/6k/lmrc2s553fq0vn7c57__f37r0000gn/T/pip-ephem-wheel-cache-ifi7apzu/wheels/25/ae/22/58a8882864c6c6d809db0560400b6efe27cce7a4c875a32c86\n", + "Successfully built dapi\n", + "Installing collected packages: pytz, parse, paginate, watchdog, urllib3, tzdata, tqdm, sqlalchemy, rpds-py, regex, pyyaml, python-dotenv, pymysql, PyJWT, pycparser, pathspec, pathable, numpy, more-itertools, mkdocs-material-extensions, mergedeep, markupsafe, markdown, lazy-object-proxy, isodate, idna, exceptiongroup, colorama, cloudpickle, click, charset-normalizer, certifi, babel, attrs, atomicwrites, werkzeug, requests, referencing, pyyaml-env-tag, pymdown-extensions, pandas, jinja2, griffe, ghp-import, cffi, mkdocs, jsonschema-specifications, cryptography, mkdocs-material, mkdocs-autorefs, jsonschema, openapi-schema-validator, mkdocstrings, jsonschema-spec, openapi_spec_validator, mkdocstrings-python, openapi_core, tapipy, dapi\n", + "Successfully installed PyJWT-2.10.1 atomicwrites-1.4.1 attrs-25.3.0 babel-2.17.0 certifi-2025.4.26 cffi-1.17.1 charset-normalizer-3.4.2 click-8.2.1 cloudpickle-3.1.1 colorama-0.4.6 cryptography-45.0.3 dapi-1.0.0 exceptiongroup-1.3.0 ghp-import-2.1.0 griffe-1.7.3 idna-3.10 isodate-0.7.2 jinja2-3.1.6 jsonschema-4.24.0 jsonschema-spec-0.1.3 jsonschema-specifications-2025.4.1 lazy-object-proxy-1.11.0 markdown-3.5.2 markupsafe-3.0.2 mergedeep-1.3.4 mkdocs-1.5.3 mkdocs-autorefs-1.4.2 mkdocs-material-9.4.14 mkdocs-material-extensions-1.3.1 mkdocstrings-0.23.0 mkdocstrings-python-1.9.1 more-itertools-10.7.0 numpy-2.2.6 openapi-schema-validator-0.3.4 openapi_core-0.16.0 openapi_spec_validator-0.5.4 paginate-0.5.7 pandas-2.3.0 parse-1.20.2 pathable-0.4.4 pathspec-0.12.1 pycparser-2.22 pymdown-extensions-10.7.1 pymysql-1.1.1 python-dotenv-1.1.0 pytz-2025.2 pyyaml-6.0.2 pyyaml-env-tag-1.1 referencing-0.36.2 regex-2024.11.6 requests-2.32.3 rpds-py-0.25.1 sqlalchemy-2.0.41 tapipy-1.8.4 tqdm-4.67.1 tzdata-2025.2 urllib3-1.26.20 watchdog-6.0.0 werkzeug-3.1.3\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m25.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.1.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "# Dapi installation\n", + "!pip uninstall dapi --yes\n", + "\n", + "# Upgrade dapi dependencies to avoid conflicts\n", + "# !python -m pip install --upgrade numpy\n", + "\n", + "# Install the latest development version of dapi from GitHub\n", + "# !pip install git+https://github.com/DesignSafe-CI/dapi.git@dev --user --quiet\n", + "\n", + "# Install editable local version of dapi\n", + "!pip install -e ../" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "35fca324-ee48-41c8-84a1-78ad7b03aae8", + "metadata": {}, + "outputs": [], + "source": [ + "# Import required modules\n", + "from dapi import DSClient\n", + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "58b62f77-23b6-4355-91f1-b680ae6d6cdf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authentication successful.\n", + "DatabaseAccessor initialized. Connections will be created on first access.\n" + ] + } + ], + "source": [ + "# Initialize DesignSafe client\n", + "ds = DSClient()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "feee3ce0", + "metadata": {}, + "outputs": [], + "source": [ + "# Job configuration parameters\n", + "ds_path: str = \"/MyData/mpm-benchmarks/2d/uniaxial_stress/\" # Path to input files\n", + "input_filename: str = \"mpm.json\" # Main input script filename\n", + "max_job_minutes: int = 10 # Maximum runtime in minutes\n", + "tacc_allocation: str = \"ASC25049\" # TACC allocation to charge\n", + "app_id_to_use = \"mpm-s3\" # MPM application ID" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3f0ee687", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Translated '/MyData/mpm-benchmarks/2d/uniaxial_stress/' to 'tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/' using t.username\n", + "Input Directory Tapis URI: tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\n" + ] + } + ], + "source": [ + "# Convert DesignSafe path to Tapis URI format\n", + "input_uri = ds.files.translate_path_to_uri(ds_path)\n", + "print(f\"Input Directory Tapis URI: {input_uri}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6257d31a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating job request for app 'mpm-s3'...\n", + "Using App Details: mpm-s3 v1.0\n", + "Placing script 'mpm.json' in appArgs: 'Input Script'\n", + "Adding allocation: ASC25049\n", + "Job request dictionary generated successfully.\n", + "{\n", + " \"name\": \"mpm-s3-20250605_141247\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 48,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# Generate job request dictionary using app defaults\n", + "job_dict = ds.jobs.generate_request(\n", + " app_id=app_id_to_use,\n", + " input_dir_uri=input_uri,\n", + " script_filename=input_filename,\n", + " max_minutes=max_job_minutes,\n", + " allocation=tacc_allocation,\n", + ")\n", + "print(json.dumps(job_dict, indent=2, default=str))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5a17eee7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"name\": \"mpm-s3-20250605_141247\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 1,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# Customize job settings (optional)\n", + "job_dict[\"nodeCount\"] = 1 # Use single node\n", + "job_dict[\"coresPerNode\"] = 1 # Use single core\n", + "print(json.dumps(job_dict, indent=2, default=str))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e04a5ef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Submitting Tapis Job Request ---\n", + "{\n", + " \"name\": \"mpm-s3-20250605_141247\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 1,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n", + "------------------------------------\n", + "Job submitted successfully. UUID: 66778a7f-ac75-486d-91ee-acf82ffe8abe-007\n", + "Job UUID: 66778a7f-ac75-486d-91ee-acf82ffe8abe-007\n" + ] + } + ], + "source": [ + "# Submit the job to TACC\n", + "submitted_job = ds.jobs.submit_request(job_dict)\n", + "print(f\"Job UUID: {submitted_job.uuid}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cd6089f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Monitoring Job: 66778a7f-ac75-486d-91ee-acf82ffe8abe-007\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Monitoring job: 0%| | 0/40 [00:00=1.2.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.2.2)\n", + "Requirement already satisfied: jsonschema>=4.18.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (4.23.0)\n", + "Requirement already satisfied: numpy<3.0.0,>=2.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.1.3)\n", + "Requirement already satisfied: pandas<3.0.0,>=2.2.3 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.2.3)\n", + "Requirement already satisfied: pymysql<2.0.0,>=1.1.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.1.1)\n", + "Requirement already satisfied: python-dotenv<2.0.0,>=1.0.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.0.1)\n", + "Requirement already satisfied: sqlalchemy<3.0.0,>=2.0.23 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (2.0.36)\n", + "Requirement already satisfied: tapipy<2.0.0,>=1.6.3 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (1.7.0)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from dapi==1.0.0) (4.67.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (24.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (2024.10.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from jsonschema>=4.18.0->dapi==1.0.0) (0.21.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2024.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from pandas<3.0.0,>=2.2.3->dapi==1.0.0) (2024.2)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from sqlalchemy<3.0.0,>=2.0.23->dapi==1.0.0) (4.12.2)\n", + "Requirement already satisfied: PyJWT>=1.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.9.0)\n", + "Requirement already satisfied: atomicwrites<2.0.0,>=1.4.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.4.1)\n", + "Requirement already satisfied: certifi>=2020.11.8 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2024.8.30)\n", + "Requirement already satisfied: cloudpickle>=1.6.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.0)\n", + "Requirement already satisfied: cryptography>=3.3.2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (43.0.3)\n", + "Requirement already satisfied: openapi_core==0.16.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.16.0)\n", + "Requirement already satisfied: openapi_spec_validator<0.6.0,>=0.5.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.5.4)\n", + "Requirement already satisfied: pyyaml>=5.4 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (6.0.2)\n", + "Requirement already satisfied: requests<3.0.0,>=2.20.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.32.3)\n", + "Requirement already satisfied: setuptools>=21.0.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (75.4.0)\n", + "Requirement already satisfied: six<2.0,>=1.10 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.16.0)\n", + "Requirement already satisfied: urllib3<2.0.0,>=1.26.5 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.26.20)\n", + "Requirement already satisfied: isodate in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.7.2)\n", + "Requirement already satisfied: jsonschema-spec<0.2.0,>=0.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.1.3)\n", + "Requirement already satisfied: more-itertools in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (10.5.0)\n", + "Requirement already satisfied: openapi-schema-validator<0.4.0,>=0.3.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.3.4)\n", + "Requirement already satisfied: parse in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.20.2)\n", + "Requirement already satisfied: pathable<0.5.0,>=0.4.0 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (0.4.3)\n", + "Requirement already satisfied: werkzeug in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.1.3)\n", + "Requirement already satisfied: cffi>=1.12 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.17.1)\n", + "Requirement already satisfied: lazy-object-proxy<2.0.0,>=1.7.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from openapi_spec_validator<0.6.0,>=0.5.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (1.10.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.4.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from requests<3.0.0,>=2.20.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.10)\n", + "Requirement already satisfied: pycparser in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from cffi>=1.12->cryptography>=3.3.2->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (2.22)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in /Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages (from werkzeug->openapi_core==0.16.0->tapipy<2.0.0,>=1.6.3->dapi==1.0.0) (3.0.2)\n", + "Building wheels for collected packages: dapi\n", + " Building editable for dapi (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for dapi: filename=dapi-1.0.0-py3-none-any.whl size=3826 sha256=25a5c9308663e0078f3b0943613ad978d718bb5f64c36fd23162943a7d68b56f\n", + " Stored in directory: /private/var/folders/w8/xz590jyd7r36zmxcspgzj3z40000gn/T/pip-ephem-wheel-cache-sjzyd4es/wheels/98/df/91/ed70fe2dca11c3c6e5b6e8e6eef18c373a119d095037f892a3\n", + "Successfully built dapi\n", + "Installing collected packages: dapi\n", + "Successfully installed dapi-1.0.0\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m25.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.1.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "# Dapi installation\n", + "!pip uninstall dapi --yes\n", + "\n", + "# Upgrade dapi dependencies to avoid conflicts\n", + "# !python -m pip install --upgrade numpy\n", + "\n", + "# Install the latest development version of dapi from GitHub\n", + "# !pip install git+https://github.com/DesignSafe-CI/dapi.git@dev --user --quiet\n", + "\n", + "# Install editable local version of dapi\n", + "!pip install -e ../" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "35fca324-ee48-41c8-84a1-78ad7b03aae8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/krishna/Library/Caches/pypoetry/virtualenvs/dapi-ptztLUqK-py3.13/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "# Import only DSClient and exceptions needed at top level\n", + "from dapi import (\n", + " DSClient,\n", + " SubmittedJob,\n", + " interpret_job_status, # Import new function\n", + " AppDiscoveryError,\n", + " FileOperationError,\n", + " JobSubmissionError,\n", + " SystemInfoError,\n", + " JobMonitorError,\n", + " # Optionally import status constants if you want to check against them explicitly\n", + " STATUS_TIMEOUT,\n", + " STATUS_UNKNOWN,\n", + " TAPIS_TERMINAL_STATES,\n", + ")\n", + "import json\n", + "from datetime import datetime\n", + "from dataclasses import asdict\n", + "import pandas as pd\n", + "import tqdm as notebook_tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "58b62f77-23b6-4355-91f1-b680ae6d6cdf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing DSClient...\n", + "Authentication successful.\n", + "DatabaseAccessor initialized. Connections will be created on first access.\n", + "DSClient initialized.\n" + ] + } + ], + "source": [ + "try:\n", + " print(\"Initializing DSClient...\")\n", + " ds = DSClient()\n", + " print(\"DSClient initialized.\")\n", + "except Exception as e:\n", + " print(f\"Initialization failed: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to client initialization failure.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "feee3ce0", + "metadata": {}, + "outputs": [], + "source": [ + "ds_path: str = \"/MyData/mpm-benchmarks/2d/uniaxial_stress/\"\n", + "input_filename: str = \"mpm.json\"\n", + "max_job_minutes: int = 10\n", + "# queue: str = \"skx\" # Example override - only if needed and valid\n", + "# tacc_allocation: str = \"BCS20003\"\n", + "tacc_allocation: str = \"ASC25049\"\n", + "app_id_to_use = \"mpm-s3\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3f0ee687", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Translated '/MyData/mpm-benchmarks/2d/uniaxial_stress/' to 'tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/' using t.username\n", + "Input Directory Tapis URI: tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\n" + ] + } + ], + "source": [ + "try:\n", + " input_uri = ds.files.translate_path_to_uri(ds_path)\n", + " print(f\"Input Directory Tapis URI: {input_uri}\")\n", + "except Exception as e:\n", + " print(f\"Error translating path '{ds_path}': {e}\")\n", + " raise SystemExit(\"Stopping notebook due to path translation error.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6257d31a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Generating job request dictionary...\n", + "Generating job request for app 'mpm-s3'...\n", + "Using App Details: mpm-s3 v1.0\n", + "Placing script 'mpm.json' in appArgs: 'Input Script'\n", + "Adding allocation: ASC25049\n", + "Job request dictionary generated successfully.\n", + "\n", + "--- Generated Job Request Dictionary ---\n", + "{\n", + " \"name\": \"mpm-s3-20250604_081741\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 48,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n", + "---------------------------------------\n" + ] + } + ], + "source": [ + "try:\n", + " print(\"\\nGenerating job request dictionary...\")\n", + " job_dict = ds.jobs.generate_request(\n", + " app_id=app_id_to_use,\n", + " input_dir_uri=input_uri,\n", + " script_filename=input_filename,\n", + " max_minutes=max_job_minutes,\n", + " allocation=tacc_allocation,\n", + " )\n", + " print(\"\\n--- Generated Job Request Dictionary ---\")\n", + " print(json.dumps(job_dict, indent=2, default=str))\n", + " print(\"---------------------------------------\")\n", + "except (AppDiscoveryError, ValueError, JobSubmissionError) as e:\n", + " print(f\"Error generating job request: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to job request generation error.\")\n", + "except Exception as e:\n", + " print(f\"An unexpected error occurred during job request generation: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to unexpected generation error.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5a17eee7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Modifying job request dictionary...\n", + "{\n", + " \"name\": \"mpm-s3-20250604_081741\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 1,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# At this point, the user can inspect and modify job_dict if needed.\n", + "# For example:\n", + "print(\"Modifying job request dictionary...\")\n", + "job_dict[\"nodeCount\"] = 1\n", + "job_dict[\"coresPerNode\"] = 1\n", + "# job_dict[\"execSystemLogicalQueue\"] = \"development\"\n", + "\n", + "print(json.dumps(job_dict, indent=2, default=str))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8e04a5ef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting the job request dictionary...\n", + "\n", + "--- Submitting Tapis Job Request ---\n", + "{\n", + " \"name\": \"mpm-s3-20250604_081741\",\n", + " \"appId\": \"mpm-s3\",\n", + " \"appVersion\": \"1.0\",\n", + " \"description\": \"Material Point Method (MPM) is a particle based method that represents the material as a collection of material points, and their deformations are determined by Newton\\u2019s laws of motion.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"stampede3\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx-dev\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 1,\n", + " \"maxMinutes\": 10,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Input Script\",\n", + " \"arg\": \"mpm.json\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n", + "------------------------------------\n", + "Job submitted successfully. UUID: 52f48eaf-b7d6-4964-a97b-a4b32a6aaeb3-007\n", + "Job Submitted Successfully!\n", + "Job UUID: 52f48eaf-b7d6-4964-a97b-a4b32a6aaeb3-007\n" + ] + } + ], + "source": [ + "if \"job_dict\" not in locals():\n", + " print(\"Error: job_dict not found.\")\n", + " raise SystemExit(\"Stopping notebook.\")\n", + "try:\n", + " print(\"\\nSubmitting the job request dictionary...\")\n", + " submitted_job = ds.jobs.submit_request(job_dict)\n", + " print(f\"Job Submitted Successfully!\")\n", + " print(f\"Job UUID: {submitted_job.uuid}\")\n", + "except JobSubmissionError as e:\n", + " print(f\"Job submission failed: {e}\")\n", + " print(\"\\n--- Failed Job Request ---\")\n", + " print(json.dumps(job_dict, indent=2, default=str))\n", + " print(\"--------------------------\")\n", + " raise SystemExit(\"Stopping notebook due to job submission error.\")\n", + "except Exception as e:\n", + " print(f\"An unexpected error occurred during job submission: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to unexpected submission error.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cd6089f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Monitoring Job: 52f48eaf-b7d6-4964-a97b-a4b32a6aaeb3-007\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Monitoring job: 0%| | 0/40 [00:00 This example shows how to run MPM code on HPC cluster using a templatized notebook by passing input path." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "79aac18b-20ea-4a89-b9e9-85d50d69d84a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.3.1\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], - "source": [ - "!pip install papermill --quiet" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "308dfdd7-f3b8-449f-af8c-e190307dff90", - "metadata": {}, - "outputs": [], - "source": [ - "import papermill as pm" - ] - }, - { - "cell_type": "markdown", - "id": "9d155cf6-4d18-4cbb-872a-bf06ff8c1704", - "metadata": {}, - "source": [ - "## Inspect Templatized notebook" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5ee38f0d-b42f-4a15-b6b4-27f06afbce09", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"path\": {\n", - " \"name\": \"path\",\n", - " \"inferred_type_name\": \"str\",\n", - " \"default\": \"\\\"/MyData/mpm-benchmarks/2d/uniaxial_stress/\\\"\",\n", - " \"help\": \"path to input file\"\n", - " },\n", - " \"input_file\": {\n", - " \"name\": \"input_file\",\n", - " \"inferred_type_name\": \"str\",\n", - " \"default\": \"\\\"mpm.json\\\"\",\n", - " \"help\": \"input file.json\"\n", - " },\n", - " \"duration\": {\n", - " \"name\": \"duration\",\n", - " \"inferred_type_name\": \"str\",\n", - " \"default\": \"\\\"00:10:00\\\"\",\n", - " \"help\": \"Runtime duration ('HH:MM:SS')\"\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "# Parameters available to modify in the templatized notebook\n", - "import json\n", - "\n", - "print(json.dumps(pm.inspect_notebook(\"template-mpm-run.ipynb\"), indent=2))" - ] - }, - { - "cell_type": "markdown", - "id": "dd2b30ef-4bed-4843-9fb2-bb6536c9c238", - "metadata": {}, - "source": [ - "## Execute template MPM notebook" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "455571f2-daa2-4099-95a7-3518003e833a", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7e3a30ebadf544d5bcee10b0cbdda95d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Executing: 0%| | 0/17 [00:00 Only change the cell below" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8593c08c-c96a-4a66-9b52-80b8b5c27e44", - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "# Default parameters for the MPM template notebook\n", - "path: str = \"/MyData/mpm-benchmarks/2d/uniaxial_stress/\" # path to input file\n", - "\n", - "input_file: str = \"mpm.json\" # input file.json\n", - "\n", - "duration: str = \"00:10:00\" # Runtime duration ('HH:MM:SS')\n", - "\n", - "# The parameters modified in your job will be included in the cell below." - ] - }, - { - "cell_type": "markdown", - "id": "89d9596b-1c14-4d0c-a127-ee6c46da2671", - "metadata": {}, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "58d09a12-300a-4cd3-9722-b4de8e4cc8d2", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import dapi\n", - "import json" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "fd5b809f-5bc5-4e49-9ae7-e5a4b44e70c3", - "metadata": {}, - "outputs": [], - "source": [ - "# Authenticate\n", - "t = dapi.auth.init()" - ] - }, - { - "cell_type": "markdown", - "id": "14a18561-3bf7-4605-a6f4-98ab0b99af10", - "metadata": {}, - "source": [ - "## Configure and run MPM job" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "f73c5bab-83d8-4f23-8752-4ad150b4dc59", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\n" - ] - } - ], - "source": [ - "# Identify folder with input file in DesignSafe\n", - "input_uri = dapi.jobs.get_ds_path_uri(t, path)\n", - "print(input_uri)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "b6b3818d-0358-487d-a67b-f91b6431b290", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "---Job Info---\n", - "\n", - "{\n", - " \"name\": \"mpm_20241001_114511\",\n", - " \"appId\": \"mpm\",\n", - " \"appVersion\": \"1.1.0\",\n", - " \"execSystemId\": \"frontera\",\n", - " \"maxMinutes\": 10,\n", - " \"archiveOnAppError\": true,\n", - " \"fileInputs\": [\n", - " {\n", - " \"name\": \"Input Directory\",\n", - " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/mpm-benchmarks/2d/uniaxial_stress/\"\n", - " }\n", - " ],\n", - " \"execSystemLogicalQueue\": \"development\",\n", - " \"nodeCount\": 1,\n", - " \"coresPerNode\": 1,\n", - " \"parameterSet\": {\n", - " \"appArgs\": [\n", - " {\n", - " \"name\": \"Input Script\",\n", - " \"arg\": \"mpm.json\"\n", - " }\n", - " ],\n", - " \"schedulerOptions\": [\n", - " {\n", - " \"name\": \"TACC Allocation\",\n", - " \"arg\": \"-A BCS20003\"\n", - " }\n", - " ]\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "# Generate job info for mpm\n", - "job_info = dapi.jobs.generate_job_info(\n", - " t, \"mpm\", input_uri, input_file, allocation=\"BCS20003\"\n", - ")\n", - "job_info[\"maxMinutes\"] = 10\n", - "job_info[\"execSystemLogicalQueue\"] = \"development\"\n", - "print(\"\\n---Job Info---\\n\\n\" + json.dumps(job_info, indent=2))" - ] - }, - { - "cell_type": "markdown", - "id": "9851e692-2ba8-4cb0-887f-b639ba8832d2", - "metadata": {}, - "source": [ - "## Submit and monitor job status" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "004bdcf4-c93b-4770-805d-bfd05d47d7b6", - "metadata": {}, - "outputs": [], - "source": [ - "# Submit job\n", - "job = t.jobs.submitJob(**job_info)\n", - "jobUuid = job.uuid" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "17c70c97-aea3-4b92-af78-5fd63592ecd6", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Waiting for job to start: 0it [00:00, ?it/s]\n", - "Monitoring job: 0%| | 0/40 [00:00 Tools & Application > Job Status" - ) - - status = t.jobs.getJobStatus(jobUuid=mjobUuid).status - previous = "" - while True: - if status in ["FINISHED", "FAILED", "STOPPED"]: - break - status = t.jobs.getJobStatus(jobUuid=mjobUuid).status - if status == previous: - continue - else: - previous = status - print(f"\tStatus: {status}") - time.sleep(tlapse) - return status - - -def DS_GetRuntime(t, mjobUuid): - from datetime import datetime - - print("\nRuntime Summary") - print("---------------") - hist = t.jobs.getJobHistory(jobUuid=mjobUuid) - - time1 = datetime.strptime(hist[-1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[0].created, "%Y-%m-%dT%H:%M:%S.%fZ") - print("TOTAL time:", time1 - time0) - - for i in range(len(hist)): - if hist[i].eventDetail == "RUNNING": - time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") - print("RUNNING time:", time1 - time0) - if hist[i].eventDetail == "QUEUED": - time1 = datetime.strptime(hist[i + 1].created, "%Y-%m-%dT%H:%M:%S.%fZ") - time0 = datetime.strptime(hist[i].created, "%Y-%m-%dT%H:%M:%S.%fZ") - print("QUEUED time:", time1 - time0) diff --git a/examples/opensees/DS_input/Main_multiMotion.tcl b/examples/opensees/DS_input/Main_multiMotion.tcl new file mode 100644 index 0000000..7cd4847 --- /dev/null +++ b/examples/opensees/DS_input/Main_multiMotion.tcl @@ -0,0 +1,79 @@ +set pid [getPID] +set np [getNP] +#set par_list [open "slope_values.txt" r] +set countP 0; + + +set startT [clock seconds] + +# Getting the list of input motion data +set fp [open "recordData.txt" r] +set content [read $fp] +close $fp +set records [split $content "\n"] + +set count 0 +set motionFiles {} +set motionDTs {} +set motionNsteps {} +foreach rec $records { + set element [split $rec " "] + set colNum 0 + foreach column $element { + if {$colNum==0} { + # puts "Column 1: $column" + lappend motionFiles $column + set colNum [expr $colNum+1] + } elseif {$colNum==1} { + #puts "Column 2: $column" + lappend motionDTs $column + set colNum [expr $colNum+1] + } else { + # puts "Column 3: $column" + lappend motionNsteps $column + set colNum [expr $colNum+1] + } + } + set count [expr $count+1] +} +set numRecords $count +puts "Number of Records: $numRecords" + +# set motionSteps [lindex $motionNsteps 1] +# puts "Number of Times Steps: $motionSteps" + +set profileList {A B C D} +foreach profile $profileList { + set prefix Profile + set suffix .tcl + set profileName "" + append profileName $prefix $profile $suffix +# Go through each record and call main script + for {set rsn 0} {$rsn < $numRecords} {incr rsn 1} { + + if {[expr $countP % $np] == $pid} { + + # Input Velocity file name + set velocityFile [lindex $motionFiles $rsn] + puts "Velocity File: $velocityFile" + + # Time step increment + set motionDT [lindex $motionDTs $rsn] + puts "Motion Timestep: $motionDT" + + # Number of time steps + set motionSteps [lindex $motionNsteps $rsn] + puts "Number of Timesteps: $motionSteps" + + # Motion ID for writing output files + set motionID [lindex [split $velocityFile .] 0] + + source $profileName + wipe + } + incr countP 1 + } +} +set endT [clock seconds] + +# puts "Total duration for processor $pid [expr $endT-$startT] seconds!" diff --git a/examples/opensees/DS_input/ProfileA.tcl b/examples/opensees/DS_input/ProfileA.tcl new file mode 100644 index 0000000..c3aa6be --- /dev/null +++ b/examples/opensees/DS_input/ProfileA.tcl @@ -0,0 +1,568 @@ +### OpenSees TCL file for 1D Soil Column Analysis ### +### AnalysisID: TestProfileA ### +### Ground Motion Record: RSN6928 ### +### Slope Inclination: 2.00 % ### + + +### GENERATING MESH ### +wipe +model BasicBuilder -ndm 2 -ndf 3 +node 1 0.00 0.00 +node 2 0.50 0.00 +node 3 0.00 0.50 +node 4 0.50 0.50 +node 5 0.00 1.00 +node 6 0.50 1.00 +node 7 0.00 1.50 +node 8 0.50 1.50 +node 9 0.00 2.00 +node 10 0.50 2.00 +node 11 0.00 2.50 +node 12 0.50 2.50 +node 13 0.00 3.00 +node 14 0.50 3.00 +node 15 0.00 3.50 +node 16 0.50 3.50 +node 17 0.00 4.00 +node 18 0.50 4.00 +node 19 0.00 4.50 +node 20 0.50 4.50 +node 21 0.00 5.00 +node 22 0.50 5.00 +node 23 0.00 5.50 +node 24 0.50 5.50 +node 25 0.00 6.00 +node 26 0.50 6.00 +node 27 0.00 6.50 +node 28 0.50 6.50 +node 29 0.00 7.00 +node 30 0.50 7.00 +node 31 0.00 7.50 +node 32 0.50 7.50 +node 33 0.00 8.00 +node 34 0.50 8.00 +node 35 0.00 8.50 +node 36 0.50 8.50 +node 37 0.00 9.00 +node 38 0.50 9.00 +node 39 0.00 9.50 +node 40 0.50 9.50 +node 41 0.00 10.00 +node 42 0.50 10.00 +node 43 0.00 10.50 +node 44 0.50 10.50 +node 45 0.00 11.00 +node 46 0.50 11.00 +node 47 0.00 11.50 +node 48 0.50 11.50 +node 49 0.00 12.00 +node 50 0.50 12.00 +node 51 0.00 12.50 +node 52 0.50 12.50 +node 53 0.00 13.00 +node 54 0.50 13.00 +node 55 0.00 13.50 +node 56 0.50 13.50 +node 57 0.00 14.00 +node 58 0.50 14.00 +node 59 0.00 14.50 +node 60 0.50 14.50 +node 61 0.00 15.00 +node 62 0.50 15.00 +node 63 0.00 15.50 +node 64 0.50 15.50 +node 65 0.00 16.00 +node 66 0.50 16.00 +node 67 0.00 16.50 +node 68 0.50 16.50 +node 69 0.00 17.00 +node 70 0.50 17.00 +node 71 0.00 17.50 +node 72 0.50 17.50 +node 73 0.00 18.00 +node 74 0.50 18.00 +node 75 0.00 18.50 +node 76 0.50 18.50 +node 77 0.00 19.00 +node 78 0.50 19.00 +node 79 0.00 19.50 +node 80 0.50 19.50 +node 81 0.00 20.00 +node 82 0.50 20.00 +node 83 0.00 20.50 +node 84 0.50 20.50 + + + ### NODE BOUNDARY CONDITIONS ### +fix 1 0 1 0 +fix 2 0 1 0 +equalDOF 1 2 1 +equalDOF 3 4 1 2 +equalDOF 5 6 1 2 +equalDOF 7 8 1 2 +equalDOF 9 10 1 2 +equalDOF 11 12 1 2 +equalDOF 13 14 1 2 +equalDOF 15 16 1 2 +equalDOF 17 18 1 2 +equalDOF 19 20 1 2 +equalDOF 21 22 1 2 +equalDOF 23 24 1 2 +equalDOF 25 26 1 2 +equalDOF 27 28 1 2 +equalDOF 29 30 1 2 +equalDOF 31 32 1 2 +equalDOF 33 34 1 2 +equalDOF 35 36 1 2 +equalDOF 37 38 1 2 +equalDOF 39 40 1 2 +equalDOF 41 42 1 2 +equalDOF 43 44 1 2 +equalDOF 45 46 1 2 +equalDOF 47 48 1 2 +equalDOF 49 50 1 2 +equalDOF 51 52 1 2 +equalDOF 53 54 1 2 +equalDOF 55 56 1 2 +equalDOF 57 58 1 2 +equalDOF 59 60 1 2 +equalDOF 61 62 1 2 +equalDOF 63 64 1 2 +equalDOF 65 66 1 2 +equalDOF 67 68 1 2 +equalDOF 69 70 1 2 +equalDOF 71 72 1 2 +equalDOF 73 74 1 2 +equalDOF 75 76 1 2 +equalDOF 77 78 1 2 +equalDOF 79 80 1 2 +equalDOF 81 82 1 2 +equalDOF 83 84 1 2 +fix 75 0 0 1 +fix 76 0 0 1 +fix 77 0 0 1 +fix 78 0 0 1 +fix 79 0 0 1 +fix 80 0 0 1 +fix 81 0 0 1 +fix 82 0 0 1 +fix 83 0 0 1 +fix 84 0 0 1 + + + + ### GENERATE SOIL MATERIAL MODELS ### +nDMaterial PM4Sand 1 0.950 12061.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 2 0.950 10826.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 3 0.950 9721.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 4 0.950 8732.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 5 0.950 7846.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 6 0.950 7052.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 7 0.950 6341.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 8 0.950 5704.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 9 0.950 5133.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 10 0.950 4621.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 11 0.950 4162.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 12 0.950 3750.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 13 0.950 3381.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 14 0.950 3050.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 15 0.950 2753.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 16 0.950 2487.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 17 0.950 2248.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 18 0.950 2033.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 19 0.950 1840.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 20 0.950 1667.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 21 0.950 1512.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 22 0.950 1373.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 23 0.950 1248.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 24 0.950 1136.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 25 0.950 1035.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 26 0.950 945.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 27 0.950 864.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 28 0.950 791.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 29 0.950 727.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 30 0.950 669.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 31 0.950 618.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 32 0.950 572.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 33 0.950 533.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 34 0.400 524.4 0.500 1.994 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 35 0.400 524.4 1.500 1.589 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 + + + + ### DEFINE SOIL ELEMENTS ### +element SSPquadUP 1 1 2 4 3 1 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 2 3 4 6 5 2 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 3 5 6 8 7 3 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 4 7 8 10 9 4 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 5 9 10 12 11 5 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 6 11 12 14 13 6 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 7 13 14 16 15 7 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 8 15 16 18 17 8 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 9 17 18 20 19 9 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 10 19 20 22 21 10 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 11 21 22 24 23 11 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 12 23 24 26 25 12 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 13 25 26 28 27 13 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 14 27 28 30 29 14 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 15 29 30 32 31 15 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 16 31 32 34 33 16 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 17 33 34 36 35 17 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 18 35 36 38 37 18 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 19 37 38 40 39 19 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 20 39 40 42 41 20 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 21 41 42 44 43 21 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 22 43 44 46 45 22 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 23 45 46 48 47 23 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 24 47 48 50 49 24 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 25 49 50 52 51 25 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 26 51 52 54 53 26 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 27 53 54 56 55 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 28 55 56 58 57 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 29 57 58 60 59 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 30 59 60 62 61 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 31 61 62 64 63 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 32 63 64 66 65 32 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 33 65 66 68 67 33 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 34 67 68 70 69 34 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 35 69 70 72 71 34 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 36 71 72 74 73 34 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 37 73 74 76 75 34 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 38 75 76 78 77 35 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 39 77 78 80 79 35 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 40 79 80 82 81 35 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 41 81 82 84 83 35 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 + + + +### LYSMER-KUHLMEYER DASHPOTS ### +model BasicBuilder -ndm 2 -ndf 2 +node 85 0.00 0.00 +node 86 0.00 0.00 +fix 85 1 1 +fix 86 0 1 +equalDOF 1 86 1 +uniaxialMaterial Viscous 4000 885.202 1 +element zeroLength 5000 85 86 -mat 4000 -dir 1 + + + + ### GRAVITY RECORDERS ### +eval "recorder Element -file ProfileA_Gstress$motionID.out -time -eleRange 1 41 stress" + + + + ## Update Material for Elastoplastic ## +updateMaterialStage -material 1 -stage 0 +updateMaterialStage -material 2 -stage 0 +updateMaterialStage -material 3 -stage 0 +updateMaterialStage -material 4 -stage 0 +updateMaterialStage -material 5 -stage 0 +updateMaterialStage -material 6 -stage 0 +updateMaterialStage -material 7 -stage 0 +updateMaterialStage -material 8 -stage 0 +updateMaterialStage -material 9 -stage 0 +updateMaterialStage -material 10 -stage 0 +updateMaterialStage -material 11 -stage 0 +updateMaterialStage -material 12 -stage 0 +updateMaterialStage -material 13 -stage 0 +updateMaterialStage -material 14 -stage 0 +updateMaterialStage -material 15 -stage 0 +updateMaterialStage -material 16 -stage 0 +updateMaterialStage -material 17 -stage 0 +updateMaterialStage -material 18 -stage 0 +updateMaterialStage -material 19 -stage 0 +updateMaterialStage -material 20 -stage 0 +updateMaterialStage -material 21 -stage 0 +updateMaterialStage -material 22 -stage 0 +updateMaterialStage -material 23 -stage 0 +updateMaterialStage -material 24 -stage 0 +updateMaterialStage -material 25 -stage 0 +updateMaterialStage -material 26 -stage 0 +updateMaterialStage -material 27 -stage 0 +updateMaterialStage -material 28 -stage 0 +updateMaterialStage -material 29 -stage 0 +updateMaterialStage -material 30 -stage 0 +updateMaterialStage -material 31 -stage 0 +updateMaterialStage -material 32 -stage 0 +updateMaterialStage -material 33 -stage 0 +updateMaterialStage -material 34 -stage 0 +updateMaterialStage -material 35 -stage 0 + + + + ### APPLY GRAVITY LOADING ELASTIC CASE ### +constraints Transformation +test NormDispIncr 1.00e-04 35 2 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.833 0.444 +analysis Transient +analyze 10 1.00 + + + + ### ELASTO-PLASTIC GRAVITY ANALYSIS ### +updateMaterialStage -material 1 -stage 1 +setParameter -value 0.300 -eleRange 1 1 poissonRatio 1 +setParameter -value 0 -eleRange 1 1 FirstCall 1 +updateMaterialStage -material 2 -stage 1 +setParameter -value 0.300 -eleRange 2 2 poissonRatio 2 +setParameter -value 0 -eleRange 2 2 FirstCall 2 +updateMaterialStage -material 3 -stage 1 +setParameter -value 0.300 -eleRange 3 3 poissonRatio 3 +setParameter -value 0 -eleRange 3 3 FirstCall 3 +updateMaterialStage -material 4 -stage 1 +setParameter -value 0.300 -eleRange 4 4 poissonRatio 4 +setParameter -value 0 -eleRange 4 4 FirstCall 4 +updateMaterialStage -material 5 -stage 1 +setParameter -value 0.300 -eleRange 5 5 poissonRatio 5 +setParameter -value 0 -eleRange 5 5 FirstCall 5 +updateMaterialStage -material 6 -stage 1 +setParameter -value 0.300 -eleRange 6 6 poissonRatio 6 +setParameter -value 0 -eleRange 6 6 FirstCall 6 +updateMaterialStage -material 7 -stage 1 +setParameter -value 0.300 -eleRange 7 7 poissonRatio 7 +setParameter -value 0 -eleRange 7 7 FirstCall 7 +updateMaterialStage -material 8 -stage 1 +setParameter -value 0.300 -eleRange 8 8 poissonRatio 8 +setParameter -value 0 -eleRange 8 8 FirstCall 8 +updateMaterialStage -material 9 -stage 1 +setParameter -value 0.300 -eleRange 9 9 poissonRatio 9 +setParameter -value 0 -eleRange 9 9 FirstCall 9 +updateMaterialStage -material 10 -stage 1 +setParameter -value 0.300 -eleRange 10 10 poissonRatio 10 +setParameter -value 0 -eleRange 10 10 FirstCall 10 +updateMaterialStage -material 11 -stage 1 +setParameter -value 0.300 -eleRange 11 11 poissonRatio 11 +setParameter -value 0 -eleRange 11 11 FirstCall 11 +updateMaterialStage -material 12 -stage 1 +setParameter -value 0.300 -eleRange 12 12 poissonRatio 12 +setParameter -value 0 -eleRange 12 12 FirstCall 12 +updateMaterialStage -material 13 -stage 1 +setParameter -value 0.300 -eleRange 13 13 poissonRatio 13 +setParameter -value 0 -eleRange 13 13 FirstCall 13 +updateMaterialStage -material 14 -stage 1 +setParameter -value 0.300 -eleRange 14 14 poissonRatio 14 +setParameter -value 0 -eleRange 14 14 FirstCall 14 +updateMaterialStage -material 15 -stage 1 +setParameter -value 0.300 -eleRange 15 15 poissonRatio 15 +setParameter -value 0 -eleRange 15 15 FirstCall 15 +updateMaterialStage -material 16 -stage 1 +setParameter -value 0.300 -eleRange 16 16 poissonRatio 16 +setParameter -value 0 -eleRange 16 16 FirstCall 16 +updateMaterialStage -material 17 -stage 1 +setParameter -value 0.300 -eleRange 17 17 poissonRatio 17 +setParameter -value 0 -eleRange 17 17 FirstCall 17 +updateMaterialStage -material 18 -stage 1 +setParameter -value 0.300 -eleRange 18 18 poissonRatio 18 +setParameter -value 0 -eleRange 18 18 FirstCall 18 +updateMaterialStage -material 19 -stage 1 +setParameter -value 0.300 -eleRange 19 19 poissonRatio 19 +setParameter -value 0 -eleRange 19 19 FirstCall 19 +updateMaterialStage -material 20 -stage 1 +setParameter -value 0.300 -eleRange 20 20 poissonRatio 20 +setParameter -value 0 -eleRange 20 20 FirstCall 20 +updateMaterialStage -material 21 -stage 1 +setParameter -value 0.300 -eleRange 21 21 poissonRatio 21 +setParameter -value 0 -eleRange 21 21 FirstCall 21 +updateMaterialStage -material 22 -stage 1 +setParameter -value 0.300 -eleRange 22 22 poissonRatio 22 +setParameter -value 0 -eleRange 22 22 FirstCall 22 +updateMaterialStage -material 23 -stage 1 +setParameter -value 0.300 -eleRange 23 23 poissonRatio 23 +setParameter -value 0 -eleRange 23 23 FirstCall 23 +updateMaterialStage -material 24 -stage 1 +setParameter -value 0.300 -eleRange 24 24 poissonRatio 24 +setParameter -value 0 -eleRange 24 24 FirstCall 24 +updateMaterialStage -material 25 -stage 1 +setParameter -value 0.300 -eleRange 25 25 poissonRatio 25 +setParameter -value 0 -eleRange 25 25 FirstCall 25 +updateMaterialStage -material 26 -stage 1 +setParameter -value 0.300 -eleRange 26 26 poissonRatio 26 +setParameter -value 0 -eleRange 26 26 FirstCall 26 +updateMaterialStage -material 27 -stage 1 +setParameter -value 0.300 -eleRange 27 27 poissonRatio 27 +setParameter -value 0 -eleRange 27 27 FirstCall 27 +updateMaterialStage -material 28 -stage 1 +setParameter -value 0.300 -eleRange 28 28 poissonRatio 28 +setParameter -value 0 -eleRange 28 28 FirstCall 28 +updateMaterialStage -material 29 -stage 1 +setParameter -value 0.300 -eleRange 29 29 poissonRatio 29 +setParameter -value 0 -eleRange 29 29 FirstCall 29 +updateMaterialStage -material 30 -stage 1 +setParameter -value 0.300 -eleRange 30 30 poissonRatio 30 +setParameter -value 0 -eleRange 30 30 FirstCall 30 +updateMaterialStage -material 31 -stage 1 +setParameter -value 0.300 -eleRange 31 31 poissonRatio 31 +setParameter -value 0 -eleRange 31 31 FirstCall 31 +updateMaterialStage -material 32 -stage 1 +setParameter -value 0.300 -eleRange 32 32 poissonRatio 32 +setParameter -value 0 -eleRange 32 32 FirstCall 32 +updateMaterialStage -material 33 -stage 1 +setParameter -value 0.300 -eleRange 33 33 poissonRatio 33 +setParameter -value 0 -eleRange 33 33 FirstCall 33 +updateMaterialStage -material 34 -stage 1 +setParameter -value 0.300 -eleRange 34 37 poissonRatio 34 +setParameter -value 0 -eleRange 34 37 FirstCall 34 +updateMaterialStage -material 35 -stage 1 +setParameter -value 0.300 -eleRange 38 41 poissonRatio 35 +setParameter -value 0 -eleRange 38 41 FirstCall 35 +analyze 10 1.000 +remove sp 1 1 +remove recorders + + + + ### DYNAMIC ANALYSIS PHASE ### + +# Updating Element Permeabilities# +setParameter -val 3.058e-06 -eleRange 1 1 hPerm +setParameter -val 3.058e-06 -eleRange 1 1 vPerm +setParameter -val 3.058e-06 -eleRange 2 2 hPerm +setParameter -val 3.058e-06 -eleRange 2 2 vPerm +setParameter -val 3.058e-06 -eleRange 3 3 hPerm +setParameter -val 3.058e-06 -eleRange 3 3 vPerm +setParameter -val 3.058e-06 -eleRange 4 4 hPerm +setParameter -val 3.058e-06 -eleRange 4 4 vPerm +setParameter -val 3.058e-06 -eleRange 5 5 hPerm +setParameter -val 3.058e-06 -eleRange 5 5 vPerm +setParameter -val 3.058e-06 -eleRange 6 6 hPerm +setParameter -val 3.058e-06 -eleRange 6 6 vPerm +setParameter -val 3.058e-06 -eleRange 7 7 hPerm +setParameter -val 3.058e-06 -eleRange 7 7 vPerm +setParameter -val 3.058e-06 -eleRange 8 8 hPerm +setParameter -val 3.058e-06 -eleRange 8 8 vPerm +setParameter -val 3.058e-06 -eleRange 9 9 hPerm +setParameter -val 3.058e-06 -eleRange 9 9 vPerm +setParameter -val 3.058e-06 -eleRange 10 10 hPerm +setParameter -val 3.058e-06 -eleRange 10 10 vPerm +setParameter -val 3.058e-06 -eleRange 11 11 hPerm +setParameter -val 3.058e-06 -eleRange 11 11 vPerm +setParameter -val 3.058e-06 -eleRange 12 12 hPerm +setParameter -val 3.058e-06 -eleRange 12 12 vPerm +setParameter -val 3.058e-06 -eleRange 13 13 hPerm +setParameter -val 3.058e-06 -eleRange 13 13 vPerm +setParameter -val 3.058e-06 -eleRange 14 14 hPerm +setParameter -val 3.058e-06 -eleRange 14 14 vPerm +setParameter -val 3.058e-06 -eleRange 15 15 hPerm +setParameter -val 3.058e-06 -eleRange 15 15 vPerm +setParameter -val 3.058e-06 -eleRange 16 16 hPerm +setParameter -val 3.058e-06 -eleRange 16 16 vPerm +setParameter -val 3.058e-06 -eleRange 17 17 hPerm +setParameter -val 3.058e-06 -eleRange 17 17 vPerm +setParameter -val 3.058e-06 -eleRange 18 18 hPerm +setParameter -val 3.058e-06 -eleRange 18 18 vPerm +setParameter -val 3.058e-06 -eleRange 19 19 hPerm +setParameter -val 3.058e-06 -eleRange 19 19 vPerm +setParameter -val 3.058e-06 -eleRange 20 20 hPerm +setParameter -val 3.058e-06 -eleRange 20 20 vPerm +setParameter -val 3.058e-06 -eleRange 21 21 hPerm +setParameter -val 3.058e-06 -eleRange 21 21 vPerm +setParameter -val 3.058e-06 -eleRange 22 22 hPerm +setParameter -val 3.058e-06 -eleRange 22 22 vPerm +setParameter -val 3.058e-06 -eleRange 23 23 hPerm +setParameter -val 3.058e-06 -eleRange 23 23 vPerm +setParameter -val 3.058e-06 -eleRange 24 24 hPerm +setParameter -val 3.058e-06 -eleRange 24 24 vPerm +setParameter -val 3.058e-06 -eleRange 25 25 hPerm +setParameter -val 3.058e-06 -eleRange 25 25 vPerm +setParameter -val 3.058e-06 -eleRange 26 26 hPerm +setParameter -val 3.058e-06 -eleRange 26 26 vPerm +setParameter -val 3.058e-06 -eleRange 27 27 hPerm +setParameter -val 3.058e-06 -eleRange 27 27 vPerm +setParameter -val 3.058e-06 -eleRange 28 28 hPerm +setParameter -val 3.058e-06 -eleRange 28 28 vPerm +setParameter -val 3.058e-06 -eleRange 29 29 hPerm +setParameter -val 3.058e-06 -eleRange 29 29 vPerm +setParameter -val 3.058e-06 -eleRange 30 30 hPerm +setParameter -val 3.058e-06 -eleRange 30 30 vPerm +setParameter -val 3.058e-06 -eleRange 31 31 hPerm +setParameter -val 3.058e-06 -eleRange 31 31 vPerm +setParameter -val 3.058e-06 -eleRange 32 32 hPerm +setParameter -val 3.058e-06 -eleRange 32 32 vPerm +setParameter -val 3.058e-06 -eleRange 33 33 hPerm +setParameter -val 3.058e-06 -eleRange 33 33 vPerm +setParameter -val 3.058e-06 -eleRange 34 37 hPerm +setParameter -val 3.058e-06 -eleRange 34 37 vPerm +setParameter -val 1.019e-09 -eleRange 38 41 hPerm +setParameter -val 1.019e-09 -eleRange 38 41 vPerm + + # Creating Post-Gravity Recorders +setTime 0.000 +wipeAnalysis +eval "recorder Node -file ProfileA_acc$motionID.out -time -dT 0.010 -node 55 84 -dof 1 accel" +# eval "recorder Element -file ProfileA_stress$motionID.out -time -dT 0.010 -eleRange 1 41 stress" +# eval "recorder Element -file ProfileA_strain$motionID.out -time -dT 0.010 -eleRange 1 41 strain" + +# Creating Force Load Pattern +set mSeries "Path -dt $motionDT -filePath $velocityFile -factor 885.202" + +pattern Plain 10 $mSeries {load 1 1.000 0.000 0.000} + +# Analysis Time Step +set dT $motionDT +set nSteps $motionSteps + + ## Setting Dynamic Analysis Parameters## +constraints Transformation +test NormDispIncr 1.000e-04 15 0 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.500 0.250 +analysis Transient +rayleigh 4.977e-02 3.152e-04 0.000 0.000 + + + + ## Define Dynamic Sub-stepping ## +proc subStepAnalyze {dT subStep} { + if {$subStep > 10} { + return -10 + } + for {set i 1} {$i < 3} {incr i} { + puts "Try dT = $dT" + set success [analyze 1 $dT] + if {$success != 0} { + set success [subStepAnalyze [expr $dT/2.0] [expr $subStep+1]] + if {$success == -10} { + puts "Did not converge." + return $success + } + } else { + if {$i==1} { + puts "Substep $subStep : Left side converged with dT = $dT" + } else { + puts "Substep $subStep : Right side converged with dT = $dT" + } + } + } + return $success +} + # Start Dynamic Analysis # +set remStep $nSteps +set success 0 +puts "Start analysis" +set startT [clock seconds] +while {$success != -10} { + set subStep 0 + set success [analyze $remStep $dT] + if {$success == 0} { + puts "Analysis Finished" + break + } else { + set curTime [getTime] + puts "Analysis failed at $curTime. Try substepping." + set success [subStepAnalyze [expr $dT/2.0] [incr subStep]] + set curStep [expr int($curTime/$dT + 1)] + set remStep [expr int($nSteps-$curStep)] + puts "Current step: $curStep , Remaining steps: $remStep" + } +} +set endT [clock seconds] + +puts "loading analysis execution time: [expr $endT-$startT] seconds." +puts "Finished with dynamic analysis..." +wipe diff --git a/examples/opensees/DS_input/ProfileB.tcl b/examples/opensees/DS_input/ProfileB.tcl new file mode 100644 index 0000000..0f1d6df --- /dev/null +++ b/examples/opensees/DS_input/ProfileB.tcl @@ -0,0 +1,511 @@ +### OpenSees TCL file for 1D Soil Column Analysis ### +### AnalysisID: TestProfileB ### +### Ground Motion Record: RSN6928 ### +### Slope Inclination: 2.00 % ### + + +### GENERATING MESH ### +wipe +model BasicBuilder -ndm 2 -ndf 3 +node 1 0.00 0.00 +node 2 0.50 0.00 +node 3 0.00 0.50 +node 4 0.50 0.50 +node 5 0.00 1.00 +node 6 0.50 1.00 +node 7 0.00 1.50 +node 8 0.50 1.50 +node 9 0.00 2.00 +node 10 0.50 2.00 +node 11 0.00 2.50 +node 12 0.50 2.50 +node 13 0.00 3.00 +node 14 0.50 3.00 +node 15 0.00 3.50 +node 16 0.50 3.50 +node 17 0.00 4.00 +node 18 0.50 4.00 +node 19 0.00 4.50 +node 20 0.50 4.50 +node 21 0.00 5.00 +node 22 0.50 5.00 +node 23 0.00 5.50 +node 24 0.50 5.50 +node 25 0.00 6.00 +node 26 0.50 6.00 +node 27 0.00 6.50 +node 28 0.50 6.50 +node 29 0.00 7.00 +node 30 0.50 7.00 +node 31 0.00 7.50 +node 32 0.50 7.50 +node 33 0.00 8.00 +node 34 0.50 8.00 +node 35 0.00 8.50 +node 36 0.50 8.50 +node 37 0.00 9.00 +node 38 0.50 9.00 +node 39 0.00 9.50 +node 40 0.50 9.50 +node 41 0.00 10.00 +node 42 0.50 10.00 +node 43 0.00 10.50 +node 44 0.50 10.50 +node 45 0.00 11.00 +node 46 0.50 11.00 +node 47 0.00 11.50 +node 48 0.50 11.50 +node 49 0.00 12.00 +node 50 0.50 12.00 +node 51 0.00 12.50 +node 52 0.50 12.50 +node 53 0.00 13.00 +node 54 0.50 13.00 +node 55 0.00 13.50 +node 56 0.50 13.50 +node 57 0.00 14.00 +node 58 0.50 14.00 +node 59 0.00 14.50 +node 60 0.50 14.50 +node 61 0.00 15.00 +node 62 0.50 15.00 +node 63 0.00 15.50 +node 64 0.50 15.50 +node 65 0.00 16.00 +node 66 0.50 16.00 +node 67 0.00 16.50 +node 68 0.50 16.50 +node 69 0.00 17.00 +node 70 0.50 17.00 +node 71 0.00 17.50 +node 72 0.50 17.50 +node 73 0.00 18.00 +node 74 0.50 18.00 + + + ### NODE BOUNDARY CONDITIONS ### +fix 1 0 1 0 +fix 2 0 1 0 +equalDOF 1 2 1 +equalDOF 3 4 1 2 +equalDOF 5 6 1 2 +equalDOF 7 8 1 2 +equalDOF 9 10 1 2 +equalDOF 11 12 1 2 +equalDOF 13 14 1 2 +equalDOF 15 16 1 2 +equalDOF 17 18 1 2 +equalDOF 19 20 1 2 +equalDOF 21 22 1 2 +equalDOF 23 24 1 2 +equalDOF 25 26 1 2 +equalDOF 27 28 1 2 +equalDOF 29 30 1 2 +equalDOF 31 32 1 2 +equalDOF 33 34 1 2 +equalDOF 35 36 1 2 +equalDOF 37 38 1 2 +equalDOF 39 40 1 2 +equalDOF 41 42 1 2 +equalDOF 43 44 1 2 +equalDOF 45 46 1 2 +equalDOF 47 48 1 2 +equalDOF 49 50 1 2 +equalDOF 51 52 1 2 +equalDOF 53 54 1 2 +equalDOF 55 56 1 2 +equalDOF 57 58 1 2 +equalDOF 59 60 1 2 +equalDOF 61 62 1 2 +equalDOF 63 64 1 2 +equalDOF 65 66 1 2 +equalDOF 67 68 1 2 +equalDOF 69 70 1 2 +equalDOF 71 72 1 2 +equalDOF 73 74 1 2 +fix 65 0 0 1 +fix 66 0 0 1 +fix 67 0 0 1 +fix 68 0 0 1 +fix 69 0 0 1 +fix 70 0 0 1 +fix 71 0 0 1 +fix 72 0 0 1 +fix 73 0 0 1 +fix 74 0 0 1 + + + + ### GENERATE SOIL MATERIAL MODELS ### +nDMaterial PM4Sand 1 0.950 11638.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 2 0.950 10464.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 3 0.950 9412.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 4 0.950 8469.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 5 0.950 7623.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 6 0.950 6866.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 7 0.950 6186.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 8 0.950 5577.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 9 0.950 5030.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 10 0.950 4540.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 11 0.950 4100.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 12 0.950 3705.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 13 0.950 3351.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 14 0.950 3033.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 15 0.950 2748.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 16 0.950 2491.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 17 0.950 2261.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 18 0.950 2055.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 19 0.950 1869.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 20 0.950 1703.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 21 0.950 1554.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 22 0.950 1420.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 23 0.950 1301.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 24 0.950 1194.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 25 0.950 1099.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 26 0.950 1014.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 27 0.950 939.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 28 0.950 873.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 29 0.700 835.7 0.440 2.050 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 30 0.400 524.4 1.500 1.589 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 + + + + ### DEFINE SOIL ELEMENTS ### +element SSPquadUP 1 1 2 4 3 1 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 2 3 4 6 5 2 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 3 5 6 8 7 3 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 4 7 8 10 9 4 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 5 9 10 12 11 5 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 6 11 12 14 13 6 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 7 13 14 16 15 7 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 8 15 16 18 17 8 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 9 17 18 20 19 9 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 10 19 20 22 21 10 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 11 21 22 24 23 11 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 12 23 24 26 25 12 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 13 25 26 28 27 13 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 14 27 28 30 29 14 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 15 29 30 32 31 15 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 16 31 32 34 33 16 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 17 33 34 36 35 17 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 18 35 36 38 37 18 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 19 37 38 40 39 19 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 20 39 40 42 41 20 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 21 41 42 44 43 21 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 22 43 44 46 45 22 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 23 45 46 48 47 23 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 24 47 48 50 49 24 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 25 49 50 52 51 25 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 26 51 52 54 53 26 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 27 53 54 56 55 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 28 55 56 58 57 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 29 57 58 60 59 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 30 59 60 62 61 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 31 61 62 64 63 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 32 63 64 66 65 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 33 65 66 68 67 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 34 67 68 70 69 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 35 69 70 72 71 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 36 71 72 74 73 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 + + + +### LYSMER-KUHLMEYER DASHPOTS ### +model BasicBuilder -ndm 2 -ndf 2 +node 75 0.00 0.00 +node 76 0.00 0.00 +fix 75 1 1 +fix 76 0 1 +equalDOF 1 76 1 +uniaxialMaterial Viscous 4000 843.528 1 +element zeroLength 5000 75 76 -mat 4000 -dir 1 + + + + ### GRAVITY RECORDERS ### +eval "recorder Element -file ProfileB_Gstress$motionID.out -time -eleRange 1 36 stress" + + +## Update Material for Elastoplastic ## +updateMaterialStage -material 1 -stage 0 +updateMaterialStage -material 2 -stage 0 +updateMaterialStage -material 3 -stage 0 +updateMaterialStage -material 4 -stage 0 +updateMaterialStage -material 5 -stage 0 +updateMaterialStage -material 6 -stage 0 +updateMaterialStage -material 7 -stage 0 +updateMaterialStage -material 8 -stage 0 +updateMaterialStage -material 9 -stage 0 +updateMaterialStage -material 10 -stage 0 +updateMaterialStage -material 11 -stage 0 +updateMaterialStage -material 12 -stage 0 +updateMaterialStage -material 13 -stage 0 +updateMaterialStage -material 14 -stage 0 +updateMaterialStage -material 15 -stage 0 +updateMaterialStage -material 16 -stage 0 +updateMaterialStage -material 17 -stage 0 +updateMaterialStage -material 18 -stage 0 +updateMaterialStage -material 19 -stage 0 +updateMaterialStage -material 20 -stage 0 +updateMaterialStage -material 21 -stage 0 +updateMaterialStage -material 22 -stage 0 +updateMaterialStage -material 23 -stage 0 +updateMaterialStage -material 24 -stage 0 +updateMaterialStage -material 25 -stage 0 +updateMaterialStage -material 26 -stage 0 +updateMaterialStage -material 27 -stage 0 +updateMaterialStage -material 28 -stage 0 +updateMaterialStage -material 29 -stage 0 +updateMaterialStage -material 30 -stage 0 + + + +### APPLY GRAVITY LOADING ELASTIC CASE ### +constraints Transformation +test NormDispIncr 1.00e-04 35 2 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.833 0.444 +analysis Transient +analyze 10 1.00 + + + + ### ELASTO-PLASTIC GRAVITY ANALYSIS ### +updateMaterialStage -material 1 -stage 1 +setParameter -value 0.300 -eleRange 1 1 poissonRatio 1 +setParameter -value 0 -eleRange 1 1 FirstCall 1 +updateMaterialStage -material 2 -stage 1 +setParameter -value 0.300 -eleRange 2 2 poissonRatio 2 +setParameter -value 0 -eleRange 2 2 FirstCall 2 +updateMaterialStage -material 3 -stage 1 +setParameter -value 0.300 -eleRange 3 3 poissonRatio 3 +setParameter -value 0 -eleRange 3 3 FirstCall 3 +updateMaterialStage -material 4 -stage 1 +setParameter -value 0.300 -eleRange 4 4 poissonRatio 4 +setParameter -value 0 -eleRange 4 4 FirstCall 4 +updateMaterialStage -material 5 -stage 1 +setParameter -value 0.300 -eleRange 5 5 poissonRatio 5 +setParameter -value 0 -eleRange 5 5 FirstCall 5 +updateMaterialStage -material 6 -stage 1 +setParameter -value 0.300 -eleRange 6 6 poissonRatio 6 +setParameter -value 0 -eleRange 6 6 FirstCall 6 +updateMaterialStage -material 7 -stage 1 +setParameter -value 0.300 -eleRange 7 7 poissonRatio 7 +setParameter -value 0 -eleRange 7 7 FirstCall 7 +updateMaterialStage -material 8 -stage 1 +setParameter -value 0.300 -eleRange 8 8 poissonRatio 8 +setParameter -value 0 -eleRange 8 8 FirstCall 8 +updateMaterialStage -material 9 -stage 1 +setParameter -value 0.300 -eleRange 9 9 poissonRatio 9 +setParameter -value 0 -eleRange 9 9 FirstCall 9 +updateMaterialStage -material 10 -stage 1 +setParameter -value 0.300 -eleRange 10 10 poissonRatio 10 +setParameter -value 0 -eleRange 10 10 FirstCall 10 +updateMaterialStage -material 11 -stage 1 +setParameter -value 0.300 -eleRange 11 11 poissonRatio 11 +setParameter -value 0 -eleRange 11 11 FirstCall 11 +updateMaterialStage -material 12 -stage 1 +setParameter -value 0.300 -eleRange 12 12 poissonRatio 12 +setParameter -value 0 -eleRange 12 12 FirstCall 12 +updateMaterialStage -material 13 -stage 1 +setParameter -value 0.300 -eleRange 13 13 poissonRatio 13 +setParameter -value 0 -eleRange 13 13 FirstCall 13 +updateMaterialStage -material 14 -stage 1 +setParameter -value 0.300 -eleRange 14 14 poissonRatio 14 +setParameter -value 0 -eleRange 14 14 FirstCall 14 +updateMaterialStage -material 15 -stage 1 +setParameter -value 0.300 -eleRange 15 15 poissonRatio 15 +setParameter -value 0 -eleRange 15 15 FirstCall 15 +updateMaterialStage -material 16 -stage 1 +setParameter -value 0.300 -eleRange 16 16 poissonRatio 16 +setParameter -value 0 -eleRange 16 16 FirstCall 16 +updateMaterialStage -material 17 -stage 1 +setParameter -value 0.300 -eleRange 17 17 poissonRatio 17 +setParameter -value 0 -eleRange 17 17 FirstCall 17 +updateMaterialStage -material 18 -stage 1 +setParameter -value 0.300 -eleRange 18 18 poissonRatio 18 +setParameter -value 0 -eleRange 18 18 FirstCall 18 +updateMaterialStage -material 19 -stage 1 +setParameter -value 0.300 -eleRange 19 19 poissonRatio 19 +setParameter -value 0 -eleRange 19 19 FirstCall 19 +updateMaterialStage -material 20 -stage 1 +setParameter -value 0.300 -eleRange 20 20 poissonRatio 20 +setParameter -value 0 -eleRange 20 20 FirstCall 20 +updateMaterialStage -material 21 -stage 1 +setParameter -value 0.300 -eleRange 21 21 poissonRatio 21 +setParameter -value 0 -eleRange 21 21 FirstCall 21 +updateMaterialStage -material 22 -stage 1 +setParameter -value 0.300 -eleRange 22 22 poissonRatio 22 +setParameter -value 0 -eleRange 22 22 FirstCall 22 +updateMaterialStage -material 23 -stage 1 +setParameter -value 0.300 -eleRange 23 23 poissonRatio 23 +setParameter -value 0 -eleRange 23 23 FirstCall 23 +updateMaterialStage -material 24 -stage 1 +setParameter -value 0.300 -eleRange 24 24 poissonRatio 24 +setParameter -value 0 -eleRange 24 24 FirstCall 24 +updateMaterialStage -material 25 -stage 1 +setParameter -value 0.300 -eleRange 25 25 poissonRatio 25 +setParameter -value 0 -eleRange 25 25 FirstCall 25 +updateMaterialStage -material 26 -stage 1 +setParameter -value 0.300 -eleRange 26 26 poissonRatio 26 +setParameter -value 0 -eleRange 26 26 FirstCall 26 +updateMaterialStage -material 27 -stage 1 +setParameter -value 0.300 -eleRange 27 27 poissonRatio 27 +setParameter -value 0 -eleRange 27 27 FirstCall 27 +updateMaterialStage -material 28 -stage 1 +setParameter -value 0.300 -eleRange 28 28 poissonRatio 28 +setParameter -value 0 -eleRange 28 28 FirstCall 28 +updateMaterialStage -material 29 -stage 1 +setParameter -value 0.300 -eleRange 29 32 poissonRatio 29 +setParameter -value 0 -eleRange 29 32 FirstCall 29 +updateMaterialStage -material 30 -stage 1 +setParameter -value 0.300 -eleRange 33 36 poissonRatio 30 +setParameter -value 0 -eleRange 33 36 FirstCall 30 +analyze 10 1.000 +remove sp 1 1 +remove recorders + + + + ### DYNAMIC ANALYSIS PHASE ### + +# Updating Element Permeabilities# +setParameter -val 3.058e-06 -eleRange 1 1 hPerm +setParameter -val 3.058e-06 -eleRange 1 1 vPerm +setParameter -val 3.058e-06 -eleRange 2 2 hPerm +setParameter -val 3.058e-06 -eleRange 2 2 vPerm +setParameter -val 3.058e-06 -eleRange 3 3 hPerm +setParameter -val 3.058e-06 -eleRange 3 3 vPerm +setParameter -val 3.058e-06 -eleRange 4 4 hPerm +setParameter -val 3.058e-06 -eleRange 4 4 vPerm +setParameter -val 3.058e-06 -eleRange 5 5 hPerm +setParameter -val 3.058e-06 -eleRange 5 5 vPerm +setParameter -val 3.058e-06 -eleRange 6 6 hPerm +setParameter -val 3.058e-06 -eleRange 6 6 vPerm +setParameter -val 3.058e-06 -eleRange 7 7 hPerm +setParameter -val 3.058e-06 -eleRange 7 7 vPerm +setParameter -val 3.058e-06 -eleRange 8 8 hPerm +setParameter -val 3.058e-06 -eleRange 8 8 vPerm +setParameter -val 3.058e-06 -eleRange 9 9 hPerm +setParameter -val 3.058e-06 -eleRange 9 9 vPerm +setParameter -val 3.058e-06 -eleRange 10 10 hPerm +setParameter -val 3.058e-06 -eleRange 10 10 vPerm +setParameter -val 3.058e-06 -eleRange 11 11 hPerm +setParameter -val 3.058e-06 -eleRange 11 11 vPerm +setParameter -val 3.058e-06 -eleRange 12 12 hPerm +setParameter -val 3.058e-06 -eleRange 12 12 vPerm +setParameter -val 3.058e-06 -eleRange 13 13 hPerm +setParameter -val 3.058e-06 -eleRange 13 13 vPerm +setParameter -val 3.058e-06 -eleRange 14 14 hPerm +setParameter -val 3.058e-06 -eleRange 14 14 vPerm +setParameter -val 3.058e-06 -eleRange 15 15 hPerm +setParameter -val 3.058e-06 -eleRange 15 15 vPerm +setParameter -val 3.058e-06 -eleRange 16 16 hPerm +setParameter -val 3.058e-06 -eleRange 16 16 vPerm +setParameter -val 3.058e-06 -eleRange 17 17 hPerm +setParameter -val 3.058e-06 -eleRange 17 17 vPerm +setParameter -val 3.058e-06 -eleRange 18 18 hPerm +setParameter -val 3.058e-06 -eleRange 18 18 vPerm +setParameter -val 3.058e-06 -eleRange 19 19 hPerm +setParameter -val 3.058e-06 -eleRange 19 19 vPerm +setParameter -val 3.058e-06 -eleRange 20 20 hPerm +setParameter -val 3.058e-06 -eleRange 20 20 vPerm +setParameter -val 3.058e-06 -eleRange 21 21 hPerm +setParameter -val 3.058e-06 -eleRange 21 21 vPerm +setParameter -val 3.058e-06 -eleRange 22 22 hPerm +setParameter -val 3.058e-06 -eleRange 22 22 vPerm +setParameter -val 3.058e-06 -eleRange 23 23 hPerm +setParameter -val 3.058e-06 -eleRange 23 23 vPerm +setParameter -val 3.058e-06 -eleRange 24 24 hPerm +setParameter -val 3.058e-06 -eleRange 24 24 vPerm +setParameter -val 3.058e-06 -eleRange 25 25 hPerm +setParameter -val 3.058e-06 -eleRange 25 25 vPerm +setParameter -val 3.058e-06 -eleRange 26 26 hPerm +setParameter -val 3.058e-06 -eleRange 26 26 vPerm +setParameter -val 3.058e-06 -eleRange 27 27 hPerm +setParameter -val 3.058e-06 -eleRange 27 27 vPerm +setParameter -val 3.058e-06 -eleRange 28 28 hPerm +setParameter -val 3.058e-06 -eleRange 28 28 vPerm +setParameter -val 3.058e-06 -eleRange 29 32 hPerm +setParameter -val 3.058e-06 -eleRange 29 32 vPerm +setParameter -val 1.019e-09 -eleRange 33 36 hPerm +setParameter -val 1.019e-09 -eleRange 33 36 vPerm + + # Creating Post-Gravity Recorders +setTime 0.000 +wipeAnalysis +eval "recorder Node -file ProfileB_acc$motionID.out -time -dT 0.010 -node 55 74 -dof 1 accel" + + +# Creating Force Load Pattern +set mSeries "Path -dt $motionDT -filePath $velocityFile -factor 885.202" + +pattern Plain 10 $mSeries {load 1 1.000 0.000 0.000} + +# Analysis Time Step +set dT $motionDT +set nSteps $motionSteps + + ## Setting Dynamic Analysis Parameters## +constraints Transformation +test NormDispIncr 1.000e-04 15 0 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.500 0.250 +analysis Transient +rayleigh 4.977e-02 3.152e-04 0.000 0.000 + + + + ## Define Dynamic Sub-stepping ## +proc subStepAnalyze {dT subStep} { + if {$subStep > 10} { + return -10 + } + for {set i 1} {$i < 3} {incr i} { + puts "Try dT = $dT" + set success [analyze 1 $dT] + if {$success != 0} { + set success [subStepAnalyze [expr $dT/2.0] [expr $subStep+1]] + if {$success == -10} { + puts "Did not converge." + return $success + } + } else { + if {$i==1} { + puts "Substep $subStep : Left side converged with dT = $dT" + } else { + puts "Substep $subStep : Right side converged with dT = $dT" + } + } + } + return $success +} + # Start Dynamic Analysis # +set remStep $nSteps +set success 0 +puts "Start analysis" +set startT [clock seconds] +while {$success != -10} { + set subStep 0 + set success [analyze $remStep $dT] + if {$success == 0} { + puts "Analysis Finished" + break + } else { + set curTime [getTime] + puts "Analysis failed at $curTime. Try substepping." + set success [subStepAnalyze [expr $dT/2.0] [incr subStep]] + set curStep [expr int($curTime/$dT + 1)] + set remStep [expr int($nSteps-$curStep)] + puts "Current step: $curStep , Remaining steps: $remStep" + } +} +set endT [clock seconds] + +puts "loading analysis execution time: [expr $endT-$startT] seconds." +puts "Finished with dynamic analysis..." +wipe diff --git a/examples/opensees/DS_input/ProfileC.tcl b/examples/opensees/DS_input/ProfileC.tcl new file mode 100644 index 0000000..709bb04 --- /dev/null +++ b/examples/opensees/DS_input/ProfileC.tcl @@ -0,0 +1,565 @@ +### OpenSees TCL file for 1D Soil Column Analysis ### +### AnalysisID: TestProfileC ### +### Ground Motion Record: RSN6928 ### +### Slope Inclination: 2.00 % ### + + +### GENERATING MESH ### +wipe +model BasicBuilder -ndm 2 -ndf 3 +node 1 0.00 0.00 +node 2 0.50 0.00 +node 3 0.00 0.50 +node 4 0.50 0.50 +node 5 0.00 1.00 +node 6 0.50 1.00 +node 7 0.00 1.50 +node 8 0.50 1.50 +node 9 0.00 2.00 +node 10 0.50 2.00 +node 11 0.00 2.50 +node 12 0.50 2.50 +node 13 0.00 3.00 +node 14 0.50 3.00 +node 15 0.00 3.50 +node 16 0.50 3.50 +node 17 0.00 4.00 +node 18 0.50 4.00 +node 19 0.00 4.50 +node 20 0.50 4.50 +node 21 0.00 5.00 +node 22 0.50 5.00 +node 23 0.00 5.50 +node 24 0.50 5.50 +node 25 0.00 6.00 +node 26 0.50 6.00 +node 27 0.00 6.50 +node 28 0.50 6.50 +node 29 0.00 7.00 +node 30 0.50 7.00 +node 31 0.00 7.50 +node 32 0.50 7.50 +node 33 0.00 8.00 +node 34 0.50 8.00 +node 35 0.00 8.50 +node 36 0.50 8.50 +node 37 0.00 9.00 +node 38 0.50 9.00 +node 39 0.00 9.50 +node 40 0.50 9.50 +node 41 0.00 10.00 +node 42 0.50 10.00 +node 43 0.00 10.50 +node 44 0.50 10.50 +node 45 0.00 11.00 +node 46 0.50 11.00 +node 47 0.00 11.50 +node 48 0.50 11.50 +node 49 0.00 12.00 +node 50 0.50 12.00 +node 51 0.00 12.50 +node 52 0.50 12.50 +node 53 0.00 13.00 +node 54 0.50 13.00 +node 55 0.00 13.50 +node 56 0.50 13.50 +node 57 0.00 14.00 +node 58 0.50 14.00 +node 59 0.00 14.50 +node 60 0.50 14.50 +node 61 0.00 15.00 +node 62 0.50 15.00 +node 63 0.00 15.50 +node 64 0.50 15.50 +node 65 0.00 16.00 +node 66 0.50 16.00 +node 67 0.00 16.50 +node 68 0.50 16.50 +node 69 0.00 17.00 +node 70 0.50 17.00 +node 71 0.00 17.50 +node 72 0.50 17.50 +node 73 0.00 18.00 +node 74 0.50 18.00 +node 75 0.00 18.50 +node 76 0.50 18.50 +node 77 0.00 19.00 +node 78 0.50 19.00 +node 79 0.00 19.50 +node 80 0.50 19.50 +node 81 0.00 20.00 +node 82 0.50 20.00 +node 83 0.00 20.50 +node 84 0.50 20.50 +node 85 0.00 21.00 +node 86 0.50 21.00 +node 87 0.00 21.50 +node 88 0.50 21.50 +node 89 0.00 22.00 +node 90 0.50 22.00 +node 91 0.00 22.50 +node 92 0.50 22.50 +node 93 0.00 23.00 +node 94 0.50 23.00 + + + ### NODE BOUNDARY CONDITIONS ### +fix 1 0 1 0 +fix 2 0 1 0 +equalDOF 1 2 1 +equalDOF 3 4 1 2 +equalDOF 5 6 1 2 +equalDOF 7 8 1 2 +equalDOF 9 10 1 2 +equalDOF 11 12 1 2 +equalDOF 13 14 1 2 +equalDOF 15 16 1 2 +equalDOF 17 18 1 2 +equalDOF 19 20 1 2 +equalDOF 21 22 1 2 +equalDOF 23 24 1 2 +equalDOF 25 26 1 2 +equalDOF 27 28 1 2 +equalDOF 29 30 1 2 +equalDOF 31 32 1 2 +equalDOF 33 34 1 2 +equalDOF 35 36 1 2 +equalDOF 37 38 1 2 +equalDOF 39 40 1 2 +equalDOF 41 42 1 2 +equalDOF 43 44 1 2 +equalDOF 45 46 1 2 +equalDOF 47 48 1 2 +equalDOF 49 50 1 2 +equalDOF 51 52 1 2 +equalDOF 53 54 1 2 +equalDOF 55 56 1 2 +equalDOF 57 58 1 2 +equalDOF 59 60 1 2 +equalDOF 61 62 1 2 +equalDOF 63 64 1 2 +equalDOF 65 66 1 2 +equalDOF 67 68 1 2 +equalDOF 69 70 1 2 +equalDOF 71 72 1 2 +equalDOF 73 74 1 2 +equalDOF 75 76 1 2 +equalDOF 77 78 1 2 +equalDOF 79 80 1 2 +equalDOF 81 82 1 2 +equalDOF 83 84 1 2 +equalDOF 85 86 1 2 +equalDOF 87 88 1 2 +equalDOF 89 90 1 2 +equalDOF 91 92 1 2 +equalDOF 93 94 1 2 +fix 85 0 0 1 +fix 86 0 0 1 +fix 87 0 0 1 +fix 88 0 0 1 +fix 89 0 0 1 +fix 90 0 0 1 +fix 91 0 0 1 +fix 92 0 0 1 +fix 93 0 0 1 +fix 94 0 0 1 + + + + ### GENERATE SOIL MATERIAL MODELS ### +nDMaterial PM4Sand 1 0.950 10783.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 2 0.950 9669.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 3 0.950 8672.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 4 0.950 7780.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 5 0.950 6981.8 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 6 0.950 6266.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 7 0.950 5627.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 8 0.950 5053.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 9 0.950 4540.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 10 0.950 4081.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 11 0.950 3669.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 12 0.950 3300.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 13 0.950 2969.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 14 0.950 2673.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 15 0.950 2407.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 16 0.950 2169.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 17 0.950 1955.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 18 0.950 1763.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 19 0.950 1592.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 20 0.950 1437.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 21 0.950 1299.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 22 0.950 1175.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 23 0.950 1063.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 24 0.950 963.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 25 0.950 873.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 26 0.950 793.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 27 0.950 720.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 28 0.950 655.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 29 0.950 597.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 30 0.950 545.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 31 0.400 524.4 0.500 1.994 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 32 0.400 524.4 1.500 1.589 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 + + + + ### DEFINE SOIL ELEMENTS ### +element SSPquadUP 1 1 2 4 3 1 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 2 3 4 6 5 2 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 3 5 6 8 7 3 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 4 7 8 10 9 4 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 5 9 10 12 11 5 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 6 11 12 14 13 6 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 7 13 14 16 15 7 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 8 15 16 18 17 8 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 9 17 18 20 19 9 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 10 19 20 22 21 10 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 11 21 22 24 23 11 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 12 23 24 26 25 12 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 13 25 26 28 27 13 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 14 27 28 30 29 14 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 15 29 30 32 31 15 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 16 31 32 34 33 16 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 17 33 34 36 35 17 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 18 35 36 38 37 18 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 19 37 38 40 39 19 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 20 39 40 42 41 20 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 21 41 42 44 43 21 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 22 43 44 46 45 22 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 23 45 46 48 47 23 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 24 47 48 50 49 24 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 25 49 50 52 51 25 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 26 51 52 54 53 26 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 27 53 54 56 55 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 28 55 56 58 57 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 29 57 58 60 59 29 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 30 59 60 62 61 30 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 31 61 62 64 63 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 32 63 64 66 65 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 33 65 66 68 67 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 34 67 68 70 69 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 35 69 70 72 71 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 36 71 72 74 73 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 37 73 74 76 75 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 38 75 76 78 77 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 39 77 78 80 79 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 40 79 80 82 81 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 41 81 82 84 83 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 42 83 84 86 85 31 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 43 85 86 88 87 32 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 44 87 88 90 89 32 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 45 89 90 92 91 32 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 46 91 92 94 93 32 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 + + + +### LYSMER-KUHLMEYER DASHPOTS ### +model BasicBuilder -ndm 2 -ndf 2 +node 95 0.00 0.00 +node 96 0.00 0.00 +fix 95 1 1 +fix 96 0 1 +equalDOF 1 96 1 +uniaxialMaterial Viscous 4000 857.330 1 +element zeroLength 5000 95 96 -mat 4000 -dir 1 + + + + ### GRAVITY RECORDERS ### +eval "recorder Element -file ProfileC_Gstress$motionID.out -time -eleRange 1 46 stress" + + +## Update Material for Elastoplastic ## +updateMaterialStage -material 1 -stage 0 +updateMaterialStage -material 2 -stage 0 +updateMaterialStage -material 3 -stage 0 +updateMaterialStage -material 4 -stage 0 +updateMaterialStage -material 5 -stage 0 +updateMaterialStage -material 6 -stage 0 +updateMaterialStage -material 7 -stage 0 +updateMaterialStage -material 8 -stage 0 +updateMaterialStage -material 9 -stage 0 +updateMaterialStage -material 10 -stage 0 +updateMaterialStage -material 11 -stage 0 +updateMaterialStage -material 12 -stage 0 +updateMaterialStage -material 13 -stage 0 +updateMaterialStage -material 14 -stage 0 +updateMaterialStage -material 15 -stage 0 +updateMaterialStage -material 16 -stage 0 +updateMaterialStage -material 17 -stage 0 +updateMaterialStage -material 18 -stage 0 +updateMaterialStage -material 19 -stage 0 +updateMaterialStage -material 20 -stage 0 +updateMaterialStage -material 21 -stage 0 +updateMaterialStage -material 22 -stage 0 +updateMaterialStage -material 23 -stage 0 +updateMaterialStage -material 24 -stage 0 +updateMaterialStage -material 25 -stage 0 +updateMaterialStage -material 26 -stage 0 +updateMaterialStage -material 27 -stage 0 +updateMaterialStage -material 28 -stage 0 +updateMaterialStage -material 29 -stage 0 +updateMaterialStage -material 30 -stage 0 +updateMaterialStage -material 31 -stage 0 +updateMaterialStage -material 32 -stage 0 + + + +### APPLY GRAVITY LOADING ELASTIC CASE ### +constraints Transformation +test NormDispIncr 1.00e-04 35 2 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.833 0.444 +analysis Transient +analyze 10 1.00 + + + + ### ELASTO-PLASTIC GRAVITY ANALYSIS ### +updateMaterialStage -material 1 -stage 1 +setParameter -value 0.300 -eleRange 1 1 poissonRatio 1 +setParameter -value 0 -eleRange 1 1 FirstCall 1 +updateMaterialStage -material 2 -stage 1 +setParameter -value 0.300 -eleRange 2 2 poissonRatio 2 +setParameter -value 0 -eleRange 2 2 FirstCall 2 +updateMaterialStage -material 3 -stage 1 +setParameter -value 0.300 -eleRange 3 3 poissonRatio 3 +setParameter -value 0 -eleRange 3 3 FirstCall 3 +updateMaterialStage -material 4 -stage 1 +setParameter -value 0.300 -eleRange 4 4 poissonRatio 4 +setParameter -value 0 -eleRange 4 4 FirstCall 4 +updateMaterialStage -material 5 -stage 1 +setParameter -value 0.300 -eleRange 5 5 poissonRatio 5 +setParameter -value 0 -eleRange 5 5 FirstCall 5 +updateMaterialStage -material 6 -stage 1 +setParameter -value 0.300 -eleRange 6 6 poissonRatio 6 +setParameter -value 0 -eleRange 6 6 FirstCall 6 +updateMaterialStage -material 7 -stage 1 +setParameter -value 0.300 -eleRange 7 7 poissonRatio 7 +setParameter -value 0 -eleRange 7 7 FirstCall 7 +updateMaterialStage -material 8 -stage 1 +setParameter -value 0.300 -eleRange 8 8 poissonRatio 8 +setParameter -value 0 -eleRange 8 8 FirstCall 8 +updateMaterialStage -material 9 -stage 1 +setParameter -value 0.300 -eleRange 9 9 poissonRatio 9 +setParameter -value 0 -eleRange 9 9 FirstCall 9 +updateMaterialStage -material 10 -stage 1 +setParameter -value 0.300 -eleRange 10 10 poissonRatio 10 +setParameter -value 0 -eleRange 10 10 FirstCall 10 +updateMaterialStage -material 11 -stage 1 +setParameter -value 0.300 -eleRange 11 11 poissonRatio 11 +setParameter -value 0 -eleRange 11 11 FirstCall 11 +updateMaterialStage -material 12 -stage 1 +setParameter -value 0.300 -eleRange 12 12 poissonRatio 12 +setParameter -value 0 -eleRange 12 12 FirstCall 12 +updateMaterialStage -material 13 -stage 1 +setParameter -value 0.300 -eleRange 13 13 poissonRatio 13 +setParameter -value 0 -eleRange 13 13 FirstCall 13 +updateMaterialStage -material 14 -stage 1 +setParameter -value 0.300 -eleRange 14 14 poissonRatio 14 +setParameter -value 0 -eleRange 14 14 FirstCall 14 +updateMaterialStage -material 15 -stage 1 +setParameter -value 0.300 -eleRange 15 15 poissonRatio 15 +setParameter -value 0 -eleRange 15 15 FirstCall 15 +updateMaterialStage -material 16 -stage 1 +setParameter -value 0.300 -eleRange 16 16 poissonRatio 16 +setParameter -value 0 -eleRange 16 16 FirstCall 16 +updateMaterialStage -material 17 -stage 1 +setParameter -value 0.300 -eleRange 17 17 poissonRatio 17 +setParameter -value 0 -eleRange 17 17 FirstCall 17 +updateMaterialStage -material 18 -stage 1 +setParameter -value 0.300 -eleRange 18 18 poissonRatio 18 +setParameter -value 0 -eleRange 18 18 FirstCall 18 +updateMaterialStage -material 19 -stage 1 +setParameter -value 0.300 -eleRange 19 19 poissonRatio 19 +setParameter -value 0 -eleRange 19 19 FirstCall 19 +updateMaterialStage -material 20 -stage 1 +setParameter -value 0.300 -eleRange 20 20 poissonRatio 20 +setParameter -value 0 -eleRange 20 20 FirstCall 20 +updateMaterialStage -material 21 -stage 1 +setParameter -value 0.300 -eleRange 21 21 poissonRatio 21 +setParameter -value 0 -eleRange 21 21 FirstCall 21 +updateMaterialStage -material 22 -stage 1 +setParameter -value 0.300 -eleRange 22 22 poissonRatio 22 +setParameter -value 0 -eleRange 22 22 FirstCall 22 +updateMaterialStage -material 23 -stage 1 +setParameter -value 0.300 -eleRange 23 23 poissonRatio 23 +setParameter -value 0 -eleRange 23 23 FirstCall 23 +updateMaterialStage -material 24 -stage 1 +setParameter -value 0.300 -eleRange 24 24 poissonRatio 24 +setParameter -value 0 -eleRange 24 24 FirstCall 24 +updateMaterialStage -material 25 -stage 1 +setParameter -value 0.300 -eleRange 25 25 poissonRatio 25 +setParameter -value 0 -eleRange 25 25 FirstCall 25 +updateMaterialStage -material 26 -stage 1 +setParameter -value 0.300 -eleRange 26 26 poissonRatio 26 +setParameter -value 0 -eleRange 26 26 FirstCall 26 +updateMaterialStage -material 27 -stage 1 +setParameter -value 0.300 -eleRange 27 27 poissonRatio 27 +setParameter -value 0 -eleRange 27 27 FirstCall 27 +updateMaterialStage -material 28 -stage 1 +setParameter -value 0.300 -eleRange 28 28 poissonRatio 28 +setParameter -value 0 -eleRange 28 28 FirstCall 28 +updateMaterialStage -material 29 -stage 1 +setParameter -value 0.300 -eleRange 29 29 poissonRatio 29 +setParameter -value 0 -eleRange 29 29 FirstCall 29 +updateMaterialStage -material 30 -stage 1 +setParameter -value 0.300 -eleRange 30 30 poissonRatio 30 +setParameter -value 0 -eleRange 30 30 FirstCall 30 +updateMaterialStage -material 31 -stage 1 +setParameter -value 0.300 -eleRange 31 42 poissonRatio 31 +setParameter -value 0 -eleRange 31 42 FirstCall 31 +updateMaterialStage -material 32 -stage 1 +setParameter -value 0.300 -eleRange 43 46 poissonRatio 32 +setParameter -value 0 -eleRange 43 46 FirstCall 32 +analyze 10 1.000 +remove sp 1 1 +remove recorders + + + + ### DYNAMIC ANALYSIS PHASE ### + +# Updating Element Permeabilities# +setParameter -val 3.058e-06 -eleRange 1 1 hPerm +setParameter -val 3.058e-06 -eleRange 1 1 vPerm +setParameter -val 3.058e-06 -eleRange 2 2 hPerm +setParameter -val 3.058e-06 -eleRange 2 2 vPerm +setParameter -val 3.058e-06 -eleRange 3 3 hPerm +setParameter -val 3.058e-06 -eleRange 3 3 vPerm +setParameter -val 3.058e-06 -eleRange 4 4 hPerm +setParameter -val 3.058e-06 -eleRange 4 4 vPerm +setParameter -val 3.058e-06 -eleRange 5 5 hPerm +setParameter -val 3.058e-06 -eleRange 5 5 vPerm +setParameter -val 3.058e-06 -eleRange 6 6 hPerm +setParameter -val 3.058e-06 -eleRange 6 6 vPerm +setParameter -val 3.058e-06 -eleRange 7 7 hPerm +setParameter -val 3.058e-06 -eleRange 7 7 vPerm +setParameter -val 3.058e-06 -eleRange 8 8 hPerm +setParameter -val 3.058e-06 -eleRange 8 8 vPerm +setParameter -val 3.058e-06 -eleRange 9 9 hPerm +setParameter -val 3.058e-06 -eleRange 9 9 vPerm +setParameter -val 3.058e-06 -eleRange 10 10 hPerm +setParameter -val 3.058e-06 -eleRange 10 10 vPerm +setParameter -val 3.058e-06 -eleRange 11 11 hPerm +setParameter -val 3.058e-06 -eleRange 11 11 vPerm +setParameter -val 3.058e-06 -eleRange 12 12 hPerm +setParameter -val 3.058e-06 -eleRange 12 12 vPerm +setParameter -val 3.058e-06 -eleRange 13 13 hPerm +setParameter -val 3.058e-06 -eleRange 13 13 vPerm +setParameter -val 3.058e-06 -eleRange 14 14 hPerm +setParameter -val 3.058e-06 -eleRange 14 14 vPerm +setParameter -val 3.058e-06 -eleRange 15 15 hPerm +setParameter -val 3.058e-06 -eleRange 15 15 vPerm +setParameter -val 3.058e-06 -eleRange 16 16 hPerm +setParameter -val 3.058e-06 -eleRange 16 16 vPerm +setParameter -val 3.058e-06 -eleRange 17 17 hPerm +setParameter -val 3.058e-06 -eleRange 17 17 vPerm +setParameter -val 3.058e-06 -eleRange 18 18 hPerm +setParameter -val 3.058e-06 -eleRange 18 18 vPerm +setParameter -val 3.058e-06 -eleRange 19 19 hPerm +setParameter -val 3.058e-06 -eleRange 19 19 vPerm +setParameter -val 3.058e-06 -eleRange 20 20 hPerm +setParameter -val 3.058e-06 -eleRange 20 20 vPerm +setParameter -val 3.058e-06 -eleRange 21 21 hPerm +setParameter -val 3.058e-06 -eleRange 21 21 vPerm +setParameter -val 3.058e-06 -eleRange 22 22 hPerm +setParameter -val 3.058e-06 -eleRange 22 22 vPerm +setParameter -val 3.058e-06 -eleRange 23 23 hPerm +setParameter -val 3.058e-06 -eleRange 23 23 vPerm +setParameter -val 3.058e-06 -eleRange 24 24 hPerm +setParameter -val 3.058e-06 -eleRange 24 24 vPerm +setParameter -val 3.058e-06 -eleRange 25 25 hPerm +setParameter -val 3.058e-06 -eleRange 25 25 vPerm +setParameter -val 3.058e-06 -eleRange 26 26 hPerm +setParameter -val 3.058e-06 -eleRange 26 26 vPerm +setParameter -val 3.058e-06 -eleRange 27 27 hPerm +setParameter -val 3.058e-06 -eleRange 27 27 vPerm +setParameter -val 3.058e-06 -eleRange 28 28 hPerm +setParameter -val 3.058e-06 -eleRange 28 28 vPerm +setParameter -val 3.058e-06 -eleRange 29 29 hPerm +setParameter -val 3.058e-06 -eleRange 29 29 vPerm +setParameter -val 3.058e-06 -eleRange 30 30 hPerm +setParameter -val 3.058e-06 -eleRange 30 30 vPerm +setParameter -val 3.058e-06 -eleRange 31 42 hPerm +setParameter -val 3.058e-06 -eleRange 31 42 vPerm +setParameter -val 1.019e-09 -eleRange 43 46 hPerm +setParameter -val 1.019e-09 -eleRange 43 46 vPerm + + # Creating Post-Gravity Recorders +setTime 0.000 +wipeAnalysis +eval "recorder Node -file ProfileC_acc$motionID.out -time -dT 0.010 -node 55 94 -dof 1 accel" + + +# Creating Force Load Pattern +set mSeries "Path -dt $motionDT -filePath $velocityFile -factor 885.202" + +pattern Plain 10 $mSeries {load 1 1.000 0.000 0.000} + +# Analysis Time Step +set dT $motionDT +set nSteps $motionSteps + + ## Setting Dynamic Analysis Parameters## +constraints Transformation +test NormDispIncr 1.000e-04 15 0 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.500 0.250 +analysis Transient +rayleigh 4.977e-02 3.152e-04 0.000 0.000 + + + + ## Define Dynamic Sub-stepping ## +proc subStepAnalyze {dT subStep} { + if {$subStep > 10} { + return -10 + } + for {set i 1} {$i < 3} {incr i} { + puts "Try dT = $dT" + set success [analyze 1 $dT] + if {$success != 0} { + set success [subStepAnalyze [expr $dT/2.0] [expr $subStep+1]] + if {$success == -10} { + puts "Did not converge." + return $success + } + } else { + if {$i==1} { + puts "Substep $subStep : Left side converged with dT = $dT" + } else { + puts "Substep $subStep : Right side converged with dT = $dT" + } + } + } + return $success +} + # Start Dynamic Analysis # +set remStep $nSteps +set success 0 +puts "Start analysis" +set startT [clock seconds] +while {$success != -10} { + set subStep 0 + set success [analyze $remStep $dT] + if {$success == 0} { + puts "Analysis Finished" + break + } else { + set curTime [getTime] + puts "Analysis failed at $curTime. Try substepping." + set success [subStepAnalyze [expr $dT/2.0] [incr subStep]] + set curStep [expr int($curTime/$dT + 1)] + set remStep [expr int($nSteps-$curStep)] + puts "Current step: $curStep , Remaining steps: $remStep" + } +} +set endT [clock seconds] + +puts "loading analysis execution time: [expr $endT-$startT] seconds." +puts "Finished with dynamic analysis..." +wipe diff --git a/examples/opensees/DS_input/ProfileD.tcl b/examples/opensees/DS_input/ProfileD.tcl new file mode 100644 index 0000000..4a10a7a --- /dev/null +++ b/examples/opensees/DS_input/ProfileD.tcl @@ -0,0 +1,521 @@ +### OpenSees TCL file for 1D Soil Column Analysis ### +### AnalysisID: TestProfileD ### +### Ground Motion Record: RSN6928 ### +### Slope Inclination: 2.00 % ### + + +### GENERATING MESH ### +wipe +model BasicBuilder -ndm 2 -ndf 3 +node 1 0.00 0.00 +node 2 0.50 0.00 +node 3 0.00 0.50 +node 4 0.50 0.50 +node 5 0.00 1.00 +node 6 0.50 1.00 +node 7 0.00 1.50 +node 8 0.50 1.50 +node 9 0.00 2.00 +node 10 0.50 2.00 +node 11 0.00 2.50 +node 12 0.50 2.50 +node 13 0.00 3.00 +node 14 0.50 3.00 +node 15 0.00 3.50 +node 16 0.50 3.50 +node 17 0.00 4.00 +node 18 0.50 4.00 +node 19 0.00 4.50 +node 20 0.50 4.50 +node 21 0.00 5.00 +node 22 0.50 5.00 +node 23 0.00 5.50 +node 24 0.50 5.50 +node 25 0.00 6.00 +node 26 0.50 6.00 +node 27 0.00 6.50 +node 28 0.50 6.50 +node 29 0.00 7.00 +node 30 0.50 7.00 +node 31 0.00 7.50 +node 32 0.50 7.50 +node 33 0.00 8.00 +node 34 0.50 8.00 +node 35 0.00 8.50 +node 36 0.50 8.50 +node 37 0.00 9.00 +node 38 0.50 9.00 +node 39 0.00 9.50 +node 40 0.50 9.50 +node 41 0.00 10.00 +node 42 0.50 10.00 +node 43 0.00 10.50 +node 44 0.50 10.50 +node 45 0.00 11.00 +node 46 0.50 11.00 +node 47 0.00 11.50 +node 48 0.50 11.50 +node 49 0.00 12.00 +node 50 0.50 12.00 +node 51 0.00 12.50 +node 52 0.50 12.50 +node 53 0.00 13.00 +node 54 0.50 13.00 +node 55 0.00 13.50 +node 56 0.50 13.50 +node 57 0.00 14.00 +node 58 0.50 14.00 +node 59 0.00 14.50 +node 60 0.50 14.50 +node 61 0.00 15.00 +node 62 0.50 15.00 +node 63 0.00 15.50 +node 64 0.50 15.50 +node 65 0.00 16.00 +node 66 0.50 16.00 +node 67 0.00 16.50 +node 68 0.50 16.50 +node 69 0.00 17.00 +node 70 0.50 17.00 +node 71 0.00 17.50 +node 72 0.50 17.50 +node 73 0.00 18.00 +node 74 0.50 18.00 +node 75 0.00 18.50 +node 76 0.50 18.50 +node 77 0.00 19.00 +node 78 0.50 19.00 +node 79 0.00 19.50 +node 80 0.50 19.50 +node 81 0.00 20.00 +node 82 0.50 20.00 +node 83 0.00 20.50 +node 84 0.50 20.50 +node 85 0.00 21.00 +node 86 0.50 21.00 + + + ### NODE BOUNDARY CONDITIONS ### +fix 1 0 1 0 +fix 2 0 1 0 +equalDOF 1 2 1 +equalDOF 3 4 1 2 +equalDOF 5 6 1 2 +equalDOF 7 8 1 2 +equalDOF 9 10 1 2 +equalDOF 11 12 1 2 +equalDOF 13 14 1 2 +equalDOF 15 16 1 2 +equalDOF 17 18 1 2 +equalDOF 19 20 1 2 +equalDOF 21 22 1 2 +equalDOF 23 24 1 2 +equalDOF 25 26 1 2 +equalDOF 27 28 1 2 +equalDOF 29 30 1 2 +equalDOF 31 32 1 2 +equalDOF 33 34 1 2 +equalDOF 35 36 1 2 +equalDOF 37 38 1 2 +equalDOF 39 40 1 2 +equalDOF 41 42 1 2 +equalDOF 43 44 1 2 +equalDOF 45 46 1 2 +equalDOF 47 48 1 2 +equalDOF 49 50 1 2 +equalDOF 51 52 1 2 +equalDOF 53 54 1 2 +equalDOF 55 56 1 2 +equalDOF 57 58 1 2 +equalDOF 59 60 1 2 +equalDOF 61 62 1 2 +equalDOF 63 64 1 2 +equalDOF 65 66 1 2 +equalDOF 67 68 1 2 +equalDOF 69 70 1 2 +equalDOF 71 72 1 2 +equalDOF 73 74 1 2 +equalDOF 75 76 1 2 +equalDOF 77 78 1 2 +equalDOF 79 80 1 2 +equalDOF 81 82 1 2 +equalDOF 83 84 1 2 +equalDOF 85 86 1 2 +fix 77 0 0 1 +fix 78 0 0 1 +fix 79 0 0 1 +fix 80 0 0 1 +fix 81 0 0 1 +fix 82 0 0 1 +fix 83 0 0 1 +fix 84 0 0 1 +fix 85 0 0 1 +fix 86 0 0 1 + + + + ### GENERATE SOIL MATERIAL MODELS ### +nDMaterial PM4Sand 1 0.950 11562.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 2 0.950 10376.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 3 0.950 9315.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 4 0.950 8365.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 5 0.950 7514.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 6 0.950 6752.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 7 0.950 6069.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 8 0.950 5457.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 9 0.950 4909.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 10 0.950 4418.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 11 0.950 3978.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 12 0.950 3583.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 13 0.950 3229.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 14 0.950 2911.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 15 0.950 2627.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 16 0.950 2371.6 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 17 0.950 2142.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 18 0.950 1936.7 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 19 0.950 1752.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 20 0.950 1586.3 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 21 0.950 1437.5 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 22 0.950 1304.0 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 23 0.950 1184.1 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 24 0.950 1076.4 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 25 0.950 979.9 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 26 0.950 893.2 2.500 2.102 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 27 0.700 835.7 0.440 2.050 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 +nDMaterial PM4Sand 28 0.400 524.4 1.500 1.589 101.300 -1 0.800 0.500 0.500 0.100 -1 -1 250.0 -1 33.000 0.333 + + + + ### DEFINE SOIL ELEMENTS ### +element SSPquadUP 1 1 2 4 3 1 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 2 3 4 6 5 2 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 3 5 6 8 7 3 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 4 7 8 10 9 4 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 5 9 10 12 11 5 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 6 11 12 14 13 6 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 7 13 14 16 15 7 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 8 15 16 18 17 8 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 9 17 18 20 19 9 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 10 19 20 22 21 10 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 11 21 22 24 23 11 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 12 23 24 26 25 12 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 13 25 26 28 27 13 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 14 27 28 30 29 14 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 15 29 30 32 31 15 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 16 31 32 34 33 16 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 17 33 34 36 35 17 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 18 35 36 38 37 18 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 19 37 38 40 39 19 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 20 39 40 42 41 20 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 21 41 42 44 43 21 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 22 43 44 46 45 22 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 23 45 46 48 47 23 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 24 47 48 50 49 24 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 25 49 50 52 51 25 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 26 51 52 54 53 26 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.515 1.000e-08 -0.196 -9.808 +element SSPquadUP 27 53 54 56 55 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 28 55 56 58 57 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 29 57 58 60 59 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 30 59 60 62 61 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 31 61 62 64 63 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 32 63 64 66 65 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 33 65 66 68 67 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 34 67 68 70 69 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 35 69 70 72 71 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 36 71 72 74 73 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 37 73 74 76 75 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 38 75 76 78 77 27 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.590 1.000e-08 -0.196 -9.808 +element SSPquadUP 39 77 78 80 79 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 40 79 80 82 81 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 41 81 82 84 83 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 +element SSPquadUP 42 83 84 86 85 28 1.000 2.200e+06 1.000 1.000e+00 1.000e+00 0.680 1.000e-08 -0.196 -9.808 + + + +### LYSMER-KUHLMEYER DASHPOTS ### +model BasicBuilder -ndm 2 -ndf 2 +node 87 0.00 0.00 +node 88 0.00 0.00 +fix 87 1 1 +fix 88 0 1 +equalDOF 1 88 1 +uniaxialMaterial Viscous 4000 870.962 1 +element zeroLength 5000 87 88 -mat 4000 -dir 1 + + + + ### GRAVITY RECORDERS ### +eval "recorder Element -file ProfileD_Gstress$motionID.out -time -eleRange 1 42 stress" + + +## Update Material for Elastoplastic ## +updateMaterialStage -material 1 -stage 0 +updateMaterialStage -material 2 -stage 0 +updateMaterialStage -material 3 -stage 0 +updateMaterialStage -material 4 -stage 0 +updateMaterialStage -material 5 -stage 0 +updateMaterialStage -material 6 -stage 0 +updateMaterialStage -material 7 -stage 0 +updateMaterialStage -material 8 -stage 0 +updateMaterialStage -material 9 -stage 0 +updateMaterialStage -material 10 -stage 0 +updateMaterialStage -material 11 -stage 0 +updateMaterialStage -material 12 -stage 0 +updateMaterialStage -material 13 -stage 0 +updateMaterialStage -material 14 -stage 0 +updateMaterialStage -material 15 -stage 0 +updateMaterialStage -material 16 -stage 0 +updateMaterialStage -material 17 -stage 0 +updateMaterialStage -material 18 -stage 0 +updateMaterialStage -material 19 -stage 0 +updateMaterialStage -material 20 -stage 0 +updateMaterialStage -material 21 -stage 0 +updateMaterialStage -material 22 -stage 0 +updateMaterialStage -material 23 -stage 0 +updateMaterialStage -material 24 -stage 0 +updateMaterialStage -material 25 -stage 0 +updateMaterialStage -material 26 -stage 0 +updateMaterialStage -material 27 -stage 0 +updateMaterialStage -material 28 -stage 0 + + + +### APPLY GRAVITY LOADING ELASTIC CASE ### +constraints Transformation +test NormDispIncr 1.00e-04 35 2 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.833 0.444 +analysis Transient +analyze 10 1.00 + + + + ### ELASTO-PLASTIC GRAVITY ANALYSIS ### +updateMaterialStage -material 1 -stage 1 +setParameter -value 0.300 -eleRange 1 1 poissonRatio 1 +setParameter -value 0 -eleRange 1 1 FirstCall 1 +updateMaterialStage -material 2 -stage 1 +setParameter -value 0.300 -eleRange 2 2 poissonRatio 2 +setParameter -value 0 -eleRange 2 2 FirstCall 2 +updateMaterialStage -material 3 -stage 1 +setParameter -value 0.300 -eleRange 3 3 poissonRatio 3 +setParameter -value 0 -eleRange 3 3 FirstCall 3 +updateMaterialStage -material 4 -stage 1 +setParameter -value 0.300 -eleRange 4 4 poissonRatio 4 +setParameter -value 0 -eleRange 4 4 FirstCall 4 +updateMaterialStage -material 5 -stage 1 +setParameter -value 0.300 -eleRange 5 5 poissonRatio 5 +setParameter -value 0 -eleRange 5 5 FirstCall 5 +updateMaterialStage -material 6 -stage 1 +setParameter -value 0.300 -eleRange 6 6 poissonRatio 6 +setParameter -value 0 -eleRange 6 6 FirstCall 6 +updateMaterialStage -material 7 -stage 1 +setParameter -value 0.300 -eleRange 7 7 poissonRatio 7 +setParameter -value 0 -eleRange 7 7 FirstCall 7 +updateMaterialStage -material 8 -stage 1 +setParameter -value 0.300 -eleRange 8 8 poissonRatio 8 +setParameter -value 0 -eleRange 8 8 FirstCall 8 +updateMaterialStage -material 9 -stage 1 +setParameter -value 0.300 -eleRange 9 9 poissonRatio 9 +setParameter -value 0 -eleRange 9 9 FirstCall 9 +updateMaterialStage -material 10 -stage 1 +setParameter -value 0.300 -eleRange 10 10 poissonRatio 10 +setParameter -value 0 -eleRange 10 10 FirstCall 10 +updateMaterialStage -material 11 -stage 1 +setParameter -value 0.300 -eleRange 11 11 poissonRatio 11 +setParameter -value 0 -eleRange 11 11 FirstCall 11 +updateMaterialStage -material 12 -stage 1 +setParameter -value 0.300 -eleRange 12 12 poissonRatio 12 +setParameter -value 0 -eleRange 12 12 FirstCall 12 +updateMaterialStage -material 13 -stage 1 +setParameter -value 0.300 -eleRange 13 13 poissonRatio 13 +setParameter -value 0 -eleRange 13 13 FirstCall 13 +updateMaterialStage -material 14 -stage 1 +setParameter -value 0.300 -eleRange 14 14 poissonRatio 14 +setParameter -value 0 -eleRange 14 14 FirstCall 14 +updateMaterialStage -material 15 -stage 1 +setParameter -value 0.300 -eleRange 15 15 poissonRatio 15 +setParameter -value 0 -eleRange 15 15 FirstCall 15 +updateMaterialStage -material 16 -stage 1 +setParameter -value 0.300 -eleRange 16 16 poissonRatio 16 +setParameter -value 0 -eleRange 16 16 FirstCall 16 +updateMaterialStage -material 17 -stage 1 +setParameter -value 0.300 -eleRange 17 17 poissonRatio 17 +setParameter -value 0 -eleRange 17 17 FirstCall 17 +updateMaterialStage -material 18 -stage 1 +setParameter -value 0.300 -eleRange 18 18 poissonRatio 18 +setParameter -value 0 -eleRange 18 18 FirstCall 18 +updateMaterialStage -material 19 -stage 1 +setParameter -value 0.300 -eleRange 19 19 poissonRatio 19 +setParameter -value 0 -eleRange 19 19 FirstCall 19 +updateMaterialStage -material 20 -stage 1 +setParameter -value 0.300 -eleRange 20 20 poissonRatio 20 +setParameter -value 0 -eleRange 20 20 FirstCall 20 +updateMaterialStage -material 21 -stage 1 +setParameter -value 0.300 -eleRange 21 21 poissonRatio 21 +setParameter -value 0 -eleRange 21 21 FirstCall 21 +updateMaterialStage -material 22 -stage 1 +setParameter -value 0.300 -eleRange 22 22 poissonRatio 22 +setParameter -value 0 -eleRange 22 22 FirstCall 22 +updateMaterialStage -material 23 -stage 1 +setParameter -value 0.300 -eleRange 23 23 poissonRatio 23 +setParameter -value 0 -eleRange 23 23 FirstCall 23 +updateMaterialStage -material 24 -stage 1 +setParameter -value 0.300 -eleRange 24 24 poissonRatio 24 +setParameter -value 0 -eleRange 24 24 FirstCall 24 +updateMaterialStage -material 25 -stage 1 +setParameter -value 0.300 -eleRange 25 25 poissonRatio 25 +setParameter -value 0 -eleRange 25 25 FirstCall 25 +updateMaterialStage -material 26 -stage 1 +setParameter -value 0.300 -eleRange 26 26 poissonRatio 26 +setParameter -value 0 -eleRange 26 26 FirstCall 26 +updateMaterialStage -material 27 -stage 1 +setParameter -value 0.300 -eleRange 27 38 poissonRatio 27 +setParameter -value 0 -eleRange 27 38 FirstCall 27 +updateMaterialStage -material 28 -stage 1 +setParameter -value 0.300 -eleRange 39 42 poissonRatio 28 +setParameter -value 0 -eleRange 39 42 FirstCall 28 +analyze 10 1.000 +remove sp 1 1 +remove recorders + + + + ### DYNAMIC ANALYSIS PHASE ### + +# Updating Element Permeabilities# +setParameter -val 3.058e-06 -eleRange 1 1 hPerm +setParameter -val 3.058e-06 -eleRange 1 1 vPerm +setParameter -val 3.058e-06 -eleRange 2 2 hPerm +setParameter -val 3.058e-06 -eleRange 2 2 vPerm +setParameter -val 3.058e-06 -eleRange 3 3 hPerm +setParameter -val 3.058e-06 -eleRange 3 3 vPerm +setParameter -val 3.058e-06 -eleRange 4 4 hPerm +setParameter -val 3.058e-06 -eleRange 4 4 vPerm +setParameter -val 3.058e-06 -eleRange 5 5 hPerm +setParameter -val 3.058e-06 -eleRange 5 5 vPerm +setParameter -val 3.058e-06 -eleRange 6 6 hPerm +setParameter -val 3.058e-06 -eleRange 6 6 vPerm +setParameter -val 3.058e-06 -eleRange 7 7 hPerm +setParameter -val 3.058e-06 -eleRange 7 7 vPerm +setParameter -val 3.058e-06 -eleRange 8 8 hPerm +setParameter -val 3.058e-06 -eleRange 8 8 vPerm +setParameter -val 3.058e-06 -eleRange 9 9 hPerm +setParameter -val 3.058e-06 -eleRange 9 9 vPerm +setParameter -val 3.058e-06 -eleRange 10 10 hPerm +setParameter -val 3.058e-06 -eleRange 10 10 vPerm +setParameter -val 3.058e-06 -eleRange 11 11 hPerm +setParameter -val 3.058e-06 -eleRange 11 11 vPerm +setParameter -val 3.058e-06 -eleRange 12 12 hPerm +setParameter -val 3.058e-06 -eleRange 12 12 vPerm +setParameter -val 3.058e-06 -eleRange 13 13 hPerm +setParameter -val 3.058e-06 -eleRange 13 13 vPerm +setParameter -val 3.058e-06 -eleRange 14 14 hPerm +setParameter -val 3.058e-06 -eleRange 14 14 vPerm +setParameter -val 3.058e-06 -eleRange 15 15 hPerm +setParameter -val 3.058e-06 -eleRange 15 15 vPerm +setParameter -val 3.058e-06 -eleRange 16 16 hPerm +setParameter -val 3.058e-06 -eleRange 16 16 vPerm +setParameter -val 3.058e-06 -eleRange 17 17 hPerm +setParameter -val 3.058e-06 -eleRange 17 17 vPerm +setParameter -val 3.058e-06 -eleRange 18 18 hPerm +setParameter -val 3.058e-06 -eleRange 18 18 vPerm +setParameter -val 3.058e-06 -eleRange 19 19 hPerm +setParameter -val 3.058e-06 -eleRange 19 19 vPerm +setParameter -val 3.058e-06 -eleRange 20 20 hPerm +setParameter -val 3.058e-06 -eleRange 20 20 vPerm +setParameter -val 3.058e-06 -eleRange 21 21 hPerm +setParameter -val 3.058e-06 -eleRange 21 21 vPerm +setParameter -val 3.058e-06 -eleRange 22 22 hPerm +setParameter -val 3.058e-06 -eleRange 22 22 vPerm +setParameter -val 3.058e-06 -eleRange 23 23 hPerm +setParameter -val 3.058e-06 -eleRange 23 23 vPerm +setParameter -val 3.058e-06 -eleRange 24 24 hPerm +setParameter -val 3.058e-06 -eleRange 24 24 vPerm +setParameter -val 3.058e-06 -eleRange 25 25 hPerm +setParameter -val 3.058e-06 -eleRange 25 25 vPerm +setParameter -val 3.058e-06 -eleRange 26 26 hPerm +setParameter -val 3.058e-06 -eleRange 26 26 vPerm +setParameter -val 3.058e-06 -eleRange 27 38 hPerm +setParameter -val 3.058e-06 -eleRange 27 38 vPerm +setParameter -val 1.019e-09 -eleRange 39 42 hPerm +setParameter -val 1.019e-09 -eleRange 39 42 vPerm + + # Creating Post-Gravity Recorders +setTime 0.000 +wipeAnalysis +eval "recorder Node -file ProfileD_acc$motionID.out -time -dT 0.010 -node 55 86 -dof 1 accel" + + +# Creating Force Load Pattern +set mSeries "Path -dt $motionDT -filePath $velocityFile -factor 885.202" + +pattern Plain 10 $mSeries {load 1 1.000 0.000 0.000} + +# Analysis Time Step +set dT $motionDT +set nSteps $motionSteps + + ## Setting Dynamic Analysis Parameters## +constraints Transformation +test NormDispIncr 1.000e-04 15 0 +algorithm Newton +numberer RCM +system SparseGeneral +integrator Newmark 0.500 0.250 +analysis Transient +rayleigh 4.977e-02 3.152e-04 0.000 0.000 + + + + ## Define Dynamic Sub-stepping ## +proc subStepAnalyze {dT subStep} { + if {$subStep > 10} { + return -10 + } + for {set i 1} {$i < 3} {incr i} { + puts "Try dT = $dT" + set success [analyze 1 $dT] + if {$success != 0} { + set success [subStepAnalyze [expr $dT/2.0] [expr $subStep+1]] + if {$success == -10} { + puts "Did not converge." + return $success + } + } else { + if {$i==1} { + puts "Substep $subStep : Left side converged with dT = $dT" + } else { + puts "Substep $subStep : Right side converged with dT = $dT" + } + } + } + return $success +} + # Start Dynamic Analysis # +set remStep $nSteps +set success 0 +puts "Start analysis" +set startT [clock seconds] +while {$success != -10} { + set subStep 0 + set success [analyze $remStep $dT] + if {$success == 0} { + puts "Analysis Finished" + break + } else { + set curTime [getTime] + puts "Analysis failed at $curTime. Try substepping." + set success [subStepAnalyze [expr $dT/2.0] [incr subStep]] + set curStep [expr int($curTime/$dT + 1)] + set remStep [expr int($nSteps-$curStep)] + puts "Current step: $curStep , Remaining steps: $remStep" + } +} +set endT [clock seconds] + +puts "loading analysis execution time: [expr $endT-$startT] seconds." +puts "Finished with dynamic analysis..." +wipe diff --git a/examples/opensees/DS_input/motion1.vel b/examples/opensees/DS_input/motion1.vel new file mode 100644 index 0000000..52793d8 --- /dev/null +++ b/examples/opensees/DS_input/motion1.vel @@ -0,0 +1,6610 @@ +1.012102000000000021e-04 +2.024113999999999981e-04 +3.035719999999999998e-04 +4.044439000000000259e-04 +5.053190999999999846e-04 +6.064967000000000101e-04 +7.067841999999999745e-04 +8.087781000000000484e-04 +9.167923000000000348e-04 +1.013178300000000098e-03 +1.088236600000000009e-03 +1.173305199999999989e-03 +1.306104200000000057e-03 +1.484644800000000080e-03 +1.715524099999999989e-03 +2.020729099999999789e-03 +2.277305299999999970e-03 +2.453473600000000057e-03 +2.690012900000000179e-03 +2.945504900000000138e-03 +3.157631199999999787e-03 +3.390549100000000114e-03 +3.610650400000000107e-03 +3.765653900000000189e-03 +3.972105200000000148e-03 +4.133479699999999604e-03 +3.924140799999999846e-03 +3.613936299999999987e-03 +3.791756800000000132e-03 +4.403726099999999768e-03 +5.205933999999999735e-03 +5.881792599999999607e-03 +6.201728200000000170e-03 +6.449699300000000246e-03 +6.983102300000000248e-03 +7.684372600000000282e-03 +7.549513300000000419e-03 +6.524977599999999718e-03 +5.446793400000000257e-03 +4.555592100000000269e-03 +4.419031900000000221e-03 +4.878850599999999885e-03 +4.896622199999999848e-03 +3.754046300000000135e-03 +1.925601400000000012e-03 +3.678669999999999797e-05 +-2.096548800000000001e-03 +-3.483635299999999786e-03 +-3.723241600000000168e-03 +-3.664930299999999939e-03 +-3.572208800000000167e-03 +-3.142309700000000053e-03 +-2.230037299999999920e-03 +-1.317317300000000026e-03 +-2.570291000000000155e-04 +1.289845699999999989e-03 +3.586005399999999885e-03 +6.629572799999999648e-03 +9.884448199999999740e-03 +1.266513770000000060e-02 +1.461497919999999937e-02 +1.645459050000000131e-02 +1.829261550000000139e-02 +1.895096380000000150e-02 +1.768657109999999949e-02 +1.518702350000000062e-02 +1.215543919999999972e-02 +8.842893799999999513e-03 +5.360711199999999843e-03 +2.040299900000000066e-03 +-3.388436999999999894e-04 +-1.654340200000000089e-03 +-3.196989500000000078e-03 +-4.990693800000000312e-03 +-5.869679899999999916e-03 +-5.722154499999999866e-03 +-4.811010099999999713e-03 +-3.888667699999999970e-03 +-3.425025999999999852e-03 +-3.033065399999999856e-03 +-1.985110200000000068e-03 +-2.331408999999999890e-04 +1.087463899999999975e-03 +8.359611000000000082e-04 +-9.267582000000000337e-04 +-3.512792700000000063e-03 +-7.135114599999999897e-03 +-1.236911580000000024e-02 +-1.869372429999999891e-02 +-2.524816270000000001e-02 +-3.129993689999999856e-02 +-3.692654249999999944e-02 +-4.229832420000000093e-02 +-4.670712579999999892e-02 +-5.006658230000000237e-02 +-5.333342180000000265e-02 +-5.752074280000000345e-02 +-6.199090990000000190e-02 +-6.476009470000000656e-02 +-6.511945419999999596e-02 +-6.445608799999999472e-02 +-6.334304749999999928e-02 +-6.082242150000000125e-02 +-5.685833400000000343e-02 +-5.287014050000000270e-02 +-4.978475720000000160e-02 +-4.671353839999999730e-02 +-4.374554490000000240e-02 +-4.229037320000000183e-02 +-4.218123220000000173e-02 +-4.330541329999999800e-02 +-4.594520230000000149e-02 +-4.942942919999999962e-02 +-5.316334209999999671e-02 +-5.676952770000000259e-02 +-5.958586929999999671e-02 +-6.166151870000000090e-02 +-6.342085090000000591e-02 +-6.513851240000000098e-02 +-6.745275010000000016e-02 +-6.952603659999999353e-02 +-6.870607659999999894e-02 +-6.505028279999999774e-02 +-6.017915780000000076e-02 +-5.396221150000000272e-02 +-4.654370270000000170e-02 +-3.802822069999999693e-02 +-2.937692009999999868e-02 +-2.135768249999999910e-02 +-1.380648569999999922e-02 +-7.104330199999999915e-03 +-7.208511000000000345e-04 +5.478044700000000294e-03 +9.975825600000000001e-03 +1.293474330000000082e-02 +1.537925939999999943e-02 +1.668732889999999941e-02 +1.648163219999999873e-02 +1.454893309999999960e-02 +1.105699100000000039e-02 +7.646895899999999781e-03 +4.908629900000000164e-03 +2.467362900000000161e-03 +-1.153301000000000022e-04 +-3.439802300000000153e-03 +-6.758965900000000332e-03 +-9.258690300000000512e-03 +-9.299136700000000186e-03 +-5.962203899999999994e-03 +-7.496173000000000506e-04 +4.859475099999999853e-03 +1.081765709999999922e-02 +1.718821480000000054e-02 +2.221000949999999904e-02 +2.613579010000000036e-02 +2.996987389999999918e-02 +3.274452750000000217e-02 +3.416346979999999867e-02 +3.458252059999999961e-02 +3.436117269999999779e-02 +3.285539030000000221e-02 +2.933698640000000080e-02 +2.474882960000000104e-02 +2.075934399999999902e-02 +1.763903229999999947e-02 +1.419685090000000031e-02 +1.017051580000000004e-02 +5.401294200000000129e-03 +-1.420479999999999993e-05 +-5.736915100000000017e-03 +-1.220711780000000024e-02 +-1.923716309999999943e-02 +-2.615400899999999890e-02 +-3.209529789999999994e-02 +-3.667523789999999756e-02 +-4.003357679999999807e-02 +-4.166218840000000118e-02 +-4.070573200000000141e-02 +-3.709529789999999744e-02 +-3.193578799999999968e-02 +-2.626413049999999985e-02 +-2.046498999999999888e-02 +-1.513167640000000029e-02 +-1.083994710000000042e-02 +-7.520297399999999709e-03 +-5.061656399999999584e-03 +-3.724596499999999893e-03 +-3.670516300000000072e-03 +-4.868864199999999726e-03 +-7.254170800000000162e-03 +-9.794294699999999201e-03 +-1.157800160000000030e-02 +-1.287198680000000046e-02 +-1.345435560000000051e-02 +-1.392651360000000081e-02 +-1.644709299999999944e-02 +-2.011354060000000027e-02 +-2.256317279999999967e-02 +-2.509052260000000159e-02 +-2.841315070000000054e-02 +-3.081694810000000159e-02 +-3.258286690000000013e-02 +-3.404141570000000089e-02 +-3.283047459999999945e-02 +-2.877460180000000062e-02 +-2.417844800000000169e-02 +-1.938586499999999865e-02 +-1.450000289999999956e-02 +-1.056252499999999969e-02 +-7.187423200000000144e-03 +-4.047020600000000336e-03 +-1.851139900000000000e-03 +-2.679738000000000194e-04 +2.028315199999999787e-03 +4.950020299999999956e-03 +7.198130799999999906e-03 +7.857946299999999870e-03 +7.309499500000000288e-03 +5.704347400000000373e-03 +2.781532299999999857e-03 +-1.214127000000000039e-04 +-3.031354400000000129e-03 +-6.181107899999999794e-03 +-8.618162999999999865e-03 +-1.046495780000000070e-02 +-1.173356509999999922e-02 +-1.234668929999999977e-02 +-1.287722019999999919e-02 +-1.342554089999999957e-02 +-1.418619370000000039e-02 +-1.516762829999999951e-02 +-1.567340139999999840e-02 +-1.544809309999999915e-02 +-1.484069200000000081e-02 +-1.398201020000000051e-02 +-1.283074969999999961e-02 +-1.156412390000000068e-02 +-1.008601620000000067e-02 +-8.638454000000000271e-03 +-7.470366400000000122e-03 +-6.526093200000000240e-03 +-5.688235800000000092e-03 +-4.810844699999999689e-03 +-4.324014400000000292e-03 +-3.939553499999999889e-03 +-3.079322900000000095e-03 +-1.302548300000000046e-03 +1.417728899999999917e-03 +3.650280599999999875e-03 +4.645792600000000355e-03 +4.270890099999999877e-03 +2.814741300000000047e-03 +9.819693999999999905e-04 +-1.248636299999999902e-03 +-4.204316999999999950e-03 +-7.723818799999999755e-03 +-1.111953279999999995e-02 +-1.437432410000000042e-02 +-1.731466049999999882e-02 +-1.955441130000000124e-02 +-2.105014800000000116e-02 +-2.166970130000000008e-02 +-2.147482950000000057e-02 +-2.013665829999999879e-02 +-1.777495990000000151e-02 +-1.517461810000000043e-02 +-1.234494250000000085e-02 +-9.062016000000000862e-03 +-6.318628100000000213e-03 +-4.404510000000000369e-03 +-2.637730799999999862e-03 +-1.604876899999999962e-03 +-1.691227399999999928e-03 +-2.548975299999999868e-03 +-4.168122899999999673e-03 +-6.648980199999999716e-03 +-1.003417380000000067e-02 +-1.384515920000000018e-02 +-1.768042579999999989e-02 +-2.096389590000000136e-02 +-2.267190469999999861e-02 +-2.328370369999999828e-02 +-2.272636680000000159e-02 +-2.032372169999999839e-02 +-1.733379029999999876e-02 +-1.493677830000000005e-02 +-1.298207049999999980e-02 +-1.155779000000000008e-02 +-1.062228380000000000e-02 +-1.002713400000000005e-02 +-1.011568149999999937e-02 +-1.085487239999999992e-02 +-1.149361230000000081e-02 +-1.158771649999999938e-02 +-1.188947440000000071e-02 +-1.260278689999999938e-02 +-1.274560769999999975e-02 +-1.159271010000000046e-02 +-9.890463999999999853e-03 +-8.407655300000000526e-03 +-6.700539600000000352e-03 +-5.085018299999999845e-03 +-3.997064699999999630e-03 +-3.036715000000000161e-03 +-2.221059799999999893e-03 +-1.629788999999999977e-03 +-1.249160999999999935e-03 +-1.446223900000000043e-03 +-2.056716899999999973e-03 +-2.603824299999999911e-03 +-3.233535799999999894e-03 +-3.997525299999999705e-03 +-4.383197499999999872e-03 +-4.222413900000000254e-03 +-4.119077399999999771e-03 +-4.316397300000000131e-03 +-4.292789699999999785e-03 +-3.937974900000000208e-03 +-3.545770399999999874e-03 +-3.082027099999999804e-03 +-2.812214999999999854e-03 +-2.989599500000000073e-03 +-2.897979299999999848e-03 +-1.888287900000000085e-03 +-5.983178999999999928e-04 +3.347046999999999804e-04 +1.039451600000000035e-03 +2.023549099999999955e-03 +3.418324800000000201e-03 +4.419858199999999668e-03 +4.316886100000000281e-03 +3.534113199999999819e-03 +2.734757300000000089e-03 +1.795377799999999966e-03 +5.350708999999999934e-04 +-6.439409999999999796e-04 +-1.342505799999999970e-03 +-1.340960700000000004e-03 +-5.450484999999999705e-04 +8.032996999999999620e-04 +1.918306600000000035e-03 +2.071119900000000045e-03 +2.030946400000000190e-03 +2.931602100000000200e-03 +4.414226200000000329e-03 +5.816753299999999696e-03 +7.204521600000000393e-03 +7.864575800000000658e-03 +7.653177799999999996e-03 +7.206124300000000052e-03 +6.120914199999999937e-03 +4.195401799999999917e-03 +2.429704300000000081e-03 +1.805238200000000093e-03 +1.568848500000000028e-03 +1.272685300000000064e-03 +1.638755399999999906e-03 +2.765919099999999964e-03 +4.439269000000000027e-03 +5.801519100000000241e-03 +6.608092900000000179e-03 +7.237726600000000086e-03 +7.789617799999999821e-03 +9.517886200000000643e-03 +1.226731640000000047e-02 +1.503878120000000027e-02 +1.762183549999999863e-02 +1.885864530000000081e-02 +1.905826819999999894e-02 +1.914577160000000000e-02 +1.875805609999999998e-02 +1.784499930000000081e-02 +1.637090789999999865e-02 +1.479817660000000076e-02 +1.401782650000000033e-02 +1.333416049999999915e-02 +1.230801400000000080e-02 +1.186720599999999994e-02 +1.214824840000000052e-02 +1.255548880000000034e-02 +1.235865470000000084e-02 +1.174870819999999927e-02 +1.169763629999999964e-02 +1.203737690000000055e-02 +1.226626599999999963e-02 +1.229829820000000011e-02 +1.205746769999999947e-02 +1.174204660000000011e-02 +1.209140600000000072e-02 +1.366681800000000072e-02 +1.597513019999999978e-02 +1.876874029999999957e-02 +2.132803629999999867e-02 +2.225201790000000054e-02 +2.233525780000000099e-02 +2.237108180000000127e-02 +2.175765749999999943e-02 +2.058125439999999862e-02 +1.911097150000000064e-02 +1.829255620000000068e-02 +1.835179619999999928e-02 +1.818857629999999850e-02 +1.781893660000000157e-02 +1.741855830000000119e-02 +1.634087019999999960e-02 +1.473835310000000051e-02 +1.308107990000000054e-02 +1.147848400000000060e-02 +1.041058159999999969e-02 +9.993258399999999791e-03 +9.987919499999999354e-03 +9.747504199999999785e-03 +9.043888800000000200e-03 +8.219494100000000400e-03 +7.453082199999999831e-03 +6.744407099999999607e-03 +5.490822400000000374e-03 +3.688952100000000150e-03 +2.029181499999999864e-03 +1.262020800000000038e-03 +1.152845800000000054e-03 +1.004537200000000076e-03 +1.132187399999999913e-03 +1.571331100000000064e-03 +1.699988200000000001e-03 +1.463237299999999930e-03 +1.035663200000000103e-03 +5.376769000000000426e-04 +-1.111568999999999996e-04 +-1.125459000000000095e-03 +-2.029681699999999998e-03 +-2.795563400000000177e-03 +-3.665134799999999853e-03 +-4.814963999999999703e-03 +-6.620812099999999825e-03 +-8.679957500000000034e-03 +-1.018034970000000067e-02 +-1.118335030000000042e-02 +-1.223217629999999966e-02 +-1.333973809999999989e-02 +-1.353092959999999990e-02 +-1.266500069999999985e-02 +-1.185340529999999969e-02 +-1.109363680000000074e-02 +-9.788921299999999576e-03 +-8.337195999999999843e-03 +-7.331151900000000034e-03 +-6.635750499999999892e-03 +-6.455232400000000120e-03 +-7.052270900000000113e-03 +-7.961020600000000280e-03 +-8.771114999999999468e-03 +-9.837131799999999232e-03 +-1.127576970000000040e-02 +-1.233550169999999939e-02 +-1.285803829999999925e-02 +-1.325070929999999994e-02 +-1.352110909999999951e-02 +-1.367046059999999993e-02 +-1.353193509999999974e-02 +-1.317185499999999967e-02 +-1.288533019999999960e-02 +-1.246668119999999949e-02 +-1.184144500000000079e-02 +-1.122810389999999957e-02 +-1.068375300000000069e-02 +-9.691062199999999488e-03 +-7.729688499999999921e-03 +-5.284189699999999705e-03 +-2.474803700000000051e-03 +8.487071000000000112e-04 +4.011304099999999859e-03 +6.692324099999999963e-03 +8.596327200000000029e-03 +9.741305500000000187e-03 +1.043750449999999996e-02 +1.040228259999999988e-02 +9.615631600000000556e-03 +8.505903199999999623e-03 +7.457665700000000279e-03 +6.373660300000000278e-03 +5.637170399999999644e-03 +5.865328099999999982e-03 +6.813150100000000056e-03 +8.298134100000000013e-03 +9.606341600000000217e-03 +1.039351430000000007e-02 +1.133206550000000028e-02 +1.232037130000000064e-02 +1.322941600000000079e-02 +1.427140089999999993e-02 +1.529303930000000013e-02 +1.577164610000000161e-02 +1.552541210000000019e-02 +1.496444100000000020e-02 +1.425456699999999924e-02 +1.358080010000000011e-02 +1.297204629999999977e-02 +1.219198229999999931e-02 +1.109431349999999948e-02 +9.583508500000000735e-03 +8.157066100000000611e-03 +7.609963200000000039e-03 +7.735436499999999785e-03 +8.094505499999999840e-03 +8.659101100000000245e-03 +9.358175200000000762e-03 +1.028306170000000026e-02 +1.117898609999999973e-02 +1.170246429999999976e-02 +1.211711239999999946e-02 +1.277587619999999945e-02 +1.355895889999999930e-02 +1.405991260000000014e-02 +1.374186150000000078e-02 +1.277023470000000077e-02 +1.150705240000000039e-02 +9.917613500000000207e-03 +8.118286900000000472e-03 +6.043644100000000394e-03 +4.115158199999999905e-03 +3.393950800000000018e-03 +3.634946799999999850e-03 +4.230750099999999736e-03 +5.191225399999999969e-03 +6.357922799999999632e-03 +7.694167499999999757e-03 +8.493950800000000384e-03 +8.650364900000000537e-03 +9.057504900000000816e-03 +9.457861999999999172e-03 +9.236622400000000024e-03 +8.910679100000000810e-03 +8.797654599999999575e-03 +8.465368399999999294e-03 +7.811975799999999921e-03 +6.907974499999999622e-03 +6.017209600000000130e-03 +5.562273300000000059e-03 +5.149677699999999879e-03 +4.349799399999999816e-03 +3.406980500000000162e-03 +2.484898100000000176e-03 +1.773448300000000054e-03 +9.449375000000000309e-04 +-2.147297000000000051e-04 +-1.020432900000000026e-03 +-1.381368100000000040e-03 +-1.731954599999999947e-03 +-2.314501100000000092e-03 +-3.179516199999999921e-03 +-3.975947100000000109e-03 +-4.201625599999999836e-03 +-3.997276400000000264e-03 +-3.870920600000000121e-03 +-4.144398500000000263e-03 +-4.621579500000000396e-03 +-4.713938600000000187e-03 +-4.739798899999999801e-03 +-5.898450099999999995e-03 +-8.061297800000000527e-03 +-1.033965849999999957e-02 +-1.244624149999999999e-02 +-1.347148010000000055e-02 +-1.351594839999999999e-02 +-1.302385370000000084e-02 +-1.125190600000000075e-02 +-9.498446299999999468e-03 +-8.536339400000000563e-03 +-7.700376899999999969e-03 +-7.822887800000000863e-03 +-8.071303599999999495e-03 +-7.560064099999999621e-03 +-6.938798399999999630e-03 +-6.173886899999999830e-03 +-5.898382700000000430e-03 +-6.395157099999999872e-03 +-6.985256300000000119e-03 +-7.509201899999999943e-03 +-7.991320700000000346e-03 +-8.703215000000000257e-03 +-9.616289400000000223e-03 +-1.057799369999999975e-02 +-1.176563440000000065e-02 +-1.262228219999999949e-02 +-1.302961210000000078e-02 +-1.339231800000000028e-02 +-1.372831440000000028e-02 +-1.397041620000000033e-02 +-1.347913960000000043e-02 +-1.222081849999999935e-02 +-1.093699289999999942e-02 +-9.656200000000000200e-03 +-8.408156099999999564e-03 +-7.248084099999999724e-03 +-5.914483800000000166e-03 +-4.551978600000000132e-03 +-3.527721499999999892e-03 +-3.102038699999999909e-03 +-3.003709800000000079e-03 +-2.696584699999999939e-03 +-2.088938099999999853e-03 +-1.450307899999999945e-03 +-8.965655999999999799e-04 +-7.453615000000000023e-04 +-1.193645500000000076e-03 +-1.684225900000000005e-03 +-2.123193900000000089e-03 +-2.485463499999999992e-03 +-2.528528800000000212e-03 +-2.479724100000000025e-03 +-2.557726499999999920e-03 +-2.804564800000000115e-03 +-3.061471100000000105e-03 +-3.110708700000000028e-03 +-3.057053200000000182e-03 +-3.074401999999999951e-03 +-3.039548300000000092e-03 +-2.796831499999999793e-03 +-2.345709400000000212e-03 +-1.674147499999999915e-03 +-7.611910000000000377e-04 +3.804001000000000105e-04 +1.631022300000000086e-03 +2.606571700000000040e-03 +3.237883899999999867e-03 +3.816581500000000050e-03 +4.299028699999999682e-03 +4.737449000000000347e-03 +5.227332099999999933e-03 +5.312281299999999963e-03 +4.700181000000000324e-03 +3.719092499999999968e-03 +2.509134300000000206e-03 +1.031611200000000055e-03 +-8.379800000000000643e-06 +-3.971280999999999900e-04 +-6.250916999999999498e-04 +-4.946707999999999531e-04 +6.229490000000000559e-05 +3.624880999999999828e-04 +2.908450000000000249e-04 +3.196357999999999730e-04 +6.394595999999999787e-04 +1.048989699999999976e-03 +1.138644299999999956e-03 +1.145706899999999898e-03 +1.815405300000000072e-03 +3.125688599999999935e-03 +4.494832899999999694e-03 +5.700355899999999705e-03 +6.449745500000000388e-03 +6.759791900000000110e-03 +6.870407000000000250e-03 +6.664939899999999806e-03 +6.626807900000000057e-03 +7.025681899999999640e-03 +7.408576899999999923e-03 +7.866270300000000396e-03 +8.154637399999999439e-03 +8.005602900000000424e-03 +7.806635800000000409e-03 +7.457644299999999921e-03 +7.055865399999999843e-03 +7.098830999999999891e-03 +7.329987100000000082e-03 +7.656905099999999909e-03 +8.714354800000000817e-03 +1.026535129999999948e-02 +1.164098040000000056e-02 +1.276689760000000035e-02 +1.332798770000000015e-02 +1.342934609999999959e-02 +1.313374250000000007e-02 +1.202043669999999960e-02 +1.094890029999999979e-02 +1.023345990000000018e-02 +9.348496499999999279e-03 +8.854653999999999997e-03 +8.721672099999999359e-03 +8.424813600000000818e-03 +8.131571799999999170e-03 +7.941687700000000030e-03 +7.830146099999999235e-03 +7.451936099999999751e-03 +6.671767200000000390e-03 +5.873645799999999660e-03 +4.817175600000000134e-03 +3.719849400000000035e-03 +3.014307700000000163e-03 +2.134736099999999959e-03 +1.095476099999999993e-03 +3.450993000000000181e-04 +2.108877000000000104e-04 +8.851452000000000105e-04 +1.984985700000000113e-03 +3.324074299999999881e-03 +5.099728900000000294e-03 +7.365804400000000238e-03 +9.420482799999999393e-03 +1.038307630000000030e-02 +1.072919089999999943e-02 +1.056958870000000023e-02 +9.202583500000000027e-03 +7.267481600000000319e-03 +5.632817499999999769e-03 +3.904182799999999804e-03 +2.134148499999999945e-03 +9.823620999999998962e-04 +2.318583000000000091e-04 +-2.519533000000000124e-04 +-5.182860999999999978e-04 +-7.010140000000000208e-04 +-9.112718000000000120e-04 +-1.349898200000000052e-03 +-1.691658699999999986e-03 +-1.669557600000000103e-03 +-1.572111400000000088e-03 +-1.578941799999999994e-03 +-1.376655700000000088e-03 +-8.254535000000000344e-04 +-1.703877000000000017e-04 +2.745081999999999817e-04 +2.029734000000000106e-04 +-1.070944999999999959e-04 +-4.582621999999999846e-04 +-1.144950100000000082e-03 +-2.169365600000000126e-03 +-3.302125200000000007e-03 +-4.095111599999999574e-03 +-4.557956999999999634e-03 +-5.020867099999999639e-03 +-5.314316599999999689e-03 +-5.239214199999999919e-03 +-4.618284099999999878e-03 +-3.478881000000000074e-03 +-2.187186399999999954e-03 +-8.453230999999999636e-04 +7.533716999999999888e-04 +2.159444300000000049e-03 +2.845788900000000010e-03 +3.224751399999999796e-03 +3.314507099999999991e-03 +2.838100899999999958e-03 +2.275919300000000048e-03 +1.778638599999999908e-03 +1.007558900000000068e-03 +3.453786999999999938e-04 +1.349199999999999932e-06 +-3.419173000000000069e-04 +-5.580221999999999917e-04 +-6.623659000000000274e-04 +-8.004359999999999644e-04 +-6.620438000000000191e-04 +-1.722135000000000072e-04 +4.931322000000000353e-04 +1.542704200000000062e-03 +2.656566300000000064e-03 +3.265516100000000026e-03 +3.686581600000000177e-03 +4.137401599999999957e-03 +4.393923099999999700e-03 +4.439435499999999993e-03 +4.445857000000000107e-03 +4.579474600000000249e-03 +4.845852099999999919e-03 +4.936682099999999997e-03 +4.670718199999999987e-03 +4.310081299999999997e-03 +4.176809200000000145e-03 +4.204784500000000209e-03 +4.058687600000000263e-03 +3.874426700000000064e-03 +4.151896500000000143e-03 +4.945003800000000171e-03 +6.029664399999999820e-03 +7.366482100000000185e-03 +8.668673400000000140e-03 +9.552360200000000259e-03 +1.057224669999999936e-02 +1.182753100000000050e-02 +1.257858589999999964e-02 +1.313815190000000056e-02 +1.380286520000000017e-02 +1.425147409999999969e-02 +1.442559300000000044e-02 +1.429495729999999930e-02 +1.411815150000000040e-02 +1.416852310000000018e-02 +1.402708329999999975e-02 +1.335248070000000058e-02 +1.239568849999999993e-02 +1.131650619999999968e-02 +1.035277790000000038e-02 +9.542701100000000256e-03 +8.571943999999999744e-03 +7.621537700000000082e-03 +6.846926100000000175e-03 +6.053870299999999927e-03 +4.993294500000000288e-03 +3.843806300000000061e-03 +2.996118900000000179e-03 +2.372626000000000075e-03 +1.986340000000000067e-03 +1.931388200000000097e-03 +2.072093000000000112e-03 +2.418125799999999975e-03 +2.797230999999999849e-03 +3.054487900000000134e-03 +3.354193699999999910e-03 +3.713430099999999803e-03 +4.077273799999999587e-03 +4.545279200000000228e-03 +5.184835199999999686e-03 +5.606975600000000358e-03 +5.493119900000000173e-03 +5.321423399999999741e-03 +5.321488699999999891e-03 +5.477042700000000347e-03 +6.015406499999999788e-03 +6.513309099999999713e-03 +6.713229499999999982e-03 +6.943865700000000259e-03 +7.051575200000000099e-03 +6.949130599999999748e-03 +6.802059099999999657e-03 +6.497154399999999913e-03 +6.046678800000000048e-03 +5.912444099999999807e-03 +6.197566699999999644e-03 +6.526632699999999898e-03 +7.196036599999999610e-03 +8.493640000000000218e-03 +1.018583770000000034e-02 +1.182720800000000051e-02 +1.275854759999999963e-02 +1.328065649999999980e-02 +1.394742730000000062e-02 +1.452265129999999980e-02 +1.495885769999999969e-02 +1.529926700000000007e-02 +1.552525119999999953e-02 +1.584966559999999997e-02 +1.625474260000000018e-02 +1.618746009999999860e-02 +1.536403130000000075e-02 +1.423928030000000053e-02 +1.292004700000000048e-02 +1.123805379999999986e-02 +9.379675500000000249e-03 +7.884150200000000427e-03 +6.927166400000000362e-03 +6.048958600000000317e-03 +5.285950499999999934e-03 +4.905274999999999740e-03 +4.815974399999999912e-03 +4.583755899999999994e-03 +4.049318100000000135e-03 +3.561033999999999814e-03 +3.344334000000000022e-03 +3.328333599999999930e-03 +3.376681199999999935e-03 +3.389384899999999933e-03 +3.164843599999999854e-03 +2.874406600000000127e-03 +2.859645000000000069e-03 +3.011787799999999984e-03 +3.335677500000000170e-03 +3.514040799999999798e-03 +3.022832200000000104e-03 +2.336084200000000059e-03 +1.662304400000000001e-03 +9.139105000000000449e-04 +6.409789999999999629e-04 +7.310581999999999931e-04 +8.416057999999999916e-04 +1.189172600000000047e-03 +1.644007100000000098e-03 +1.712374700000000036e-03 +1.456971899999999921e-03 +1.144148999999999904e-03 +5.506550000000000463e-04 +-3.708477999999999970e-04 +-1.415004899999999961e-03 +-2.361061700000000041e-03 +-2.978102399999999969e-03 +-3.410284799999999811e-03 +-3.743207399999999834e-03 +-3.841825399999999804e-03 +-3.670673599999999936e-03 +-3.134289699999999977e-03 +-2.538590299999999959e-03 +-2.681428500000000194e-03 +-3.338831899999999877e-03 +-3.808593099999999908e-03 +-3.847986199999999923e-03 +-3.243620999999999917e-03 +-2.027674900000000016e-03 +-4.164519999999999897e-04 +1.298839399999999903e-03 +2.851014499999999976e-03 +4.028674900000000191e-03 +4.733524700000000043e-03 +5.092178000000000156e-03 +5.127901899999999687e-03 +4.826686299999999839e-03 +4.263621399999999693e-03 +3.726934400000000026e-03 +3.549984999999999859e-03 +3.455306600000000207e-03 +3.326250599999999984e-03 +3.113103099999999911e-03 +2.495776900000000204e-03 +1.614899099999999969e-03 +6.537881000000000161e-04 +-2.393009999999999980e-05 +1.911989999999999968e-05 +2.791983000000000268e-04 +4.467396000000000214e-04 +6.457201000000000520e-04 +8.674671999999999808e-04 +1.090643600000000069e-03 +1.110334599999999918e-03 +1.099605200000000095e-03 +1.612976500000000077e-03 +2.505584600000000141e-03 +3.406395500000000166e-03 +4.178357399999999867e-03 +4.583806000000000165e-03 +5.019703099999999960e-03 +5.823811800000000191e-03 +6.339647099999999938e-03 +6.090708999999999707e-03 +5.511425799999999757e-03 +4.580697899999999767e-03 +2.865771799999999869e-03 +1.064973600000000079e-03 +-3.470104999999999804e-04 +-1.507223200000000094e-03 +-2.298801000000000056e-03 +-2.876582500000000094e-03 +-3.121253300000000151e-03 +-2.811568999999999874e-03 +-2.383217700000000213e-03 +-2.466379500000000051e-03 +-2.772463199999999819e-03 +-2.699342200000000042e-03 +-2.130272900000000202e-03 +-1.189675399999999984e-03 +1.547852999999999968e-04 +1.859493399999999960e-03 +2.778306899999999791e-03 +2.707509700000000109e-03 +2.610040300000000205e-03 +2.448346899999999989e-03 +1.850965700000000011e-03 +8.511057000000000258e-04 +-1.663842999999999919e-04 +-6.688052000000000320e-04 +-7.840005999999999625e-04 +-7.876466000000000153e-04 +-4.088820000000000063e-04 +4.035991999999999965e-04 +1.093776600000000068e-03 +1.268529200000000079e-03 +1.158954700000000039e-03 +6.225302000000000049e-04 +-3.227654999999999847e-04 +-6.875222000000000494e-04 +-4.563573000000000022e-04 +-4.074637000000000202e-04 +-6.049948999999999561e-04 +-8.453306999999999531e-04 +-1.059352300000000052e-03 +-1.521617899999999938e-03 +-2.303299700000000210e-03 +-3.125770899999999811e-03 +-3.904829900000000159e-03 +-4.444573099999999874e-03 +-4.571138899999999637e-03 +-4.535001399999999579e-03 +-4.383877300000000102e-03 +-3.983352600000000104e-03 +-3.408649499999999877e-03 +-2.861000099999999862e-03 +-2.375716400000000075e-03 +-1.716746299999999999e-03 +-8.205295999999999510e-04 +1.661911000000000020e-04 +1.117684099999999899e-03 +1.919669500000000103e-03 +2.666600500000000044e-03 +3.434569800000000003e-03 +3.955273599999999806e-03 +4.100944999999999938e-03 +3.995521099999999742e-03 +3.614129099999999813e-03 +3.042759800000000188e-03 +2.582763400000000209e-03 +2.174865599999999989e-03 +1.571395400000000090e-03 +7.203694000000000286e-04 +4.376630000000000142e-05 +-2.932062000000000253e-04 +-7.128119000000000252e-04 +-1.200696000000000012e-03 +-1.858990000000000035e-03 +-2.888013500000000209e-03 +-4.049950000000000078e-03 +-5.133003700000000370e-03 +-5.982689999999999710e-03 +-6.653426399999999748e-03 +-7.122317399999999674e-03 +-7.293608400000000172e-03 +-7.487211799999999966e-03 +-7.850133699999999395e-03 +-8.069030700000000278e-03 +-8.001967599999999792e-03 +-7.831719299999999676e-03 +-7.637313100000000209e-03 +-7.568550099999999878e-03 +-7.886267400000000760e-03 +-8.403779400000000246e-03 +-8.814111300000000010e-03 +-8.930769599999999198e-03 +-8.803947899999999341e-03 +-8.645223100000000091e-03 +-8.583681600000000328e-03 +-8.775576099999999810e-03 +-9.095235300000000661e-03 +-9.376700499999999702e-03 +-9.374096999999999638e-03 +-9.056588699999999770e-03 +-8.749532799999999375e-03 +-8.528530499999999182e-03 +-8.285648600000000696e-03 +-7.973647900000000247e-03 +-7.646927900000000285e-03 +-7.310593199999999847e-03 +-7.023322099999999846e-03 +-6.841120000000000013e-03 +-6.751201699999999882e-03 +-6.513772299999999807e-03 +-5.937254099999999916e-03 +-5.265729999999999716e-03 +-4.690943000000000369e-03 +-4.283353000000000160e-03 +-4.117001000000000341e-03 +-3.809926800000000210e-03 +-3.198064999999999936e-03 +-2.460585099999999976e-03 +-1.399813900000000059e-03 +-5.500000000000000196e-05 +1.319650099999999937e-03 +2.633419599999999895e-03 +3.749414999999999866e-03 +4.820335999999999718e-03 +6.090424799999999937e-03 +7.308066600000000419e-03 +7.756449099999999930e-03 +7.338564799999999951e-03 +6.801846299999999949e-03 +6.189390900000000216e-03 +5.592950499999999915e-03 +5.368566600000000168e-03 +5.123331800000000338e-03 +4.826502600000000080e-03 +4.689138300000000349e-03 +4.447893399999999775e-03 +4.126666400000000325e-03 +3.819131199999999983e-03 +3.478434099999999900e-03 +3.254420499999999793e-03 +3.034612500000000070e-03 +2.494896700000000158e-03 +1.778429700000000013e-03 +1.070181099999999944e-03 +2.821969999999999817e-04 +-5.214675000000000213e-04 +-1.317429499999999906e-03 +-1.909298399999999948e-03 +-2.178721800000000056e-03 +-2.197279300000000001e-03 +-1.740090199999999978e-03 +-1.207097099999999892e-03 +-9.308921999999999640e-04 +-8.048654000000000138e-04 +-8.824657999999999764e-04 +-7.334578999999999491e-04 +-1.479043999999999997e-04 +4.065413999999999833e-04 +4.959425000000000378e-04 +3.132353000000000264e-04 +2.812169999999999877e-05 +-3.597704999999999870e-04 +-4.071880000000000052e-04 +-1.678918999999999908e-04 +2.167876000000000113e-04 +1.287768600000000103e-03 +2.961322199999999807e-03 +4.607038600000000136e-03 +6.081272799999999819e-03 +7.522160100000000425e-03 +8.794694500000000206e-03 +9.576032899999999820e-03 +1.000568769999999989e-02 +1.026331079999999972e-02 +1.042240049999999980e-02 +1.056775729999999934e-02 +1.050392420000000049e-02 +1.022249809999999960e-02 +1.008053360000000023e-02 +1.018048159999999924e-02 +1.015845989999999976e-02 +9.878452700000000045e-03 +9.574581599999999748e-03 +9.368173000000000472e-03 +9.139745399999999603e-03 +8.696758400000000749e-03 +7.659052300000000063e-03 +6.116894999999999798e-03 +4.521442100000000117e-03 +2.717174399999999854e-03 +5.395006000000000367e-04 +-1.280164999999999992e-03 +-1.868494299999999943e-03 +-1.687815500000000015e-03 +-1.042005199999999996e-03 +3.617828999999999815e-04 +1.811216800000000097e-03 +3.201752400000000120e-03 +4.828258900000000076e-03 +5.959034499999999943e-03 +6.608778899999999921e-03 +7.086958800000000246e-03 +7.103003699999999900e-03 +7.058350199999999762e-03 +7.129005199999999959e-03 +6.853022099999999880e-03 +6.109258000000000223e-03 +5.077136700000000127e-03 +3.878670600000000065e-03 +2.429926900000000094e-03 +7.866352000000000066e-04 +-7.964617999999999915e-04 +-1.912016699999999911e-03 +-2.636354200000000109e-03 +-3.055205499999999810e-03 +-2.820258500000000137e-03 +-2.219876300000000070e-03 +-1.443752699999999991e-03 +-2.637305999999999852e-04 +1.169356099999999902e-03 +2.756255699999999795e-03 +4.140155799999999803e-03 +5.051100700000000013e-03 +5.921774700000000113e-03 +6.782420100000000410e-03 +7.440218099999999779e-03 +7.991715099999999530e-03 +8.420244400000000476e-03 +8.640752200000000743e-03 +8.448206899999999644e-03 +7.869154499999999469e-03 +7.108645900000000115e-03 +6.010843200000000157e-03 +4.943253199999999951e-03 +4.538014699999999742e-03 +4.345928300000000306e-03 +4.346409199999999931e-03 +5.274444100000000128e-03 +6.382578899999999736e-03 +7.224703199999999922e-03 +8.120192199999999236e-03 +8.843156799999999859e-03 +9.556002900000000813e-03 +1.062370709999999920e-02 +1.194989750000000073e-02 +1.322915820000000048e-02 +1.409876829999999991e-02 +1.425119090000000026e-02 +1.399729740000000069e-02 +1.370220720000000017e-02 +1.325570639999999918e-02 +1.246482460000000042e-02 +1.133594660000000059e-02 +1.034416820000000001e-02 +9.951802699999999849e-03 +9.743270400000000192e-03 +9.512978999999999533e-03 +9.601787500000000253e-03 +9.837621499999999256e-03 +1.002787129999999950e-02 +1.022565020000000026e-02 +1.053159350000000029e-02 +1.119757149999999965e-02 +1.218760410000000079e-02 +1.315440269999999974e-02 +1.350645550000000028e-02 +1.323812320000000015e-02 +1.280615780000000058e-02 +1.209224209999999917e-02 +1.093320759999999968e-02 +9.679389400000000185e-03 +8.578540900000000691e-03 +7.393186700000000180e-03 +6.159442400000000352e-03 +5.016793500000000031e-03 +3.909775600000000087e-03 +2.911805999999999856e-03 +2.188971899999999932e-03 +1.688027699999999952e-03 +1.264625500000000078e-03 +9.977713000000000467e-04 +7.607185999999999506e-04 +3.266047000000000004e-04 +1.392320999999999912e-04 +5.328757999999999845e-04 +1.200405099999999909e-03 +2.092891899999999809e-03 +3.023173699999999898e-03 +3.657831900000000150e-03 +3.956333900000000119e-03 +3.966777399999999593e-03 +4.027612800000000132e-03 +4.055792899999999777e-03 +4.018566299999999994e-03 +4.336089500000000173e-03 +4.791441100000000050e-03 +5.237449800000000197e-03 +5.789144000000000408e-03 +6.071581099999999974e-03 +6.081314400000000127e-03 +5.959711700000000154e-03 +5.476223100000000149e-03 +4.802438000000000019e-03 +4.124385399999999646e-03 +3.521839000000000133e-03 +3.131580399999999830e-03 +3.025103199999999975e-03 +3.243400300000000118e-03 +3.756874400000000027e-03 +4.544722400000000308e-03 +5.279312399999999683e-03 +5.871736800000000069e-03 +6.518052499999999611e-03 +7.086962100000000070e-03 +7.510023200000000287e-03 +7.720450099999999830e-03 +7.649803900000000031e-03 +7.438597199999999986e-03 +7.475684600000000006e-03 +8.142735899999999777e-03 +9.087750199999999542e-03 +9.749420099999999562e-03 +9.797819600000000351e-03 +9.404204100000000677e-03 +9.086910700000000798e-03 +8.902030800000000285e-03 +8.699946499999999805e-03 +8.639324699999999246e-03 +8.830866700000000388e-03 +9.070451499999999945e-03 +9.196959899999999216e-03 +9.129222899999999211e-03 +9.005665700000000176e-03 +8.875995299999999907e-03 +8.673090600000000691e-03 +8.516885199999999281e-03 +8.432601099999999239e-03 +8.389034400000000211e-03 +8.583197600000000080e-03 +8.988893700000000209e-03 +9.112518899999999880e-03 +8.970419900000000182e-03 +9.282206100000000779e-03 +1.044750170000000034e-02 +1.192178330000000057e-02 +1.325612450000000081e-02 +1.479872880000000085e-02 +1.641387760000000140e-02 +1.751987760000000074e-02 +1.830961130000000048e-02 +1.906271229999999955e-02 +1.955976759999999981e-02 +1.973062979999999980e-02 +1.961010250000000052e-02 +1.915000869999999855e-02 +1.836915160000000130e-02 +1.736658170000000140e-02 +1.619253520000000016e-02 +1.514723400000000074e-02 +1.438335030000000014e-02 +1.360812009999999919e-02 +1.253284210000000023e-02 +1.110734860000000060e-02 +9.681523399999999308e-03 +8.456884799999999855e-03 +7.414745300000000032e-03 +6.543035699999999802e-03 +5.768727900000000276e-03 +5.146602600000000326e-03 +4.703476399999999974e-03 +4.337449900000000039e-03 +4.160195200000000280e-03 +4.271438600000000002e-03 +4.336294000000000086e-03 +4.239183700000000339e-03 +4.202618699999999784e-03 +4.191756300000000143e-03 +4.107585300000000071e-03 +3.999483300000000394e-03 +4.100005399999999585e-03 +4.593712699999999600e-03 +5.270355699999999810e-03 +5.979154500000000150e-03 +6.689474699999999746e-03 +7.021213499999999844e-03 +6.955897100000000416e-03 +6.718417100000000433e-03 +6.262438399999999648e-03 +5.757594000000000427e-03 +5.706328600000000299e-03 +6.064473400000000049e-03 +6.114111299999999867e-03 +5.867461099999999631e-03 +5.867370900000000097e-03 +6.100187899999999844e-03 +6.279153400000000128e-03 +6.104254400000000066e-03 +5.617803999999999680e-03 +5.133974000000000350e-03 +4.574539899999999736e-03 +4.467850699999999578e-03 +5.197781400000000412e-03 +6.228196499999999816e-03 +7.272381799999999910e-03 +8.494939199999999163e-03 +9.826139700000000032e-03 +1.075186109999999931e-02 +1.134633439999999972e-02 +1.168412400000000059e-02 +1.150313310000000006e-02 +1.084070780000000005e-02 +9.794790399999999536e-03 +8.637653900000000218e-03 +7.866834799999999905e-03 +7.525305000000000362e-03 +7.156270499999999903e-03 +6.738348100000000375e-03 +6.180055200000000339e-03 +5.319865600000000215e-03 +4.441289600000000379e-03 +4.030406900000000139e-03 +4.082227400000000041e-03 +4.362986999999999595e-03 +5.181557800000000102e-03 +6.293558200000000380e-03 +7.463932999999999852e-03 +8.909628600000000370e-03 +9.883488399999999438e-03 +9.859985400000000066e-03 +9.157184000000000504e-03 +8.426685600000000803e-03 +7.933265800000000381e-03 +7.319780199999999758e-03 +6.593327999999999862e-03 +5.738156200000000401e-03 +4.759579600000000098e-03 +3.857433099999999990e-03 +3.011184799999999922e-03 +2.185561600000000132e-03 +1.552602699999999954e-03 +1.160369700000000092e-03 +8.447097000000000416e-04 +5.921585999999999517e-04 +5.081127999999999643e-04 +5.087114999999999693e-04 +5.767998999999999999e-04 +7.981314000000000203e-04 +1.153808099999999908e-03 +1.564445299999999914e-03 +1.932274000000000101e-03 +2.305843699999999934e-03 +2.803804300000000121e-03 +3.331321800000000208e-03 +3.572614699999999803e-03 +3.275698300000000167e-03 +2.579113200000000133e-03 +1.733329800000000089e-03 +8.535365999999999960e-04 +1.266375000000000085e-04 +-4.299444999999999829e-04 +-1.005408300000000055e-03 +-1.542603299999999915e-03 +-1.975007400000000114e-03 +-2.370335999999999797e-03 +-2.792894499999999929e-03 +-3.306498000000000163e-03 +-3.668364500000000084e-03 +-3.592279800000000144e-03 +-3.418079799999999922e-03 +-3.366471800000000059e-03 +-3.086268300000000187e-03 +-2.421489900000000067e-03 +-1.563495100000000066e-03 +-7.481350000000000326e-04 +7.858349999999999732e-05 +7.585687999999999936e-04 +9.021977000000000035e-04 +6.885027999999999634e-04 +1.418330999999999889e-04 +-7.982430000000000211e-04 +-1.472841599999999895e-03 +-1.854436899999999978e-03 +-2.448036099999999823e-03 +-3.148355800000000090e-03 +-3.800600500000000069e-03 +-4.405462100000000214e-03 +-4.958428099999999568e-03 +-5.510538700000000394e-03 +-6.168927400000000401e-03 +-6.854770900000000354e-03 +-7.078020600000000176e-03 +-6.819210299999999697e-03 +-6.493413499999999700e-03 +-5.926079600000000100e-03 +-5.125013200000000380e-03 +-4.426887200000000078e-03 +-3.672857800000000131e-03 +-2.916726799999999967e-03 +-2.385151600000000056e-03 +-1.903313000000000010e-03 +-1.488757799999999897e-03 +-1.203665399999999950e-03 +-1.019450600000000075e-03 +-1.123155499999999984e-03 +-1.582868099999999896e-03 +-1.914437400000000089e-03 +-1.650714200000000026e-03 +-1.190432300000000051e-03 +-1.158490299999999969e-03 +-1.437169999999999984e-03 +-1.703391999999999970e-03 +-2.034852900000000062e-03 +-2.399460500000000131e-03 +-2.832961699999999965e-03 +-3.606284899999999839e-03 +-4.597422999999999788e-03 +-5.314045499999999617e-03 +-5.412307400000000018e-03 +-5.311725599999999985e-03 +-5.354403100000000235e-03 +-5.171417900000000074e-03 +-4.682009099999999598e-03 +-4.068165700000000128e-03 +-3.685975299999999857e-03 +-3.805874500000000060e-03 +-4.035183900000000219e-03 +-3.984229500000000326e-03 +-3.458403300000000187e-03 +-2.589225000000000120e-03 +-1.588531499999999968e-03 +-4.390406000000000126e-04 +8.390001999999999703e-04 +1.843949600000000097e-03 +2.369597399999999899e-03 +2.615512700000000197e-03 +2.280834700000000052e-03 +1.414684399999999957e-03 +7.904633000000000319e-04 +5.156070999999999918e-04 +1.691159999999999983e-04 +-2.604856999999999919e-04 +-6.998542999999999648e-04 +-1.049847000000000020e-03 +-1.230451299999999913e-03 +-1.331149599999999992e-03 +-1.490371799999999939e-03 +-1.882423899999999912e-03 +-2.431233200000000160e-03 +-2.979094099999999874e-03 +-3.539889000000000056e-03 +-3.841884700000000076e-03 +-3.809218999999999973e-03 +-3.718166699999999984e-03 +-3.672335799999999935e-03 +-3.637480199999999862e-03 +-3.603013200000000030e-03 +-3.588141100000000021e-03 +-3.677685899999999855e-03 +-4.003995300000000312e-03 +-4.493993499999999683e-03 +-5.107352699999999704e-03 +-5.896446799999999905e-03 +-6.656178100000000042e-03 +-7.285561500000000031e-03 +-7.934513600000000014e-03 +-8.550805200000000800e-03 +-8.977113300000000642e-03 +-9.139411199999999263e-03 +-9.101052700000000772e-03 +-8.933755599999999159e-03 +-8.781833500000000778e-03 +-8.794192799999999560e-03 +-8.800226700000000207e-03 +-8.689082199999999950e-03 +-8.560973899999999373e-03 +-8.404615699999999634e-03 +-8.109154299999999163e-03 +-7.718790599999999884e-03 +-7.336713600000000120e-03 +-7.021649599999999804e-03 +-6.954029100000000060e-03 +-7.121495799999999661e-03 +-7.385300499999999761e-03 +-7.780212800000000165e-03 +-8.127774900000000677e-03 +-8.258292299999999211e-03 +-8.341166900000000425e-03 +-8.409273099999999695e-03 +-8.370957099999999651e-03 +-8.274263599999999788e-03 +-8.100657199999999891e-03 +-7.710804699999999727e-03 +-7.140906500000000420e-03 +-6.641423599999999802e-03 +-6.608723099999999975e-03 +-7.031610899999999643e-03 +-7.623975899999999722e-03 +-8.359348100000000420e-03 +-8.949049599999999924e-03 +-9.400778000000000259e-03 +-1.011121610000000060e-02 +-1.100241530000000030e-02 +-1.184795710000000057e-02 +-1.273864719999999971e-02 +-1.369092319999999988e-02 +-1.442205809999999935e-02 +-1.491584779999999971e-02 +-1.520690220000000051e-02 +-1.512111309999999986e-02 +-1.476474330000000085e-02 +-1.425179359999999978e-02 +-1.355475119999999950e-02 +-1.275563080000000071e-02 +-1.218726359999999960e-02 +-1.188466529999999965e-02 +-1.156693280000000053e-02 +-1.124361639999999982e-02 +-1.085400440000000057e-02 +-1.032739709999999991e-02 +-9.697584100000000012e-03 +-8.993963400000000788e-03 +-8.268395600000000636e-03 +-7.639998200000000343e-03 +-7.203536800000000240e-03 +-7.021229700000000164e-03 +-7.187283899999999913e-03 +-7.479873800000000003e-03 +-7.504679700000000016e-03 +-7.308500600000000097e-03 +-6.979653100000000193e-03 +-6.371764900000000120e-03 +-5.606812000000000080e-03 +-4.816614900000000185e-03 +-3.930648299999999797e-03 +-3.152055099999999995e-03 +-2.606076299999999808e-03 +-2.105036700000000038e-03 +-1.668390700000000086e-03 +-1.295831500000000063e-03 +-9.527334000000000150e-04 +-7.441471000000000500e-04 +-6.606841999999999923e-04 +-4.690270000000000073e-04 +3.989189999999999663e-05 +7.601809000000000387e-04 +1.503878900000000032e-03 +2.198919399999999837e-03 +2.847039500000000164e-03 +3.349193400000000011e-03 +3.638909999999999974e-03 +3.686773600000000164e-03 +3.547656799999999999e-03 +3.365556899999999890e-03 +3.147237299999999880e-03 +3.019087399999999862e-03 +2.934508800000000008e-03 +2.810040800000000033e-03 +2.790236099999999792e-03 +2.877902400000000027e-03 +3.034772499999999987e-03 +3.319344399999999817e-03 +3.775844200000000057e-03 +4.434275399999999812e-03 +5.297009899999999966e-03 +6.198748700000000257e-03 +7.059142699999999826e-03 +7.979005500000000556e-03 +8.830532000000000312e-03 +9.489844399999999153e-03 +1.012724570000000067e-02 +1.080021729999999965e-02 +1.140318910000000067e-02 +1.190372030000000012e-02 +1.225293709999999980e-02 +1.233594330000000079e-02 +1.216592699999999999e-02 +1.190129210000000042e-02 +1.162985220000000049e-02 +1.132249500000000013e-02 +1.093165110000000016e-02 +1.052867809999999925e-02 +1.023744019999999963e-02 +1.004971709999999928e-02 +9.880572699999999597e-03 +9.789075799999999786e-03 +9.817054900000000278e-03 +9.892940100000000708e-03 +1.002223390000000006e-02 +1.016753069999999995e-02 +1.031395310000000030e-02 +1.058197609999999948e-02 +1.100153010000000028e-02 +1.148528709999999987e-02 +1.206065989999999949e-02 +1.282507100000000039e-02 +1.365577809999999996e-02 +1.416062279999999972e-02 +1.427111569999999982e-02 +1.423287900000000036e-02 +1.411982030000000048e-02 +1.410172049999999962e-02 +1.411942610000000049e-02 +1.398528849999999997e-02 +1.373632900000000025e-02 +1.338324859999999970e-02 +1.295504240000000008e-02 +1.246648900000000074e-02 +1.187281530000000064e-02 +1.117047479999999995e-02 +1.047642560000000035e-02 +9.854720100000000441e-03 +9.425508799999999382e-03 +9.369192000000000145e-03 +9.572396599999999714e-03 +9.914950599999999836e-03 +1.028465180000000083e-02 +1.064526300000000029e-02 +1.107421949999999947e-02 +1.145513410000000010e-02 +1.176612789999999936e-02 +1.212045129999999964e-02 +1.252681400000000070e-02 +1.294492459999999935e-02 +1.338706949999999944e-02 +1.386920200000000061e-02 +1.439506710000000057e-02 +1.483851320000000029e-02 +1.502625540000000065e-02 +1.501308519999999987e-02 +1.478335660000000031e-02 +1.431228109999999921e-02 +1.391509060000000082e-02 +1.366252400000000054e-02 +1.337033580000000083e-02 +1.311851389999999992e-02 +1.301605230000000071e-02 +1.300555140000000075e-02 +1.295155339999999947e-02 +1.270651539999999996e-02 +1.239124810000000014e-02 +1.215350490000000061e-02 +1.187705699999999989e-02 +1.150393520000000079e-02 +1.106211850000000073e-02 +1.061612039999999986e-02 +1.036860900000000085e-02 +1.035150190000000067e-02 +1.048670579999999922e-02 +1.083553689999999965e-02 +1.132267699999999974e-02 +1.181541309999999990e-02 +1.222451230000000041e-02 +1.265051770000000068e-02 +1.322925770000000015e-02 +1.384368149999999978e-02 +1.430952240000000000e-02 +1.436544390000000018e-02 +1.406024929999999916e-02 +1.363739469999999954e-02 +1.305490179999999924e-02 +1.238472340000000040e-02 +1.175925979999999961e-02 +1.130175429999999946e-02 +1.100068960000000033e-02 +1.074643110000000033e-02 +1.054517089999999942e-02 +1.029149090000000023e-02 +9.976557299999999281e-03 +9.605174299999999846e-03 +9.115323899999999702e-03 +8.585381300000000104e-03 +8.198857599999999704e-03 +7.949994000000000158e-03 +7.548922700000000249e-03 +6.847012100000000011e-03 +6.102628700000000371e-03 +5.449051800000000167e-03 +4.698698000000000284e-03 +3.972352000000000175e-03 +3.557164199999999880e-03 +3.356714800000000064e-03 +3.198796399999999981e-03 +2.914091100000000198e-03 +2.429345700000000094e-03 +2.054592300000000153e-03 +1.864913099999999978e-03 +1.713370400000000003e-03 +1.657271400000000011e-03 +1.703296399999999896e-03 +1.771381399999999960e-03 +1.796431600000000014e-03 +1.586425800000000087e-03 +9.277766999999999698e-04 +9.448359999999999777e-05 +-4.347724999999999984e-04 +-6.853760000000000191e-04 +-7.642710999999999949e-04 +-6.618124000000000402e-04 +-4.109340999999999862e-04 +-3.008999999999999905e-06 +5.176945000000000288e-04 +1.030987300000000021e-03 +1.352645300000000078e-03 +1.342869700000000029e-03 +1.087298599999999985e-03 +8.999357999999999837e-04 +8.430252999999999532e-04 +8.216795000000000262e-04 +8.599197000000000264e-04 +8.460927999999999505e-04 +8.173424000000000097e-04 +9.262377999999999497e-04 +1.101584600000000058e-03 +1.287383700000000039e-03 +1.391840999999999998e-03 +1.207018200000000091e-03 +6.826052999999999678e-04 +4.529819999999999940e-05 +-4.473268000000000079e-04 +-7.798377999999999690e-04 +-9.720242000000000031e-04 +-1.113870099999999912e-03 +-1.347290899999999993e-03 +-1.697709500000000107e-03 +-2.107255000000000152e-03 +-2.506378999999999985e-03 +-2.866463799999999923e-03 +-3.280209499999999813e-03 +-3.823054399999999912e-03 +-4.506883500000000327e-03 +-5.385399199999999983e-03 +-6.281899100000000111e-03 +-7.021976400000000222e-03 +-7.451418900000000324e-03 +-7.474794400000000019e-03 +-7.397685499999999935e-03 +-7.494797400000000227e-03 +-7.622448199999999618e-03 +-7.664750100000000156e-03 +-7.705759999999999867e-03 +-7.727381699999999985e-03 +-7.749478100000000216e-03 +-7.898687399999999859e-03 +-8.195946500000000565e-03 +-8.529410200000000358e-03 +-8.844807399999999806e-03 +-9.083737499999999451e-03 +-9.217630600000000299e-03 +-9.328378099999999618e-03 +-9.532293000000000710e-03 +-9.844837900000000253e-03 +-1.022301200000000007e-02 +-1.066910599999999938e-02 +-1.114999619999999976e-02 +-1.157939560000000034e-02 +-1.189310759999999932e-02 +-1.208268900000000062e-02 +-1.201464829999999984e-02 +-1.173990530000000067e-02 +-1.146843300000000010e-02 +-1.116337750000000011e-02 +-1.080056599999999929e-02 +-1.043617420000000039e-02 +-1.012168589999999993e-02 +-9.970160500000000217e-03 +-9.896101399999999298e-03 +-9.808968600000000579e-03 +-9.818154600000000148e-03 +-9.905892899999999349e-03 +-1.003734140000000011e-02 +-1.025310790000000076e-02 +-1.050963669999999996e-02 +-1.078675569999999924e-02 +-1.114147709999999993e-02 +-1.160704689999999921e-02 +-1.210964930000000064e-02 +-1.252693950000000056e-02 +-1.273192589999999971e-02 +-1.272623670000000082e-02 +-1.267921060000000086e-02 +-1.262390220000000028e-02 +-1.250471910000000055e-02 +-1.242285559999999935e-02 +-1.249580100000000082e-02 +-1.262302549999999926e-02 +-1.266839510000000030e-02 +-1.262688560000000022e-02 +-1.246528879999999999e-02 +-1.215097820000000071e-02 +-1.176425229999999988e-02 +-1.143086630000000013e-02 +-1.121970559999999929e-02 +-1.107306079999999943e-02 +-1.094188590000000003e-02 +-1.085683450000000071e-02 +-1.083578049999999945e-02 +-1.079620560000000076e-02 +-1.062660370000000076e-02 +-1.032192850000000078e-02 +-9.985374099999999586e-03 +-9.692155200000000109e-03 +-9.440364799999999973e-03 +-9.197300599999999604e-03 +-8.924262100000000114e-03 +-8.648145799999999717e-03 +-8.494131900000000124e-03 +-8.495781699999999798e-03 +-8.361659299999999254e-03 +-7.863860699999999232e-03 +-7.212161299999999588e-03 +-6.656253600000000201e-03 +-6.098819200000000183e-03 +-5.449379699999999660e-03 +-4.877872600000000315e-03 +-4.468348199999999659e-03 +-4.239751800000000209e-03 +-4.300689199999999969e-03 +-4.504623600000000339e-03 +-4.629356200000000338e-03 +-4.680320099999999567e-03 +-4.619825499999999883e-03 +-4.504579199999999943e-03 +-4.378803399999999825e-03 +-4.174121200000000323e-03 +-3.914123900000000128e-03 +-3.502285999999999854e-03 +-2.825187500000000008e-03 +-2.084174299999999938e-03 +-1.596223699999999935e-03 +-1.453989200000000001e-03 +-1.520452499999999998e-03 +-1.735142299999999950e-03 +-2.063752900000000168e-03 +-2.303077000000000162e-03 +-2.367954099999999840e-03 +-2.223465300000000092e-03 +-1.827042199999999927e-03 +-1.369302900000000066e-03 +-1.049483599999999914e-03 +-8.802560000000000506e-04 +-8.535653000000000250e-04 +-9.918188000000000525e-04 +-1.240217899999999929e-03 +-1.534098600000000003e-03 +-1.780164899999999968e-03 +-1.775162399999999970e-03 +-1.512936099999999916e-03 +-1.054381100000000102e-03 +-3.051131999999999911e-04 +5.457927999999999695e-04 +1.209891399999999968e-03 +1.627004600000000025e-03 +1.673645099999999898e-03 +1.467776899999999937e-03 +1.346515499999999905e-03 +1.236580400000000064e-03 +1.159764699999999999e-03 +1.250444500000000032e-03 +1.535111200000000096e-03 +2.019574699999999914e-03 +2.456636099999999923e-03 +2.742379300000000186e-03 +2.962486299999999954e-03 +3.168568899999999952e-03 +3.421498600000000018e-03 +3.741261499999999803e-03 +4.126043599999999582e-03 +4.595547699999999978e-03 +5.183119800000000194e-03 +5.929223200000000027e-03 +6.846617699999999959e-03 +8.035948600000000427e-03 +9.386171199999999645e-03 +1.051984629999999990e-02 +1.146156870000000078e-02 +1.223286909999999998e-02 +1.274874879999999926e-02 +1.294037259999999967e-02 +1.286728160000000058e-02 +1.286060200000000049e-02 +1.286095680000000005e-02 +1.274518550000000063e-02 +1.258315150000000049e-02 +1.241109879999999915e-02 +1.231197780000000026e-02 +1.226130370000000011e-02 +1.214546390000000031e-02 +1.189795800000000014e-02 +1.151892709999999959e-02 +1.108771199999999957e-02 +1.083806959999999986e-02 +1.097285410000000024e-02 +1.129684840000000010e-02 +1.146495730000000011e-02 +1.136673650000000028e-02 +1.113129279999999950e-02 +1.088883629999999950e-02 +1.070151930000000015e-02 +1.051882309999999966e-02 +1.026365060000000023e-02 +1.001464189999999935e-02 +9.801736700000000801e-03 +9.635772500000000518e-03 +9.640305400000000191e-03 +9.867011700000000857e-03 +1.018916199999999987e-02 +1.040180020000000018e-02 +1.046581930000000001e-02 +1.041559409999999984e-02 +1.029141700000000062e-02 +1.024569879999999954e-02 +1.029203669999999987e-02 +1.033895689999999971e-02 +1.038320510000000085e-02 +1.039418689999999958e-02 +1.040476329999999970e-02 +1.050151359999999985e-02 +1.062834000000000001e-02 +1.060185680000000005e-02 +1.024294660000000037e-02 +9.692970999999999879e-03 +9.293391499999999542e-03 +9.033911400000000508e-03 +8.891939300000000282e-03 +8.917065599999999398e-03 +8.952256800000000722e-03 +8.980734799999999171e-03 +9.129359599999999422e-03 +9.302217300000000313e-03 +9.289742300000000674e-03 +9.183669400000000343e-03 +9.098802899999999458e-03 +9.011408000000000265e-03 +9.018990799999999572e-03 +9.125553099999999390e-03 +9.224850499999999454e-03 +9.313536000000000731e-03 +9.376677499999999665e-03 +9.328909700000000485e-03 +9.113319899999999807e-03 +8.876903099999999824e-03 +8.664302000000000462e-03 +8.365834799999999349e-03 +8.022099499999999286e-03 +7.656781799999999930e-03 +7.192091599999999620e-03 +6.663643700000000149e-03 +6.171582699999999914e-03 +5.660845500000000023e-03 +5.099393399999999944e-03 +4.602207999999999993e-03 +4.259558400000000231e-03 +4.064927999999999771e-03 +4.074760000000000187e-03 +4.279203700000000325e-03 +4.507438899999999769e-03 +4.638289799999999706e-03 +4.674460299999999742e-03 +4.688831099999999676e-03 +4.666395999999999739e-03 +4.578495800000000407e-03 +4.486212600000000043e-03 +4.367763799999999606e-03 +4.154773399999999763e-03 +3.909696300000000367e-03 +3.649263299999999915e-03 +3.286387699999999794e-03 +2.842242000000000032e-03 +2.406015400000000200e-03 +2.015790600000000148e-03 +1.664026400000000010e-03 +1.369198100000000107e-03 +1.161663899999999935e-03 +1.073196700000000024e-03 +1.104591899999999910e-03 +1.245001699999999942e-03 +1.526834099999999951e-03 +1.797043099999999938e-03 +1.886063500000000059e-03 +1.865482699999999926e-03 +1.737920700000000025e-03 +1.510838200000000093e-03 +1.352005000000000090e-03 +1.459058700000000078e-03 +1.905115300000000079e-03 +2.371541200000000082e-03 +2.619462700000000158e-03 +2.709687200000000188e-03 +2.447325599999999966e-03 +1.721279399999999958e-03 +9.344819000000000086e-04 +2.319500000000000001e-04 +-5.056461000000000375e-04 +-1.258513200000000018e-03 +-1.956241699999999861e-03 +-2.359126100000000052e-03 +-2.438428199999999931e-03 +-2.514494199999999999e-03 +-2.644829400000000153e-03 +-2.682514200000000060e-03 +-2.689786000000000000e-03 +-2.735327100000000105e-03 +-2.765893299999999840e-03 +-2.679653100000000190e-03 +-2.493348199999999900e-03 +-2.274962000000000165e-03 +-2.098422099999999995e-03 +-2.004985600000000132e-03 +-1.919568699999999991e-03 +-1.810811100000000095e-03 +-1.695000299999999994e-03 +-1.563198600000000006e-03 +-1.401037799999999998e-03 +-1.218732500000000102e-03 +-1.102340299999999933e-03 +-1.242843100000000020e-03 +-1.618548999999999943e-03 +-1.934581400000000024e-03 +-2.174328300000000214e-03 +-2.402341799999999951e-03 +-2.509299400000000128e-03 +-2.494810200000000151e-03 +-2.378609399999999981e-03 +-2.085186499999999894e-03 +-1.621521500000000070e-03 +-1.112818299999999896e-03 +-5.780167000000000117e-04 +-2.555869999999999976e-05 +4.952285999999999971e-04 +9.875846999999999230e-04 +1.401510699999999931e-03 +1.645229300000000108e-03 +1.707388900000000095e-03 +1.678260399999999914e-03 +1.630076999999999958e-03 +1.561077400000000044e-03 +1.424669300000000038e-03 +1.159206700000000104e-03 +8.842897000000000387e-04 +7.161484000000000296e-04 +5.885127999999999670e-04 +5.112924000000000245e-04 +5.378575999999999713e-04 +6.076980000000000489e-04 +6.183677000000000054e-04 +5.944264999999999575e-04 +7.643952999999999555e-04 +1.154399099999999997e-03 +1.560491200000000073e-03 +1.956236399999999789e-03 +2.369802700000000085e-03 +2.747213399999999788e-03 +2.969149500000000091e-03 +3.055157000000000185e-03 +3.099366200000000168e-03 +3.151291499999999812e-03 +3.290363200000000210e-03 +3.504469100000000108e-03 +3.802919200000000159e-03 +4.131025400000000111e-03 +4.339375200000000418e-03 +4.329443399999999796e-03 +4.167261099999999829e-03 +3.942418300000000153e-03 +3.621874000000000187e-03 +3.261541699999999985e-03 +2.909463699999999958e-03 +2.613340899999999894e-03 +2.431608300000000136e-03 +2.369820999999999820e-03 +2.353508299999999918e-03 +2.354925300000000003e-03 +2.337589599999999931e-03 +2.223099999999999989e-03 +2.070566299999999915e-03 +1.978115999999999815e-03 +2.010642100000000019e-03 +2.138816100000000015e-03 +2.258122500000000164e-03 +2.216348199999999997e-03 +2.024233199999999917e-03 +1.798688299999999995e-03 +1.570387099999999946e-03 +1.325132400000000052e-03 +9.629931999999999468e-04 +4.492054000000000207e-04 +-1.822418999999999873e-04 +-9.001764999999999897e-04 +-1.649454799999999907e-03 +-2.222350599999999878e-03 +-2.411827100000000102e-03 +-2.191372899999999898e-03 +-1.756806999999999987e-03 +-1.450495200000000064e-03 +-1.389627100000000084e-03 +-1.403236900000000070e-03 +-1.431236900000000100e-03 +-1.578672199999999999e-03 +-1.817533500000000036e-03 +-2.001595300000000213e-03 +-2.118456800000000171e-03 +-2.311156700000000213e-03 +-2.576643300000000091e-03 +-2.875760800000000048e-03 +-3.239150200000000170e-03 +-3.691354999999999897e-03 +-4.222696399999999878e-03 +-4.759483000000000116e-03 +-5.174131200000000284e-03 +-5.397931299999999578e-03 +-5.444746399999999577e-03 +-5.348043499999999978e-03 +-5.257209700000000339e-03 +-5.201433000000000098e-03 +-5.084740600000000124e-03 +-4.930076099999999850e-03 +-4.821802899999999906e-03 +-4.832296399999999950e-03 +-4.963253600000000140e-03 +-5.120328999999999853e-03 +-5.229383599999999979e-03 +-5.312213599999999862e-03 +-5.386390999999999922e-03 +-5.414569200000000221e-03 +-5.388323999999999891e-03 +-5.391670399999999586e-03 +-5.499380100000000361e-03 +-5.626711799999999791e-03 +-5.683653299999999985e-03 +-5.655197800000000101e-03 +-5.572321100000000339e-03 +-5.497452100000000362e-03 +-5.455457599999999699e-03 +-5.476355199999999659e-03 +-5.546335200000000396e-03 +-5.622372199999999681e-03 +-5.683117900000000423e-03 +-5.784702699999999878e-03 +-5.951886299999999651e-03 +-6.166847700000000279e-03 +-6.450531800000000072e-03 +-6.764653500000000416e-03 +-7.080027499999999759e-03 +-7.404219099999999679e-03 +-7.762967299999999626e-03 +-8.173703900000000785e-03 +-8.537107099999999976e-03 +-8.783022700000000377e-03 +-8.887519400000000111e-03 +-8.862859100000000309e-03 +-8.822113300000000019e-03 +-8.813520000000000035e-03 +-8.781579899999999300e-03 +-8.718211599999999353e-03 +-8.673166799999999788e-03 +-8.610503099999999854e-03 +-8.513282500000000225e-03 +-8.471345599999999254e-03 +-8.480200300000000774e-03 +-8.500029900000000832e-03 +-8.609183100000000755e-03 +-8.796523699999999474e-03 +-8.973925799999999189e-03 +-9.145594599999999283e-03 +-9.262782799999999192e-03 +-9.252681199999999648e-03 +-9.079128299999999346e-03 +-8.783792699999999273e-03 +-8.448644499999999682e-03 +-8.163461099999999929e-03 +-8.023779199999999182e-03 +-7.930363200000000237e-03 +-7.798092399999999660e-03 +-7.696823000000000206e-03 +-7.616696800000000329e-03 +-7.599221500000000358e-03 +-7.744161700000000079e-03 +-7.987790800000000094e-03 +-8.242962100000000847e-03 +-8.477564700000000605e-03 +-8.687922500000000436e-03 +-8.884683100000000458e-03 +-9.109020100000000258e-03 +-9.362681700000000107e-03 +-9.586629699999999962e-03 +-9.786697999999999925e-03 +-9.975891500000000356e-03 +-1.015119069999999984e-02 +-1.031320950000000000e-02 +-1.038432970000000011e-02 +-1.027565729999999934e-02 +-1.001441150000000058e-02 +-9.655751699999999549e-03 +-9.232287599999999816e-03 +-8.798967600000000625e-03 +-8.353548400000000707e-03 +-7.917901600000000831e-03 +-7.549620699999999747e-03 +-7.227758800000000199e-03 +-6.936787800000000087e-03 +-6.664474200000000161e-03 +-6.385074900000000005e-03 +-6.083620100000000121e-03 +-5.707191200000000415e-03 +-5.247725899999999832e-03 +-4.895279399999999913e-03 +-4.773872600000000389e-03 +-4.694629700000000315e-03 +-4.592229199999999824e-03 +-4.577927199999999933e-03 +-4.602636900000000100e-03 +-4.610932499999999615e-03 +-4.555766099999999756e-03 +-4.374845100000000070e-03 +-4.147177000000000155e-03 +-4.012577500000000415e-03 +-4.002581300000000383e-03 +-4.098883900000000087e-03 +-4.279780900000000263e-03 +-4.486511200000000386e-03 +-4.731248099999999998e-03 +-4.998261700000000175e-03 +-5.178954199999999571e-03 +-5.262299100000000264e-03 +-5.286208100000000173e-03 +-5.239965699999999879e-03 +-5.152219300000000085e-03 +-5.056640000000000267e-03 +-4.960175399999999964e-03 +-4.851700799999999862e-03 +-4.655651299999999902e-03 +-4.344684899999999572e-03 +-4.011291400000000298e-03 +-3.717646099999999832e-03 +-3.416916500000000047e-03 +-3.110007399999999839e-03 +-2.879158599999999922e-03 +-2.785971200000000002e-03 +-2.899979600000000216e-03 +-3.215658299999999813e-03 +-3.491411499999999991e-03 +-3.663227299999999905e-03 +-3.822433100000000115e-03 +-3.892945999999999993e-03 +-3.830142999999999829e-03 +-3.641791200000000193e-03 +-3.309635999999999915e-03 +-2.820294599999999870e-03 +-2.307646799999999842e-03 +-1.909355900000000040e-03 +-1.625316799999999970e-03 +-1.434617700000000032e-03 +-1.314192399999999971e-03 +-1.166800499999999909e-03 +-9.717410999999999584e-04 +-7.878804999999999793e-04 +-5.859030000000000314e-04 +-3.582481000000000099e-04 +-2.052351999999999963e-04 +-2.507666000000000192e-04 +-5.267766999999999806e-04 +-1.056309500000000021e-03 +-1.658003199999999976e-03 +-2.024738299999999987e-03 +-2.265870599999999895e-03 +-2.494871999999999975e-03 +-2.589077799999999797e-03 +-2.606802599999999848e-03 +-2.601956999999999794e-03 +-2.472478800000000015e-03 +-2.269506900000000001e-03 +-2.097308799999999824e-03 +-1.974766599999999966e-03 +-1.988732999999999907e-03 +-2.165865500000000061e-03 +-2.328409699999999839e-03 +-2.417390599999999935e-03 +-2.508266199999999949e-03 +-2.607214899999999932e-03 +-2.717753199999999904e-03 +-2.825003899999999849e-03 +-2.970406000000000088e-03 +-3.200495900000000123e-03 +-3.433497099999999799e-03 +-3.593254399999999855e-03 +-3.737135700000000175e-03 +-3.867081499999999814e-03 +-3.909319700000000314e-03 +-3.876713899999999820e-03 +-3.766088800000000174e-03 +-3.541557299999999967e-03 +-3.224105000000000113e-03 +-2.827344700000000103e-03 +-2.349883599999999864e-03 +-1.816418200000000050e-03 +-1.278631599999999896e-03 +-8.124305000000000068e-04 +-4.845178000000000115e-04 +-2.133017999999999980e-04 +4.665250000000000099e-05 +2.291880999999999953e-04 +3.495497000000000187e-04 +4.062997000000000158e-04 +3.785196999999999802e-04 +2.525110000000000223e-04 +-6.270199999999999700e-06 +-3.223527000000000011e-04 +-5.958111000000000526e-04 +-8.378828999999999531e-04 +-1.043160700000000029e-03 +-1.149218399999999947e-03 +-1.070971800000000045e-03 +-7.459747999999999987e-04 +-2.429557999999999956e-04 +2.776993999999999860e-04 +7.851534999999999764e-04 +1.359198399999999966e-03 +1.970783700000000062e-03 +2.499080099999999912e-03 +2.912529400000000209e-03 +3.254404900000000111e-03 +3.549730599999999844e-03 +3.801885200000000142e-03 +4.055816799999999687e-03 +4.408610099999999907e-03 +4.861809400000000059e-03 +5.361313999999999837e-03 +5.837348800000000289e-03 +6.116364099999999603e-03 +6.109719700000000239e-03 +6.017568299999999717e-03 +5.980155800000000292e-03 +5.981499999999999838e-03 +6.056238599999999583e-03 +6.174945099999999860e-03 +6.236558100000000153e-03 +6.175197099999999925e-03 +6.109732300000000199e-03 +6.136881099999999881e-03 +6.267918499999999664e-03 +6.527688200000000308e-03 +6.832484800000000053e-03 +7.108819399999999865e-03 +7.322702599999999715e-03 +7.471080399999999871e-03 +7.578289900000000079e-03 +7.587014900000000305e-03 +7.484538100000000249e-03 +7.384956600000000017e-03 +7.357340999999999881e-03 +7.337007399999999693e-03 +7.364353199999999766e-03 +7.547507900000000047e-03 +7.747821799999999627e-03 +7.898442599999999647e-03 +8.062639099999999517e-03 +8.210565399999999667e-03 +8.318037400000000484e-03 +8.295881899999999615e-03 +8.094635500000000802e-03 +7.872146700000000677e-03 +7.648649700000000225e-03 +7.306352300000000001e-03 +6.930665199999999984e-03 +6.619142599999999939e-03 +6.368708300000000370e-03 +6.145468799999999690e-03 +5.907416100000000003e-03 +5.660921799999999587e-03 +5.472797899999999605e-03 +5.354515399999999932e-03 +5.230202800000000041e-03 +5.095766600000000042e-03 +4.990781900000000430e-03 +4.926698999999999662e-03 +4.890562400000000344e-03 +4.866602599999999591e-03 +4.859963000000000130e-03 +4.868548399999999589e-03 +4.893058700000000281e-03 +4.921596599999999641e-03 +4.938106200000000334e-03 +4.936997099999999861e-03 +4.910879100000000407e-03 +4.854790999999999794e-03 +4.739583900000000211e-03 +4.552694099999999959e-03 +4.312639299999999724e-03 +4.048116899999999914e-03 +3.802219199999999980e-03 +3.579434099999999862e-03 +3.366665799999999861e-03 +3.187307900000000208e-03 +3.046397800000000006e-03 +2.902492000000000006e-03 +2.759354600000000091e-03 +2.669359000000000055e-03 +2.655930099999999957e-03 +2.679443799999999942e-03 +2.707235000000000110e-03 +2.720013099999999892e-03 +2.696777599999999799e-03 +2.648063999999999887e-03 +2.565858900000000161e-03 +2.421735400000000083e-03 +2.230353799999999862e-03 +2.109549899999999933e-03 +2.060312300000000010e-03 +2.002113099999999844e-03 +1.974606199999999912e-03 +1.982946800000000027e-03 +1.991598499999999976e-03 +2.003208900000000119e-03 +2.010176700000000042e-03 +1.999941199999999940e-03 +1.986091499999999895e-03 +1.979302000000000058e-03 +1.963278399999999861e-03 +2.041738999999999880e-03 +2.259793099999999992e-03 +2.547032700000000094e-03 +2.910310799999999993e-03 +3.187371200000000109e-03 +3.279108700000000001e-03 +3.252048899999999878e-03 +3.129652000000000128e-03 +2.933950800000000112e-03 +2.720108299999999830e-03 +2.514191499999999992e-03 +2.275510000000000119e-03 +2.019563199999999895e-03 +1.755058299999999981e-03 +1.505595399999999900e-03 +1.299471400000000096e-03 +1.086916799999999893e-03 +8.639913999999999624e-04 +6.704244000000000045e-04 +5.428841000000000222e-04 +4.820030999999999795e-04 +4.259819000000000084e-04 +3.886997000000000217e-04 +4.062653999999999745e-04 +4.364764999999999943e-04 +4.752218999999999909e-04 +5.470641000000000262e-04 +6.323238000000000122e-04 +7.097552000000000244e-04 +7.707929000000000516e-04 +7.965131000000000294e-04 +7.745733999999999996e-04 +7.363399000000000073e-04 +7.036835000000000399e-04 +6.525463000000000444e-04 +5.686635000000000214e-04 +4.208247999999999828e-04 +2.494773999999999842e-04 +1.275222999999999971e-04 +3.310009999999999840e-05 +-4.088429999999999750e-05 +-1.245952999999999893e-04 +-2.495247000000000133e-04 +-3.656196000000000120e-04 +-4.511035999999999952e-04 +-5.448645000000000007e-04 +-6.852517999999999500e-04 +-9.234761000000000402e-04 +-1.237142899999999976e-03 +-1.540436000000000062e-03 +-1.770398399999999987e-03 +-1.881867900000000048e-03 +-1.874749800000000046e-03 +-1.850825699999999975e-03 +-1.951187100000000094e-03 +-2.119659800000000139e-03 +-2.243171700000000206e-03 +-2.326762699999999819e-03 +-2.374530100000000164e-03 +-2.378281600000000089e-03 +-2.360883199999999887e-03 +-2.360497699999999834e-03 +-2.351598299999999985e-03 +-2.309527899999999894e-03 +-2.218596000000000196e-03 +-2.043541700000000086e-03 +-1.825780400000000074e-03 +-1.649385900000000047e-03 +-1.596168399999999942e-03 +-1.647771500000000085e-03 +-1.751276900000000051e-03 +-1.912673300000000036e-03 +-2.088178300000000098e-03 +-2.231287499999999938e-03 +-2.300183899999999788e-03 +-2.292890799999999958e-03 +-2.269234299999999850e-03 +-2.262406199999999860e-03 +-2.306096899999999974e-03 +-2.465434900000000162e-03 +-2.713212699999999807e-03 +-2.902804100000000182e-03 +-2.970519500000000195e-03 +-2.916164800000000008e-03 +-2.677532600000000033e-03 +-2.306171699999999894e-03 +-2.023842599999999860e-03 +-1.802274599999999964e-03 +-1.505993200000000027e-03 +-1.254970499999999954e-03 +-1.070824499999999905e-03 +-8.832211999999999659e-04 +-7.540367000000000510e-04 +-6.891459000000000387e-04 +-6.336309000000000255e-04 +-5.994442000000000433e-04 +-6.152256000000000478e-04 +-6.907283000000000390e-04 +-8.632899999999999558e-04 +-1.156385000000000008e-03 +-1.482391300000000106e-03 +-1.751151399999999973e-03 +-1.972963800000000160e-03 +-2.114127099999999967e-03 +-2.091677799999999959e-03 +-2.024231599999999805e-03 +-2.028517399999999783e-03 +-2.053116600000000000e-03 +-2.075840499999999974e-03 +-2.098825400000000046e-03 +-2.107114099999999809e-03 +-2.094817899999999993e-03 +-2.056053999999999868e-03 +-1.949996399999999984e-03 +-1.787956800000000106e-03 +-1.628766700000000046e-03 +-1.423348500000000015e-03 +-1.141077799999999946e-03 +-9.642974999999999811e-04 +-9.336105000000000358e-04 +-9.537093999999999867e-04 +-1.096400700000000001e-03 +-1.283561899999999993e-03 +-1.375015000000000048e-03 +-1.403766299999999970e-03 +-1.397345500000000094e-03 +-1.361743099999999929e-03 +-1.311890999999999925e-03 +-1.285032300000000073e-03 +-1.320170700000000089e-03 +-1.405214699999999921e-03 +-1.520215099999999925e-03 +-1.655354499999999894e-03 +-1.763091999999999958e-03 +-1.799406900000000012e-03 +-1.743735400000000083e-03 +-1.630615499999999926e-03 +-1.545517200000000009e-03 +-1.538011500000000106e-03 +-1.608323199999999896e-03 +-1.726383800000000010e-03 +-1.865619300000000104e-03 +-2.049883000000000174e-03 +-2.274969200000000018e-03 +-2.482255200000000120e-03 +-2.680228000000000211e-03 +-2.869624199999999941e-03 +-3.026975900000000198e-03 +-3.164595699999999887e-03 +-3.254806299999999947e-03 +-3.328331800000000184e-03 +-3.461335299999999948e-03 +-3.632886000000000101e-03 +-3.797737199999999883e-03 +-3.934952099999999842e-03 +-4.050994799999999875e-03 +-4.152188900000000106e-03 +-4.235238100000000144e-03 +-4.293177599999999788e-03 +-4.239605100000000057e-03 +-4.093308900000000236e-03 +-3.962967900000000272e-03 +-3.853864499999999985e-03 +-3.795554400000000165e-03 +-3.782715299999999965e-03 +-3.770780000000000052e-03 +-3.765701399999999907e-03 +-3.783713599999999951e-03 +-3.828875600000000018e-03 +-3.879005799999999879e-03 +-3.930796700000000095e-03 +-3.990898500000000272e-03 +-4.049317099999999794e-03 +-4.101131200000000115e-03 +-4.187035700000000214e-03 +-4.322877699999999948e-03 +-4.491720900000000134e-03 +-4.706279899999999718e-03 +-4.954741200000000421e-03 +-5.208991900000000362e-03 +-5.450815200000000416e-03 +-5.624810600000000257e-03 +-5.698281799999999758e-03 +-5.742697500000000337e-03 +-5.834085400000000275e-03 +-5.965793799999999890e-03 +-6.104366800000000232e-03 +-6.256172200000000017e-03 +-6.434096700000000064e-03 +-6.636964000000000405e-03 +-6.908475199999999927e-03 +-7.245595799999999913e-03 +-7.574392899999999977e-03 +-7.850653000000000839e-03 +-8.012431800000000687e-03 +-8.021999499999999880e-03 +-7.986730100000000512e-03 +-8.070130400000000148e-03 +-8.313667599999999616e-03 +-8.621173799999999610e-03 +-8.907530999999999782e-03 +-9.081425900000000481e-03 +-9.063726799999999653e-03 +-8.821817500000000631e-03 +-8.475281700000000112e-03 +-8.237335700000000815e-03 +-7.996970200000000015e-03 +-7.635203299999999797e-03 +-7.264298100000000230e-03 +-6.922642700000000357e-03 +-6.583474599999999954e-03 +-6.253648500000000277e-03 +-5.983827399999999859e-03 +-5.807243000000000127e-03 +-5.707381299999999755e-03 +-5.679316099999999826e-03 +-5.712138500000000021e-03 +-5.747370199999999978e-03 +-5.782861499999999988e-03 +-5.843863300000000024e-03 +-5.878272099999999958e-03 +-5.878668299999999756e-03 +-5.875209900000000034e-03 +-5.894084499999999692e-03 +-5.939261199999999567e-03 +-5.940020499999999586e-03 +-5.887798100000000111e-03 +-5.774629899999999746e-03 +-5.599049600000000244e-03 +-5.431950900000000367e-03 +-5.279996900000000215e-03 +-5.118964999999999627e-03 +-4.950474699999999652e-03 +-4.775147000000000419e-03 +-4.568154599999999822e-03 +-4.332235299999999921e-03 +-4.116052599999999589e-03 +-3.949011199999999736e-03 +-3.831586000000000106e-03 +-3.692848800000000150e-03 +-3.498924699999999850e-03 +-3.314908000000000091e-03 +-3.130798100000000209e-03 +-2.915504699999999991e-03 +-2.687989400000000140e-03 +-2.455375899999999965e-03 +-2.229463899999999978e-03 +-2.062552400000000185e-03 +-1.935401499999999959e-03 +-1.789950800000000061e-03 +-1.636792399999999897e-03 +-1.484673499999999893e-03 +-1.317790799999999946e-03 +-1.122667900000000026e-03 +-9.443610000000000069e-04 +-8.058472000000000118e-04 +-6.280707000000000173e-04 +-3.957066999999999768e-04 +-1.555909000000000014e-04 +6.490750000000000154e-05 +2.394301999999999900e-04 +3.718665999999999812e-04 +4.771155000000000231e-04 +5.660123999999999884e-04 +6.501414999999999755e-04 +7.152338999999999962e-04 +6.912738000000000086e-04 +5.109220999999999511e-04 +2.523574000000000108e-04 +-6.137999999999999508e-07 +-2.389372000000000067e-04 +-3.973329999999999852e-04 +-4.593234000000000075e-04 +-4.388506999999999825e-04 +-3.575160999999999769e-04 +-2.653368000000000241e-04 +-1.557335000000000024e-04 +-8.314399999999999542e-06 +1.406369000000000087e-04 +2.431006999999999949e-04 +3.402206999999999866e-04 +4.621816000000000270e-04 +5.702371999999999823e-04 +6.613559999999999882e-04 +7.767909999999999832e-04 +9.169623000000000010e-04 +9.854147000000000167e-04 +9.304174000000000342e-04 +7.915822999999999783e-04 +6.218426999999999679e-04 +4.790374000000000021e-04 +4.074303999999999946e-04 +4.179326000000000243e-04 +5.394246000000000327e-04 +7.403530000000000180e-04 +1.008367800000000087e-03 +1.353757500000000091e-03 +1.704381100000000072e-03 +1.998415400000000050e-03 +2.170044199999999947e-03 +2.290526699999999999e-03 +2.430122399999999974e-03 +2.515509200000000042e-03 +2.545680499999999988e-03 +2.569650399999999849e-03 +2.587371299999999871e-03 +2.627017100000000188e-03 +2.726747600000000056e-03 +2.845513100000000069e-03 +2.903119200000000080e-03 +2.880947300000000124e-03 +2.787508900000000046e-03 +2.572411799999999981e-03 +2.214127900000000069e-03 +1.808302300000000015e-03 +1.513313199999999923e-03 +1.378572399999999920e-03 +1.331072999999999892e-03 +1.357494899999999978e-03 +1.421921999999999943e-03 +1.427490599999999997e-03 +1.416596200000000069e-03 +1.434065599999999980e-03 +1.437787399999999969e-03 +1.431301500000000011e-03 +1.410638299999999968e-03 +1.354775400000000039e-03 +1.309082399999999960e-03 +1.338936999999999896e-03 +1.458527399999999963e-03 +1.633350800000000049e-03 +1.816050499999999996e-03 +1.962458800000000097e-03 +2.069274700000000092e-03 +2.160413700000000155e-03 +2.220588800000000175e-03 +2.250255000000000050e-03 +2.274752300000000213e-03 +2.303256699999999858e-03 +2.335644999999999909e-03 +2.361853399999999832e-03 +2.385468899999999837e-03 +2.412066100000000071e-03 +2.446297699999999860e-03 +2.517394400000000192e-03 +2.611221500000000112e-03 +2.689385700000000105e-03 +2.737868599999999843e-03 +2.754441700000000073e-03 +2.747205799999999799e-03 +2.705652199999999865e-03 +2.626171599999999832e-03 +2.521670499999999898e-03 +2.388436399999999994e-03 +2.224460000000000152e-03 +2.012484599999999919e-03 +1.740924000000000030e-03 +1.485053500000000021e-03 +1.247687799999999984e-03 +9.586179000000000228e-04 +6.938689999999999528e-04 +4.863731999999999734e-04 +2.846163999999999877e-04 +1.161490999999999956e-04 +5.417800000000000034e-06 +-7.636289999999999354e-05 +-1.225991999999999967e-04 +-8.348300000000000013e-05 +-5.064000000000000347e-07 +4.864719999999999732e-05 +1.023180000000000053e-04 +2.214352000000000106e-04 +3.786721999999999961e-04 +5.307735999999999964e-04 +6.830716000000000348e-04 +8.580077999999999880e-04 +1.048904100000000060e-03 +1.223688400000000039e-03 +1.308493200000000051e-03 +1.319808100000000040e-03 +1.330209499999999902e-03 +1.308827100000000071e-03 +1.259826500000000085e-03 +1.230458100000000063e-03 +1.189114999999999920e-03 +1.108269999999999958e-03 +9.991023000000000785e-04 +8.534909999999999502e-04 +6.892734999999999661e-04 +5.935728999999999832e-04 +6.074825999999999967e-04 +6.989677000000000130e-04 +8.487208999999999465e-04 +1.027905699999999986e-03 +1.230466300000000041e-03 +1.468025399999999892e-03 +1.763313500000000030e-03 +2.062582299999999973e-03 +2.255392699999999966e-03 +2.320691599999999931e-03 +2.226211599999999846e-03 +2.051631200000000009e-03 +1.922302600000000070e-03 +1.807846299999999991e-03 +1.643151899999999903e-03 +1.487883900000000047e-03 +1.388236599999999928e-03 +1.260818699999999943e-03 +1.149650099999999925e-03 +1.116848799999999985e-03 +1.102683099999999953e-03 +1.062260900000000074e-03 +1.019193199999999903e-03 +9.952186999999999926e-04 +9.747440999999999701e-04 +9.528594000000000473e-04 +9.350161999999999536e-04 +9.221337000000000240e-04 +8.737775000000000142e-04 +7.004563000000000109e-04 +4.415628000000000001e-04 +2.261325999999999972e-04 +2.183380000000000092e-05 +-2.365312999999999964e-04 +-5.007180000000000398e-04 +-7.377844000000000372e-04 +-9.707287000000000424e-04 +-1.192822899999999939e-03 +-1.344520199999999941e-03 +-1.446503200000000093e-03 +-1.589767699999999982e-03 +-1.746547200000000055e-03 +-1.889476400000000096e-03 +-2.088882499999999975e-03 +-2.295713200000000075e-03 +-2.449078400000000068e-03 +-2.568671700000000040e-03 +-2.650510899999999892e-03 +-2.711743500000000136e-03 +-2.732793700000000093e-03 +-2.664325800000000213e-03 +-2.503340199999999800e-03 +-2.366316800000000092e-03 +-2.340578700000000081e-03 +-2.343507600000000086e-03 +-2.364017099999999975e-03 +-2.440230199999999898e-03 +-2.479266600000000140e-03 +-2.457576200000000013e-03 +-2.415372600000000036e-03 +-2.325632599999999991e-03 +-2.226155000000000061e-03 +-2.139523899999999819e-03 +-2.018285099999999905e-03 +-1.880069299999999940e-03 +-1.780320200000000018e-03 +-1.724413200000000012e-03 +-1.710890600000000055e-03 +-1.765035899999999958e-03 +-1.855369099999999976e-03 +-1.932136299999999982e-03 +-2.011226799999999912e-03 +-2.108860699999999967e-03 +-2.242129499999999994e-03 +-2.399646699999999876e-03 +-2.514295900000000031e-03 +-2.511292100000000072e-03 +-2.412806899999999852e-03 +-2.286862099999999783e-03 +-2.151281599999999884e-03 +-2.073273599999999814e-03 +-2.015887499999999798e-03 +-1.896537599999999994e-03 +-1.751401999999999994e-03 +-1.613861700000000093e-03 +-1.474471300000000087e-03 +-1.311902399999999910e-03 +-1.166212800000000077e-03 +-1.061820399999999914e-03 +-9.414237999999999903e-04 +-8.055078999999999928e-04 +-7.629333000000000295e-04 +-8.579351000000000251e-04 +-9.955814000000000764e-04 +-1.164655300000000003e-03 +-1.357540900000000052e-03 +-1.504144800000000066e-03 +-1.633745499999999986e-03 +-1.726091300000000012e-03 +-1.743549999999999961e-03 +-1.744136299999999966e-03 +-1.802914600000000067e-03 +-1.925385599999999931e-03 +-2.075674799999999848e-03 +-2.211395200000000182e-03 +-2.312272599999999970e-03 +-2.418394199999999994e-03 +-2.530571599999999893e-03 +-2.608259700000000163e-03 +-2.648535300000000141e-03 +-2.675816299999999801e-03 +-2.717247700000000130e-03 +-2.774264800000000083e-03 +-2.816736199999999874e-03 +-2.852873000000000128e-03 +-2.941182599999999855e-03 +-3.126377200000000130e-03 +-3.331239199999999796e-03 +-3.489930500000000199e-03 +-3.640000200000000075e-03 +-3.760627500000000064e-03 +-3.820596299999999990e-03 +-3.876881600000000195e-03 +-3.956877000000000137e-03 +-4.015945200000000000e-03 +-4.067255700000000328e-03 +-4.151958899999999737e-03 +-4.253770100000000068e-03 +-4.342598199999999665e-03 +-4.414516099999999874e-03 +-4.482527099999999640e-03 +-4.534396399999999702e-03 +-4.565395100000000338e-03 +-4.603801700000000052e-03 +-4.636377799999999959e-03 +-4.629087300000000148e-03 +-4.588746000000000318e-03 +-4.538794500000000245e-03 +-4.469466200000000132e-03 +-4.371105499999999866e-03 +-4.253154700000000114e-03 +-4.126539099999999849e-03 +-3.991286699999999944e-03 +-3.839293000000000133e-03 +-3.747318899999999790e-03 +-3.837190900000000179e-03 +-3.996872299999999940e-03 +-4.087607899999999919e-03 +-4.184635600000000122e-03 +-4.330614099999999592e-03 +-4.492260500000000260e-03 +-4.645940500000000049e-03 +-4.787889200000000102e-03 +-4.926333300000000290e-03 +-5.055608999999999971e-03 +-5.170908800000000374e-03 +-5.296829500000000031e-03 +-5.463006500000000022e-03 +-5.653904000000000395e-03 +-5.828736000000000160e-03 +-6.009427599999999682e-03 +-6.215835200000000352e-03 +-6.376472700000000021e-03 +-6.470513899999999659e-03 +-6.495483899999999686e-03 +-6.418164799999999913e-03 +-6.331349400000000141e-03 +-6.280194200000000296e-03 +-6.258050799999999650e-03 +-6.348449800000000205e-03 +-6.522976199999999843e-03 +-6.709400899999999786e-03 +-6.864911799999999856e-03 +-6.965113600000000411e-03 +-7.054210699999999799e-03 +-7.132603300000000049e-03 +-7.179000599999999822e-03 +-7.208905899999999700e-03 +-7.235985300000000002e-03 +-7.253556199999999614e-03 +-7.257828499999999759e-03 +-7.195680000000000305e-03 +-7.073261100000000426e-03 +-6.969272999999999788e-03 +-6.877937699999999571e-03 +-6.798154300000000365e-03 +-6.753941700000000090e-03 +-6.715219100000000170e-03 +-6.642198099999999800e-03 +-6.539707599999999843e-03 +-6.415487299999999768e-03 +-6.270229999999999901e-03 +-6.114371599999999726e-03 +-5.927839600000000056e-03 +-5.708621100000000129e-03 +-5.491176099999999990e-03 +-5.277771799999999951e-03 +-5.097842099999999599e-03 +-5.048960499999999643e-03 +-5.127493200000000396e-03 +-5.198500499999999733e-03 +-5.215910500000000422e-03 +-5.238135799999999939e-03 +-5.248095799999999769e-03 +-5.199718600000000079e-03 +-5.108662199999999994e-03 +-5.004260100000000426e-03 +-4.917442000000000167e-03 +-4.842852499999999658e-03 +-4.738513500000000357e-03 +-4.604835699999999636e-03 +-4.485346000000000298e-03 +-4.381249400000000391e-03 +-4.276988199999999865e-03 +-4.185832500000000178e-03 +-4.102681599999999720e-03 +-4.051256399999999744e-03 +-4.080508200000000120e-03 +-4.147992399999999788e-03 +-4.204391600000000236e-03 +-4.296764300000000328e-03 +-4.428168700000000360e-03 +-4.553125800000000153e-03 +-4.675575799999999796e-03 +-4.791248700000000360e-03 +-4.873162000000000327e-03 +-4.916457100000000413e-03 +-4.939877399999999773e-03 +-4.922301100000000054e-03 +-4.860698400000000238e-03 +-4.794520200000000100e-03 +-4.723650700000000049e-03 +-4.704389199999999861e-03 +-4.775876899999999953e-03 +-4.875349299999999844e-03 +-4.987152600000000109e-03 +-5.097043300000000422e-03 +-5.173406299999999854e-03 +-5.225317800000000429e-03 +-5.269241299999999698e-03 +-5.308828899999999684e-03 +-5.320419800000000116e-03 +-5.301832599999999583e-03 +-5.301034900000000348e-03 +-5.327491200000000239e-03 +-5.336046300000000207e-03 +-5.316128100000000294e-03 +-5.251763599999999775e-03 +-5.124732800000000171e-03 +-4.952417399999999893e-03 +-4.735375400000000137e-03 +-4.506085600000000156e-03 +-4.296558600000000006e-03 +-4.076058999999999932e-03 +-3.839851100000000062e-03 +-3.640128299999999956e-03 +-3.509172200000000141e-03 +-3.415904500000000159e-03 +-3.327294699999999977e-03 +-3.215648499999999941e-03 +-3.062494700000000045e-03 +-2.908353600000000011e-03 +-2.820593499999999882e-03 +-2.766457400000000080e-03 +-2.701982700000000147e-03 +-2.664102700000000028e-03 +-2.655244399999999883e-03 +-2.678291000000000179e-03 +-2.749868800000000203e-03 +-2.843497700000000190e-03 +-2.921370099999999990e-03 +-2.976200400000000162e-03 +-3.006718299999999906e-03 +-3.017156300000000107e-03 +-3.014766700000000126e-03 +-2.996842799999999835e-03 +-2.963446599999999993e-03 +-2.915031700000000024e-03 +-2.852358399999999853e-03 +-2.774444899999999915e-03 +-2.680829300000000127e-03 +-2.583518999999999833e-03 +-2.497746500000000078e-03 +-2.423995200000000037e-03 +-2.341611600000000157e-03 +-2.225429899999999996e-03 +-2.084424699999999891e-03 +-1.922824799999999900e-03 +-1.783800299999999985e-03 +-1.751029899999999957e-03 +-1.772890000000000056e-03 +-1.745774299999999953e-03 +-1.692299499999999927e-03 +-1.666338799999999903e-03 +-1.652955900000000096e-03 +-1.630783900000000106e-03 +-1.603174300000000064e-03 +-1.566518600000000021e-03 +-1.510955899999999897e-03 +-1.435840700000000098e-03 +-1.340307599999999988e-03 +-1.213417700000000076e-03 +-1.071315300000000087e-03 +-9.618161000000000288e-04 +-9.085335999999999846e-04 +-8.971959000000000271e-04 +-9.207123999999999907e-04 +-1.001037300000000079e-03 +-1.118856099999999921e-03 +-1.209308700000000106e-03 +-1.293290299999999993e-03 +-1.388979700000000060e-03 +-1.460146100000000091e-03 +-1.518568000000000088e-03 +-1.567590499999999953e-03 +-1.584295799999999943e-03 +-1.557507999999999983e-03 +-1.485790799999999910e-03 +-1.392304200000000092e-03 +-1.318924200000000033e-03 +-1.251365799999999999e-03 +-1.149413300000000056e-03 +-1.013517399999999940e-03 +-8.255593000000000089e-04 +-5.380863000000000052e-04 +-2.234443999999999981e-04 +4.843500000000000298e-06 +1.997190000000000033e-04 +3.979090999999999813e-04 +5.778364000000000026e-04 +7.511228999999999909e-04 +9.055552000000000133e-04 +1.044056600000000008e-03 +1.169823099999999991e-03 +1.259031000000000082e-03 +1.301101200000000105e-03 +1.330748299999999973e-03 +1.371652300000000000e-03 +1.424224599999999964e-03 +1.499488800000000049e-03 +1.576309799999999969e-03 +1.636677700000000032e-03 +1.696751299999999917e-03 +1.763711600000000043e-03 +1.832506899999999895e-03 +1.860283500000000072e-03 +1.798450299999999934e-03 +1.677756400000000002e-03 +1.526690700000000057e-03 +1.339622099999999982e-03 +1.129739600000000035e-03 +9.198970000000000324e-04 +7.412477999999999472e-04 +5.957048000000000161e-04 +5.031315999999999653e-04 +4.669068000000000068e-04 +4.577738000000000250e-04 +5.062013999999999880e-04 +6.040883000000000147e-04 +6.917495000000000284e-04 +7.771704000000000155e-04 +8.939542999999999665e-04 +1.037002200000000044e-03 +1.214749499999999947e-03 +1.443503899999999934e-03 +1.688422200000000038e-03 +1.834375100000000102e-03 +1.866388700000000097e-03 +1.916487099999999956e-03 +2.004868099999999962e-03 +2.062664300000000180e-03 +2.108845700000000056e-03 +2.136903199999999961e-03 +2.049064699999999985e-03 +1.887673099999999902e-03 +1.773997600000000018e-03 +1.749009500000000107e-03 +1.750148399999999901e-03 +1.701027900000000011e-03 +1.636503199999999941e-03 +1.609759600000000091e-03 +1.664680599999999967e-03 +1.766524499999999956e-03 +1.876801900000000080e-03 +2.028802000000000123e-03 +2.194334500000000212e-03 +2.345801599999999994e-03 +2.468506799999999925e-03 +2.534212200000000165e-03 +2.547188799999999982e-03 +2.496377499999999881e-03 +2.362142600000000005e-03 +2.192029600000000057e-03 +2.039118999999999828e-03 +1.883510799999999971e-03 +1.717654299999999985e-03 +1.567987600000000058e-03 +1.414154599999999920e-03 +1.287212600000000023e-03 +1.231326700000000057e-03 +1.225816200000000083e-03 +1.284708100000000108e-03 +1.377461200000000031e-03 +1.459084100000000066e-03 +1.580987399999999980e-03 +1.757240699999999996e-03 +1.914143600000000082e-03 +2.011335999999999853e-03 +2.026802800000000130e-03 +1.958754899999999924e-03 +1.840145399999999981e-03 +1.714531899999999914e-03 +1.651558100000000053e-03 +1.615541500000000023e-03 +1.543301900000000051e-03 +1.469624500000000058e-03 +1.398193500000000002e-03 +1.315119900000000100e-03 +1.240470299999999913e-03 +1.148767699999999996e-03 +9.939398999999999804e-04 +7.582846000000000074e-04 +5.003981999999999484e-04 +3.356095999999999927e-04 +3.095538000000000109e-04 +3.724708000000000185e-04 +4.378613999999999748e-04 +4.706193000000000225e-04 +4.870597999999999746e-04 +4.856714999999999730e-04 +4.488108999999999892e-04 +4.109237999999999975e-04 +3.942999000000000091e-04 +3.701746999999999915e-04 +3.351070000000000155e-04 +3.090117999999999880e-04 +3.066537999999999946e-04 +3.474700999999999853e-04 +4.221119999999999864e-04 +5.078342999999999703e-04 +6.096193999999999658e-04 +7.179979999999999652e-04 +8.219874999999999968e-04 +9.248321999999999576e-04 +1.026364299999999981e-03 +1.131556400000000061e-03 +1.246920699999999908e-03 +1.359190900000000011e-03 +1.445737699999999912e-03 +1.504348300000000072e-03 +1.539384399999999898e-03 +1.535956200000000065e-03 +1.495434799999999969e-03 +1.431608100000000047e-03 +1.332471700000000025e-03 +1.223991900000000101e-03 +1.159627899999999970e-03 +1.130457299999999962e-03 +1.120962899999999960e-03 +1.152240500000000075e-03 +1.225697700000000006e-03 +1.321018200000000043e-03 +1.425170799999999965e-03 +1.527603300000000093e-03 +1.621001200000000021e-03 +1.705346599999999933e-03 +1.736499700000000094e-03 +1.705273599999999976e-03 +1.655908999999999897e-03 +1.576989399999999915e-03 +1.463587099999999952e-03 +1.407955499999999967e-03 +1.420656200000000027e-03 +1.466172800000000017e-03 +1.595852100000000068e-03 +1.768399300000000028e-03 +1.932661399999999934e-03 +2.094816199999999847e-03 +2.213996599999999964e-03 +2.236348300000000084e-03 +2.160289900000000006e-03 +2.045957000000000157e-03 +1.907204700000000039e-03 +1.776216099999999984e-03 +1.697866300000000018e-03 +1.643299900000000065e-03 +1.625150400000000038e-03 +1.663306000000000029e-03 +1.740553400000000072e-03 +1.838393100000000049e-03 +1.933864200000000051e-03 +2.013773600000000157e-03 +2.057546300000000043e-03 +2.045532000000000079e-03 +1.999053199999999836e-03 +1.908027000000000074e-03 +1.696827799999999983e-03 +1.473069399999999947e-03 +1.393066799999999935e-03 +1.334675299999999896e-03 +1.236637299999999952e-03 +1.206232900000000097e-03 +1.247521300000000019e-03 +1.332508399999999963e-03 +1.490875299999999898e-03 +1.693099700000000015e-03 +1.836976699999999952e-03 +1.894739199999999953e-03 +1.950023200000000016e-03 +2.013131999999999942e-03 +2.042963300000000173e-03 +2.082433299999999956e-03 +2.149754800000000087e-03 +2.218527899999999959e-03 +2.295485999999999794e-03 +2.395287800000000123e-03 +2.473145999999999851e-03 +2.494699799999999801e-03 +2.489550799999999935e-03 +2.460832500000000207e-03 +2.414501800000000160e-03 +2.367128300000000130e-03 +2.314632899999999934e-03 +2.284017399999999868e-03 +2.297892199999999798e-03 +2.353000100000000091e-03 +2.440568199999999799e-03 +2.503633300000000002e-03 +2.469530599999999933e-03 +2.392345299999999817e-03 +2.330571000000000031e-03 +2.271043999999999841e-03 +2.218896499999999886e-03 +2.159538900000000216e-03 +2.097080099999999898e-03 +2.052612399999999802e-03 +2.035316899999999995e-03 +2.046345800000000034e-03 +2.088239699999999786e-03 +2.164600100000000065e-03 +2.268393000000000059e-03 +2.376230000000000009e-03 +2.470387399999999806e-03 +2.563001899999999954e-03 +2.662391999999999970e-03 +2.763891599999999862e-03 +2.859131699999999804e-03 +2.930685799999999987e-03 +2.971226999999999896e-03 +2.967174099999999974e-03 +2.940437900000000045e-03 +2.926182600000000033e-03 +2.896499399999999998e-03 +2.838379099999999849e-03 +2.762341699999999994e-03 +2.662508799999999901e-03 +2.541708599999999933e-03 +2.435573700000000143e-03 +2.386749499999999812e-03 +2.393983299999999804e-03 +2.425985500000000031e-03 +2.468848699999999854e-03 +2.500167499999999925e-03 +2.508868000000000036e-03 +2.524669700000000024e-03 +2.538085399999999957e-03 +2.518595399999999911e-03 +2.460152199999999807e-03 +2.378456000000000146e-03 +2.308282000000000042e-03 +2.255235600000000170e-03 +2.201698599999999967e-03 +2.150888799999999944e-03 +2.108952700000000114e-03 +2.044836300000000065e-03 +1.939429799999999949e-03 +1.824718099999999947e-03 +1.693287799999999973e-03 +1.503744399999999920e-03 +1.290150299999999993e-03 +1.102338499999999969e-03 +9.373877000000000511e-04 +8.094722999999999849e-04 +7.287790999999999627e-04 +6.920515000000000130e-04 +7.117871000000000007e-04 +7.395050000000000017e-04 +6.981126999999999949e-04 +6.045574999999999864e-04 +5.186766000000000206e-04 +4.545897999999999823e-04 +3.915206999999999867e-04 +3.420065000000000128e-04 +3.344337999999999760e-04 +3.004896999999999972e-04 +1.303098000000000038e-04 +-1.257017000000000030e-04 +-3.608336000000000074e-04 +-5.713374999999999487e-04 +-7.349655999999999550e-04 +-8.310174000000000033e-04 +-8.854776999999999874e-04 +-8.896146999999999649e-04 +-8.194895000000000217e-04 +-6.943569000000000130e-04 +-5.738199000000000251e-04 +-5.461530999999999938e-04 +-5.803397999999999760e-04 +-5.952702000000000254e-04 +-6.406636999999999965e-04 +-7.506052999999999944e-04 +-9.024817000000000299e-04 +-1.086165199999999898e-03 +-1.290985300000000021e-03 +-1.472760800000000097e-03 +-1.629150700000000021e-03 +-1.812145899999999905e-03 +-2.002297000000000105e-03 +-2.175181600000000194e-03 +-2.324706100000000202e-03 +-2.405593100000000175e-03 +-2.435788099999999963e-03 +-2.451137800000000207e-03 +-2.432881000000000019e-03 +-2.413664199999999895e-03 +-2.453376100000000202e-03 +-2.515827400000000130e-03 +-2.572264400000000024e-03 +-2.646166900000000016e-03 +-2.704321999999999889e-03 +-2.709924299999999942e-03 +-2.668599099999999832e-03 +-2.609112900000000110e-03 +-2.604498299999999898e-03 +-2.675786400000000013e-03 +-2.748961099999999887e-03 +-2.820175500000000023e-03 +-2.873590399999999788e-03 +-2.897254299999999817e-03 +-2.957094700000000194e-03 +-3.037539100000000158e-03 +-3.109047499999999936e-03 +-3.219792799999999806e-03 +-3.358186400000000120e-03 +-3.452752600000000109e-03 +-3.501720800000000106e-03 +-3.510199900000000178e-03 +-3.477318699999999881e-03 +-3.421238300000000159e-03 +-3.366255800000000128e-03 +-3.322370099999999871e-03 +-3.291686399999999967e-03 +-3.290101599999999907e-03 +-3.297566799999999878e-03 +-3.262570099999999827e-03 +-3.173980299999999959e-03 +-3.073869500000000077e-03 +-3.024936499999999941e-03 +-3.043083700000000051e-03 +-3.089238900000000100e-03 +-3.128380300000000152e-03 +-3.108303800000000033e-03 +-3.042163699999999877e-03 +-3.013930900000000041e-03 +-3.027078400000000023e-03 +-3.040978599999999941e-03 +-3.056768499999999809e-03 +-3.096581299999999828e-03 +-3.168895100000000166e-03 +-3.264723800000000030e-03 +-3.360410199999999941e-03 +-3.389514100000000189e-03 +-3.338956799999999968e-03 +-3.259874600000000049e-03 +-3.156724300000000177e-03 +-3.057803500000000167e-03 +-2.996480900000000024e-03 +-2.937753500000000149e-03 +-2.896090799999999875e-03 +-2.921747200000000214e-03 +-2.980333300000000043e-03 +-3.014382899999999785e-03 +-3.027938799999999823e-03 +-3.023185900000000155e-03 +-2.986292900000000073e-03 +-2.954005500000000169e-03 +-2.996563500000000001e-03 +-3.077275400000000112e-03 +-3.147768300000000109e-03 +-3.251796600000000145e-03 +-3.392195299999999861e-03 +-3.510437700000000171e-03 +-3.579446799999999856e-03 +-3.613934599999999841e-03 +-3.634554900000000217e-03 +-3.688006599999999954e-03 +-3.755124700000000114e-03 +-3.799810099999999854e-03 +-3.825706099999999932e-03 +-3.825629699999999900e-03 +-3.816028899999999828e-03 +-3.808735699999999964e-03 +-3.788835899999999819e-03 +-3.760766000000000022e-03 +-3.748316700000000039e-03 +-3.760081299999999856e-03 +-3.778981700000000072e-03 +-3.743489300000000120e-03 +-3.613965499999999970e-03 +-3.415333999999999905e-03 +-3.176322200000000155e-03 +-2.902343800000000210e-03 +-2.581251299999999787e-03 +-2.244280700000000212e-03 +-1.965718899999999852e-03 +-1.758559299999999919e-03 +-1.605685199999999993e-03 +-1.519499299999999995e-03 +-1.483007400000000081e-03 +-1.408021100000000003e-03 +-1.280648799999999955e-03 +-1.168878699999999953e-03 +-1.105483700000000008e-03 +-1.095115700000000043e-03 +-1.097572700000000023e-03 +-1.108173500000000011e-03 +-1.101354699999999940e-03 +-1.041028299999999934e-03 +-9.607053999999999854e-04 +-8.511639000000000314e-04 +-6.833974000000000038e-04 +-4.900398000000000037e-04 +-2.851093000000000182e-04 +-7.653180000000000475e-05 +5.167689999999999984e-05 +8.408099999999999678e-05 +7.237479999999999695e-05 +2.536100000000000164e-06 +-7.064870000000000004e-05 +-9.859620000000000309e-05 +-1.370441999999999982e-04 +-1.813535999999999978e-04 +-2.135813999999999877e-04 +-2.570525000000000262e-04 +-3.068783000000000058e-04 +-3.693863000000000246e-04 +-5.015078000000000504e-04 +-6.997242999999999779e-04 +-9.499232000000000465e-04 +-1.261542899999999919e-03 +-1.554173600000000044e-03 +-1.748855500000000068e-03 +-1.877933999999999940e-03 +-1.963663699999999845e-03 +-1.967827299999999786e-03 +-1.889427400000000083e-03 +-1.820135799999999908e-03 +-1.779776299999999943e-03 +-1.698332099999999914e-03 +-1.597233399999999906e-03 +-1.501098699999999994e-03 +-1.381641700000000098e-03 +-1.231407300000000003e-03 +-1.082801100000000023e-03 +-9.363919000000000496e-04 +-7.673518000000000483e-04 +-5.827382000000000308e-04 +-3.748029999999999960e-04 +-1.800887000000000093e-04 +-5.089290000000000193e-05 +7.388729999999999983e-05 +2.142981000000000074e-04 +3.275770999999999913e-04 +4.095543999999999899e-04 +4.559518999999999942e-04 +4.948443000000000286e-04 +6.004352000000000343e-04 +7.601259000000000401e-04 +8.972865999999999481e-04 +9.748558000000000050e-04 +1.003810400000000082e-03 +1.015486899999999996e-03 +1.001253400000000045e-03 +9.678624999999999512e-04 +9.529380999999999963e-04 +9.556334999999999569e-04 +9.602915000000000062e-04 +9.878887999999999732e-04 +1.043121300000000038e-03 +1.090455599999999928e-03 +1.119040900000000055e-03 +1.105015300000000093e-03 +1.025111300000000093e-03 +8.979797000000000516e-04 +7.424588000000000411e-04 +5.915048000000000224e-04 +5.013678000000000145e-04 +4.836250000000000054e-04 +5.061504000000000524e-04 +5.459018999999999851e-04 +5.785051000000000256e-04 +5.904869999999999997e-04 +5.832181999999999991e-04 +5.589832999999999781e-04 +5.169528000000000491e-04 +4.565419999999999938e-04 +3.641200999999999834e-04 +2.264146999999999991e-04 +4.551699999999999805e-05 +-1.600975000000000033e-04 +-3.086041000000000088e-04 +-3.423159000000000271e-04 +-3.013282000000000265e-04 +-2.057814999999999948e-04 +-4.158130000000000116e-05 +1.589310999999999936e-04 +3.354127999999999949e-04 +5.075944000000000202e-04 +7.080606999999999613e-04 +9.100151999999999807e-04 +1.079638800000000008e-03 +1.150534799999999988e-03 +1.139497599999999937e-03 +1.175568600000000087e-03 +1.261148599999999901e-03 +1.339547800000000016e-03 +1.429173699999999967e-03 +1.489609100000000063e-03 +1.505950800000000096e-03 +1.523228300000000054e-03 +1.538480100000000090e-03 +1.552551000000000105e-03 +1.572341099999999920e-03 +1.598399699999999935e-03 +1.637655100000000048e-03 +1.696293200000000044e-03 +1.733203000000000001e-03 +1.663968800000000100e-03 +1.497406800000000010e-03 +1.302936700000000003e-03 +1.141100699999999949e-03 +1.092111399999999913e-03 +1.137634900000000088e-03 +1.228777199999999976e-03 +1.394081400000000059e-03 +1.599193000000000055e-03 +1.814106999999999916e-03 +2.055113700000000144e-03 +2.300652700000000057e-03 +2.523634299999999962e-03 +2.699255399999999933e-03 +2.811874199999999865e-03 +2.882073199999999821e-03 +2.960606199999999810e-03 +3.051085499999999992e-03 +3.114023200000000120e-03 +3.153988099999999965e-03 +3.154613699999999927e-03 +3.093797599999999898e-03 +2.997521400000000089e-03 +2.875796500000000078e-03 +2.755946600000000208e-03 +2.711963999999999868e-03 +2.756429199999999979e-03 +2.847854199999999992e-03 +2.999394099999999879e-03 +3.215672900000000022e-03 +3.476339599999999936e-03 +3.774689400000000045e-03 +4.091932500000000118e-03 +4.401261499999999799e-03 +4.657509399999999918e-03 +4.822929899999999978e-03 +4.928193200000000052e-03 +5.024120499999999712e-03 +5.097727899999999687e-03 +5.108096399999999607e-03 +5.059842200000000227e-03 +4.890351099999999847e-03 +4.572977300000000307e-03 +4.234200100000000064e-03 +3.988880200000000271e-03 +3.824014799999999985e-03 +3.675458500000000107e-03 +3.563393700000000008e-03 +3.503987000000000074e-03 +3.480162800000000025e-03 +3.490639900000000115e-03 +3.531894299999999935e-03 +3.594694500000000011e-03 +3.613465199999999801e-03 +3.527965899999999967e-03 +3.386847100000000155e-03 +3.214986500000000143e-03 +3.020885300000000166e-03 +2.843883299999999843e-03 +2.669588799999999922e-03 +2.484538200000000179e-03 +2.296372599999999854e-03 +2.105916399999999914e-03 +1.889687300000000023e-03 +1.613606600000000056e-03 +1.330621900000000021e-03 +1.101207500000000051e-03 +9.196747000000000125e-04 +7.972355000000000413e-04 +7.546360999999999694e-04 +7.692375000000000428e-04 +7.997236000000000015e-04 +8.048133999999999540e-04 +7.459949000000000224e-04 +6.460790000000000326e-04 +5.502026999999999829e-04 +4.206052999999999962e-04 +2.291252999999999931e-04 +2.154059999999999837e-05 +-1.960250000000000078e-04 +-4.193616000000000271e-04 +-6.200516999999999574e-04 +-8.096789999999999977e-04 +-9.870623000000000244e-04 +-1.135066899999999986e-03 +-1.262476499999999960e-03 +-1.380530700000000060e-03 +-1.489041900000000066e-03 +-1.577383199999999978e-03 +-1.658474199999999911e-03 +-1.746501300000000015e-03 +-1.828673899999999934e-03 +-1.905834900000000004e-03 +-1.978751899999999821e-03 +-2.040275299999999917e-03 +-2.076859500000000081e-03 +-2.081874899999999924e-03 +-2.084646099999999929e-03 +-2.147462799999999995e-03 +-2.244643699999999964e-03 +-2.325990999999999909e-03 +-2.451295000000000036e-03 +-2.634635399999999891e-03 +-2.818140199999999863e-03 +-2.978910300000000080e-03 +-3.105380400000000169e-03 +-3.175154500000000081e-03 +-3.185790600000000181e-03 +-3.137192799999999858e-03 +-3.024753800000000090e-03 +-2.884055099999999986e-03 +-2.754412700000000158e-03 +-2.647021299999999938e-03 +-2.597212499999999955e-03 +-2.622525699999999921e-03 +-2.680529699999999876e-03 +-2.713961899999999851e-03 +-2.711178299999999954e-03 +-2.697495700000000080e-03 +-2.692341000000000005e-03 +-2.704410899999999847e-03 +-2.737462799999999807e-03 +-2.802246999999999898e-03 +-2.917102200000000044e-03 +-3.073065299999999927e-03 +-3.233302200000000032e-03 +-3.380137000000000072e-03 +-3.478716000000000187e-03 +-3.546024000000000051e-03 +-3.626470799999999967e-03 +-3.684826600000000191e-03 +-3.706461199999999939e-03 +-3.704497299999999840e-03 +-3.677393199999999789e-03 +-3.631479799999999796e-03 +-3.574687300000000106e-03 +-3.501896899999999875e-03 +-3.420791700000000088e-03 +-3.338453400000000043e-03 +-3.250082699999999863e-03 +-3.151008600000000052e-03 +-3.098051799999999942e-03 +-3.112830699999999829e-03 +-3.142099900000000067e-03 +-3.209591300000000022e-03 +-3.310380899999999793e-03 +-3.381113700000000066e-03 +-3.418001700000000177e-03 +-3.386629999999999849e-03 +-3.270111100000000059e-03 +-3.164050900000000156e-03 +-3.068858399999999965e-03 +-2.924183500000000074e-03 +-2.759131599999999941e-03 +-2.601748799999999921e-03 +-2.456276600000000063e-03 +-2.341732100000000049e-03 +-2.268023799999999927e-03 +-2.228664300000000095e-03 +-2.201679099999999823e-03 +-2.171280399999999961e-03 +-2.168122099999999792e-03 +-2.217418999999999987e-03 +-2.301337000000000087e-03 +-2.412141899999999898e-03 +-2.529812900000000080e-03 +-2.634172299999999831e-03 +-2.739707899999999953e-03 +-2.841952599999999791e-03 +-2.922284299999999922e-03 +-2.954409099999999889e-03 +-2.904812300000000208e-03 +-2.780767799999999800e-03 +-2.694672099999999987e-03 +-2.728239700000000163e-03 +-2.792413200000000168e-03 +-2.837548400000000203e-03 +-2.849926200000000090e-03 +-2.771299400000000208e-03 +-2.667864199999999894e-03 +-2.620482600000000138e-03 +-2.610430899999999829e-03 +-2.598518299999999850e-03 +-2.596228900000000211e-03 +-2.638202000000000082e-03 +-2.715234400000000100e-03 +-2.812452500000000178e-03 +-2.916428999999999896e-03 +-2.983683999999999902e-03 +-3.033699799999999783e-03 +-3.130510500000000147e-03 +-3.247769599999999948e-03 +-3.349779399999999914e-03 +-3.453826299999999787e-03 +-3.562637899999999882e-03 +-3.663483999999999838e-03 +-3.755561299999999811e-03 +-3.818509999999999786e-03 +-3.807473400000000157e-03 +-3.720255799999999842e-03 +-3.562885100000000044e-03 +-3.336447199999999832e-03 +-3.070711500000000010e-03 +-2.782422699999999912e-03 +-2.533226799999999806e-03 +-2.337539100000000057e-03 +-2.160532900000000037e-03 +-2.043276499999999857e-03 +-2.005291199999999826e-03 +-2.039453000000000099e-03 +-2.143637500000000057e-03 +-2.305604399999999863e-03 +-2.542593899999999983e-03 +-2.845749900000000155e-03 +-3.167097599999999999e-03 +-3.474278899999999788e-03 +-3.722946699999999786e-03 +-3.876764799999999830e-03 +-3.937960600000000103e-03 +-3.912482000000000112e-03 +-3.822094299999999941e-03 +-3.704809299999999982e-03 +-3.576314399999999845e-03 +-3.449511199999999791e-03 +-3.321270400000000001e-03 +-3.183411799999999979e-03 +-3.053024899999999976e-03 +-2.935377199999999933e-03 +-2.826405100000000184e-03 +-2.733624400000000173e-03 +-2.652850799999999839e-03 +-2.541474499999999900e-03 +-2.377468499999999939e-03 +-2.189840499999999926e-03 +-2.004421900000000027e-03 +-1.851702599999999980e-03 +-1.721685099999999960e-03 +-1.575528099999999902e-03 +-1.429032200000000070e-03 +-1.287649600000000073e-03 +-1.150588900000000005e-03 +-1.036895799999999973e-03 +-9.455496999999999774e-04 +-8.717094000000000535e-04 +-8.147661000000000053e-04 +-7.729177999999999743e-04 +-7.428871999999999776e-04 +-7.174577999999999598e-04 +-6.860873000000000405e-04 +-6.314330000000000376e-04 +-5.174516000000000315e-04 +-3.380254999999999978e-04 +-1.121810999999999956e-04 +1.391750000000000083e-04 +3.703655000000000033e-04 +5.219412000000000097e-04 +6.131682000000000495e-04 +6.867751999999999971e-04 +7.646519999999999966e-04 +8.677800999999999961e-04 +9.545251000000000473e-04 +9.957952999999999423e-04 +1.010360799999999917e-03 +1.014556599999999996e-03 +1.001640800000000095e-03 +9.729727000000000297e-04 +9.523001999999999596e-04 +9.405785000000000274e-04 +9.245002999999999685e-04 +9.076311999999999575e-04 +8.781057000000000315e-04 +8.025337000000000443e-04 +7.178831999999999575e-04 +7.214448999999999949e-04 +7.854347999999999495e-04 +8.513214999999999975e-04 +9.475071999999999531e-04 +1.059313199999999946e-03 +1.176208100000000019e-03 +1.312809100000000102e-03 +1.367938400000000103e-03 +1.318437900000000084e-03 +1.310487599999999924e-03 +1.348781000000000068e-03 +1.348760600000000051e-03 +1.318741999999999918e-03 +1.272602299999999950e-03 +1.202848500000000022e-03 +1.108460599999999902e-03 +1.001845400000000042e-03 +9.096453000000000438e-04 +8.445790999999999585e-04 +7.979096999999999882e-04 +7.699283000000000125e-04 +7.737850000000000327e-04 +8.339477999999999778e-04 +9.649208000000000264e-04 +1.134784100000000044e-03 +1.326410099999999906e-03 +1.516940199999999893e-03 +1.672001200000000068e-03 +1.807972799999999977e-03 +1.925978899999999938e-03 +1.989906100000000087e-03 +1.992100399999999823e-03 +1.952516299999999946e-03 +1.907778400000000084e-03 +1.874209300000000047e-03 +1.831370300000000019e-03 +1.779694100000000102e-03 +1.706548000000000006e-03 +1.582665700000000049e-03 +1.435183000000000032e-03 +1.351330100000000013e-03 +1.349925799999999922e-03 +1.385242600000000058e-03 +1.446988800000000019e-03 +1.518867900000000007e-03 +1.595418900000000013e-03 +1.693430699999999914e-03 +1.801495400000000099e-03 +1.890986000000000099e-03 +1.964866100000000042e-03 +2.047335700000000192e-03 +2.140814799999999837e-03 +2.215406599999999830e-03 +2.235153299999999808e-03 +2.210004299999999890e-03 +2.154526099999999958e-03 +2.074000099999999923e-03 +2.021390899999999952e-03 +2.037401600000000087e-03 +2.084971799999999972e-03 +2.155699100000000104e-03 +2.275613000000000115e-03 +2.413943899999999865e-03 +2.554081900000000020e-03 +2.726312299999999935e-03 +2.910275600000000133e-03 +3.048648100000000190e-03 +3.155106400000000106e-03 +3.237622600000000100e-03 +3.255536199999999915e-03 +3.219776599999999919e-03 +3.178941399999999935e-03 +3.164539599999999838e-03 +3.177544200000000096e-03 +3.205239899999999791e-03 +3.266638200000000162e-03 +3.363094599999999837e-03 +3.454094200000000069e-03 +3.511737699999999823e-03 +3.539812199999999888e-03 +3.542025399999999997e-03 +3.547907600000000088e-03 +3.639203900000000016e-03 +3.819732199999999796e-03 +4.009414299999999876e-03 +4.168756800000000297e-03 +4.264848299999999572e-03 +4.208478199999999940e-03 +4.058138799999999602e-03 +3.973012799999999997e-03 +3.941317599999999942e-03 +3.982212800000000004e-03 +4.079991399999999963e-03 +4.138150000000000162e-03 +4.166470099999999843e-03 +4.143744999999999894e-03 +4.050192000000000202e-03 +3.899336099999999809e-03 +3.683870200000000181e-03 +3.512781400000000113e-03 +3.465506599999999913e-03 +3.439547500000000001e-03 +3.450967000000000097e-03 +3.543210800000000035e-03 +3.634451899999999788e-03 +3.676781100000000094e-03 +3.666715100000000113e-03 +3.591935699999999898e-03 +3.401037600000000188e-03 +3.091624600000000053e-03 +2.746885200000000193e-03 +2.424299500000000156e-03 +2.164453599999999981e-03 +2.022971100000000178e-03 +1.988728099999999971e-03 +1.988351599999999952e-03 +1.921043099999999917e-03 +1.769668299999999951e-03 +1.581095399999999946e-03 +1.393582599999999968e-03 +1.335888900000000009e-03 +1.433813300000000030e-03 +1.567074099999999932e-03 +1.751316799999999996e-03 +1.995256899999999813e-03 +2.213636100000000197e-03 +2.381581800000000075e-03 +2.497558600000000188e-03 +2.554534600000000003e-03 +2.560656100000000164e-03 +2.536711000000000087e-03 +2.503809599999999840e-03 +2.551511700000000035e-03 +2.717707199999999830e-03 +2.923431199999999841e-03 +3.153093699999999847e-03 +3.365369600000000204e-03 +3.458965599999999814e-03 +3.466184699999999997e-03 +3.480905500000000020e-03 +3.520565900000000113e-03 +3.601638400000000025e-03 +3.734448500000000191e-03 +3.879293499999999974e-03 +4.047877899999999946e-03 +4.194484299999999728e-03 +4.269302499999999730e-03 +4.342225199999999972e-03 +4.413666600000000322e-03 +4.454987799999999935e-03 +4.484885200000000155e-03 +4.502973000000000392e-03 +4.511855799999999785e-03 +4.523856899999999584e-03 +4.535079200000000088e-03 +4.556299599999999971e-03 +4.599879999999999768e-03 +4.642845799999999884e-03 +4.650646999999999941e-03 +4.623380300000000387e-03 +4.550445900000000057e-03 +4.428440999999999975e-03 +4.318737599999999781e-03 +4.269283999999999926e-03 +4.298460199999999676e-03 +4.394138199999999758e-03 +4.510431199999999710e-03 +4.579793300000000074e-03 +4.554104399999999928e-03 +4.490643499999999629e-03 +4.438508800000000136e-03 +4.398774799999999666e-03 +4.374270999999999888e-03 +4.362051999999999943e-03 +4.355570999999999922e-03 +4.348254099999999782e-03 +4.338271399999999584e-03 +4.308254400000000213e-03 +4.264531099999999825e-03 +4.213087100000000376e-03 +4.165882000000000092e-03 +4.152669299999999994e-03 +4.157240700000000219e-03 +4.166394500000000084e-03 +4.197660100000000227e-03 +4.251296899999999768e-03 +4.300109400000000012e-03 +4.306740699999999679e-03 +4.286932799999999648e-03 +4.259040900000000268e-03 +4.171534900000000053e-03 +4.025418200000000293e-03 +3.880612500000000034e-03 +3.767699800000000061e-03 +3.733040100000000003e-03 +3.738490799999999968e-03 +3.718938800000000031e-03 +3.719856599999999888e-03 +3.745298599999999974e-03 +3.764659599999999832e-03 +3.782344600000000188e-03 +3.774173300000000127e-03 +3.720129300000000073e-03 +3.657752199999999860e-03 +3.618817299999999969e-03 +3.589247800000000110e-03 +3.555007900000000092e-03 +3.524936800000000054e-03 +3.503329800000000178e-03 +3.481365000000000154e-03 +3.454761099999999804e-03 +3.422793099999999963e-03 +3.387526499999999816e-03 +3.362288599999999940e-03 +3.347141100000000126e-03 +3.335613299999999962e-03 +3.327412100000000112e-03 +3.301536500000000051e-03 +3.254676599999999954e-03 +3.202049900000000088e-03 +3.133158699999999842e-03 +3.047682500000000079e-03 +2.969373899999999851e-03 +2.915640299999999827e-03 +2.874487900000000096e-03 +2.833590300000000083e-03 +2.800243699999999808e-03 +2.783386100000000141e-03 +2.777104800000000130e-03 +2.754566700000000198e-03 +2.723366499999999805e-03 +2.692055100000000090e-03 +2.653815300000000009e-03 +2.618557899999999963e-03 +2.581726999999999807e-03 +2.537290499999999942e-03 +2.516378300000000207e-03 +2.525727699999999985e-03 +2.539040399999999923e-03 +2.564173199999999955e-03 +2.601017699999999978e-03 +2.643556999999999938e-03 +2.698563800000000016e-03 +2.765011600000000149e-03 +2.844256800000000140e-03 +2.914958200000000114e-03 +2.943462100000000022e-03 +2.941385199999999988e-03 +2.898417199999999989e-03 +2.810358800000000053e-03 +2.732341200000000178e-03 +2.669012799999999960e-03 +2.601045100000000214e-03 +2.537825200000000132e-03 +2.485110699999999815e-03 +2.446103199999999887e-03 +2.420509600000000146e-03 +2.417166200000000174e-03 +2.442981800000000158e-03 +2.469756899999999908e-03 +2.455547099999999799e-03 +2.414912500000000132e-03 +2.371575400000000035e-03 +2.308219499999999980e-03 +2.206082900000000142e-03 +2.066225599999999864e-03 +1.895506500000000098e-03 +1.721759599999999994e-03 +1.610174000000000024e-03 +1.563551100000000081e-03 +1.547982399999999967e-03 +1.562935600000000093e-03 +1.585554699999999892e-03 +1.601794500000000088e-03 +1.612716200000000001e-03 +1.623443000000000021e-03 +1.673708000000000097e-03 +1.760322599999999916e-03 +1.832604800000000103e-03 +1.857643800000000024e-03 +1.857726999999999989e-03 +1.858223399999999912e-03 +1.856006600000000093e-03 +1.851149700000000089e-03 +1.833140499999999984e-03 +1.798607700000000049e-03 +1.750038800000000040e-03 +1.689828399999999909e-03 +1.640136900000000028e-03 +1.607795599999999958e-03 +1.576968800000000046e-03 +1.531102299999999999e-03 +1.457999300000000073e-03 +1.403362499999999966e-03 +1.432941399999999995e-03 +1.500317699999999949e-03 +1.537935100000000074e-03 +1.587077500000000059e-03 +1.651554800000000012e-03 +1.689185499999999902e-03 +1.701755500000000062e-03 +1.676648800000000040e-03 +1.605429000000000014e-03 +1.537960699999999913e-03 +1.527076499999999995e-03 +1.561928100000000005e-03 +1.623168199999999988e-03 +1.690519400000000056e-03 +1.712823499999999990e-03 +1.657060599999999901e-03 +1.546578500000000012e-03 +1.404642700000000022e-03 +1.246676300000000050e-03 +1.108467799999999972e-03 +1.017626399999999910e-03 +9.544386999999999663e-04 +8.966838999999999886e-04 +8.689748999999999867e-04 +8.780953999999999886e-04 +9.064639000000000203e-04 +9.313305000000000238e-04 +9.630116000000000414e-04 +1.012628000000000009e-03 +1.056971600000000070e-03 +1.098282799999999960e-03 +1.174377600000000091e-03 +1.285045000000000067e-03 +1.380629699999999993e-03 +1.417018099999999958e-03 +1.402123199999999979e-03 +1.369115699999999981e-03 +1.314989199999999983e-03 +1.230903800000000044e-03 +1.124455500000000070e-03 +1.008853000000000093e-03 +8.968856000000000311e-04 +8.392735000000000343e-04 +8.367001999999999686e-04 +8.316365000000000259e-04 +8.029347999999999954e-04 +7.346068000000000086e-04 +6.788869999999999801e-04 +6.779626999999999659e-04 +6.947891000000000527e-04 +7.321100000000000090e-04 +7.918127000000000498e-04 +8.575979999999999975e-04 +9.075186000000000494e-04 +9.062900000000000253e-04 +8.866332999999999463e-04 +8.724082999999999664e-04 +8.254579000000000170e-04 +7.240109999999999905e-04 +5.850345999999999975e-04 +4.429006000000000197e-04 +3.088375999999999990e-04 +2.020695999999999940e-04 +1.349889999999999912e-04 +6.914640000000000597e-05 +-9.595700000000000301e-06 +-7.851009999999999901e-05 +-1.523952000000000076e-04 +-2.249405000000000057e-04 +-2.313565999999999865e-04 +-1.992306999999999965e-04 +-2.050812000000000110e-04 +-2.795488000000000161e-04 +-3.846626000000000125e-04 +-4.428230999999999921e-04 +-4.912246000000000537e-04 +-5.629195000000000032e-04 +-6.206043999999999970e-04 +-6.749850000000000164e-04 +-7.428177000000000217e-04 +-8.196540999999999896e-04 +-8.971040000000000221e-04 +-9.718244999999999922e-04 +-1.044239800000000030e-03 +-1.090645600000000100e-03 +-1.106576300000000060e-03 +-1.093717599999999898e-03 +-1.033314499999999974e-03 +-9.324503999999999519e-04 +-8.585055000000000290e-04 +-8.413659000000000415e-04 +-8.339079999999999583e-04 +-8.374081999999999490e-04 +-8.570201000000000381e-04 +-8.419547000000000316e-04 +-7.930714000000000383e-04 +-7.536350000000000037e-04 +-7.382628000000000020e-04 +-7.516689999999999483e-04 +-7.756907000000000168e-04 +-8.058454999999999742e-04 +-8.674237000000000006e-04 +-9.648448000000000224e-04 +-1.068221899999999931e-03 +-1.160597300000000076e-03 +-1.262151100000000019e-03 +-1.370040600000000091e-03 +-1.457545300000000080e-03 +-1.519065700000000020e-03 +-1.562980299999999940e-03 +-1.598354200000000032e-03 +-1.660171499999999953e-03 +-1.784532099999999949e-03 +-1.929767700000000006e-03 +-2.064522400000000195e-03 +-2.219316499999999994e-03 +-2.375526700000000005e-03 +-2.514410800000000182e-03 +-2.641871300000000165e-03 +-2.729145499999999832e-03 +-2.778963800000000019e-03 +-2.831768499999999869e-03 +-2.912906099999999863e-03 +-3.001768200000000213e-03 +-3.065608799999999887e-03 +-3.091377199999999822e-03 +-3.085682199999999816e-03 +-3.063742999999999848e-03 +-3.020515399999999795e-03 +-2.960664699999999809e-03 +-2.932479899999999862e-03 +-2.944988200000000014e-03 +-2.933263199999999824e-03 +-2.904677599999999811e-03 +-2.888465399999999919e-03 +-2.851278799999999898e-03 +-2.798343999999999918e-03 +-2.778150599999999835e-03 +-2.799429500000000150e-03 +-2.837978499999999852e-03 +-2.888170700000000039e-03 +-2.949756300000000095e-03 +-3.023191100000000194e-03 +-3.107020399999999970e-03 +-3.181240399999999812e-03 +-3.236564099999999968e-03 +-3.283476799999999855e-03 +-3.319310700000000034e-03 +-3.338654400000000064e-03 +-3.348545300000000183e-03 +-3.354415199999999982e-03 +-3.354721800000000018e-03 +-3.344103199999999814e-03 +-3.322489200000000153e-03 +-3.291045099999999855e-03 +-3.242178000000000074e-03 +-3.174795900000000094e-03 +-3.096985599999999787e-03 +-3.005688099999999884e-03 +-2.895589999999999969e-03 +-2.774707400000000091e-03 +-2.670802600000000103e-03 +-2.607316100000000181e-03 +-2.576661000000000055e-03 +-2.584452399999999806e-03 +-2.636857199999999898e-03 +-2.713486700000000001e-03 +-2.803820700000000075e-03 +-2.917814999999999818e-03 +-3.049958499999999920e-03 +-3.178253099999999842e-03 +-3.305808800000000196e-03 +-3.373574500000000014e-03 +-3.345583999999999971e-03 +-3.289427900000000023e-03 +-3.204720500000000048e-03 +-3.084367000000000185e-03 +-3.008981600000000187e-03 +-3.001459900000000031e-03 +-2.979221499999999950e-03 +-2.936600699999999953e-03 +-2.888151499999999997e-03 +-2.818226100000000098e-03 +-2.800311199999999841e-03 +-2.834792300000000143e-03 +-2.860042799999999979e-03 +-2.900690899999999912e-03 +-2.961046499999999901e-03 +-3.013541499999999960e-03 +-3.041265400000000164e-03 +-3.031661699999999970e-03 +-2.990851200000000168e-03 +-2.910668600000000140e-03 +-2.800741399999999957e-03 +-2.743903900000000100e-03 +-2.733517999999999885e-03 +-2.701960099999999813e-03 +-2.669893100000000040e-03 +-2.603580800000000143e-03 +-2.472791099999999825e-03 +-2.319412600000000067e-03 +-2.157393000000000071e-03 +-1.998814099999999833e-03 +-1.871428999999999974e-03 +-1.773074300000000020e-03 +-1.701000299999999923e-03 +-1.654122600000000045e-03 +-1.628687699999999995e-03 +-1.651024100000000102e-03 +-1.707193399999999998e-03 +-1.734329099999999983e-03 +-1.697789600000000100e-03 +-1.626185800000000100e-03 +-1.547468100000000011e-03 +-1.445053200000000031e-03 +-1.321710700000000051e-03 +-1.192284600000000040e-03 +-1.051603699999999935e-03 +-8.991989000000000145e-04 +-7.444262999999999575e-04 +-5.881376999999999916e-04 +-4.356240999999999954e-04 +-3.007616999999999973e-04 +-1.977217000000000080e-04 +-1.258468999999999961e-04 +-7.168040000000000576e-05 +-3.684519999999999750e-05 +-2.765199999999999800e-06 +5.756420000000000021e-05 +1.248133999999999865e-04 +1.925285000000000050e-04 +2.728254999999999851e-04 +3.406503000000000070e-04 +3.931836999999999875e-04 +4.456907999999999985e-04 +4.933443999999999720e-04 +5.495251999999999949e-04 +6.303040999999999679e-04 +7.177788000000000267e-04 +8.025668999999999815e-04 +8.835912999999999710e-04 +9.544446999999999523e-04 +1.025315599999999938e-03 +1.093974300000000047e-03 +1.149237000000000002e-03 +1.185309500000000012e-03 +1.208622599999999896e-03 +1.235957599999999972e-03 +1.263695399999999929e-03 +1.285544200000000078e-03 +1.328664600000000005e-03 +1.411657599999999960e-03 +1.518045399999999904e-03 +1.637413400000000026e-03 +1.751235999999999982e-03 +1.851030700000000058e-03 +1.955084699999999967e-03 +2.057101100000000016e-03 +2.139192900000000137e-03 +2.193803900000000119e-03 +2.235731700000000155e-03 +2.279843200000000215e-03 +2.326274499999999874e-03 +2.363380300000000097e-03 +2.363366799999999830e-03 +2.318576399999999847e-03 +2.246624400000000153e-03 +2.216696099999999805e-03 +2.251130000000000058e-03 +2.298721799999999937e-03 +2.363503199999999940e-03 +2.455957300000000034e-03 +2.552790100000000128e-03 +2.651518700000000082e-03 +2.780055300000000128e-03 +2.952434299999999977e-03 +3.143585500000000126e-03 +3.337294800000000037e-03 +3.541599400000000012e-03 +3.746851399999999964e-03 +3.907678199999999567e-03 +4.006818300000000201e-03 +4.072788600000000134e-03 +4.100101400000000229e-03 +4.071515599999999714e-03 +4.013782500000000197e-03 +3.965921300000000392e-03 +3.912332400000000272e-03 +3.829244900000000184e-03 +3.732052000000000026e-03 +3.645479799999999920e-03 +3.581121500000000214e-03 +3.548145200000000013e-03 +3.597023899999999847e-03 +3.732164799999999893e-03 +3.875297900000000077e-03 +4.007227200000000426e-03 +4.135098499999999982e-03 +4.255743799999999605e-03 +4.383195500000000057e-03 +4.507326199999999936e-03 +4.621900899999999840e-03 +4.733598700000000124e-03 +4.846672500000000390e-03 +4.931515899999999904e-03 +4.950915099999999777e-03 +4.926812600000000236e-03 +4.874145400000000003e-03 +4.787179400000000050e-03 +4.691497000000000202e-03 +4.597186700000000306e-03 +4.543641299999999841e-03 +4.558038000000000367e-03 +4.584940099999999623e-03 +4.627870699999999879e-03 +4.695758500000000134e-03 +4.760693499999999606e-03 +4.844473699999999987e-03 +4.956413500000000395e-03 +5.072095599999999760e-03 +5.186436699999999803e-03 +5.282328900000000070e-03 +5.328289499999999679e-03 +5.344635900000000231e-03 +5.341923800000000430e-03 +5.304756699999999686e-03 +5.244040499999999896e-03 +5.165691000000000033e-03 +5.075350099999999774e-03 +4.987037199999999788e-03 +4.925537800000000070e-03 +4.893071500000000310e-03 +4.872921399999999813e-03 +4.880380600000000339e-03 +4.934470300000000365e-03 +5.008133500000000286e-03 +5.040945199999999869e-03 +5.000459599999999838e-03 +4.892164099999999662e-03 +4.778283599999999694e-03 +4.681353899999999950e-03 +4.602596999999999938e-03 +4.582425000000000213e-03 +4.622515699999999589e-03 +4.697709500000000170e-03 +4.777511400000000047e-03 +4.839936799999999817e-03 +4.889365199999999752e-03 +4.943661299999999904e-03 +4.993438200000000285e-03 +5.026558900000000288e-03 +5.044100699999999951e-03 +5.065588200000000277e-03 +5.092278700000000234e-03 +5.100745599999999616e-03 +5.100688899999999797e-03 +5.093655600000000089e-03 +5.041334100000000214e-03 +4.936134899999999881e-03 +4.798964900000000054e-03 +4.633313299999999683e-03 +4.479651700000000097e-03 +4.339123700000000090e-03 +4.186866600000000230e-03 +4.061537999999999954e-03 +3.966321699999999888e-03 +3.875009400000000142e-03 +3.813922300000000074e-03 +3.786949099999999992e-03 +3.713647200000000110e-03 +3.565101000000000207e-03 +3.407606699999999895e-03 +3.284487500000000167e-03 +3.200473699999999925e-03 +3.154797600000000188e-03 +3.120765599999999942e-03 +3.114896800000000084e-03 +3.165513000000000007e-03 +3.230386999999999929e-03 +3.245338799999999795e-03 +3.183748299999999802e-03 +3.107802499999999957e-03 +3.055663799999999968e-03 +3.019617000000000048e-03 +3.023921699999999966e-03 +3.039926899999999960e-03 +3.052590799999999830e-03 +3.080244000000000211e-03 +3.086373600000000099e-03 +3.055878000000000153e-03 +2.997749400000000210e-03 +2.888234099999999974e-03 +2.756671300000000137e-03 +2.688888799999999794e-03 +2.680484199999999973e-03 +2.681645099999999896e-03 +2.691954400000000011e-03 +2.706406800000000015e-03 +2.699477599999999811e-03 +2.679838600000000130e-03 +2.678533500000000039e-03 +2.711664600000000119e-03 +2.781946999999999892e-03 +2.860833699999999931e-03 +2.922910099999999952e-03 +2.950873799999999963e-03 +2.928505300000000186e-03 +2.873327000000000173e-03 +2.804908799999999893e-03 +2.735227199999999866e-03 +2.701208200000000149e-03 +2.719240099999999973e-03 +2.774147800000000084e-03 +2.869183400000000113e-03 +3.000677900000000078e-03 +3.092216000000000062e-03 +3.124004699999999909e-03 +3.159498900000000041e-03 +3.173296999999999837e-03 +3.162315199999999812e-03 +3.171274700000000207e-03 +3.175510500000000048e-03 +3.153535099999999879e-03 +3.122186600000000090e-03 +3.074158999999999919e-03 +2.995952599999999848e-03 +2.904015099999999842e-03 +2.839504100000000107e-03 +2.809479000000000143e-03 +2.773141299999999903e-03 +2.712966700000000054e-03 +2.641300000000000071e-03 +2.547221499999999857e-03 +2.428812299999999914e-03 +2.325799500000000092e-03 +2.244665900000000162e-03 +2.178695200000000092e-03 +2.132728200000000036e-03 +2.108651599999999786e-03 +2.115625700000000123e-03 +2.136939200000000094e-03 +2.147812700000000050e-03 +2.156377100000000154e-03 +2.171696199999999938e-03 +2.200305899999999929e-03 +2.262444699999999979e-03 +2.332042700000000121e-03 +2.379403799999999826e-03 +2.385309300000000056e-03 +2.345719200000000084e-03 +2.284988899999999823e-03 +2.181028900000000093e-03 +2.024017700000000156e-03 +1.887348899999999937e-03 +1.804967599999999974e-03 +1.743811999999999966e-03 +1.690675300000000093e-03 +1.648111899999999937e-03 +1.617845199999999985e-03 +1.556875400000000019e-03 +1.465917300000000060e-03 +1.374456399999999948e-03 +1.244918700000000045e-03 +1.097017999999999951e-03 +9.946851999999999951e-04 +9.301865000000000090e-04 +8.782751000000000099e-04 +8.449977999999999483e-04 +8.344854999999999981e-04 +8.486734000000000118e-04 +8.830093999999999487e-04 +9.051067999999999787e-04 +9.046816999999999749e-04 +8.905127000000000095e-04 +8.588361000000000085e-04 +8.094429999999999681e-04 +7.448565999999999998e-04 +6.795145000000000482e-04 +6.249235999999999810e-04 +5.719616999999999757e-04 +5.147104999999999909e-04 +4.529170999999999805e-04 +3.853807000000000218e-04 +3.200860000000000250e-04 +2.687422999999999765e-04 +2.562652999999999806e-04 +2.675269000000000084e-04 +2.688354000000000112e-04 +2.661060000000000031e-04 +2.637938000000000153e-04 +2.654658999999999752e-04 +2.784773000000000044e-04 +2.952381999999999815e-04 +3.083097999999999937e-04 +3.233023000000000233e-04 +3.534912000000000080e-04 +4.166272999999999743e-04 +4.504085000000000228e-04 +4.080369000000000032e-04 +3.435887999999999790e-04 +3.338290000000000051e-04 +4.128585999999999845e-04 +5.337427000000000490e-04 +6.514563000000000124e-04 +6.985927999999999973e-04 +6.280697000000000016e-04 +4.647032000000000268e-04 +2.905766999999999855e-04 +2.712271999999999838e-04 +4.053085999999999907e-04 +5.156416999999999728e-04 +5.555493000000000106e-04 +5.464060999999999658e-04 +4.924171000000000190e-04 +4.807179000000000074e-04 +5.461446999999999483e-04 +6.015270999999999552e-04 +6.267377999999999881e-04 +6.615974000000000160e-04 +7.064655999999999670e-04 +7.618399999999999565e-04 +8.332444000000000482e-04 +9.094796999999999517e-04 +9.935655000000000268e-04 +1.095196699999999908e-03 +1.229685899999999983e-03 +1.400317199999999949e-03 +1.552711600000000009e-03 +1.638409800000000015e-03 +1.648194699999999983e-03 +1.614169200000000002e-03 +1.562943100000000049e-03 +1.487962800000000065e-03 +1.392870499999999999e-03 +1.261806199999999933e-03 +1.088431599999999935e-03 +8.940769000000000320e-04 +7.161294999999999814e-04 +6.106494000000000288e-04 +5.783093000000000435e-04 +5.789417000000000478e-04 +6.053353000000000249e-04 +6.710534999999999677e-04 +7.600859999999999865e-04 +8.372381999999999828e-04 +8.855757000000000125e-04 +9.049338999999999994e-04 +8.977243999999999459e-04 +8.713514999999999802e-04 +8.568579999999999470e-04 +8.859125000000000463e-04 +9.401321000000000244e-04 +9.863307999999999451e-04 +1.007741500000000102e-03 +1.009434000000000026e-03 +1.012611999999999974e-03 +1.006670099999999908e-03 +9.486785999999999873e-04 +8.460139000000000417e-04 +7.636414000000000439e-04 +7.129070999999999629e-04 +6.991932999999999655e-04 +7.073796000000000467e-04 +6.415589999999999878e-04 +5.058181000000000352e-04 +4.657326999999999734e-04 +5.333214000000000400e-04 +6.087974999999999593e-04 +6.772177000000000535e-04 +7.445442000000000466e-04 +8.337302000000000428e-04 +9.338515000000000357e-04 +1.041628800000000011e-03 +1.140301100000000066e-03 +1.190010899999999899e-03 +1.241514900000000076e-03 +1.319628100000000024e-03 +1.381506499999999964e-03 +1.412604000000000030e-03 +1.398393900000000035e-03 +1.366448599999999913e-03 +1.383234199999999964e-03 +1.431888999999999992e-03 +1.461144499999999895e-03 +1.479967000000000001e-03 +1.501692300000000103e-03 +1.508726900000000037e-03 +1.499340399999999967e-03 +1.471050700000000027e-03 +1.414510199999999968e-03 +1.358520900000000087e-03 +1.365672199999999918e-03 +1.434567899999999964e-03 +1.520507300000000037e-03 +1.645114299999999924e-03 +1.821991600000000006e-03 +1.990881800000000174e-03 +2.074531699999999923e-03 +2.064727100000000176e-03 +1.993356999999999855e-03 +1.872529699999999969e-03 +1.788015200000000072e-03 +1.806927999999999963e-03 +1.807665699999999988e-03 +1.727258900000000052e-03 +1.637481600000000080e-03 +1.539695999999999903e-03 +1.414847400000000029e-03 +1.317829099999999996e-03 +1.279476500000000048e-03 +1.259910799999999992e-03 +1.256518899999999961e-03 +1.287149200000000087e-03 +1.341600299999999970e-03 +1.376959299999999968e-03 +1.334942599999999974e-03 +1.241181600000000043e-03 +1.158963600000000038e-03 +1.078053800000000097e-03 +1.024010299999999997e-03 +1.028055799999999997e-03 +1.039583499999999910e-03 +1.067268300000000008e-03 +1.161281899999999992e-03 +1.317019399999999922e-03 +1.523021999999999961e-03 +1.774686900000000019e-03 +2.011330799999999815e-03 +2.102722899999999884e-03 +2.012991799999999838e-03 +1.832190899999999907e-03 +1.663714800000000004e-03 +1.578778199999999934e-03 +1.548596599999999945e-03 +1.531532300000000048e-03 +1.530845799999999918e-03 +1.542606100000000003e-03 +1.517960999999999963e-03 +1.422531400000000019e-03 +1.312429599999999927e-03 +1.218666599999999964e-03 +1.146139100000000046e-03 +1.151716099999999928e-03 +1.210360200000000020e-03 +1.222362600000000046e-03 +1.195853399999999896e-03 +1.222873499999999926e-03 +1.335383299999999985e-03 +1.478119599999999948e-03 +1.559508899999999905e-03 +1.540312299999999947e-03 +1.469419999999999928e-03 +1.359788000000000012e-03 +1.238815600000000086e-03 +1.188508299999999898e-03 +1.188812200000000097e-03 +1.161094600000000089e-03 +1.108548200000000067e-03 +1.068835400000000104e-03 +1.025055100000000011e-03 +9.455244999999999492e-04 +8.379175000000000425e-04 +7.558880999999999500e-04 +7.575966000000000167e-04 +8.175809999999999501e-04 +8.926223999999999530e-04 +1.002047299999999936e-03 +1.132633600000000065e-03 +1.267626599999999984e-03 +1.400023600000000010e-03 +1.424558200000000099e-03 +1.356544899999999982e-03 +1.314545999999999987e-03 +1.241441100000000063e-03 +1.126674200000000103e-03 +1.054869300000000048e-03 +9.929614000000000235e-04 +9.306205000000000119e-04 +9.040898000000000120e-04 +8.904205000000000106e-04 +8.335273000000000248e-04 +7.251904999999999680e-04 +6.390032999999999607e-04 +5.652552999999999614e-04 +4.993626000000000358e-04 +5.109119999999999764e-04 +5.551116999999999727e-04 +5.204867999999999648e-04 +4.291033999999999886e-04 +3.645488000000000222e-04 +2.996620000000000186e-04 +2.087666000000000012e-04 +1.265681000000000054e-04 +4.280369999999999813e-05 +-6.120180000000000075e-05 +-1.545015999999999913e-04 +-2.253830999999999868e-04 +-2.989069000000000231e-04 +-3.781050999999999791e-04 +-4.482883000000000224e-04 +-5.122940999999999780e-04 +-5.362528000000000303e-04 +-4.781224000000000151e-04 +-3.792517000000000132e-04 +-3.205268999999999957e-04 +-3.138047999999999944e-04 +-3.028026000000000068e-04 +-2.418795000000000005e-04 +-1.304358000000000091e-04 +-7.408340000000000292e-05 +-9.841709999999999662e-05 +-1.072263000000000003e-04 +-9.647439999999999911e-05 +-1.032688000000000030e-04 +-1.454098999999999984e-04 +-2.478339000000000193e-04 +-3.989826000000000245e-04 +-5.466705000000000305e-04 +-6.554309000000000133e-04 +-7.300021000000000287e-04 +-7.844781999999999797e-04 +-8.270019000000000415e-04 +-8.702364999999999884e-04 +-9.043150000000000450e-04 +-9.277852000000000494e-04 +-9.602236999999999795e-04 +-9.727219000000000490e-04 +-9.449763999999999603e-04 +-9.207484000000000154e-04 +-9.047715000000000228e-04 +-8.714035000000000400e-04 +-8.569463000000000254e-04 +-8.949456999999999855e-04 +-9.575795000000000227e-04 +-1.037899899999999986e-03 +-1.149642900000000072e-03 +-1.260233699999999948e-03 +-1.347245699999999975e-03 +-1.418083400000000023e-03 +-1.470863300000000090e-03 +-1.505205300000000013e-03 +-1.522635999999999955e-03 +-1.538064399999999931e-03 +-1.594145900000000027e-03 +-1.685392100000000001e-03 +-1.779576900000000034e-03 +-1.894506000000000011e-03 +-2.039295799999999836e-03 +-2.170771499999999896e-03 +-2.234308400000000090e-03 +-2.222182799999999903e-03 +-2.146627300000000012e-03 +-2.030973000000000153e-03 +-1.925060300000000025e-03 +-1.827965300000000074e-03 +-1.760211999999999931e-03 +-1.742159799999999908e-03 +-1.724325700000000098e-03 +-1.716386999999999991e-03 +-1.709921899999999970e-03 +-1.631609299999999896e-03 +-1.517076000000000015e-03 +-1.419740899999999938e-03 +-1.356228599999999892e-03 +-1.346858100000000074e-03 +-1.345378499999999892e-03 +-1.355553999999999917e-03 +-1.399412500000000005e-03 +-1.406242399999999958e-03 +-1.350450399999999921e-03 +-1.310568000000000019e-03 +-1.289360600000000016e-03 +-1.236696100000000053e-03 +-1.170204499999999946e-03 +-1.098606000000000018e-03 +-1.023562700000000018e-03 +-9.881212000000000762e-04 +-9.895761000000000748e-04 +-9.972082999999999642e-04 +-1.001752100000000102e-03 +-9.806228000000000600e-04 +-9.023650000000000247e-04 +-7.853044999999999687e-04 +-7.013762000000000425e-04 +-7.051571000000000184e-04 +-7.636688999999999890e-04 +-8.333315000000000427e-04 +-8.936726999999999995e-04 +-9.206514000000000060e-04 +-9.460398999999999545e-04 +-9.662222999999999732e-04 +-9.545841000000000005e-04 +-9.231994000000000094e-04 +-8.737163999999999955e-04 +-8.005109000000000270e-04 +-7.065522000000000078e-04 +-5.947063999999999953e-04 +-5.019516999999999599e-04 +-4.746133000000000253e-04 +-4.504907000000000269e-04 +-3.809498999999999828e-04 +-3.278026999999999981e-04 +-2.992816000000000248e-04 +-2.607369000000000006e-04 +-2.163401999999999925e-04 +-1.734008999999999952e-04 +-1.280559000000000016e-04 +-7.926550000000000197e-05 +-3.162239999999999729e-05 +8.981299999999999882e-06 +4.799460000000000293e-05 +9.198690000000000523e-05 +1.351476000000000001e-04 +1.744244000000000100e-04 +2.125326999999999989e-04 +2.568496999999999881e-04 +3.086558000000000205e-04 +3.620639000000000149e-04 +4.187371999999999861e-04 +4.807742000000000157e-04 +5.475373999999999866e-04 +6.193534999999999579e-04 +6.719968999999999899e-04 +6.667090000000000299e-04 +6.215433000000000026e-04 +5.696158000000000428e-04 +5.164872000000000039e-04 +4.745880000000000172e-04 +4.512313000000000109e-04 +4.449750999999999945e-04 +4.592466999999999817e-04 +4.995212000000000176e-04 +5.600937999999999533e-04 +5.993682000000000393e-04 +6.119667000000000509e-04 +6.441269999999999808e-04 +6.824370999999999649e-04 +7.077576000000000353e-04 +7.547346999999999823e-04 +8.358378999999999549e-04 +9.280151999999997677e-04 +1.003983699999999764e-03 +1.047299299999999685e-03 +1.083160199999999747e-03 +1.120751299999999794e-03 +1.137729999999999774e-03 +1.136947899999999788e-03 +1.124204599999999729e-03 +1.099676999999999859e-03 +1.061375599999999806e-03 +1.036642899999999819e-03 +1.076086699999999775e-03 +1.143727199999999833e-03 +1.146295399999999786e-03 +1.062260599999999755e-03 +9.639232999999997704e-04 +8.594782999999997768e-04 +7.295562999999999050e-04 +6.365696999999999372e-04 +5.917154999999998813e-04 +5.728997999999999252e-04 +5.932441999999998926e-04 +6.548514999999998677e-04 +7.271032999999998796e-04 +8.025291999999998108e-04 +8.882262999999997665e-04 +9.611577999999997577e-04 +1.017662799999999746e-03 +1.080312399999999642e-03 +1.171844599999999565e-03 +1.283368599999999346e-03 +1.388277199999999245e-03 +1.464472399999999352e-03 +1.502999799999999277e-03 +1.528273699999999286e-03 +1.551998299999999414e-03 +1.566177899999999417e-03 +1.564132599999999316e-03 +1.546792699999999330e-03 +1.525229299999999360e-03 +1.540193199999999448e-03 +1.599233899999998824e-03 +1.666876199999998845e-03 +1.717586399999998948e-03 +1.740264399999998882e-03 +1.756853899999998849e-03 +1.769541599999998813e-03 +1.762286699999998998e-03 +1.749231999999999003e-03 +1.755842299999998881e-03 +1.767905699999998458e-03 +1.768768999999998379e-03 +1.781002099999998579e-03 +1.804070899999998421e-03 +1.819417099999998556e-03 +1.822236499999998517e-03 +1.790823199999998097e-03 +1.722024699999998021e-03 +1.640357099999998356e-03 +1.617952999999998365e-03 +1.659254199999998314e-03 +1.612859499999998343e-03 +1.465684599999998120e-03 +1.303924999999998315e-03 +1.107696699999998532e-03 +9.048074999999988549e-04 +7.746771999999988584e-04 +7.350677999999988103e-04 +7.788242999999988106e-04 +9.090031999999985748e-04 +1.061872799999998051e-03 +1.131925299999998139e-03 +1.180875099999997933e-03 +1.281912699999997489e-03 +1.403294899999997080e-03 +1.531143099999996999e-03 +1.636199999999996295e-03 +1.723573799999996098e-03 +1.815750199999995604e-03 +1.904862299999995554e-03 +1.997474699999995419e-03 +2.097050899999994278e-03 +2.176044999999994511e-03 +2.186742199999993329e-03 +2.083195799999994127e-03 +1.926732799999993995e-03 +1.774212599999994621e-03 +1.633694099999994601e-03 +1.559930199999994384e-03 +1.566864599999994410e-03 +1.638762599999993687e-03 +1.776047899999992933e-03 +1.992820499999992112e-03 +2.281710499999990358e-03 +2.554511699999988724e-03 +2.734487399999987849e-03 +2.857202499999986385e-03 +2.960035599999985643e-03 +3.025348399999984277e-03 +3.038380999999984108e-03 +2.999869699999983385e-03 +2.915072499999983146e-03 +2.819977099999983108e-03 +2.722580399999983275e-03 +2.618368199999982979e-03 +2.540720699999983109e-03 +2.481825199999983158e-03 +2.423435499999982215e-03 +2.382350699999982117e-03 +2.375024199999981305e-03 +2.402519999999980053e-03 +2.460314399999979224e-03 +2.520736599999978504e-03 +2.550209399999976614e-03 +2.569414399999975316e-03 +2.579817299999974823e-03 +2.559591199999973997e-03 +2.516830199999973029e-03 +2.448196999999972725e-03 +2.371210899999972883e-03 +2.348621199999971834e-03 +2.380140799999970556e-03 +2.428672999999968891e-03 +2.459888399999967095e-03 +2.431195599999966088e-03 +2.384959199999965671e-03 +2.355435699999964584e-03 +2.341129899999963397e-03 +2.342505299999961873e-03 +2.345228599999960722e-03 +2.357120199999958744e-03 +2.386964699999956536e-03 +2.426123199999954180e-03 +2.431430999999952252e-03 +2.392278899999951153e-03 +2.360465299999950188e-03 +2.346987099999948458e-03 +2.322924299999946842e-03 +2.290064199999945933e-03 +2.252706499999944378e-03 +2.202829699999943758e-03 +2.124098099999943267e-03 +2.011740399999943901e-03 +1.898763499999945236e-03 +1.827412699999945208e-03 +1.782263999999944473e-03 +1.731369299999944338e-03 +1.677317799999943895e-03 +1.605261399999944162e-03 +1.524828199999944765e-03 +1.454808899999945372e-03 +1.415010199999944740e-03 +1.406755599999942727e-03 +1.407815599999940551e-03 +1.413640899999938152e-03 +1.394504799999936491e-03 +1.353042699999936101e-03 +1.324137699999934940e-03 +1.299385799999933609e-03 +1.266727099999932857e-03 +1.226966899999932343e-03 +1.145219499999934306e-03 +1.012513999999939667e-03 +8.866053999999452210e-04 +7.847162999999496595e-04 +7.150146999999523528e-04 +7.275329999999496271e-04 +8.232269999999408542e-04 +9.329835999999303497e-04 +9.989577999999226139e-04 +1.001539699999919432e-03 +9.538417999999202358e-04 +8.556794999999255006e-04 +7.151822999999353460e-04 +6.260192999999412413e-04 +5.945441999999419736e-04 +5.403706999999452476e-04 +4.800050999999494927e-04 +4.456515999999513403e-04 +4.198301999999523603e-04 +3.985254999999530046e-04 +3.893665999999523764e-04 +3.888082999999504814e-04 +3.962213999999476474e-04 +4.141650999999431978e-04 +4.462396999999364007e-04 +4.923466999999270063e-04 +5.437769999999163620e-04 +5.753685999999081941e-04 +5.926140999999016850e-04 +6.148225999998940643e-04 +6.345950999998863605e-04 +6.744374999998746815e-04 +7.339377999998583950e-04 +7.892926999998417601e-04 +8.451879999998238979e-04 +9.031654999998046246e-04 +9.649186999997831204e-04 +1.030914899999759576e-03 +1.098243699999734008e-03 +1.164373799999707118e-03 +1.202261099999685874e-03 +1.198271299999674943e-03 +1.172752699999669553e-03 +1.126604199999670271e-03 +1.057977199999678370e-03 +9.717230999996931710e-04 +8.761392999997126346e-04 +7.890961999997312759e-04 +7.179827999997460660e-04 +6.648968999997558176e-04 +6.261302999997611684e-04 +5.859918999997678615e-04 +5.302978999997819435e-04 +4.750443999997970524e-04 +4.268922999998105887e-04 +3.705843999998293488e-04 +3.122387999998506541e-04 +2.530739999998742832e-04 +1.909268999999015170e-04 +1.349695999999277001e-04 +8.268589999995399654e-05 +2.447779999998586607e-05 +-4.041859999997576087e-05 +-1.080826999999326789e-04 +-1.786723999998844788e-04 +-2.552677999998285833e-04 +-3.395901999997631899e-04 +-4.455052999996775092e-04 +-5.914024999995554175e-04 +-7.384622999994236913e-04 +-8.261291999993304559e-04 +-8.702471999992675723e-04 +-9.181790999991978116e-04 +-1.019042599999075331e-03 +-1.154132799998912589e-03 +-1.276299899998751576e-03 +-1.411654399998566204e-03 +-1.531813999998384804e-03 +-1.607559299998239950e-03 +-1.704211999998062619e-03 +-1.850390499997815871e-03 +-2.005492599997542313e-03 +-2.148472899997266611e-03 +-2.270543999997000871e-03 +-2.373848599996743712e-03 +-2.468094299996485656e-03 +-2.541495099996242575e-03 +-2.587693799996028474e-03 +-2.617705799995828381e-03 +-2.627251399995653072e-03 +-2.632671699995478305e-03 +-2.671057799995236841e-03 +-2.712926599994977799e-03 +-2.743092099994727702e-03 +-2.795159499994422786e-03 +-2.871451599994051963e-03 +-2.965017199993623571e-03 +-3.016145399993266831e-03 +-2.986926099993077177e-03 +-2.959699799992878463e-03 +-2.974756099992569621e-03 +-2.993731999992236929e-03 +-2.996108799991935041e-03 +-2.999090699991619185e-03 +-3.009240399991270840e-03 +-3.013415899990925725e-03 +-3.028857899990532003e-03 +-3.105791599989921568e-03 +-3.179148899989291122e-03 +-3.183296199988868737e-03 +-3.189494699988422877e-03 +-3.216359499987881190e-03 +-3.242618699987317738e-03 +-3.271004599986720128e-03 +-3.299050799986096884e-03 +-3.326618899985447648e-03 +-3.354370899984769182e-03 +-3.380336899984068017e-03 +-3.410061699983316791e-03 +-3.446346699982498919e-03 +-3.479313599981661079e-03 +-3.493192799980887955e-03 +-3.476546899980257482e-03 +-3.446830199979683106e-03 +-3.420648699979072192e-03 +-3.381857299978524491e-03 +-3.330480599978048392e-03 +-3.282267399977545179e-03 +-3.235774899977024617e-03 +-3.213838499976314801e-03 +-3.215022099975408266e-03 +-3.211934199974500557e-03 +-3.232493199973364602e-03 +-3.278248899971964239e-03 +-3.306280299970653334e-03 +-3.323683199969382652e-03 +-3.363041299967846343e-03 +-3.406067099966202452e-03 +-3.403625299964948246e-03 +-3.389082399963777234e-03 +-3.392695499962366471e-03 +-3.376588099961128162e-03 +-3.357017799959892065e-03 +-3.362205799958311453e-03 +-3.375903999956558939e-03 +-3.376617599954907095e-03 +-3.367232099953332888e-03 +-3.345518499951882427e-03 +-3.302401699950708452e-03 +-3.241567099949788783e-03 +-3.178207899948910699e-03 +-3.124588799947876361e-03 +-3.068777699946875163e-03 +-3.017355099945793605e-03 +-3.014819899943795879e-03 +-3.060468299940791604e-03 +-3.117359899937415923e-03 +-3.148962899934397777e-03 +-3.117442299932605444e-03 +-3.064933999931242561e-03 +-3.033056399929392674e-03 +-3.011967099927241338e-03 +-3.007513799924612079e-03 +-3.014774499921583743e-03 +-3.030976099918192539e-03 +-3.049485199914593343e-03 +-3.059137199911097192e-03 +-3.058911499907757646e-03 +-3.037356399904960012e-03 +-3.007772299902344848e-03 +-2.978550799899655141e-03 +-2.926702999897693499e-03 +-2.855791499896417548e-03 +-2.783874299895229727e-03 +-2.715863199893947099e-03 +-2.652013799892547971e-03 +-2.599267699890727562e-03 +-2.562832099888211115e-03 +-2.551257399884535558e-03 +-2.550010199880257435e-03 +-2.520606699877193414e-03 +-2.481226499874573596e-03 +-2.466487499870638651e-03 +-2.481336099864975449e-03 +-2.508201599858392826e-03 +-2.520541699852357331e-03 +-2.511627399847360734e-03 +-2.475830099843894048e-03 +-2.422996199841496827e-03 +-2.383431999838240504e-03 +-2.381138699832338872e-03 +-2.376729199826378269e-03 +-2.343756799822372186e-03 +-2.317158099817809985e-03 +-2.293368699812926414e-03 +-2.244436399810062488e-03 +-2.167940899809667459e-03 +-2.094589299809223887e-03 +-2.039593799807280436e-03 +-1.994039299804535332e-03 +-1.969305799799737910e-03 +-1.956566099793591654e-03 +-1.938053799787898580e-03 +-1.928898999781007619e-03 +-1.946000499770807017e-03 +-1.979217599758182483e-03 +-2.013901199744750053e-03 +-2.051624399730253828e-03 +-2.087628299715266721e-03 +-2.089084599704426476e-03 +-2.057348299698047705e-03 +-2.038387699689661690e-03 +-2.024238399680312103e-03 +-2.000120399672332752e-03 +-1.989606299661893490e-03 +-1.978796799651185226e-03 +-1.930803099646951097e-03 +-1.863301099646588006e-03 +-1.791874499647463752e-03 +-1.720037499648982126e-03 +-1.669942999646503376e-03 +-1.613444199645736260e-03 +-1.523744199652966522e-03 +-1.427729799662721434e-03 +-1.345747099670248619e-03 +-1.290489699672013818e-03 +-1.257198699668579103e-03 +-1.226059299664757464e-03 +-1.194416999661255261e-03 +-1.137314699665448138e-03 +-1.049752099679717755e-03 +-9.633684996951412047e-04 +-8.833811997100576591e-04 +-8.281411997180821447e-04 +-8.121824997132369873e-04 +-8.016930997064200103e-04 +-7.784386997043427547e-04 +-7.563329997020659971e-04 +-7.334912997003307025e-04 +-7.070212997004172127e-04 +-6.802433997010608495e-04 +-6.452443997059140960e-04 +-5.938522997192905838e-04 +-5.286564997408342874e-04 +-4.596828997662857777e-04 +-4.202455997784101233e-04 +-4.136611997737917566e-04 +-3.973955997746275184e-04 +-3.849712997735786927e-04 +-3.952938997588887715e-04 +-4.086908997414778473e-04 +-4.234578997222106017e-04 +-4.272981997093060051e-04 +-4.128090997087599501e-04 +-3.997738997075104476e-04 +-3.734631997166424603e-04 +-2.995837997642816232e-04 +-2.069063998311759269e-04 +-1.453282998770316962e-04 +-9.165389991957822655e-05 +-2.569909997661608270e-05 +3.419019996773921543e-05 +9.162239991035089903e-05 +1.490463998487714253e-04 +1.964023997933551945e-04 +2.317240997471800719e-04 +2.599962997058513051e-04 +2.793221996723110000e-04 +2.778191996620343602e-04 +2.661454996642775308e-04 +2.668126996510076002e-04 +2.683991996359710061e-04 +2.592277996354318205e-04 +2.369586996544511865e-04 +1.950049997051376877e-04 +1.415722997780344196e-04 +8.991559985382487834e-05 +4.254979992827605923e-05 +-4.030399992955664456e-06 +-2.647239995202580300e-05 +-1.158619997822916376e-05 +-5.326699989622109309e-06 +-4.236299991442409274e-05 +-8.411419982382461623e-05 +-1.041137997739041780e-04 +-1.216852997260143779e-04 +-1.391899996750621700e-04 +-1.562115996219012436e-04 +-1.771730995553823631e-04 +-2.052828994658837639e-04 +-2.414019993487988920e-04 +-2.775153992238427745e-04 +-3.113239990972638651e-04 +-3.448964989631407964e-04 +-3.813560988113838925e-04 +-4.415111985733097136e-04 +-5.360649982041101316e-04 +-6.637427976946678500e-04 +-7.883309971613562629e-04 +-8.794188967170531255e-04 +-9.732825962332225262e-04 +-1.063439195733185310e-03 +-1.119616695342875870e-03 +-1.159246795001049645e-03 +-1.187936594689348009e-03 +-1.210938194387900036e-03 +-1.257698893957368219e-03 +-1.309307593478697615e-03 +-1.343306993064012156e-03 +-1.375081192639641871e-03 +-1.387314392301958231e-03 +-1.352696992218956756e-03 +-1.324386792102652012e-03 +-1.341882291705175827e-03 +-1.358484791294954338e-03 +-1.368317290910839226e-03 +-1.386029790456066047e-03 +-1.408326289947519879e-03 +-1.471991789108502251e-03 +-1.581845987867344042e-03 +-1.700510186479972218e-03 +-1.812300985064060899e-03 +-1.900618483763282874e-03 +-1.979764882468658654e-03 +-2.062895781064609177e-03 +-2.141603679623539473e-03 +-2.229990878007095684e-03 +-2.326172176220188230e-03 +-2.409710174466189129e-03 +-2.478715672775556877e-03 +-2.545506971020875149e-03 +-2.614971169142995839e-03 +-2.681632167201109928e-03 +-2.740402165258822107e-03 +-2.793690963290699960e-03 +-2.853675561134250572e-03 +-2.920541058772433991e-03 +-2.982663356359696941e-03 +-3.040642153888931630e-03 +-3.097877151307997130e-03 +-3.153842048621175245e-03 +-3.214273445728097357e-03 +-3.271675642745756722e-03 +-3.301102840125909581e-03 +-3.311108437756653082e-03 +-3.318256535350322996e-03 +-3.312286333116595295e-03 +-3.293314831078445089e-03 +-3.265435029174213518e-03 +-3.233225427320469969e-03 +-3.219532224994710139e-03 +-3.222662322190229193e-03 +-3.186761920258133780e-03 +-3.100871419585343736e-03 +-3.062354917696392172e-03 +-3.081096814182110368e-03 +-3.090382010794626502e-03 +-3.111327106926056220e-03 +-3.145846402473915625e-03 +-3.163868198351793126e-03 +-3.171327194411240405e-03 +-3.176692890391457236e-03 +-3.169515686668184038e-03 +-3.157190783010528200e-03 +-3.152444978946397375e-03 +-3.154659874465171911e-03 +-3.190719068423299425e-03 +-3.261546460623368157e-03 +-3.325347452742765351e-03 +-3.376835345039875917e-03 +-3.438206836503004526e-03 +-3.505543027257966137e-03 +-3.564361917993575084e-03 +-3.612959008826626284e-03 +-3.641594100330098564e-03 +-3.637647993321319224e-03 +-3.609247087507884075e-03 +-3.576415481816141127e-03 +-3.564162974691328142e-03 +-3.581903465373432929e-03 +-3.605613955272516605e-03 +-3.598552646913579650e-03 +-3.551235541205416228e-03 +-3.475740237544912726e-03 +-3.392459634569019306e-03 +-3.346534428694425845e-03 +-3.317998621283051001e-03 +-3.264321515880444415e-03 +-3.216797909898309882e-03 +-3.187932902113240971e-03 +-3.158361694214629947e-03 +-3.132712885742603131e-03 +-3.119171675801099552e-03 +-3.101612765986173480e-03 +-3.065911057911637882e-03 +-3.021097850744954450e-03 +-2.982785442730180158e-03 +-2.960144532649257657e-03 +-2.944257821439927834e-03 +-2.935758808918226357e-03 +-2.945434693479817654e-03 +-2.965075676014229580e-03 +-2.973373059500964127e-03 +-2.962426345304705177e-03 +-2.939767432522740528e-03 +-2.898585222464695500e-03 +-2.839537915341025683e-03 +-2.794506205848495354e-03 +-2.776123191422061928e-03 +-2.759128476337194963e-03 +-2.738280761586321405e-03 +-2.726921744522625181e-03 +-2.725252324886854021e-03 +-2.732461902619758715e-03 +-2.743066278729846229e-03 +-2.740871856901257609e-03 +-2.731236836118879161e-03 +-2.722117714547793790e-03 +-2.707567593704897010e-03 +-2.688584573451695357e-03 +-2.666140053628671385e-03 +-2.640047334381897572e-03 +-2.611307515515648176e-03 +-2.581864096505833827e-03 +-2.551398477477053849e-03 +-2.516924859461406802e-03 +-2.479498842238999582e-03 +-2.444348424053107999e-03 +-2.416161603087200408e-03 +-2.392847279876536039e-03 +-2.371117055529705676e-03 +-2.346576231785763716e-03 +-2.313899911036738141e-03 +-2.278709191163951712e-03 +-2.232912076007640377e-03 +-2.164667271730491300e-03 +-2.083199374974510198e-03 +-2.000968780166032142e-03 +-1.925697783376994869e-03 +-1.851428087584922402e-03 +-1.794596783526859144e-03 +-1.771118660914556718e-03 +-1.755097133461216204e-03 +-1.748129999681459533e-03 +-1.750789558580787301e-03 +-1.742522923333001458e-03 +-1.734173687089303082e-03 +-1.731285945809469965e-03 +-1.723987006446182739e-03 +-1.719686063549720392e-03 +-1.731079806614882911e-03 +-1.764353429085501693e-03 +-1.820109828390928646e-03 +-1.893098506978165355e-03 +-1.967919277211139292e-03 +-2.027389655072672856e-03 +-2.049888063282980129e-03 +-2.039757701007678236e-03 +-2.030698135753667040e-03 +-2.021899768240845684e-03 +-2.024795385311477843e-03 +-2.049594673387418377e-03 +-2.083982944681728091e-03 +-2.135698287895293652e-03 +-2.206646197900442603e-03 +-2.279557195151042659e-03 +-2.330878712109233329e-03 +-2.369937837899119357e-03 +-2.408538256164944290e-03 +-2.436675282293339871e-03 +-2.453680418745208397e-03 +-2.451821580113444123e-03 +-2.432008867925443147e-03 +-2.428918222862857038e-03 +-2.449373928920221908e-03 +-2.460617544549987580e-03 +-2.452109392407589555e-03 +-2.437611347903979615e-03 +-2.421669302460415212e-03 +-2.400678764314726366e-03 +-2.381616718510848503e-03 +-2.365743261518161739e-03 +-2.347754705545845779e-03 +-2.338855022415781398e-03 +-2.346512089806373959e-03 +-2.365141118183955969e-03 +-2.386836026441578346e-03 +-2.400561745614520921e-03 +-2.398368001871683045e-03 +-2.377919007280797532e-03 +-2.359960899989967022e-03 +-2.352891850681580917e-03 +-2.339589515231505889e-03 +-2.322904385385298962e-03 +-2.313455222441920638e-03 +-2.308904832459273467e-03 +-2.303138737767389428e-03 +-2.297445633205377410e-03 +-2.293537111054804248e-03 +-2.288317584000707384e-03 +-2.284780038473854455e-03 +-2.300506089152052399e-03 +-2.336270922013267484e-03 +-2.366009859509576006e-03 +-2.384852329656702349e-03 +-2.404225174667138244e-03 +-2.420663613060543284e-03 +-2.433419850069324861e-03 +-2.453445420205229398e-03 +-2.478320633173379615e-03 +-2.492731384871971732e-03 +-2.492285111092171386e-03 +-2.489200435750459160e-03 +-2.483145262523273489e-03 +-2.462587179775350878e-03 +-2.433515251838865544e-03 +-2.401892837458239130e-03 +-2.365952453602259645e-03 +-2.336365412006876936e-03 +-2.315917782210556112e-03 +-2.295788337349175933e-03 +-2.280845830232574190e-03 +-2.269226873889409243e-03 +-2.248790589211757153e-03 +-2.208688900688869292e-03 +-2.154836365116229169e-03 +-2.124746971325545443e-03 +-2.120708364838311700e-03 +-2.112150786982264650e-03 +-2.098083955256880694e-03 +-2.088179149666971428e-03 +-2.084034742325742776e-03 +-2.082862863449554472e-03 +-2.079430683699365519e-03 +-2.067343901577260463e-03 +-2.036018494577476745e-03 +-1.991042603626038635e-03 +-1.949540566657241786e-03 +-1.911854372962654407e-03 +-1.880331674784916805e-03 +-1.851721121690614582e-03 +-1.820154221113528571e-03 +-1.792331546628592306e-03 +-1.769054174717739781e-03 +-1.745434399972801108e-03 +-1.720875936522368085e-03 +-1.696994950031950307e-03 +-1.673708441237779700e-03 +-1.653759042118873365e-03 +-1.639243091511943069e-03 +-1.623050060991726874e-03 +-1.602378230635160281e-03 +-1.583734230712069077e-03 +-1.569701280580630296e-03 +-1.557380453254191477e-03 +-1.542872164088625537e-03 +-1.526511608878226844e-03 +-1.509138965591022867e-03 +-1.485622814462897977e-03 +-1.455509293977659069e-03 +-1.419750394574845892e-03 +-1.375425751501722612e-03 +-1.319344027992808447e-03 +-1.248431402702526206e-03 +-1.183380368720415680e-03 +-1.135367718316298777e-03 +-1.083793815784888205e-03 +-1.029773431321125187e-03 +-9.855487883015494072e-04 +-9.490634474012323712e-04 +-9.181396869683010374e-04 +-8.947100771315536979e-04 +-8.783422034970108554e-04 +-8.642991008151186365e-04 +-8.531726209437207270e-04 +-8.418136412462134217e-04 +-8.182993266485613692e-04 +-7.848061149637239591e-04 +-7.581480261102211283e-04 +-7.438558244632423322e-04 +-7.196874557251466348e-04 +-6.680288358897086684e-04 +-6.078556956891750232e-04 +-5.571911504245665326e-04 +-5.192360645345432506e-04 +-4.878656728286449363e-04 +-4.566501049935387793e-04 +-4.315424119059724207e-04 +-4.051971520258529965e-04 +-3.679889070377462094e-04 +-3.283554250526946028e-04 +-2.945009656897050162e-04 +-2.671544968060435396e-04 +-2.420029493180155325e-04 +-2.172785163640179797e-04 +-1.982304572531798229e-04 +-1.841428995905566282e-04 +-1.715011471078660735e-04 +-1.586812064076900740e-04 +-1.418344270272423404e-04 +-1.224214607039489746e-04 +-1.010670599514275705e-04 +-7.446688032712715539e-05 +-4.419846343221096787e-05 +-1.114643762446474900e-05 +2.407633736823640289e-05 +5.993437746578197814e-05 +9.718080949780288360e-05 +1.356506149630932697e-04 +1.746522811931525512e-04 +2.139921096219386766e-04 +2.463327212901124212e-04 +2.648726340921243828e-04 +2.781558958168752513e-04 +2.927462708309352393e-04 +3.025904864948498725e-04 +3.062501101810700412e-04 +3.081028523159809614e-04 +3.117229922961290084e-04 +3.188208987180580762e-04 +3.271672070743532226e-04 +3.361545506440294720e-04 +3.474913695356074742e-04 +3.608524786953438285e-04 +3.767928106819339431e-04 +3.964204780114537457e-04 +4.183974995379368799e-04 +4.422772232449262149e-04 +4.689332122935322995e-04 +4.977139754224503814e-04 +5.239128924028037477e-04 +5.464851628191308821e-04 +5.697449255938434988e-04 +5.907297379439092281e-04 +6.062086620797341435e-04 +6.177841492910896015e-04 +6.258798470725435940e-04 +6.316540075489737553e-04 +6.356044631059918227e-04 +6.373328106429517479e-04 +6.409713013315376838e-04 +6.482333948676048804e-04 +6.556857423963826856e-04 +6.637149578110305027e-04 +6.736164259716922011e-04 +6.812679700848135256e-04 +6.836007518309750002e-04 +6.839726926328574576e-04 +6.834393254922553141e-04 +6.842966240157836348e-04 +6.912639813022735009e-04 +7.006505239188515893e-04 +7.102098273744295509e-04 +7.214324057910141133e-04 +7.304841683867066993e-04 +7.374142145466097914e-04 +7.450238494351510551e-04 +7.512322651026834101e-04 +7.553288996812886590e-04 +7.586329980946290505e-04 +7.630029160761724223e-04 +7.696022334023257683e-04 +7.769780781207592107e-04 +7.848255712712959558e-04 +7.939280775556833980e-04 +8.039051643929857102e-04 +8.124601914633352955e-04 +8.174417352428669375e-04 +8.207410515031324282e-04 +8.233840634306735040e-04 +8.240442002428478158e-04 +8.230158418233735626e-04 +8.227371084000168616e-04 +8.258546092463584388e-04 +8.302905291296777028e-04 +8.342860293074059498e-04 +8.404816139548027063e-04 +8.488419301863045279e-04 +8.548538450821393945e-04 +8.578070511781108300e-04 +8.604870581914260191e-04 +8.617006613262352763e-04 +8.607725072841572716e-04 +8.599122318420321202e-04 +8.597770860940385194e-04 +8.592534192921710053e-04 +8.582990676108489701e-04 +8.575282515904928847e-04 +8.567996470798197334e-04 +8.561919216433443950e-04 +8.563860433752991169e-04 +8.588348162085133715e-04 +8.635576308344244511e-04 +8.692776522332301041e-04 +8.759334835424998408e-04 +8.828133091908371916e-04 +8.878850402071401761e-04 +8.915598585996658589e-04 +8.949707419997659152e-04 +8.968376792936089310e-04 +8.967046240506103532e-04 +8.955328877841686524e-04 +8.938706616101517064e-04 +8.914600797286005183e-04 +8.889484705228041777e-04 +8.877546900535999118e-04 +8.872833770065982444e-04 +8.868375079322892394e-04 +8.869977067205276310e-04 +8.876542881091094685e-04 +8.885502183159992799e-04 +8.896092162495861360e-04 +8.903701442904580826e-04 +8.908509457577166047e-04 +8.913699697086348251e-04 +8.922351435564800830e-04 +8.940196166136050310e-04 +8.964032826610670137e-04 +8.990758362068934900e-04 +9.022989742528606232e-04 +9.052643479025629034e-04 +9.068678925375972186e-04 +9.077222973175740105e-04 +9.083574398097449829e-04 +9.082585845641495854e-04 +9.074804687650650731e-04 +9.064168770075240605e-04 +9.057783774713860578e-04 +9.055799230371244877e-04 +9.054499335719839439e-04 +9.057301085408830856e-04 +9.063960656161334714e-04 +9.072642343704776348e-04 +9.081021550327817923e-04 +9.083985281635767158e-04 +9.083384255077897726e-04 +9.082610666756822789e-04 +9.079624595178691819e-04 +9.074114361019709448e-04 +9.067183341342428858e-04 +9.058357737717838594e-04 +9.049221573569967434e-04 +9.042934343434316877e-04 +9.037683831821798856e-04 +9.031813858955234061e-04 +9.026440923694893084e-04 +9.020544687504065528e-04 +9.013661700309012672e-04 +9.006366248231413747e-04 +8.998743797535497298e-04 +8.990912644650546478e-04 +8.982715144627501438e-04 +8.973952978378193449e-04 +8.964080205880855037e-04 +8.952339231210542595e-04 +8.939067216147443887e-04 +8.924764556303114863e-04 +8.909300212588600791e-04 +8.892595049824165510e-04 +8.874672051036816165e-04 +8.855522140354753864e-04 +8.835183703343959822e-04 +8.813509373505558266e-04 +8.790217281706361055e-04 +8.765614269476415055e-04 +8.740718661908156075e-04 +8.715875146940076307e-04 +8.690293620028000272e-04 +8.663748284595197864e-04 +8.635832438262408973e-04 +8.606211525747935100e-04 +8.575128292709727987e-04 +8.542543756589299989e-04 +8.508941396397337381e-04 +8.474254927821863251e-04 +8.438052057920376967e-04 +8.400547180958580764e-04 +8.361721622988145140e-04 +8.321346428994998027e-04 +8.279189883870301768e-04 +8.235244474858642930e-04 +8.189677885246526715e-04 +8.142434817097679708e-04 +8.093455296594503565e-04 +8.042736385211865426e-04 +7.990225480207856874e-04 +7.935911034524797221e-04 +7.879824002333813814e-04 +7.821967117672538362e-04 +7.762338326695600180e-04 +7.700943772661116103e-04 +7.637793153875564777e-04 +7.572986608170239296e-04 +7.506597646837929409e-04 +7.438500754206265600e-04 +7.368649070399404958e-04 +7.297099550832497269e-04 +7.223848374771401140e-04 +7.148824786143016374e-04 +7.071937051110773311e-04 +6.993231670484829693e-04 +6.912779139592583342e-04 +6.830543451066997240e-04 +6.746530482287611472e-04 +6.660769745130464686e-04 +6.573276395802251293e-04 +6.484096879799599667e-04 +6.393280598676372032e-04 +6.300878163150804056e-04 +6.206894152180295618e-04 +6.111323296885290976e-04 +6.014200189155394618e-04 +5.915524754701825035e-04 +5.815312916168481139e-04 +5.713623960245862348e-04 +5.610486132143788782e-04 +5.505928202696389181e-04 +5.399993557845770295e-04 +5.292728396909199967e-04 +5.184182533232368269e-04 +5.074400446751894988e-04 +4.963416688480319422e-04 +4.851285036882701639e-04 +4.738054141394941227e-04 +4.623770904618732707e-04 +4.508495477517148820e-04 +4.392289972968428224e-04 +4.275210719367035441e-04 +4.157324582958889605e-04 +4.038697211222807637e-04 +3.919390837167982533e-04 +3.799472652502321516e-04 +3.679013880235969909e-04 +3.558088871762686393e-04 +3.436772046617177722e-04 +3.315138586238514031e-04 +3.193265797824358589e-04 +3.071230850968059787e-04 +2.949113536842956867e-04 +2.826995385296525920e-04 +2.704958127154863173e-04 +2.583084274160589878e-04 +2.461458323644227981e-04 +2.340163210433791679e-04 +2.219284212696577281e-04 +2.098906080207967267e-04 +1.979114195028161343e-04 +1.859993731200549325e-04 +1.741628856044052974e-04 +1.624103216117273334e-04 +1.507501601226732095e-04 +1.391906627386438040e-04 +1.277399235320102568e-04 +1.164060911008445702e-04 +1.051971067792475560e-04 +9.412063402002551337e-05 +8.318444507373037498e-05 +7.239588294478987345e-05 +6.176213586691696965e-05 +5.129021769674086800e-05 +4.098694888346414282e-05 +3.085883319513812258e-05 +2.091199663713465054e-05 +1.115253867679954114e-05 +1.586099999999999942e-06 +1.560145357644522401e-06 +1.534208854228513816e-06 +1.508304337855716288e-06 +1.482445583779183552e-06 +1.456646265242906141e-06 +1.430919924794859735e-06 +1.405279946197896553e-06 +1.379739527061469204e-06 +1.354311652309724181e-06 +1.329009068597040670e-06 +1.303844259773731403e-06 +1.278829423496865340e-06 +1.253976449073672377e-06 +1.229296896615184564e-06 +1.204801977568448642e-06 +1.180502536686961565e-06 +1.156409035488240918e-06 +1.132531537237508999e-06 +1.108879693487675631e-06 +1.085462732194159795e-06 +1.062289447415199587e-06 +1.039368190597732696e-06 +1.016706863439888303e-06 +9.943129123132829603e-07 +9.721933242192219864e-07 +9.503546242452268129e-07 +9.288028744819706955e-07 +9.075436743533296549e-07 +8.865821623063385672e-07 +8.659230188035868308e-07 +8.455704705543857423e-07 +8.255282959187025393e-07 +8.057998314135568467e-07 +7.863879792490292916e-07 +7.672952158197731525e-07 +7.485236010758197934e-07 +7.300747886957273754e-07 +7.119500369856035578e-07 +6.941502204271415721e-07 +6.766758417986426393e-07 +6.595270447949064878e-07 +6.427036270728624418e-07 +6.262050536518463228e-07 +6.100304706005807452e-07 +5.941787189442686759e-07 +5.786483487295077606e-07 +5.634376331864060226e-07 +5.485445829317697645e-07 +5.339669601596528926e-07 +5.197022927696292015e-07 +5.057478883860771417e-07 +4.921008482259969913e-07 +4.787580807758373435e-07 +4.657163152413147010e-07 +4.529721147382868386e-07 +4.405218891950925988e-07 +4.283619079411771534e-07 +4.164883119588906427e-07 +4.048971257793686527e-07 +3.935842690057154430e-07 +3.825455674495417271e-07 +3.717767638699736385e-07 +3.612735283061879494e-07 +3.510314679972887720e-07 +3.410461368850951262e-07 +3.313130446980341320e-07 +3.218276656154019054e-07 +3.125854465138300045e-07 +3.035818147985080561e-07 +2.948121858238679883e-07 +2.862719699092437891e-07 +2.779565789561936929e-07 +2.698614326755037617e-07 +2.619819644323612427e-07 +2.543136267192751564e-07 +2.468518962666595896e-07 +2.395922788020004885e-07 +2.325303134683938960e-07 +2.256615769141750750e-07 +2.189816870652687834e-07 +2.124863065921152179e-07 +2.061711460834678977e-07 +2.000319669389245704e-07 +1.940645839925531352e-07 +1.882648678796095624e-07 +1.826287471582729195e-07 +1.771522101983993008e-07 +1.718313068488960460e-07 +1.666621498951232676e-07 +1.616409163176895778e-07 +1.567638483635384325e-07 +1.520272544399473878e-07 +1.474275098419919968e-07 +1.429610573233434460e-07 +1.386244075203066159e-07 +1.344141392384358072e-07 +1.303268996107446666e-07 +1.263594041363408682e-07 +1.225084366077650069e-07 +1.187708489351240857e-07 +1.151435608746116855e-07 +1.116235596688835973e-07 +1.082078996061304138e-07 +1.048937015046685828e-07 +1.016781521292383824e-07 +9.855850354514384005e-08 +9.553207241588949237e-08 +9.259623924967870828e-08 +8.974844759995547231e-08 +8.698620322476698606e-08 +8.430707320945747224e-08 +8.170868505703762651e-08 +7.918872575021049397e-08 +7.674494078879130331e-08 +7.437513320614069643e-08 +7.207716256781385282e-08 +6.984894395559740893e-08 +6.768844693977792671e-08 +6.559369454229690966e-08 +6.356276219333803138e-08 +6.159377668362824491e-08 +5.968491511456930996e-08 +5.783440384822630386e-08 +5.604051745896954741e-08 +5.430157768842348640e-08 +5.261595240532286506e-08 +5.098205457161163821e-08 +4.939834121613031933e-08 +4.786331241703582790e-08 +4.637551029399642128e-08 +4.493351801115827183e-08 +4.353595879172398549e-08 +4.218149494489815886e-08 +4.086882690592130918e-08 +3.959669228978044160e-08 +3.836386495911275871e-08 +3.716915410681031496e-08 +3.601140335367280701e-08 +3.488948986149131921e-08 +3.380232346182835047e-08 +3.274884580071382191e-08 +3.172802949946843960e-08 +3.073887733177929687e-08 +2.978042141711501668e-08 +2.885172243056610710e-08 +2.795186882912324493e-08 +2.707997609437700382e-08 +2.623518599162654933e-08 +2.541666584532290120e-08 +2.462360783074978419e-08 +2.385522828186114266e-08 +2.311076701511217236e-08 +2.238948666917086026e-08 +2.169067206031399031e-08 +2.101362955335586079e-08 +2.035768644790075410e-08 +1.972219037972737879e-08 +1.910650873707713434e-08 +1.851002809164060439e-08 +1.793215364400293216e-08 +1.737230868330337169e-08 +1.682993406088563943e-08 +1.630448767766690753e-08 +1.579544398499798713e-08 +1.530229349873671941e-08 +1.482454232629626532e-08 +1.436171170639699026e-08 +1.391333756127004251e-08 +1.347897006104193375e-08 +1.305817320005165659e-08 +1.265052438483430937e-08 +1.225561403350702038e-08 +1.187304518631355166e-08 +1.150243312705466424e-08 +1.114340501516759497e-08 +1.079559952818716462e-08 +1.045866651435253732e-08 +1.013226665510842341e-08 +9.816071137254096728e-09 +9.509761334509385012e-09 +9.213028498254253843e-09 +8.925573457214684694e-09 +8.647106325859160243e-09 +8.377346221291191239e-09 +8.116020988404659689e-09 +7.862866933097085741e-09 +7.617628563316336321e-09 +7.380058337740914635e-09 +7.149916421885156024e-09 +6.926970451426038960e-09 +6.710995302561106519e-09 +6.501772869200069345e-09 +6.299091846805494835e-09 +6.102747522693721480e-09 +5.912541572623360816e-09 +5.728281863487309510e-09 +5.549782261943378106e-09 +5.376862448812961840e-09 +5.209347739081876535e-09 +5.047068907349544499e-09 +4.889862018563672634e-09 +4.737568263894299645e-09 +4.590033801596592679e-09 +4.447109602716314139e-09 +4.308651301501128091e-09 +4.174519050377394414e-09 +4.044577379361248255e-09 +3.918695059770882178e-09 +3.796744972118102121e-09 +3.678603978050515251e-09 +3.564152796229927494e-09 +3.453275882025163692e-09 +3.345861310909909952e-09 +3.241800665453515087e-09 +3.140988925796200626e-09 +3.043324363507089642e-09 +2.948708438721280438e-09 +2.857045700458999676e-09 +2.768243690028839698e-09 +2.682212847425218016e-09 +2.598866420625755017e-09 +2.518120377704528329e-09 +2.439893321672190526e-09 +2.364106407962921693e-09 +2.290683264486467416e-09 +2.219549914166230879e-09 +2.150634699889330571e-09 +2.083868211793939112e-09 +2.019183216821575374e-09 +1.956514590466583502e-09 +1.895799250654501466e-09 +1.836976093683115928e-09 +1.779985932164817108e-09 +1.724771434906190391e-09 +1.671277068667127089e-09 +1.619449041740625090e-09 +1.569235249296440069e-09 +1.520585220435345596e-09 +1.473450066900377451e-09 +1.427782433393207240e-09 +1.383536449447050302e-09 +1.340667682807208933e-09 +1.299133094271885510e-09 +1.258890993949356720e-09 +1.219900998885743465e-09 +1.182123992022158645e-09 +1.145522082439250111e-09 +1.110058566848616432e-09 +1.075697892293134317e-09 +1.042405620018014806e-09 +1.010148390475669937e-09 +9.788938894298126961e-10 +9.486108151240197126e-10 +9.192688464811362611e-10 +8.908386123020433431e-10 +8.632916614321276512e-10 +8.366004338648168873e-10 +8.107382327537737070e-10 +7.856791973041567312e-10 +7.613982765165415048e-10 +7.378712037557094775e-10 +7.150744721193240496e-10 +6.929853105808406392e-10 +6.715816608827390492e-10 +6.508421551560582546e-10 +6.307460942439954818e-10 +6.112734267071855533e-10 +5.924047284889987081e-10 +5.741211832207826690e-10 +5.564045631461382475e-10 +5.392372106455811440e-10 +5.226020203419576413e-10 +5.064824217689815938e-10 +4.908623625847826286e-10 +4.757262923135943807e-10 +4.610591465986324383e-10 +4.468463319504787024e-10 +4.330737109751828370e-10 +4.197275880668074341e-10 +4.067946955502663679e-10 +3.942621802597141707e-10 +3.821175905393466646e-10 +3.703488636527781516e-10 +3.589443135885565368e-10 +3.478926192491676026e-10 +3.371828130113237481e-10 +3.268042696461328526e-10 +3.167466955875727846e-10 +3.070001185384722998e-10 +2.975548774031412706e-10 +2.884016125367036105e-10 +2.795312563007683163e-10 +2.709350239161107224e-10 +2.626044046028732049e-10 +2.545311529991337210e-10 +2.467072808492787431e-10 +2.391250489535622458e-10 +2.317769593706067791e-10 +2.246557478648544341e-10 +2.177543765915038444e-10 +2.110660270110134593e-10 +2.045840930263826254e-10 +1.983021743358471201e-10 +1.922140699944416418e-10 +1.863137721777554078e-10 +1.805954601414454468e-10 +1.750534943704872621e-10 +1.696824109121035085e-10 +1.644769158865741385e-10 +1.594318801703097530e-10 +1.545423342459349424e-10 +1.498034632138650703e-10 +1.452106019604244552e-10 +1.407592304776897681e-10 +1.364449693300075717e-10 +1.322635752628529438e-10 +1.282109369493264573e-10 +1.242830708701098237e-10 +1.204761173226140951e-10 +1.167863365552460422e-10 +1.132101050228441097e-10 +1.097439117595921141e-10 +1.063843548655320192e-10 +1.031281381031958298e-10 +9.997206760097246347e-11 +9.691304865965719648e-11 +9.394808265914042251e-11 +9.107426406192840935e-11 +8.828877751055951136e-11 +8.558889501591707513e-11 +8.297197323357457660e-11 +8.043545082539797950e-11 +7.797684590381074691e-11 +7.559375355599444654e-11 +7.328384344557873098e-11 +7.104485748944015780e-11 +6.887460760713169368e-11 +6.677097354074273158e-11 +6.473190074296781378e-11 +6.275539833121620131e-11 +6.083953710571884344e-11 +5.898244762958039592e-11 +5.718231836888177285e-11 +5.543739389092059029e-11 +5.374597311876017237e-11 +5.210640764031480128e-11 +5.051710007031493073e-11 +4.897650246340722506e-11 +4.748311477684236341e-11 +4.603548338118879528e-11 +4.463219961754749464e-11 +4.327189839983097739e-11 +4.195325686066338470e-11 +4.067499303956916067e-11 +3.943586461210541888e-11 +3.823466765865120874e-11 +3.707023547160716563e-11 +3.594143739984109417e-11 +3.484717772915126371e-11 +3.378639459765974451e-11 +3.275805894503564735e-11 +3.176117349448516511e-11 +3.079477176646889565e-11 +2.985791712317900674e-11 +2.894970184279126150e-11 +2.806924622257386959e-11 +2.721569770993875472e-11 +2.638823006055915415e-11 +2.558604252273451198e-11 +2.480835904713915766e-11 +2.405442752118230571e-11 +2.332351902722694611e-11 +2.261492712388305738e-11 +2.192796714967993915e-11 +2.126197554841498068e-11 +2.061630921549273842e-11 +1.999034486460735752e-11 +1.938347841412432222e-11 +1.879512439254507240e-11 +1.822471536247797032e-11 +1.767170136250744937e-11 +1.713554936641763165e-11 +1.661574275924082197e-11 +1.611178082957815016e-11 +1.562317827770308113e-11 +1.514946473895230203e-11 +1.469018432192519719e-11 +1.424489516102309694e-11 +1.381316898289684129e-11 +1.339459068634627305e-11 +1.298875793527913244e-11 +1.259528076429626113e-11 +1.221378119652091143e-11 +1.184389287329919264e-11 +1.148526069538206054e-11 +1.113754047524432614e-11 +1.080039860019153099e-11 +1.047351170591741588e-11 +1.015656636018150658e-11 +9.849258756303024648e-12 +9.551294416149293782e-12 +9.262387902342235490e-12 +8.982262539377584060e-12 +8.710650143387505594e-12 +8.447290760283834588e-12 +8.191932412007192601e-12 +7.944330850639217977e-12 +7.704249320131805844e-12 +7.471458325415560106e-12 +7.245735408654788681e-12 +7.026864932432481372e-12 +6.814637869646696007e-12 +6.608851599906883789e-12 +6.409309712235459437e-12 +6.215821813868254779e-12 +6.028203344976789035e-12 +5.846275399116200910e-12 +5.669864549227948912e-12 +5.498802679023727077e-12 +5.332926819582843203e-12 +5.172078990998927272e-12 +5.016106048923256675e-12 +4.864859535850487221e-12 +4.718195536997551673e-12 +4.575974540638472012e-12 +4.438061302749376414e-12 +4.304324715838884527e-12 +4.174637681825548217e-12 +4.048876988840571277e-12 +3.926923191836995410e-12 +3.808660496880865019e-12 +3.693976649014606214e-12 +3.582762823581216005e-12 +3.474913520901595319e-12 +3.370326464199534471e-12 +3.268902500677324975e-12 +3.170545505640050513e-12 +3.075162289577648793e-12 +2.982662508111751892e-12 +2.892958574716644807e-12 +2.805965576133269224e-12 +2.721601190387424091e-12 +2.639785607334780015e-12 +2.560441451654046561e-12 +2.483493708212255249e-12 +2.408869649727627169e-12 +2.336498766661533224e-12 +2.266312699267501888e-12 +2.198245171733079948e-12 +2.132231928348854840e-12 +2.068210671640561155e-12 +2.006121002407051669e-12 +1.945904361601291400e-12 +1.887503973999748462e-12 +1.830864793604579666e-12 +1.775933450724879877e-12 +1.722658200684326989e-12 +1.670988874106827185e-12 +1.620876828729223472e-12 +1.572274902695717321e-12 +1.525137369287494326e-12 +1.479419893042697882e-12 +1.435079487224999087e-12 +1.392074472598520908e-12 +1.350364437468299000e-12 +1.309910198948303600e-12 +1.270673765418575351e-12 +1.232618300134350086e-12 +1.195708085952609695e-12 +1.159908491141084254e-12 +1.125185936235876226e-12 +1.091507861916579012e-12 +1.058842697866100710e-12 +1.027159832586022242e-12 +9.964295841375554308e-13 +9.666231717792256605e-13 +9.377126884744183439e-13 +9.096710742415936341e-13 +8.824720903208902287e-13 +8.560902941326794880e-13 +8.305010150033160387e-13 +8.056803306341429763e-13 +7.816050442917352499e-13 +7.582526626961678688e-13 +7.356013745866690984e-13 +7.136300299434421483e-13 +6.923181198454235590e-13 +6.716457569443484970e-13 +6.515936565369017628e-13 +6.321431182153211890e-13 +6.132760080797716845e-13 +5.949747414947594604e-13 +5.772222663726601349e-13 +5.600020469687824168e-13 +5.432980481715162487e-13 +5.270947202729637326e-13 +5.113769842050420147e-13 +4.961302172265827709e-13 +4.813402390479693421e-13 diff --git a/examples/opensees/DS_input/motion2.vel b/examples/opensees/DS_input/motion2.vel new file mode 100644 index 0000000..f6c4c67 --- /dev/null +++ b/examples/opensees/DS_input/motion2.vel @@ -0,0 +1,3997 @@ +-9.334880000000000315e-05 +-1.869762999999999872e-04 +-2.806702000000000220e-04 +-3.746816999999999943e-04 +-4.712432999999999813e-04 +-5.713406999999999557e-04 +-6.741504000000000160e-04 +-7.794454999999999830e-04 +-8.705588999999999906e-04 +-9.285027000000000167e-04 +-9.621445000000000171e-04 +-1.034656799999999956e-03 +-1.197770799999999967e-03 +-1.411823200000000052e-03 +-1.507855499999999956e-03 +-1.374693499999999919e-03 +-1.241460000000000003e-03 +-1.427082699999999895e-03 +-1.756865100000000067e-03 +-1.678797500000000055e-03 +-1.155991899999999966e-03 +-8.013214000000000491e-04 +-1.216434200000000030e-03 +-2.497189600000000124e-03 +-3.717816599999999860e-03 +-4.044375099999999827e-03 +-4.324640499999999992e-03 +-4.792511999999999640e-03 +-4.451901200000000364e-03 +-3.152046400000000064e-03 +-1.436758900000000092e-03 +-2.693891000000000124e-04 +-2.518247000000000150e-04 +-7.551608000000000018e-04 +-5.880571000000000452e-04 +3.573604000000000082e-04 +6.613829000000000539e-04 +-1.021556999999999950e-04 +-1.191510900000000098e-03 +-2.134642500000000134e-03 +-2.364014700000000024e-03 +-1.860954699999999972e-03 +-1.775719600000000026e-03 +-2.045910000000000176e-03 +-9.590358999999999906e-04 +1.430847700000000087e-03 +3.923199399999999747e-03 +6.480582399999999625e-03 +7.815825400000000339e-03 +6.073714000000000023e-03 +2.817556100000000174e-03 +1.134857400000000103e-03 +4.157658999999999964e-04 +-1.622054900000000034e-03 +-3.405327799999999933e-03 +-2.669097599999999820e-03 +9.945540000000000326e-05 +3.450710999999999969e-03 +5.579976199999999581e-03 +6.342749400000000093e-03 +7.094872000000000331e-03 +7.372075999999999976e-03 +6.124179799999999833e-03 +4.438598700000000001e-03 +3.511610100000000113e-03 +2.287078699999999919e-03 +1.716029900000000082e-03 +2.351113699999999966e-03 +1.750045100000000020e-03 +6.271167999999999925e-04 +-7.171439999999999900e-05 +-7.793576999999999666e-04 +6.966998000000000071e-04 +4.196312399999999922e-03 +7.377383900000000251e-03 +9.341120300000000168e-03 +9.848014100000000021e-03 +1.011065880000000007e-02 +1.044250140000000000e-02 +9.252195899999999390e-03 +5.733822500000000134e-03 +1.618723899999999953e-03 +-1.028075600000000027e-03 +-2.503550299999999888e-03 +-2.507966199999999996e-03 +-7.776842000000000173e-04 +1.118289599999999946e-03 +3.326766499999999835e-03 +7.206771499999999574e-03 +1.110100500000000059e-02 +1.236449610000000046e-02 +1.169207270000000021e-02 +1.016687380000000016e-02 +7.067265999999999999e-03 +3.371782800000000090e-03 +1.590098199999999927e-03 +1.684051399999999914e-03 +2.041827600000000170e-03 +8.581831000000000268e-04 +4.526690999999999788e-04 +4.231208799999999597e-03 +7.922319599999999920e-03 +7.985053500000000373e-03 +6.985670999999999721e-03 +7.090517799999999579e-03 +7.535546199999999806e-03 +7.476094299999999637e-03 +6.806707099999999983e-03 +5.483820900000000234e-03 +5.514953700000000195e-03 +6.677216700000000379e-03 +6.163032599999999916e-03 +4.955120999999999831e-03 +4.965284700000000169e-03 +5.163817999999999707e-03 +4.526147900000000203e-03 +3.845254099999999807e-03 +3.850430699999999977e-03 +4.816106799999999959e-03 +5.848115299999999753e-03 +6.509578299999999908e-03 +7.594343400000000063e-03 +7.974047300000000268e-03 +6.502669800000000257e-03 +3.920737399999999796e-03 +2.010803299999999912e-03 +1.978132499999999804e-03 +2.985542199999999952e-03 +3.003692000000000081e-03 +1.756593799999999926e-03 +1.617939600000000084e-03 +4.348975500000000320e-03 +9.340434999999999363e-03 +1.300421839999999982e-02 +1.297395039999999986e-02 +1.134816779999999956e-02 +1.047710879999999914e-02 +1.023060680000000000e-02 +1.016958580000000036e-02 +9.586126099999999969e-03 +7.504127299999999862e-03 +4.491404099999999656e-03 +1.485738600000000107e-03 +9.799558000000000747e-04 +4.306739999999999874e-03 +7.616312299999999751e-03 +8.352345400000000739e-03 +8.747835600000000017e-03 +1.037996189999999992e-02 +1.250723389999999942e-02 +1.335787100000000033e-02 +1.266516720000000068e-02 +1.177498190000000021e-02 +9.584475400000000422e-03 +5.404450400000000015e-03 +2.105267499999999813e-03 +1.346932500000000074e-03 +1.902034400000000066e-03 +2.138690200000000017e-03 +1.255417599999999979e-03 +1.113315199999999989e-03 +3.683291500000000166e-03 +7.459395800000000014e-03 +9.399926899999999294e-03 +9.548158500000000770e-03 +1.018568570000000055e-02 +1.187936950000000047e-02 +1.248372030000000077e-02 +1.081193899999999958e-02 +9.239265700000000650e-03 +9.182257500000000697e-03 +9.696725300000000325e-03 +8.915916200000000361e-03 +7.600974299999999594e-03 +8.243960800000000103e-03 +9.071205500000000324e-03 +7.288255399999999697e-03 +4.624210800000000399e-03 +4.030803099999999937e-03 +5.330778100000000026e-03 +7.622486599999999703e-03 +1.104085089999999950e-02 +1.375056690000000040e-02 +1.430627880000000067e-02 +1.386219609999999984e-02 +1.262110680000000026e-02 +1.127259660000000038e-02 +1.056856930000000042e-02 +8.531252200000000521e-03 +5.801681599999999710e-03 +4.554869100000000053e-03 +3.995427900000000053e-03 +3.698797099999999796e-03 +2.829869699999999853e-03 +1.228000300000000027e-03 +2.263473000000000004e-04 +-1.098959000000000047e-03 +-2.377987499999999980e-03 +-1.472188300000000028e-03 +1.169559699999999942e-03 +4.306833500000000099e-03 +6.797374099999999725e-03 +6.752784700000000195e-03 +3.583999699999999844e-03 +-1.869244999999999956e-04 +-2.933256100000000005e-03 +-5.219255299999999570e-03 +-6.452877499999999829e-03 +-7.655547399999999662e-03 +-1.006976969999999992e-02 +-1.147945350000000031e-02 +-1.106477399999999944e-02 +-1.136305139999999915e-02 +-1.273604279999999978e-02 +-1.278189199999999956e-02 +-1.072039969999999919e-02 +-7.912479999999999514e-03 +-6.593824300000000402e-03 +-7.899405099999999569e-03 +-9.664811299999999383e-03 +-1.021169939999999957e-02 +-1.153135240000000006e-02 +-1.371225379999999917e-02 +-1.347587809999999976e-02 +-1.034924800000000013e-02 +-4.395320000000000303e-03 +4.293789400000000249e-03 +1.285481110000000031e-02 +1.950629920000000045e-02 +2.354732400000000142e-02 +2.555348550000000052e-02 +2.654806869999999999e-02 +2.647590530000000150e-02 +2.526183640000000119e-02 +2.221112940000000147e-02 +1.819494489999999923e-02 +1.560917960000000014e-02 +1.579741629999999869e-02 +1.847557890000000105e-02 +2.223078759999999945e-02 +2.507416770000000031e-02 +2.524261230000000161e-02 +2.386217009999999986e-02 +2.297308229999999937e-02 +2.180704480000000139e-02 +1.816152470000000074e-02 +1.149661540000000010e-02 +3.566018099999999826e-03 +-3.555569900000000051e-03 +-9.534180300000000274e-03 +-1.502923249999999974e-02 +-1.961254470000000152e-02 +-2.235115260000000020e-02 +-2.344034929999999975e-02 +-2.346489120000000081e-02 +-2.390590979999999977e-02 +-2.611973100000000020e-02 +-2.915587199999999934e-02 +-3.268322740000000060e-02 +-3.607130160000000113e-02 +-3.653920590000000329e-02 +-3.387306360000000294e-02 +-3.101914799999999986e-02 +-2.953970900000000080e-02 +-2.839877910000000033e-02 +-2.547492310000000135e-02 +-2.127778840000000074e-02 +-1.820964099999999863e-02 +-1.668392440000000115e-02 +-1.617832660000000089e-02 +-1.619955999999999827e-02 +-1.633033630000000139e-02 +-1.569051059999999886e-02 +-1.333914710000000045e-02 +-9.691732999999999251e-03 +-6.354693600000000005e-03 +-3.969716100000000338e-03 +-2.295509199999999899e-03 +-2.103858699999999922e-03 +-3.249762700000000028e-03 +-5.186704700000000119e-03 +-7.814698400000000267e-03 +-9.592305000000000623e-03 +-9.149746900000000141e-03 +-7.797174900000000339e-03 +-8.311150099999999388e-03 +-1.140570959999999932e-02 +-1.540458460000000002e-02 +-1.892637969999999906e-02 +-2.177311850000000076e-02 +-2.423910970000000067e-02 +-2.653247369999999980e-02 +-2.940923360000000097e-02 +-3.377998000000000112e-02 +-3.919085149999999851e-02 +-4.366474719999999948e-02 +-4.641261840000000111e-02 +-4.863213329999999807e-02 +-4.963310680000000003e-02 +-4.997140170000000103e-02 +-5.266704390000000180e-02 +-5.508653470000000191e-02 +-5.298140750000000093e-02 +-4.825487860000000212e-02 +-4.383209460000000307e-02 +-4.056510370000000060e-02 +-3.866480969999999684e-02 +-3.661055319999999974e-02 +-3.315236430000000067e-02 +-3.120425209999999963e-02 +-3.216478269999999834e-02 +-3.380871829999999856e-02 +-3.559915699999999933e-02 +-3.792022099999999701e-02 +-4.128330809999999906e-02 +-4.545453149999999914e-02 +-4.938289900000000093e-02 +-5.252780029999999656e-02 +-5.453078330000000334e-02 +-5.579114999999999769e-02 +-5.612576920000000164e-02 +-5.388109160000000009e-02 +-4.947527329999999723e-02 +-4.382452030000000276e-02 +-3.621755840000000226e-02 +-2.699845359999999972e-02 +-1.733224159999999930e-02 +-8.162680199999999484e-03 +-1.026882999999999919e-03 +2.779632399999999899e-03 +3.082418500000000134e-03 +6.858925999999999999e-04 +-2.671998200000000150e-03 +-6.585804800000000063e-03 +-1.038724960000000051e-02 +-1.285414990000000035e-02 +-1.438421299999999986e-02 +-1.555224950000000037e-02 +-1.597016490000000011e-02 +-1.349274970000000073e-02 +-7.613866399999999653e-03 +-9.534955000000000123e-04 +6.497946200000000172e-03 +1.663163590000000039e-02 +2.871289659999999924e-02 +4.012119749999999707e-02 +4.927920479999999687e-02 +5.684309819999999736e-02 +6.327853619999999901e-02 +6.663224189999999991e-02 +6.519332949999999405e-02 +6.031966490000000014e-02 +5.320061529999999678e-02 +4.529561380000000220e-02 +3.817800059999999773e-02 +3.107288060000000171e-02 +2.461605069999999937e-02 +2.163991259999999833e-02 +2.340694529999999898e-02 +2.891010150000000029e-02 +3.532498459999999785e-02 +4.037605130000000014e-02 +4.373853280000000038e-02 +4.511885709999999966e-02 +4.547358559999999800e-02 +4.623946579999999723e-02 +4.805207470000000258e-02 +5.088338950000000083e-02 +5.263955110000000104e-02 +5.190591979999999855e-02 +4.956921200000000138e-02 +4.603117379999999842e-02 +4.111129609999999990e-02 +3.423971829999999938e-02 +2.468245200000000056e-02 +1.267015630000000066e-02 +4.853877999999999947e-04 +-8.230270600000000672e-03 +-1.141514329999999966e-02 +-1.026883550000000020e-02 +-7.908110799999999718e-03 +-7.343876000000000050e-03 +-8.084008499999999903e-03 +-7.853500299999999906e-03 +-5.434972399999999856e-03 +7.448040000000000606e-05 +6.031408000000000255e-03 +9.258904499999999829e-03 +1.031405080000000023e-02 +8.474519999999999276e-03 +1.531899399999999897e-03 +-9.703064299999999628e-03 +-2.331617819999999910e-02 +-3.762636560000000296e-02 +-5.040043400000000090e-02 +-5.883346810000000121e-02 +-6.033550399999999814e-02 +-5.446176440000000119e-02 +-4.314300690000000271e-02 +-3.083275850000000151e-02 +-2.162473150000000094e-02 +-1.615242290000000122e-02 +-1.352290069999999983e-02 +-1.098859559999999964e-02 +-6.141447999999999872e-03 +-9.615094999999999935e-04 +2.578939599999999915e-03 +5.320105599999999657e-03 +7.363483700000000333e-03 +8.632135799999999387e-03 +9.661556099999999564e-03 +9.660673499999999567e-03 +8.281341100000000691e-03 +6.276516999999999687e-03 +4.020447600000000114e-03 +2.869473300000000091e-03 +3.381129300000000181e-03 +3.340028499999999831e-03 +1.938226799999999981e-03 +1.012593800000000056e-03 +8.690212999999999801e-04 +3.237596999999999827e-04 +-4.551862999999999959e-04 +-2.154726999999999944e-04 +1.279610600000000023e-03 +2.833992100000000056e-03 +2.484855499999999960e-03 +-1.052418000000000060e-03 +-5.472316599999999844e-03 +-6.962604899999999715e-03 +-5.582472899999999655e-03 +-2.956732100000000144e-03 +6.458704999999999481e-04 +3.847956200000000101e-03 +5.191427099999999795e-03 +4.210880799999999584e-03 +1.076969699999999908e-03 +-3.217219999999999802e-03 +-8.292981700000000289e-03 +-1.367490030000000079e-02 +-1.701566900000000063e-02 +-1.702628210000000156e-02 +-1.548788759999999987e-02 +-1.398950589999999918e-02 +-1.251856030000000029e-02 +-1.072784570000000041e-02 +-8.264909399999999240e-03 +-4.405486999999999598e-03 +-6.530000000000000160e-06 +2.768311600000000067e-03 +4.273647000000000210e-03 +3.683977100000000206e-03 +-6.673761000000000493e-04 +-6.943167099999999689e-03 +-1.414126849999999998e-02 +-2.259034420000000098e-02 +-2.987651980000000096e-02 +-3.419930759999999931e-02 +-3.647667639999999795e-02 +-3.663200820000000330e-02 +-3.471734020000000198e-02 +-3.202132700000000221e-02 +-2.881111139999999876e-02 +-2.440368379999999920e-02 +-1.909708749999999844e-02 +-1.444719080000000065e-02 +-1.065333800000000004e-02 +-7.285880800000000060e-03 +-5.051607700000000298e-03 +-3.125266499999999979e-03 +-6.910402000000000385e-04 +1.815490799999999955e-03 +4.964931799999999958e-03 +8.176220799999999941e-03 +9.671863100000000629e-03 +9.438397600000000484e-03 +8.660348800000000277e-03 +8.327774200000000529e-03 +9.115540400000000237e-03 +9.848087900000000033e-03 +8.887165299999999490e-03 +6.880691300000000080e-03 +4.192376200000000330e-03 +1.301449600000000083e-03 +5.436631999999999619e-04 +1.787051200000000072e-03 +2.386793500000000071e-03 +1.795752600000000056e-03 +1.704175100000000082e-03 +2.084822400000000200e-03 +6.623429999999999704e-05 +-4.059703799999999849e-03 +-6.195107800000000317e-03 +-6.012193199999999946e-03 +-6.181718200000000177e-03 +-7.514616600000000209e-03 +-9.542611399999999591e-03 +-1.113972210000000081e-02 +-1.213112700000000023e-02 +-1.301164680000000025e-02 +-1.222443229999999915e-02 +-8.272470599999999855e-03 +-2.403318399999999910e-03 +3.715175099999999848e-03 +9.860806600000000810e-03 +1.499671699999999969e-02 +1.814402190000000137e-02 +1.983928600000000111e-02 +1.898830619999999914e-02 +1.521740140000000033e-02 +1.062479539999999952e-02 +6.412725900000000069e-03 +3.481833299999999819e-03 +2.190429700000000052e-03 +2.108586999999999875e-03 +3.304334700000000156e-03 +5.477523399999999903e-03 +8.251146399999999270e-03 +1.174412879999999978e-02 +1.500530249999999961e-02 +1.711633850000000151e-02 +1.816980550000000041e-02 +1.783416999999999988e-02 +1.673582430000000038e-02 +1.571466830000000162e-02 +1.483742019999999967e-02 +1.523955589999999999e-02 +1.770146040000000059e-02 +2.102468199999999940e-02 +2.334294729999999984e-02 +2.433019330000000049e-02 +2.398909780000000116e-02 +2.147532809999999973e-02 +1.840779420000000083e-02 +1.699415959999999934e-02 +1.760310569999999977e-02 +2.033353209999999925e-02 +2.378377480000000085e-02 +2.534239459999999833e-02 +2.477701599999999893e-02 +2.365891930000000101e-02 +2.287939129999999946e-02 +2.381920059999999978e-02 +2.721835079999999907e-02 +3.023754089999999839e-02 +3.052973269999999933e-02 +2.858963549999999840e-02 +2.495998179999999941e-02 +2.057363380000000116e-02 +1.627632320000000146e-02 +1.288427619999999926e-02 +1.027579070000000060e-02 +7.107802199999999938e-03 +3.986376600000000013e-03 +2.478122699999999942e-03 +2.453173800000000172e-03 +3.357999400000000103e-03 +4.765790199999999852e-03 +6.110266900000000355e-03 +7.853281400000000287e-03 +9.511665100000000345e-03 +9.404779999999999737e-03 +8.019198599999999288e-03 +6.023423400000000108e-03 +3.457336999999999997e-03 +2.218545299999999821e-03 +1.995862399999999860e-03 +8.577517000000000431e-04 +7.742587999999999467e-04 +2.982785899999999824e-03 +4.898360699999999845e-03 +5.616890900000000124e-03 +6.513510800000000406e-03 +7.021206799999999727e-03 +5.294546199999999869e-03 +1.072970500000000084e-03 +-4.753789100000000052e-03 +-1.090918710000000034e-02 +-1.613953720000000161e-02 +-1.965545230000000088e-02 +-2.104449679999999961e-02 +-2.060859409999999878e-02 +-1.923542599999999991e-02 +-1.876956540000000034e-02 +-2.050600740000000158e-02 +-2.292581330000000028e-02 +-2.407278269999999984e-02 +-2.354552680000000092e-02 +-2.162776270000000070e-02 +-1.822496009999999972e-02 +-1.365870639999999976e-02 +-9.450832500000000760e-03 +-5.962077399999999791e-03 +-2.299169499999999949e-03 +1.908518400000000026e-03 +6.823873400000000401e-03 +1.202074780000000030e-02 +1.720824790000000104e-02 +2.275176459999999831e-02 +2.728699130000000056e-02 +2.860251579999999877e-02 +2.790788690000000141e-02 +2.714501409999999990e-02 +2.612573730000000011e-02 +2.456606559999999911e-02 +2.255867920000000082e-02 +2.072045189999999898e-02 +1.884858689999999865e-02 +1.610089400000000101e-02 +1.253078110000000085e-02 +9.358960899999999375e-03 +8.289856499999999698e-03 +9.755879900000000160e-03 +1.325116710000000080e-02 +1.686516559999999901e-02 +1.718803569999999975e-02 +1.415426919999999977e-02 +1.031430690000000039e-02 +6.661821899999999935e-03 +3.422261900000000100e-03 +8.730222999999999846e-04 +-6.872051000000000114e-04 +-1.522799499999999981e-03 +-2.495665800000000049e-03 +-4.191146300000000297e-03 +-6.187927000000000184e-03 +-7.566145300000000351e-03 +-7.764137400000000085e-03 +-6.578001099999999587e-03 +-4.260535799999999595e-03 +-1.130092000000000076e-03 +2.795742999999999839e-03 +6.945138099999999606e-03 +9.087319499999999689e-03 +7.553898600000000067e-03 +3.909103899999999583e-03 +-2.968620000000000048e-04 +-4.789078000000000432e-03 +-8.178239699999999279e-03 +-9.499391200000000327e-03 +-8.721285900000000368e-03 +-5.945823299999999922e-03 +-3.055269800000000053e-03 +-1.425959700000000102e-03 +-4.668310999999999967e-04 +-7.202922999999999748e-04 +-2.685008300000000115e-03 +-4.798601500000000165e-03 +-5.664851099999999862e-03 +-5.366018799999999582e-03 +-4.329161300000000309e-03 +-2.945156400000000126e-03 +-1.099868099999999974e-03 +1.814557899999999935e-03 +5.946812600000000310e-03 +1.044172489999999932e-02 +1.448512660000000028e-02 +1.771390750000000069e-02 +1.920557960000000147e-02 +1.887649950000000118e-02 +1.700672220000000109e-02 +1.423201839999999919e-02 +1.178327189999999955e-02 +9.651100600000000335e-03 +8.286343999999999307e-03 +8.252214799999999309e-03 +8.426018400000000533e-03 +8.598333499999999407e-03 +1.001498550000000029e-02 +1.130032450000000022e-02 +1.082538320000000012e-02 +1.099211729999999970e-02 +1.301017900000000019e-02 +1.510135290000000005e-02 +1.665915100000000051e-02 +1.728002669999999935e-02 +1.634953210000000129e-02 +1.462973740000000043e-02 +1.314641889999999987e-02 +1.263937910000000053e-02 +1.386711910000000027e-02 +1.574585410000000144e-02 +1.640926770000000062e-02 +1.606045500000000126e-02 +1.487501509999999971e-02 +1.220403809999999999e-02 +9.329541199999999423e-03 +7.993950799999999940e-03 +8.030688399999999505e-03 +8.860027899999999360e-03 +1.052305520000000084e-02 +1.328432690000000069e-02 +1.651567619999999917e-02 +1.880079620000000076e-02 +1.988119069999999891e-02 +2.059442629999999955e-02 +2.146730020000000086e-02 +2.250661259999999983e-02 +2.378361580000000128e-02 +2.474790480000000140e-02 +2.408872780000000102e-02 +2.274828370000000002e-02 +2.261541779999999904e-02 +2.335298619999999839e-02 +2.396568279999999884e-02 +2.389589649999999954e-02 +2.301438169999999936e-02 +2.215526749999999906e-02 +2.081071619999999914e-02 +1.768921310000000011e-02 +1.393471509999999990e-02 +1.092061429999999916e-02 +8.451997200000000224e-03 +5.819500099999999621e-03 +2.815382500000000125e-03 +2.496468999999999967e-04 +-9.660696999999999774e-04 +-6.970884000000000325e-04 +2.524426999999999878e-04 +6.825654999999999483e-04 +2.679774000000000002e-04 +1.187179999999999974e-04 +1.035681299999999987e-03 +1.980370700000000199e-03 +2.257187999999999816e-03 +2.658771700000000116e-03 +3.345064500000000194e-03 +3.534855999999999849e-03 +3.146980900000000050e-03 +2.650534099999999997e-03 +2.290085299999999966e-03 +2.253380900000000013e-03 +2.310836299999999809e-03 +2.154093199999999788e-03 +2.318393699999999995e-03 +3.831767700000000051e-03 +6.686626499999999938e-03 +9.126763300000000079e-03 +1.001392159999999962e-02 +1.012295690000000054e-02 +9.936083599999999405e-03 +8.331067799999999565e-03 +4.675919199999999804e-03 +2.684604999999999956e-04 +-3.649112800000000201e-03 +-6.629114400000000323e-03 +-7.799351000000000374e-03 +-7.397837499999999726e-03 +-7.783380799999999738e-03 +-9.988804299999999234e-03 +-1.226386840000000082e-02 +-1.309692940000000035e-02 +-1.253921430000000045e-02 +-1.106682120000000019e-02 +-9.498421999999999421e-03 +-8.220737800000000803e-03 +-7.017073399999999676e-03 +-6.187292900000000359e-03 +-5.782715100000000372e-03 +-5.541497999999999736e-03 +-5.687751900000000312e-03 +-5.642140300000000018e-03 +-4.401217399999999939e-03 +-2.485033599999999978e-03 +-6.875890999999999861e-04 +8.158723000000000320e-04 +1.840829300000000092e-03 +2.569678699999999958e-03 +3.436266999999999794e-03 +4.634469199999999636e-03 +6.129547800000000220e-03 +8.260224400000000175e-03 +1.156451109999999914e-02 +1.517051110000000071e-02 +1.809772009999999903e-02 +2.090986920000000027e-02 +2.309964999999999935e-02 +2.279930789999999943e-02 +2.015734900000000149e-02 +1.682807840000000166e-02 +1.385918130000000047e-02 +1.149662670000000005e-02 +9.501643800000000861e-03 +8.115565599999999269e-03 +7.389536300000000037e-03 +6.752532700000000131e-03 +5.621559400000000067e-03 +4.016788900000000176e-03 +3.146722499999999971e-03 +3.667124600000000109e-03 +5.320441300000000075e-03 +7.211279200000000195e-03 +7.938527100000000378e-03 +7.212347000000000029e-03 +5.350941900000000424e-03 +2.756307200000000009e-03 +1.036550900000000105e-03 +8.856546999999999554e-04 +1.166907700000000036e-03 +1.189158899999999928e-03 +3.116700000000000026e-04 +-1.300378800000000093e-03 +-2.580731800000000010e-03 +-3.149180499999999858e-03 +-2.748967699999999969e-03 +-1.667171600000000049e-03 +-1.603978299999999930e-03 +-3.594757000000000074e-03 +-6.435412100000000198e-03 +-8.770888900000000862e-03 +-1.069917259999999919e-02 +-1.222505160000000000e-02 +-1.273747050000000047e-02 +-1.205623819999999957e-02 +-1.052247849999999978e-02 +-8.827552500000000399e-03 +-7.622124800000000359e-03 +-6.794732999999999849e-03 +-5.411546199999999786e-03 +-3.202961800000000102e-03 +-7.679969000000000465e-04 +1.085828199999999905e-03 +1.266262700000000008e-03 +6.368260000000000587e-05 +-1.000897499999999895e-03 +-1.703427100000000013e-03 +-2.306790999999999876e-03 +-2.084771300000000122e-03 +-7.969764999999999749e-04 +1.066873500000000037e-03 +2.825408000000000173e-03 +4.235644900000000088e-03 +5.977808799999999659e-03 +8.258768600000000737e-03 +1.030370390000000073e-02 +1.096855870000000045e-02 +9.983851999999999657e-03 +7.803150499999999753e-03 +4.486742200000000229e-03 +5.844379999999999497e-04 +-3.253142300000000202e-03 +-7.080130100000000051e-03 +-1.085035409999999916e-02 +-1.422530299999999991e-02 +-1.667199030000000165e-02 +-1.736113619999999844e-02 +-1.621918010000000104e-02 +-1.434679990000000023e-02 +-1.215898030000000032e-02 +-9.528340600000000798e-03 +-6.890165299999999847e-03 +-4.748029100000000433e-03 +-3.823478999999999853e-03 +-4.443254899999999653e-03 +-5.575134899999999692e-03 +-5.990871600000000248e-03 +-5.603613900000000217e-03 +-5.078036699999999987e-03 +-4.445040100000000396e-03 +-3.493094300000000076e-03 +-2.990438199999999845e-03 +-2.859020900000000184e-03 +-2.186529999999999897e-03 +-1.091435699999999996e-03 +4.589499999999999850e-06 +1.056426600000000054e-03 +2.369547599999999830e-03 +3.856231800000000168e-03 +4.468456299999999659e-03 +4.495789499999999772e-03 +5.692030899999999706e-03 +7.180646800000000003e-03 +7.036938799999999800e-03 +6.514357499999999870e-03 +6.386471000000000335e-03 +5.267170600000000043e-03 +3.827966099999999955e-03 +3.039259999999999792e-03 +2.201593500000000123e-03 +7.768443000000000527e-04 +-1.579044599999999922e-03 +-4.165374900000000206e-03 +-6.450583999999999658e-03 +-9.092714400000000141e-03 +-1.140284389999999919e-02 +-1.219470630000000014e-02 +-1.203632320000000075e-02 +-1.218852070000000024e-02 +-1.228374250000000001e-02 +-1.158417200000000022e-02 +-1.114077899999999996e-02 +-1.161266130000000035e-02 +-1.197256250000000057e-02 +-1.106595860000000008e-02 +-8.959267400000000062e-03 +-6.734454600000000166e-03 +-5.352012300000000278e-03 +-5.160940699999999950e-03 +-6.613219899999999915e-03 +-9.616379799999999825e-03 +-1.267539890000000079e-02 +-1.479470809999999976e-02 +-1.616817690000000099e-02 +-1.728025539999999971e-02 +-1.862747099999999961e-02 +-1.964756070000000035e-02 +-2.005520439999999849e-02 +-1.991312820000000136e-02 +-1.783353650000000026e-02 +-1.401814480000000002e-02 +-1.141317629999999937e-02 +-1.138502490000000041e-02 +-1.274034219999999919e-02 +-1.481417420000000033e-02 +-1.713865560000000024e-02 +-1.843336400000000069e-02 +-1.855114409999999991e-02 +-1.904439360000000081e-02 +-2.006663139999999984e-02 +-2.022893259999999915e-02 +-1.947613039999999962e-02 +-1.826617189999999932e-02 +-1.695650890000000022e-02 +-1.623871580000000106e-02 +-1.572374589999999892e-02 +-1.497141660000000062e-02 +-1.399761740000000053e-02 +-1.243804779999999922e-02 +-1.073249549999999962e-02 +-9.611381400000000574e-03 +-8.761098999999999623e-03 +-7.799933400000000350e-03 +-7.088425300000000297e-03 +-6.988296300000000280e-03 +-7.177780199999999992e-03 +-6.895355799999999986e-03 +-6.028944100000000091e-03 +-4.960023699999999841e-03 +-4.114505499999999809e-03 +-4.109466600000000192e-03 +-4.087879200000000060e-03 +-2.829001900000000132e-03 +-1.182934899999999942e-03 +2.648236000000000101e-04 +1.824162700000000071e-03 +3.044616999999999896e-03 +3.872458699999999868e-03 +3.878721999999999812e-03 +2.031357599999999899e-03 +-9.948611999999999473e-04 +-3.314480299999999959e-03 +-3.972880800000000087e-03 +-3.866289499999999921e-03 +-4.263046399999999639e-03 +-5.268822799999999668e-03 +-5.947471299999999850e-03 +-5.884510499999999651e-03 +-5.537564499999999765e-03 +-5.044835999999999591e-03 +-4.398101899999999620e-03 +-3.501673299999999954e-03 +-2.006576800000000205e-03 +-3.395300999999999766e-04 +-2.056962999999999977e-04 +-2.257011399999999876e-03 +-4.653125299999999812e-03 +-5.743947999999999589e-03 +-5.615254299999999747e-03 +-5.247711799999999795e-03 +-4.757745699999999661e-03 +-3.208976200000000171e-03 +-1.106765300000000108e-03 +3.582821000000000031e-04 +1.158419200000000010e-03 +1.171404700000000043e-03 +-2.065114999999999963e-04 +-2.283251599999999801e-03 +-3.933109399999999874e-03 +-5.295470699999999843e-03 +-6.327775600000000097e-03 +-7.139118100000000321e-03 +-8.407686899999999158e-03 +-9.859979300000000155e-03 +-1.074500289999999990e-02 +-1.060089520000000000e-02 +-9.217810300000000429e-03 +-7.102664499999999589e-03 +-5.478555300000000072e-03 +-4.893576900000000049e-03 +-5.142967299999999693e-03 +-6.073906199999999644e-03 +-7.424677900000000060e-03 +-8.973208999999999352e-03 +-1.084247420000000045e-02 +-1.279562109999999968e-02 +-1.406876580000000071e-02 +-1.439827379999999990e-02 +-1.377212440000000031e-02 +-1.223917769999999933e-02 +-1.089969900000000054e-02 +-1.100022860000000012e-02 +-1.219718239999999926e-02 +-1.344513720000000030e-02 +-1.447391810000000015e-02 +-1.509517039999999991e-02 +-1.484711740000000009e-02 +-1.416958490000000057e-02 +-1.378704730000000073e-02 +-1.361970600000000052e-02 +-1.353127720000000048e-02 +-1.332807060000000023e-02 +-1.258370219999999963e-02 +-1.150429870000000028e-02 +-1.075495999999999917e-02 +-1.052690690000000068e-02 +-1.093076970000000057e-02 +-1.265431459999999918e-02 +-1.482986640000000071e-02 +-1.580280779999999885e-02 +-1.575697490000000159e-02 +-1.480826759999999929e-02 +-1.345729199999999917e-02 +-1.336878399999999988e-02 +-1.474109579999999947e-02 +-1.644513159999999932e-02 +-1.712967370000000045e-02 +-1.680425589999999872e-02 +-1.661368189999999981e-02 +-1.631740749999999879e-02 +-1.559730559999999988e-02 +-1.489461000000000084e-02 +-1.452449570000000079e-02 +-1.478407259999999987e-02 +-1.595338149999999885e-02 +-1.752714450000000118e-02 +-1.765395189999999920e-02 +-1.559024439999999977e-02 +-1.264421599999999979e-02 +-1.015611689999999963e-02 +-8.730119399999999863e-03 +-8.066858300000000204e-03 +-7.701493000000000227e-03 +-7.706893400000000387e-03 +-8.375087800000000082e-03 +-9.284418399999999280e-03 +-1.003399840000000071e-02 +-1.136104180000000081e-02 +-1.344505650000000010e-02 +-1.564511970000000141e-02 +-1.749902240000000136e-02 +-1.840459139999999980e-02 +-1.777226250000000021e-02 +-1.597961079999999853e-02 +-1.428735930000000001e-02 +-1.346234129999999973e-02 +-1.365694050000000083e-02 +-1.513826440000000037e-02 +-1.682529649999999974e-02 +-1.769761090000000064e-02 +-1.839455740000000075e-02 +-1.845634310000000139e-02 +-1.740239160000000077e-02 +-1.644973779999999927e-02 +-1.644324419999999842e-02 +-1.711701690000000040e-02 +-1.771834400000000045e-02 +-1.739395549999999888e-02 +-1.661527080000000170e-02 +-1.655367270000000085e-02 +-1.704568290000000111e-02 +-1.805115700000000170e-02 +-2.027157619999999869e-02 +-2.368167150000000110e-02 +-2.727763019999999983e-02 +-2.994297669999999856e-02 +-3.108178860000000016e-02 +-3.056079789999999879e-02 +-2.930161259999999879e-02 +-2.810629179999999880e-02 +-2.649061109999999858e-02 +-2.457657060000000004e-02 +-2.305606699999999953e-02 +-2.184914760000000039e-02 +-2.068512310000000104e-02 +-1.932056139999999839e-02 +-1.768682120000000108e-02 +-1.611897350000000145e-02 +-1.472805200000000016e-02 +-1.347993289999999990e-02 +-1.261638699999999974e-02 +-1.203281120000000010e-02 +-1.117191709999999956e-02 +-9.783756899999999229e-03 +-8.260388100000000053e-03 +-6.698642200000000380e-03 +-5.271804899999999600e-03 +-4.659129199999999769e-03 +-4.473714200000000231e-03 +-4.071394100000000349e-03 +-3.920051499999999654e-03 +-4.220917999999999719e-03 +-4.617266400000000215e-03 +-5.411424500000000352e-03 +-6.881283699999999996e-03 +-8.526252499999999526e-03 +-9.423776800000000300e-03 +-9.211052900000000696e-03 +-8.372236999999999388e-03 +-7.133511300000000034e-03 +-5.606150199999999917e-03 +-4.365067900000000126e-03 +-3.780054499999999876e-03 +-3.712903100000000071e-03 +-3.626414200000000181e-03 +-2.968475500000000104e-03 +-1.638076200000000097e-03 +2.647820000000000002e-05 +1.267039800000000025e-03 +1.766812700000000005e-03 +1.362707199999999962e-03 +-2.014142000000000070e-04 +-2.224808899999999867e-03 +-3.384945099999999915e-03 +-3.371761500000000199e-03 +-2.874735299999999893e-03 +-2.588361899999999834e-03 +-2.354396999999999827e-03 +-1.549923500000000096e-03 +-2.942185000000000156e-04 +4.860916999999999864e-04 +1.852864000000000019e-04 +-7.217022999999999494e-04 +-1.628254499999999940e-03 +-2.170354199999999841e-03 +-2.171961699999999836e-03 +-1.761546600000000106e-03 +-1.528494800000000089e-03 +-1.549155699999999998e-03 +-1.547367600000000001e-03 +-1.722245199999999921e-03 +-2.269823299999999908e-03 +-3.227786099999999884e-03 +-4.067818100000000422e-03 +-4.278626300000000320e-03 +-3.695213900000000017e-03 +-2.361724899999999815e-03 +-1.112092899999999945e-03 +4.225500000000000116e-05 +1.699382900000000023e-03 +2.881195200000000092e-03 +2.659494899999999967e-03 +1.396503299999999996e-03 +2.647339999999999966e-05 +-7.343372000000000137e-04 +-1.254516700000000030e-03 +-1.676041700000000098e-03 +-1.471078499999999966e-03 +-8.535923000000000165e-04 +-3.827702999999999900e-04 +1.705920999999999891e-04 +1.201609100000000001e-03 +2.534858699999999881e-03 +3.415993400000000117e-03 +3.269872999999999964e-03 +2.560090699999999914e-03 +1.695518999999999932e-03 +7.305588999999999486e-04 +-5.013280000000000221e-05 +-6.975988999999999931e-04 +-1.361259999999999987e-03 +-2.036923799999999785e-03 +-2.932465899999999858e-03 +-3.975739100000000303e-03 +-4.575479399999999620e-03 +-4.384639200000000139e-03 +-3.323952499999999980e-03 +-1.447996900000000095e-03 +7.468032000000000533e-04 +2.593208599999999829e-03 +3.637816700000000118e-03 +3.834886000000000024e-03 +3.460900700000000066e-03 +2.934576700000000177e-03 +2.372197200000000002e-03 +1.658224700000000048e-03 +1.039028100000000034e-03 +1.084811100000000013e-03 +1.664066199999999921e-03 +1.981801499999999785e-03 +1.863207900000000061e-03 +1.595336699999999955e-03 +1.375090000000000036e-03 +1.121581200000000035e-03 +2.037774999999999916e-04 +-1.237006199999999981e-03 +-2.380240899999999920e-03 +-2.880354400000000037e-03 +-2.491778000000000048e-03 +-1.398916899999999922e-03 +-2.170965999999999976e-04 +1.367715499999999987e-03 +3.794053600000000127e-03 +6.420555300000000201e-03 +8.643686100000000719e-03 +1.021182560000000010e-02 +1.105580930000000031e-02 +1.139443960000000033e-02 +1.146016379999999918e-02 +1.139310779999999981e-02 +1.123494960000000036e-02 +1.078357289999999982e-02 +1.027988240000000074e-02 +1.006182849999999983e-02 +1.019900429999999990e-02 +1.086297500000000041e-02 +1.189793100000000048e-02 +1.300524890000000038e-02 +1.429212539999999941e-02 +1.599681110000000100e-02 +1.804758180000000031e-02 +2.018690589999999965e-02 +2.208326060000000146e-02 +2.340207639999999922e-02 +2.391821209999999906e-02 +2.411287089999999966e-02 +2.471825240000000146e-02 +2.555861930000000171e-02 +2.588562209999999836e-02 +2.550379330000000083e-02 +2.501818609999999915e-02 +2.469331610000000121e-02 +2.467048570000000135e-02 +2.501006470000000093e-02 +2.540216450000000112e-02 +2.613639020000000160e-02 +2.738435709999999940e-02 +2.820684269999999827e-02 +2.799731369999999830e-02 +2.750449799999999875e-02 +2.726972739999999895e-02 +2.686204700000000001e-02 +2.667601019999999920e-02 +2.765864859999999856e-02 +2.913622540000000011e-02 +2.949572509999999828e-02 +2.892779040000000024e-02 +2.819270940000000170e-02 +2.664525900000000100e-02 +2.452000169999999854e-02 +2.295014670000000007e-02 +2.208141489999999874e-02 +2.147860710000000159e-02 +2.054751130000000148e-02 +1.905036339999999911e-02 +1.790041389999999857e-02 +1.782834529999999945e-02 +1.864173389999999875e-02 +1.969634079999999995e-02 +2.035269370000000050e-02 +2.019398400000000163e-02 +1.913309510000000060e-02 +1.774870980000000167e-02 +1.632113729999999999e-02 +1.485094269999999959e-02 +1.365363590000000064e-02 +1.256760860000000028e-02 +1.120040729999999957e-02 +9.656186400000000766e-03 +8.295630300000000554e-03 +7.685928899999999730e-03 +8.137804999999999692e-03 +9.340020200000000161e-03 +1.066426510000000050e-02 +1.184044450000000005e-02 +1.363838549999999913e-02 +1.612217469999999847e-02 +1.804056030000000116e-02 +1.920806560000000093e-02 +2.024502610000000064e-02 +2.077946519999999964e-02 +2.039717120000000133e-02 +1.922822940000000133e-02 +1.705906399999999878e-02 +1.401916540000000024e-02 +1.114735170000000046e-02 +9.448148899999999836e-03 +8.840164299999999850e-03 +8.648085300000000336e-03 +8.722393999999999634e-03 +8.696347099999999705e-03 +8.303769500000000511e-03 +8.310127999999999959e-03 +8.966840999999999701e-03 +9.718102100000000632e-03 +1.011307279999999927e-02 +1.003722940000000008e-02 +9.694196100000000010e-03 +8.847011599999999448e-03 +7.477748499999999944e-03 +6.233837300000000421e-03 +5.212077300000000392e-03 +4.563056400000000366e-03 +4.171234099999999827e-03 +3.144107199999999786e-03 +1.746997300000000019e-03 +1.139691200000000036e-03 +2.097157699999999906e-03 +4.470221299999999585e-03 +7.131829099999999720e-03 +9.515832999999999584e-03 +1.161733000000000036e-02 +1.276618619999999975e-02 +1.254560099999999997e-02 +1.134066249999999935e-02 +1.021320640000000085e-02 +1.006928330000000059e-02 +1.077343889999999964e-02 +1.203394110000000072e-02 +1.354945280000000030e-02 +1.471158430000000031e-02 +1.474922449999999975e-02 +1.317972149999999988e-02 +1.074035020000000014e-02 +8.761512299999999615e-03 +7.792551899999999865e-03 +7.664209200000000020e-03 +7.685654000000000097e-03 +7.421016199999999965e-03 +7.379499000000000301e-03 +7.954885400000000217e-03 +8.878529200000000524e-03 +9.952661099999999400e-03 +1.126865160000000039e-02 +1.229848019999999972e-02 +1.219545349999999993e-02 +1.105267140000000016e-02 +9.723796399999999965e-03 +8.526256200000000354e-03 +7.113021100000000221e-03 +5.671907599999999675e-03 +4.853693000000000070e-03 +4.565762000000000119e-03 +4.284847100000000082e-03 +3.998553400000000313e-03 +3.937690500000000371e-03 +3.900092500000000139e-03 +2.995927700000000030e-03 +1.444486000000000034e-03 +9.421107000000000396e-04 +1.829228999999999924e-03 +2.965652200000000113e-03 +3.986922900000000256e-03 +5.144902699999999614e-03 +6.408210899999999995e-03 +7.126345499999999812e-03 +6.848883899999999927e-03 +6.182437199999999897e-03 +5.318240099999999720e-03 +4.257220499999999665e-03 +3.668821400000000198e-03 +3.724789000000000051e-03 +4.381758999999999828e-03 +5.485260500000000219e-03 +6.304105400000000088e-03 +6.786692500000000156e-03 +7.627236600000000116e-03 +8.721872699999999243e-03 +9.167856300000000805e-03 +8.802056900000000683e-03 +8.161694000000000587e-03 +7.381525699999999697e-03 +6.242008900000000152e-03 +4.891015900000000166e-03 +3.573198899999999959e-03 +2.350770299999999959e-03 +1.514089599999999917e-03 +1.602561699999999981e-03 +2.386220799999999934e-03 +3.033224499999999900e-03 +4.013036099999999808e-03 +5.693629000000000398e-03 +6.669029699999999734e-03 +5.755394900000000355e-03 +3.451879200000000213e-03 +1.283548299999999909e-03 +-1.404890000000000029e-05 +-8.446001999999999980e-04 +-1.261170199999999894e-03 +-1.407615000000000081e-03 +-1.508512899999999921e-03 +-1.257993900000000092e-03 +-6.142450000000000254e-04 +1.931370999999999978e-04 +6.673799999999999698e-04 +3.613776000000000076e-04 +-6.197044999999999550e-04 +-1.997923799999999812e-03 +-3.578242200000000209e-03 +-5.064980499999999913e-03 +-6.115836000000000362e-03 +-6.563219799999999750e-03 +-6.494837499999999569e-03 +-6.449121599999999704e-03 +-6.693568900000000307e-03 +-7.231565899999999568e-03 +-8.206748899999999694e-03 +-9.502970499999999210e-03 +-1.090495609999999997e-02 +-1.201578300000000037e-02 +-1.298569729999999971e-02 +-1.457329410000000013e-02 +-1.613314279999999989e-02 +-1.655770189999999920e-02 +-1.582222000000000142e-02 +-1.412764759999999946e-02 +-1.221642799999999966e-02 +-1.088578469999999972e-02 +-9.779823700000000661e-03 +-8.976897899999999181e-03 +-9.031787899999999328e-03 +-9.341654499999999320e-03 +-8.977498400000000559e-03 +-8.079281100000000257e-03 +-7.017773899999999593e-03 +-5.787753399999999784e-03 +-4.598880599999999839e-03 +-3.454120199999999828e-03 +-2.489946600000000031e-03 +-2.201335799999999850e-03 +-2.275530799999999840e-03 +-2.239295699999999893e-03 +-2.490450899999999829e-03 +-3.255233800000000011e-03 +-4.369130500000000319e-03 +-5.851014499999999605e-03 +-7.883220200000000746e-03 +-1.026882129999999969e-02 +-1.187091179999999989e-02 +-1.165810150000000031e-02 +-1.012684699999999959e-02 +-8.662696799999999517e-03 +-7.990288200000000840e-03 +-7.568451399999999614e-03 +-6.926608699999999702e-03 +-6.391058300000000345e-03 +-6.400331199999999623e-03 +-7.113309699999999756e-03 +-8.272664600000000090e-03 +-9.991940100000000838e-03 +-1.273021470000000079e-02 +-1.579629169999999944e-02 +-1.812201089999999903e-02 +-1.955443899999999985e-02 +-1.990310500000000080e-02 +-1.905072270000000151e-02 +-1.721415310000000073e-02 +-1.484394980000000065e-02 +-1.229183499999999922e-02 +-9.377503900000000447e-03 +-6.134391900000000196e-03 +-3.428631799999999966e-03 +-1.837926799999999982e-03 +-8.101812999999999810e-04 +5.295843000000000382e-04 +2.492555000000000031e-03 +4.378860800000000317e-03 +5.407230399999999985e-03 +5.484171700000000163e-03 +4.610057499999999607e-03 +2.849107300000000131e-03 +5.884698000000000489e-04 +-2.018568599999999869e-03 +-4.724215000000000358e-03 +-6.912915900000000252e-03 +-8.206399200000000574e-03 +-8.465156999999999196e-03 +-8.576426700000000514e-03 +-9.496670800000000731e-03 +-1.057786879999999922e-02 +-1.114795619999999973e-02 +-1.140110880000000035e-02 +-1.145291200000000086e-02 +-1.121635489999999943e-02 +-1.129926579999999958e-02 +-1.212685299999999994e-02 +-1.350180810000000016e-02 +-1.533483050000000042e-02 +-1.747548109999999891e-02 +-1.984282559999999904e-02 +-2.228764369999999828e-02 +-2.446713899999999886e-02 +-2.643617729999999874e-02 +-2.822043679999999832e-02 +-2.957266529999999852e-02 +-3.040653030000000159e-02 +-3.012136199999999875e-02 +-2.831463970000000149e-02 +-2.570812940000000157e-02 +-2.317627909999999888e-02 +-2.093033700000000025e-02 +-1.910778189999999890e-02 +-1.780696069999999909e-02 +-1.638098459999999881e-02 +-1.461802889999999980e-02 +-1.304945260000000065e-02 +-1.182075160000000021e-02 +-1.129388729999999952e-02 +-1.169320199999999976e-02 +-1.272048930000000029e-02 +-1.398168229999999929e-02 +-1.460341620000000021e-02 +-1.437058930000000012e-02 +-1.364439819999999949e-02 +-1.233657399999999946e-02 +-1.062847849999999997e-02 +-9.132554600000000397e-03 +-8.005732499999999516e-03 +-6.934409600000000090e-03 +-5.865656999999999816e-03 +-5.133078800000000393e-03 +-5.466051700000000221e-03 +-7.221398700000000205e-03 +-9.900835499999999928e-03 +-1.304717050000000003e-02 +-1.594000790000000070e-02 +-1.779260900000000090e-02 +-1.861156010000000055e-02 +-1.868375489999999847e-02 +-1.822996870000000158e-02 +-1.753635369999999999e-02 +-1.681304360000000081e-02 +-1.617369680000000157e-02 +-1.561508330000000062e-02 +-1.465553990000000029e-02 +-1.320370629999999962e-02 +-1.189493280000000069e-02 +-1.107175149999999920e-02 +-1.059446099999999946e-02 +-1.008416690000000018e-02 +-9.378327400000000674e-03 +-8.921008799999999642e-03 +-8.773559000000000219e-03 +-8.512772999999999521e-03 +-7.972917700000000177e-03 +-7.345057399999999591e-03 +-6.811810300000000276e-03 +-5.878079100000000064e-03 +-4.372670000000000376e-03 +-2.576533599999999979e-03 +-9.621506999999999629e-04 +-4.893640000000000533e-04 +-1.155987600000000018e-03 +-1.746666499999999971e-03 +-1.827298800000000042e-03 +-1.794165599999999897e-03 +-1.718187099999999960e-03 +-1.748312300000000015e-03 +-2.469294999999999823e-03 +-4.161163899999999714e-03 +-6.222154599999999910e-03 +-7.843648899999999813e-03 +-8.814637599999999504e-03 +-9.424573099999999926e-03 +-9.912070400000000392e-03 +-1.006958240000000067e-02 +-9.591390199999999186e-03 +-8.832149399999999345e-03 +-8.578677499999999567e-03 +-8.997732099999999206e-03 +-1.000114069999999931e-02 +-1.131246259999999990e-02 +-1.215332449999999981e-02 +-1.197734479999999942e-02 +-1.086677290000000011e-02 +-9.620912299999999362e-03 +-9.022274199999999467e-03 +-9.202698299999999276e-03 +-9.562065999999999275e-03 +-9.645825199999999433e-03 +-9.559607200000000415e-03 +-9.236901100000000087e-03 +-8.679647699999999341e-03 +-8.320372499999999227e-03 +-8.579583800000000274e-03 +-9.155535399999999505e-03 +-9.390595099999999446e-03 +-9.226328299999999455e-03 +-8.590151000000000731e-03 +-7.323154499999999859e-03 +-6.271577399999999670e-03 +-6.023621800000000109e-03 +-6.446938499999999884e-03 +-7.633063699999999632e-03 +-9.294179899999999508e-03 +-1.063424410000000063e-02 +-1.119542959999999913e-02 +-1.096915530000000007e-02 +-1.032393199999999921e-02 +-9.669284300000000748e-03 +-9.021924599999999947e-03 +-8.264456999999999359e-03 +-7.410746499999999910e-03 +-6.435882599999999745e-03 +-5.045553900000000237e-03 +-3.368678300000000052e-03 +-1.737425500000000077e-03 +-4.486060000000000210e-05 +1.539959899999999906e-03 +2.627754700000000179e-03 +3.285801000000000086e-03 +3.870531700000000210e-03 +4.465732499999999772e-03 +4.678234600000000069e-03 +4.368410199999999723e-03 +3.672961000000000194e-03 +2.621153000000000198e-03 +1.423530400000000027e-03 +8.091897000000000022e-04 +1.387326599999999912e-03 +2.978333000000000109e-03 +4.859446499999999641e-03 +6.320355899999999597e-03 +7.440884200000000108e-03 +8.354501999999999762e-03 +8.801226500000000272e-03 +8.899096299999999238e-03 +8.806376600000000512e-03 +8.588394799999999468e-03 +8.319337700000000238e-03 +8.040694500000000744e-03 +7.960797199999999560e-03 +7.994640299999999575e-03 +7.960701400000000719e-03 +8.036150800000000857e-03 +8.179019100000000514e-03 +8.257832999999999146e-03 +8.504076299999999838e-03 +9.164003000000000426e-03 +1.021047379999999970e-02 +1.163854419999999987e-02 +1.347612289999999997e-02 +1.493107450000000051e-02 +1.523978399999999928e-02 +1.475265490000000033e-02 +1.375031210000000025e-02 +1.221535900000000029e-02 +1.069356819999999972e-02 +9.982326399999999836e-03 +1.027002020000000043e-02 +1.128485520000000082e-02 +1.268914709999999918e-02 +1.419084940000000031e-02 +1.545366310000000076e-02 +1.651393630000000043e-02 +1.785888160000000113e-02 +1.899784880000000148e-02 +1.901016919999999957e-02 +1.800860749999999913e-02 +1.621201950000000086e-02 +1.373641320000000034e-02 +1.156532920000000013e-02 +1.033867160000000000e-02 +9.646840500000000013e-03 +9.303242200000000697e-03 +9.296517299999999470e-03 +9.434238100000000640e-03 +9.629150399999999652e-03 +9.549030000000000018e-03 +9.216866299999999443e-03 +9.506253399999999368e-03 +1.058318219999999921e-02 +1.174392659999999936e-02 +1.261483390000000052e-02 +1.307265179999999964e-02 +1.314031230000000001e-02 +1.304245700000000036e-02 +1.290282189999999995e-02 +1.263410350000000043e-02 +1.229901150000000006e-02 +1.229485890000000040e-02 +1.273984149999999975e-02 +1.305522989999999967e-02 +1.273232640000000054e-02 +1.211226190000000077e-02 +1.159846429999999984e-02 +1.107428650000000063e-02 +1.054695899999999985e-02 +1.021808920000000058e-02 +1.009747169999999916e-02 +9.963037799999999514e-03 +9.576598000000000402e-03 +9.151166000000000508e-03 +9.000308199999999467e-03 +9.039357399999999737e-03 +9.344195600000000657e-03 +1.010021340000000038e-02 +1.098149200000000068e-02 +1.166248110000000018e-02 +1.235147370000000064e-02 +1.306076530000000076e-02 +1.357710869999999986e-02 +1.392627980000000001e-02 +1.398471299999999931e-02 +1.385073250000000075e-02 +1.400971150000000082e-02 +1.445834369999999917e-02 +1.480782410000000028e-02 +1.495393019999999989e-02 +1.506334110000000052e-02 +1.533093649999999961e-02 +1.570238789999999982e-02 +1.584042529999999879e-02 +1.568016880000000154e-02 +1.554901669999999951e-02 +1.538254099999999958e-02 +1.497535839999999951e-02 +1.473911590000000042e-02 +1.477838660000000033e-02 +1.462795899999999941e-02 +1.415210819999999925e-02 +1.341148539999999917e-02 +1.243441399999999954e-02 +1.157264260000000038e-02 +1.121832260000000039e-02 +1.126196079999999995e-02 +1.132668709999999981e-02 +1.121357400000000046e-02 +1.081463899999999916e-02 +1.014251839999999981e-02 +9.321937500000000362e-03 +8.462522499999999837e-03 +7.693856199999999854e-03 +7.021356700000000103e-03 +6.581843199999999616e-03 +6.526608300000000251e-03 +6.620418799999999715e-03 +6.533338500000000250e-03 +6.372643199999999952e-03 +6.357124300000000124e-03 +6.364220900000000167e-03 +6.155940900000000243e-03 +5.524401699999999769e-03 +4.870618499999999906e-03 +4.886518599999999622e-03 +5.553259900000000367e-03 +6.705019300000000099e-03 +8.171100400000000721e-03 +9.527468299999999543e-03 +1.055463809999999947e-02 +1.127168580000000031e-02 +1.160819180000000062e-02 +1.134277109999999936e-02 +1.073086030000000059e-02 +1.036721940000000057e-02 +1.032494930000000047e-02 +1.050352360000000006e-02 +1.086900690000000037e-02 +1.101050270000000081e-02 +1.070190329999999926e-02 +1.014578600000000039e-02 +9.590427699999999264e-03 +9.164858099999999286e-03 +8.854509400000000127e-03 +8.430573999999999707e-03 +7.666811899999999812e-03 +6.822541700000000348e-03 +6.349568499999999616e-03 +6.264948499999999955e-03 +6.143588400000000310e-03 +5.682866400000000096e-03 +4.949912199999999957e-03 +4.015741300000000291e-03 +2.902756199999999894e-03 +1.661772699999999967e-03 +6.444836999999999701e-04 +2.184599999999999921e-04 +5.971601000000000426e-04 +1.719422200000000032e-03 +3.042731400000000044e-03 +4.190250599999999735e-03 +4.936238100000000378e-03 +5.114006899999999807e-03 +4.901747300000000238e-03 +4.569431799999999939e-03 +4.074275799999999871e-03 +3.372752399999999831e-03 +2.440167599999999801e-03 +1.314142300000000017e-03 +3.653603000000000059e-04 +-7.103160000000000615e-05 +1.556000000000000010e-06 +3.543829999999999984e-04 +5.593685999999999624e-04 +3.870303999999999867e-04 +-1.491607000000000100e-04 +-9.162016999999999731e-04 +-1.755192800000000093e-03 +-2.478475500000000119e-03 +-2.908243599999999797e-03 +-3.132997900000000085e-03 +-3.191074600000000112e-03 +-2.972814199999999907e-03 +-2.442059800000000169e-03 +-1.887599499999999958e-03 +-1.683374000000000068e-03 +-1.962176400000000074e-03 +-2.629524600000000042e-03 +-3.329663000000000067e-03 +-3.888796899999999793e-03 +-4.501207800000000397e-03 +-5.125234700000000018e-03 +-5.301286500000000276e-03 +-4.908455800000000209e-03 +-4.624422999999999902e-03 +-4.686173600000000279e-03 +-4.897034800000000035e-03 +-5.537482500000000425e-03 +-6.530542099999999892e-03 +-7.485374199999999568e-03 +-8.166186299999999426e-03 +-8.375712999999999908e-03 +-7.967787900000000353e-03 +-6.887841300000000118e-03 +-5.356835400000000032e-03 +-3.747039299999999854e-03 +-2.454538300000000135e-03 +-1.584227300000000003e-03 +-1.145897099999999922e-03 +-1.344834600000000034e-03 +-2.070915799999999835e-03 +-2.979683999999999805e-03 +-3.968579699999999662e-03 +-4.654570000000000235e-03 +-4.626710099999999624e-03 +-4.383776600000000023e-03 +-4.315841899999999821e-03 +-4.060409099999999667e-03 +-3.442414600000000182e-03 +-2.778796400000000180e-03 +-2.152159500000000013e-03 +-1.334969199999999937e-03 +-6.869061999999999998e-04 +-9.488880000000000535e-04 +-2.122878300000000020e-03 +-3.659060899999999877e-03 +-5.085956299999999652e-03 +-6.198145399999999659e-03 +-7.242120000000000328e-03 +-8.299680099999999852e-03 +-9.222182599999999980e-03 +-1.011939859999999927e-02 +-1.085038959999999955e-02 +-1.102119929999999942e-02 +-1.074819680000000006e-02 +-1.023297890000000009e-02 +-9.658856699999999323e-03 +-9.572726099999999752e-03 +-9.981211699999999187e-03 +-1.025582059999999990e-02 +-1.008860500000000049e-02 +-9.532092600000000027e-03 +-8.739989099999999692e-03 +-7.944471300000000361e-03 +-7.394088099999999650e-03 +-7.271764899999999879e-03 +-7.495320100000000228e-03 +-7.831538799999999273e-03 +-8.206882599999999750e-03 +-8.483508500000000452e-03 +-8.396496999999999294e-03 +-8.137541300000000408e-03 +-8.092890000000000153e-03 +-8.261309499999999403e-03 +-8.570667699999999500e-03 +-9.053636599999999660e-03 +-9.488564999999999153e-03 +-9.607379399999999361e-03 +-9.610470899999999303e-03 +-9.924481400000000758e-03 +-1.066001960000000082e-02 +-1.193725309999999970e-02 +-1.344998359999999976e-02 +-1.435239370000000042e-02 +-1.431097660000000063e-02 +-1.324377889999999933e-02 +-1.150525900000000032e-02 +-9.766013500000000208e-03 +-8.377701899999999424e-03 +-7.434047000000000051e-03 +-6.715020999999999837e-03 +-6.081424600000000409e-03 +-5.594094099999999577e-03 +-5.325621899999999874e-03 +-5.229426700000000365e-03 +-5.086198400000000244e-03 +-4.851766199999999613e-03 +-4.743984899999999574e-03 +-4.770577899999999677e-03 +-4.614598900000000010e-03 +-4.216485100000000319e-03 +-3.889320999999999837e-03 +-3.865233500000000207e-03 +-4.208307799999999946e-03 +-4.839971000000000204e-03 +-5.613215799999999797e-03 +-6.273530499999999989e-03 +-6.445398199999999821e-03 +-6.109177500000000094e-03 +-5.668184399999999859e-03 +-5.389136200000000168e-03 +-5.272693099999999772e-03 +-5.309594899999999819e-03 +-5.554157799999999943e-03 +-6.015269400000000308e-03 +-6.357988299999999850e-03 +-6.281407499999999873e-03 +-5.947965599999999707e-03 +-5.643330999999999695e-03 +-5.369640099999999777e-03 +-4.940200799999999899e-03 +-4.292578200000000087e-03 +-3.507561099999999786e-03 +-2.944342999999999873e-03 +-2.695271999999999859e-03 +-2.579924600000000137e-03 +-2.755604300000000142e-03 +-3.137175299999999962e-03 +-3.202146600000000103e-03 +-2.794875000000000050e-03 +-2.069813099999999809e-03 +-1.171267599999999912e-03 +-5.251337000000000236e-04 +-3.110996999999999786e-04 +-3.645842000000000050e-04 +-5.878409999999999712e-04 +-5.599351999999999715e-04 +-1.646712999999999899e-04 +7.960849999999999513e-05 +5.008050000000000273e-05 +-9.903020000000000605e-05 +-6.054819999999999739e-05 +4.449812000000000147e-04 +1.029528299999999926e-03 +1.364564800000000024e-03 +1.540352299999999926e-03 +1.542967899999999996e-03 +1.365494500000000036e-03 +1.066651399999999977e-03 +8.713402000000000300e-04 +1.116797899999999975e-03 +1.833283800000000061e-03 +2.708823300000000062e-03 +3.118771399999999919e-03 +2.966439200000000036e-03 +2.978811400000000182e-03 +3.462705099999999984e-03 +4.110290400000000087e-03 +4.791333800000000323e-03 +5.665162500000000233e-03 +6.887682099999999606e-03 +8.447756900000000582e-03 +1.008655250000000010e-02 +1.139340399999999934e-02 +1.218022960000000009e-02 +1.273501210000000002e-02 +1.323930580000000010e-02 +1.331110169999999947e-02 +1.275129080000000047e-02 +1.206844470000000002e-02 +1.170405390000000059e-02 +1.169569500000000074e-02 +1.183529290000000060e-02 +1.187790059999999960e-02 +1.179920949999999948e-02 +1.153357519999999997e-02 +1.102160330000000014e-02 +1.033113270000000049e-02 +9.810670699999999439e-03 +9.799954899999999483e-03 +1.045711470000000066e-02 +1.159947180000000036e-02 +1.261983210000000057e-02 +1.344226720000000000e-02 +1.403941790000000009e-02 +1.419826740000000066e-02 +1.429976779999999996e-02 +1.458958829999999936e-02 +1.497941000000000029e-02 +1.549513180000000080e-02 +1.592817720000000090e-02 +1.602800000000000058e-02 +1.580800879999999867e-02 +1.525579539999999922e-02 +1.478253910000000039e-02 +1.479615630000000008e-02 +1.507464420000000083e-02 +1.541455660000000047e-02 +1.571714009999999884e-02 +1.587062649999999853e-02 +1.594302040000000059e-02 +1.621749529999999898e-02 +1.647426889999999838e-02 +1.620498670000000002e-02 +1.559122309999999914e-02 +1.489001900000000086e-02 +1.414731420000000031e-02 +1.362292430000000033e-02 +1.338548739999999987e-02 +1.328434669999999963e-02 +1.328748230000000030e-02 +1.340530439999999997e-02 +1.365493450000000025e-02 +1.407489800000000062e-02 +1.455224400000000064e-02 +1.494622779999999970e-02 +1.530109590000000054e-02 +1.565475050000000173e-02 +1.595658319999999908e-02 +1.613230369999999955e-02 +1.613877409999999943e-02 +1.616182459999999932e-02 +1.643722499999999975e-02 +1.679951160000000068e-02 +1.680112900000000145e-02 +1.633389920000000162e-02 +1.558958489999999995e-02 +1.463541839999999913e-02 +1.370022020000000000e-02 +1.297994449999999994e-02 +1.248934479999999972e-02 +1.238810499999999995e-02 +1.256971450000000066e-02 +1.282936429999999989e-02 +1.307764659999999940e-02 +1.302217789999999924e-02 +1.243331970000000064e-02 +1.145749639999999944e-02 +1.062776409999999921e-02 +1.019379389999999948e-02 +9.919729800000000666e-03 +9.480781199999999825e-03 +8.636090600000000117e-03 +7.568937399999999677e-03 +6.744102299999999751e-03 +6.299353399999999860e-03 +6.169850400000000297e-03 +6.261746200000000394e-03 +6.176583000000000247e-03 +5.757825700000000074e-03 +5.279664199999999953e-03 +4.954307100000000276e-03 +4.954646299999999719e-03 +5.376474800000000283e-03 +6.064115999999999604e-03 +6.648164100000000278e-03 +6.960009799999999913e-03 +6.957304600000000297e-03 +6.741182699999999882e-03 +6.623575900000000342e-03 +6.615427699999999918e-03 +6.673253500000000255e-03 +6.841073300000000135e-03 +7.088223599999999604e-03 +7.410624799999999610e-03 +7.815314500000000025e-03 +8.290825499999999668e-03 +8.791100700000000281e-03 +9.258913599999999897e-03 +9.665000700000000652e-03 +9.896399400000000304e-03 +9.808397300000000485e-03 +9.508689000000000724e-03 +9.215332099999999291e-03 +8.933044700000000032e-03 +8.722555800000000165e-03 +8.692074699999999959e-03 +8.619884099999999133e-03 +8.162705100000000602e-03 +7.475325399999999815e-03 +6.874256100000000064e-03 +6.358313299999999654e-03 +6.083995099999999628e-03 +6.124939900000000124e-03 +6.260831399999999825e-03 +6.387952599999999898e-03 +6.458428300000000101e-03 +6.543474599999999849e-03 +6.764416900000000399e-03 +7.040380199999999797e-03 +7.132199700000000329e-03 +6.896718900000000339e-03 +6.415594499999999895e-03 +5.745796699999999868e-03 +5.228650599999999822e-03 +5.203633400000000180e-03 +5.457873900000000111e-03 +5.815889900000000175e-03 +6.315527399999999736e-03 +6.830550700000000142e-03 +7.081645499999999864e-03 +7.123760800000000087e-03 +7.201022199999999700e-03 +7.360535100000000115e-03 +7.558875900000000363e-03 +7.731398999999999910e-03 +7.712839200000000048e-03 +7.344612500000000099e-03 +6.890895200000000248e-03 +6.573730100000000319e-03 +6.173124399999999588e-03 +5.638310799999999949e-03 +5.246188199999999788e-03 +5.055873699999999596e-03 +4.880253799999999600e-03 +4.658002999999999970e-03 +4.418551899999999602e-03 +4.176924900000000135e-03 +3.811051700000000000e-03 +3.251214000000000100e-03 +2.714914499999999866e-03 +2.196662099999999868e-03 +1.571266800000000038e-03 +1.224679100000000036e-03 +1.481567000000000040e-03 +2.144281699999999857e-03 +2.828740699999999966e-03 +3.456410799999999877e-03 +4.081475299999999876e-03 +4.301690799999999780e-03 +3.930580599999999696e-03 +3.429699200000000097e-03 +3.049304100000000111e-03 +2.528890199999999852e-03 +1.828957700000000000e-03 +1.179694800000000068e-03 +6.421560999999999892e-04 +2.140501000000000057e-04 +-6.391959999999999699e-05 +-5.332009999999999793e-05 +4.552798000000000045e-04 +1.310466900000000021e-03 +1.991167299999999953e-03 +2.338979100000000179e-03 +2.620774499999999931e-03 +3.120927199999999971e-03 +3.902081500000000123e-03 +4.805619799999999962e-03 +5.609006599999999919e-03 +6.106358499999999835e-03 +6.247355399999999712e-03 +6.111580299999999806e-03 +5.892202899999999903e-03 +5.636756500000000315e-03 +5.157822500000000011e-03 +4.580483500000000381e-03 +4.221385700000000046e-03 +4.013626400000000309e-03 +3.681630999999999879e-03 +3.157874199999999819e-03 +2.513825600000000118e-03 +1.923389599999999946e-03 +1.516431900000000032e-03 +1.159557799999999918e-03 +1.063560999999999977e-03 +1.357441700000000051e-03 +1.644270699999999998e-03 +1.785117199999999979e-03 +1.814204399999999953e-03 +1.585072899999999960e-03 +9.863772999999999725e-04 +2.404871000000000103e-04 +-3.682644000000000108e-04 +-8.438045999999999611e-04 +-1.333219000000000071e-03 +-1.922633300000000083e-03 +-2.591705399999999840e-03 +-3.373376200000000047e-03 +-4.277922200000000043e-03 +-5.089390099999999660e-03 +-5.703523099999999874e-03 +-6.308685199999999708e-03 +-6.895429399999999931e-03 +-7.165797500000000396e-03 +-7.157044999999999900e-03 +-7.100877499999999967e-03 +-6.881807700000000007e-03 +-6.329072600000000028e-03 +-5.588642399999999705e-03 +-5.078797599999999683e-03 +-5.022630200000000218e-03 +-5.415982899999999614e-03 +-6.093653099999999691e-03 +-6.703765199999999619e-03 +-7.194865899999999814e-03 +-7.533356899999999606e-03 +-7.504519000000000294e-03 +-7.151569600000000186e-03 +-6.641515899999999618e-03 +-6.178833899999999768e-03 +-5.895346600000000298e-03 +-5.811638899999999920e-03 +-5.978602300000000064e-03 +-6.206589799999999608e-03 +-6.341897600000000190e-03 +-6.706913499999999848e-03 +-7.499852999999999902e-03 +-8.301829000000000153e-03 +-8.753076900000000132e-03 +-8.987725900000000101e-03 +-9.276242599999999852e-03 +-9.593278699999999160e-03 +-9.663849199999999598e-03 +-9.477733199999999539e-03 +-9.160743600000000042e-03 +-9.016076600000000676e-03 +-9.326822300000000773e-03 +-9.832497500000000543e-03 +-1.024841110000000027e-02 +-1.060258520000000038e-02 +-1.086197830000000010e-02 +-1.091345330000000058e-02 +-1.091260370000000056e-02 +-1.107921090000000067e-02 +-1.119193880000000051e-02 +-1.092566560000000041e-02 +-1.056443200000000034e-02 +-1.045041759999999938e-02 +-1.057245130000000061e-02 +-1.091703179999999919e-02 +-1.152242350000000012e-02 +-1.230515599999999939e-02 +-1.282904389999999992e-02 +-1.288928100000000070e-02 +-1.269066330000000013e-02 +-1.235352070000000045e-02 +-1.190335260000000006e-02 +-1.149858460000000027e-02 +-1.129544600000000065e-02 +-1.115727310000000014e-02 +-1.080184940000000066e-02 +-1.013790070000000071e-02 +-9.369073800000000604e-03 +-8.752428499999999334e-03 +-8.356877100000000003e-03 +-8.149488599999999208e-03 +-8.157666900000000790e-03 +-8.306247600000000314e-03 +-8.488118600000000430e-03 +-8.598450900000000410e-03 +-8.510564300000000512e-03 +-8.334381599999999418e-03 +-8.264980899999999769e-03 +-8.287549599999999295e-03 +-8.322370200000000010e-03 +-8.257999999999999716e-03 +-7.978855099999999576e-03 +-7.547242899999999886e-03 +-7.113135300000000133e-03 +-6.898239599999999791e-03 +-7.046860299999999945e-03 +-7.498908900000000183e-03 +-7.971713499999999800e-03 +-8.300738499999999950e-03 +-8.848691400000000679e-03 +-9.760505299999999718e-03 +-1.068117179999999999e-02 +-1.149094219999999972e-02 +-1.219762599999999961e-02 +-1.268004780000000012e-02 +-1.301301470000000050e-02 +-1.317392279999999964e-02 +-1.290021530000000013e-02 +-1.232096369999999969e-02 +-1.189314349999999985e-02 +-1.175252589999999965e-02 +-1.191209730000000050e-02 +-1.239954880000000009e-02 +-1.310618310000000002e-02 +-1.389215840000000007e-02 +-1.456087019999999926e-02 +-1.486619630000000046e-02 +-1.469726189999999953e-02 +-1.413325309999999974e-02 +-1.330278380000000059e-02 +-1.251462780000000066e-02 +-1.208083859999999933e-02 +-1.187590579999999937e-02 +-1.157068309999999961e-02 +-1.121662489999999957e-02 +-1.099813659999999971e-02 +-1.097006049999999996e-02 +-1.121144150000000055e-02 +-1.154018090000000045e-02 +-1.178228060000000021e-02 +-1.200659750000000053e-02 +-1.208652470000000020e-02 +-1.202994569999999916e-02 +-1.205840069999999931e-02 +-1.208415460000000080e-02 +-1.193278180000000022e-02 +-1.166264579999999954e-02 +-1.145549929999999973e-02 +-1.151223799999999929e-02 +-1.176428030000000076e-02 +-1.196647470000000019e-02 +-1.213297999999999981e-02 +-1.224567160000000071e-02 +-1.218125999999999931e-02 +-1.200086120000000076e-02 +-1.176698089999999967e-02 +-1.149575379999999945e-02 +-1.120172910000000015e-02 +-1.084885889999999929e-02 +-1.050611930000000006e-02 +-1.019414050000000058e-02 +-9.919466499999999784e-03 +-9.980715299999999915e-03 +-1.038050979999999984e-02 +-1.073405520000000023e-02 +-1.097648420000000083e-02 +-1.097512370000000050e-02 +-1.051382340000000040e-02 +-9.739700000000000440e-03 +-8.789965900000000151e-03 +-7.794006099999999625e-03 +-6.981593399999999616e-03 +-6.356224300000000264e-03 +-5.693891399999999672e-03 +-4.991096799999999827e-03 +-4.468283899999999850e-03 +-4.239021100000000403e-03 +-4.389968299999999837e-03 +-4.833288600000000025e-03 +-5.223108599999999949e-03 +-5.366798300000000417e-03 +-5.133633299999999962e-03 +-4.691532899999999867e-03 +-4.500220200000000156e-03 +-4.462595100000000224e-03 +-4.335640099999999580e-03 +-4.327795199999999801e-03 +-4.652810299999999948e-03 +-5.224692700000000203e-03 +-5.779378299999999614e-03 +-6.130995099999999795e-03 +-6.334303599999999666e-03 +-6.378486600000000256e-03 +-6.022676000000000245e-03 +-5.247309200000000416e-03 +-4.354494100000000020e-03 +-3.678082000000000053e-03 +-3.350787500000000207e-03 +-3.301613899999999990e-03 +-3.370423999999999903e-03 +-3.386879299999999860e-03 +-3.232231700000000145e-03 +-2.933452000000000021e-03 +-2.747470699999999925e-03 +-2.829376000000000200e-03 +-3.067804199999999998e-03 +-3.233031899999999799e-03 +-3.142049300000000159e-03 +-2.816394700000000081e-03 +-2.393773599999999852e-03 +-1.896296700000000028e-03 +-1.326620099999999960e-03 +-8.554768999999999611e-04 +-5.282075000000000008e-04 +-1.969786000000000117e-04 +1.514894999999999935e-04 +4.235430000000000206e-04 +4.577733999999999970e-04 +1.354644999999999970e-04 +-4.991856999999999935e-04 +-1.156719999999999970e-03 +-1.520604899999999926e-03 +-1.507457499999999978e-03 +-1.150062600000000077e-03 +-4.814279000000000193e-04 +4.711970000000000221e-04 +1.294214400000000048e-03 +1.639348600000000095e-03 +1.640762800000000092e-03 +1.564995499999999968e-03 +1.522099600000000053e-03 +1.462622000000000011e-03 +1.414598599999999972e-03 +1.456875899999999927e-03 +1.697935000000000026e-03 +2.052367299999999922e-03 +2.261358700000000010e-03 +2.189718499999999957e-03 +1.814364099999999985e-03 +1.173600199999999972e-03 +2.492438999999999939e-04 +-8.747689999999999589e-04 +-1.900786200000000080e-03 +-2.738110700000000002e-03 +-3.473847500000000130e-03 +-4.092427499999999781e-03 +-4.598190500000000000e-03 +-4.954055899999999617e-03 +-5.050660000000000219e-03 +-4.995523200000000046e-03 +-5.042156499999999632e-03 +-5.270539200000000368e-03 +-5.584796500000000115e-03 +-5.772585499999999953e-03 +-5.735965699999999792e-03 +-5.546236999999999868e-03 +-5.164325299999999661e-03 +-4.497897399999999969e-03 +-3.558003499999999857e-03 +-2.567680699999999941e-03 +-1.905234800000000063e-03 +-1.564931600000000079e-03 +-1.359368799999999960e-03 +-1.399668900000000053e-03 +-1.703539000000000008e-03 +-2.081900199999999878e-03 +-2.384457500000000153e-03 +-2.503720400000000214e-03 +-2.433892600000000205e-03 +-2.336706000000000026e-03 +-2.228253199999999986e-03 +-2.045177100000000053e-03 +-1.932617200000000040e-03 +-1.877904400000000038e-03 +-1.708453699999999990e-03 +-1.508542899999999959e-03 +-1.389241700000000065e-03 +-1.339048200000000086e-03 +-1.336940499999999957e-03 +-1.252031600000000008e-03 +-9.932571000000000282e-04 +-6.176973999999999789e-04 +-3.336522999999999768e-04 +-3.270991000000000003e-04 +-5.048621000000000532e-04 +-8.083412999999999579e-04 +-1.176810799999999978e-03 +-1.441840599999999993e-03 +-1.677331800000000060e-03 +-1.987245800000000170e-03 +-2.340183899999999893e-03 +-2.662330400000000215e-03 +-2.804269399999999995e-03 +-2.727847800000000097e-03 +-2.497224799999999984e-03 +-2.120647499999999980e-03 +-1.698978199999999928e-03 +-1.421473400000000057e-03 +-1.328126800000000059e-03 +-1.398420000000000045e-03 +-1.620201900000000023e-03 +-1.898769399999999941e-03 +-2.169554399999999890e-03 +-2.555223299999999798e-03 +-3.187313800000000051e-03 +-3.982225199999999896e-03 +-4.595806000000000023e-03 +-4.815344400000000184e-03 +-4.802648999999999981e-03 +-4.811737100000000426e-03 +-4.961110799999999751e-03 +-5.131778899999999907e-03 +-5.218192699999999774e-03 +-5.266033399999999962e-03 +-5.269541899999999855e-03 +-5.178297600000000313e-03 +-5.019480699999999580e-03 +-4.816139900000000404e-03 +-4.548162100000000159e-03 +-4.350909099999999627e-03 +-4.386049399999999640e-03 +-4.585385299999999650e-03 +-4.770838399999999604e-03 +-4.873363599999999685e-03 +-4.944190000000000217e-03 +-4.997229500000000338e-03 +-4.986515099999999992e-03 +-4.870042599999999978e-03 +-4.597948099999999740e-03 +-4.129156900000000019e-03 +-3.669948399999999836e-03 +-3.436974099999999793e-03 +-3.440135500000000152e-03 +-3.630276699999999794e-03 +-3.825040400000000174e-03 +-3.963025999999999702e-03 +-4.250297499999999840e-03 +-4.759305299999999801e-03 +-5.279554900000000411e-03 +-5.690426699999999970e-03 +-6.074264200000000294e-03 +-6.533929200000000020e-03 +-7.043398200000000262e-03 +-7.468331299999999597e-03 +-7.763654600000000246e-03 +-7.879531800000000655e-03 +-7.793875199999999656e-03 +-7.587881000000000313e-03 +-7.180886600000000244e-03 +-6.425169300000000208e-03 +-5.364990699999999842e-03 +-4.190121899999999650e-03 +-3.082077700000000146e-03 +-2.096718500000000190e-03 +-1.279753900000000100e-03 +-6.382033999999999754e-04 +-1.019282000000000044e-04 +2.499545999999999734e-04 +3.383479000000000000e-04 +2.209547000000000073e-04 +-1.280060000000000074e-05 +-2.250986000000000068e-04 +-3.918433999999999828e-04 +-5.889137999999999925e-04 +-8.112644000000000452e-04 +-1.062751100000000051e-03 +-1.473034899999999892e-03 +-2.081615900000000074e-03 +-2.610631300000000078e-03 +-2.841664199999999890e-03 +-2.835923299999999845e-03 +-2.684241500000000141e-03 +-2.534752300000000028e-03 +-2.509072800000000051e-03 +-2.583416700000000076e-03 +-2.701511199999999824e-03 +-2.732318000000000073e-03 +-2.561123499999999956e-03 +-2.242195900000000085e-03 +-1.861358499999999977e-03 +-1.418929800000000036e-03 +-8.847821000000000071e-04 +-3.102442999999999867e-04 +1.620469000000000087e-04 +5.105618000000000352e-04 +8.091590000000000501e-04 +1.068494300000000013e-03 +1.270628800000000048e-03 +1.410930799999999966e-03 +1.522077200000000003e-03 +1.648542899999999893e-03 +1.738251300000000004e-03 +1.659079400000000072e-03 +1.446601600000000038e-03 +1.171855000000000075e-03 +7.851181000000000479e-04 +2.876323999999999873e-04 +-2.987061999999999964e-04 +-8.060358999999999580e-04 +-9.542654999999999931e-04 +-7.107084999999999531e-04 +-1.882526999999999942e-04 +3.119775000000000196e-04 +5.374438000000000262e-04 +5.390743999999999831e-04 +3.465483999999999904e-04 +1.696335999999999948e-04 +1.889480999999999875e-04 +3.102824000000000229e-04 +4.848028999999999793e-04 +6.974576999999999817e-04 +8.843447000000000374e-04 +9.345504999999999828e-04 +9.119669000000000386e-04 +9.600217000000000516e-04 +1.033732699999999902e-03 +1.117887500000000088e-03 +1.250046600000000088e-03 +1.424889199999999998e-03 +1.671401699999999898e-03 +1.963041300000000107e-03 +2.217624300000000173e-03 +2.478997599999999916e-03 +2.865232699999999914e-03 +3.207564699999999793e-03 +3.246631800000000095e-03 +2.950926699999999788e-03 +2.346806099999999926e-03 +1.613552400000000005e-03 +1.046219699999999947e-03 +7.548407000000000250e-04 +8.051169000000000164e-04 +1.300197799999999954e-03 +2.073795099999999839e-03 +2.812553499999999925e-03 +3.457461700000000020e-03 +3.909016599999999737e-03 +4.068554099999999868e-03 +4.161839799999999916e-03 +4.370421900000000075e-03 +4.690318599999999949e-03 +5.011016099999999682e-03 +5.188746200000000225e-03 +5.246173100000000276e-03 +5.309653999999999589e-03 +5.347691299999999572e-03 +5.311147300000000106e-03 +5.272543499999999932e-03 +5.352262699999999797e-03 +5.531414999999999596e-03 +5.647848999999999925e-03 +5.690771100000000318e-03 +5.750225900000000175e-03 +5.828782799999999639e-03 +5.933450499999999572e-03 +5.939216599999999971e-03 +5.729231700000000232e-03 +5.486469899999999768e-03 +5.280515199999999583e-03 +5.037043700000000401e-03 +4.804059700000000085e-03 +4.651212200000000123e-03 +4.662197100000000337e-03 +4.889579699999999605e-03 +5.133014800000000252e-03 +5.088578800000000124e-03 +4.777325600000000005e-03 +4.363907400000000339e-03 +4.003100899999999761e-03 +3.792474899999999979e-03 +3.696879699999999942e-03 +3.703751300000000021e-03 +3.847185099999999962e-03 +4.173311899999999734e-03 +4.588709100000000311e-03 +4.914616200000000192e-03 +4.975889800000000106e-03 +4.678231199999999777e-03 +4.142942999999999626e-03 +3.581713399999999960e-03 +3.170160300000000094e-03 +2.984652899999999838e-03 +2.942622499999999943e-03 +2.837477299999999810e-03 +2.573610799999999886e-03 +2.301979699999999809e-03 +2.167185900000000165e-03 +2.152852600000000009e-03 +2.253624499999999815e-03 +2.496414699999999990e-03 +2.829481999999999917e-03 +3.110551400000000164e-03 +3.299694399999999854e-03 +3.415292199999999962e-03 +3.234234199999999962e-03 +2.740741599999999868e-03 +2.135075000000000167e-03 +1.520192000000000071e-03 +1.035640499999999952e-03 +7.626587999999999900e-04 +6.544448999999999926e-04 +5.772464000000000371e-04 +4.927813999999999979e-04 +4.225335999999999892e-04 +3.477922999999999735e-04 +2.569940000000000267e-04 +7.559940000000000670e-05 +-2.089461000000000085e-04 +-4.932301000000000263e-04 +-7.231788999999999752e-04 +-1.002385599999999939e-03 +-1.433112600000000045e-03 +-1.956551600000000155e-03 +-2.470786100000000023e-03 +-2.897261400000000070e-03 +-3.081179199999999931e-03 +-2.866741700000000146e-03 +-2.343041499999999871e-03 +-1.881527200000000094e-03 +-1.739173199999999959e-03 +-1.872715899999999930e-03 +-2.225550499999999921e-03 +-2.632023399999999964e-03 +-2.872605099999999897e-03 +-2.929141399999999826e-03 +-2.844597500000000095e-03 +-2.709819300000000132e-03 +-2.644013599999999950e-03 +-2.608956099999999983e-03 +-2.574818600000000190e-03 +-2.697075900000000040e-03 +-3.027337599999999941e-03 +-3.385171000000000187e-03 +-3.715486699999999854e-03 +-4.060417000000000193e-03 +-4.341078699999999756e-03 +-4.467379999999999962e-03 +-4.431154500000000253e-03 +-4.292601200000000124e-03 +-4.206143399999999997e-03 +-4.295691100000000387e-03 +-4.552978699999999865e-03 +-4.889241199999999968e-03 +-5.212152799999999683e-03 +-5.448829300000000188e-03 +-5.612357299999999778e-03 +-5.831868799999999874e-03 +-6.093335200000000139e-03 +-6.298423699999999847e-03 +-6.380760200000000146e-03 +-6.274512299999999987e-03 +-6.011076800000000019e-03 +-5.654927899999999570e-03 +-5.334288599999999735e-03 +-5.231286400000000059e-03 +-5.328589800000000168e-03 +-5.412082399999999620e-03 +-5.352759500000000073e-03 +-5.214795099999999968e-03 +-5.188576299999999968e-03 +-5.379987299999999806e-03 +-5.583685399999999827e-03 +-5.595165299999999703e-03 +-5.458491499999999948e-03 +-5.235714100000000287e-03 +-4.943860500000000179e-03 +-4.622292400000000204e-03 +-4.279660200000000303e-03 +-3.913895199999999769e-03 +-3.585613999999999989e-03 +-3.331321800000000208e-03 +-3.023166500000000045e-03 +-2.596099799999999989e-03 +-2.158337099999999790e-03 +-1.740180399999999945e-03 +-1.349663899999999951e-03 +-1.073600799999999914e-03 +-8.747762999999999546e-04 +-6.100412999999999626e-04 +-2.592712000000000055e-04 +8.404490000000000571e-05 +3.693955000000000177e-04 +5.513027999999999896e-04 +5.502387000000000077e-04 +4.784101999999999821e-04 +4.874193999999999771e-04 +5.721304000000000407e-04 +6.772392000000000125e-04 +6.829378000000000531e-04 +4.700422000000000107e-04 +1.740400000000000100e-06 +-6.994574999999999621e-04 +-1.607778200000000096e-03 +-2.519451099999999843e-03 +-3.097657699999999993e-03 +-3.335822600000000211e-03 +-3.356791500000000199e-03 +-3.123677400000000187e-03 +-2.639946399999999922e-03 +-1.989853800000000034e-03 +-1.294123099999999922e-03 +-7.195279999999999862e-04 +-2.875578000000000270e-04 +1.409826999999999944e-04 +5.814267000000000350e-04 +9.895069999999999300e-04 +1.393508099999999934e-03 +1.741665400000000016e-03 +1.893988099999999912e-03 +1.816124300000000009e-03 +1.656960299999999959e-03 +1.516510900000000083e-03 +1.469399400000000059e-03 +1.707904000000000106e-03 +2.156666700000000030e-03 +2.574312999999999949e-03 +2.895918999999999837e-03 +3.118052799999999902e-03 +3.216490199999999869e-03 +3.156461399999999865e-03 +2.995830799999999947e-03 +2.795883099999999909e-03 +2.583682999999999813e-03 +2.531219500000000087e-03 +2.711019500000000013e-03 +3.001448800000000149e-03 +3.389074699999999971e-03 +3.829026100000000165e-03 +4.151359000000000299e-03 +4.360299199999999840e-03 +4.582958199999999892e-03 +4.862621099999999731e-03 +5.197842900000000134e-03 +5.577491399999999662e-03 +5.934370500000000180e-03 +6.165191700000000226e-03 +6.145713899999999570e-03 +5.865573399999999930e-03 +5.577259099999999810e-03 +5.376416400000000317e-03 +5.127178599999999802e-03 +4.916248399999999935e-03 +4.901446000000000275e-03 +5.097079200000000088e-03 +5.380468999999999703e-03 +5.619125400000000124e-03 +5.819463000000000413e-03 +6.051443200000000168e-03 +6.331283600000000254e-03 +6.531299899999999832e-03 +6.527323600000000010e-03 +6.440737200000000266e-03 +6.412553799999999929e-03 +6.434561299999999769e-03 +6.532411400000000257e-03 +6.641554699999999839e-03 +6.580824499999999612e-03 +6.325667899999999969e-03 +5.999344900000000078e-03 +5.764048899999999788e-03 +5.727594100000000382e-03 +5.886036400000000009e-03 +6.185915099999999764e-03 +6.567402299999999631e-03 +7.046352199999999719e-03 +7.697179299999999842e-03 +8.473010600000000642e-03 +9.054225100000000415e-03 +9.303413300000000496e-03 +9.361801899999999330e-03 +9.338322200000000531e-03 +9.281245000000000467e-03 +9.158304799999999329e-03 +8.966530000000000333e-03 +8.718428699999999226e-03 +8.402035299999999207e-03 +8.132486499999999272e-03 +8.002770399999999465e-03 +7.934128000000000361e-03 +7.868134400000000722e-03 +7.695853699999999700e-03 +7.354140900000000203e-03 +6.933218799999999946e-03 +6.538725500000000176e-03 +6.225276000000000073e-03 +5.967463099999999708e-03 +5.736052799999999570e-03 +5.561157500000000337e-03 +5.494086900000000329e-03 +5.668767199999999971e-03 +6.105759199999999734e-03 +6.514354800000000251e-03 +6.758986500000000418e-03 +6.895268700000000209e-03 +6.916332300000000398e-03 +6.828892599999999806e-03 +6.825425700000000220e-03 +7.050948799999999864e-03 +7.419512199999999703e-03 +7.846130099999999372e-03 +8.260509299999999749e-03 +8.621742800000000220e-03 +8.905736500000000638e-03 +9.088336500000000415e-03 +9.137630799999999290e-03 +9.015061499999999298e-03 +8.748958700000000061e-03 +8.442637600000000436e-03 +8.203235799999999966e-03 +8.069161000000000042e-03 +8.014211999999999725e-03 +8.038033400000000120e-03 +8.139759200000000819e-03 +8.249074099999999937e-03 +8.316294599999999454e-03 +8.424028400000000208e-03 +8.666580199999999318e-03 +8.918000199999999780e-03 +9.105721000000000648e-03 +9.366873700000000191e-03 +9.664269499999999374e-03 +9.837093200000000814e-03 +9.899035299999999274e-03 +9.986892500000000422e-03 +1.011112580000000059e-02 +1.013541840000000034e-02 +9.985536999999999191e-03 +9.693323000000000217e-03 +9.322929400000000769e-03 +8.968505800000000153e-03 +8.694362599999999955e-03 +8.499046300000000220e-03 +8.380152400000000223e-03 +8.296437400000000392e-03 +8.174199999999999522e-03 +8.036176600000000114e-03 +7.963436600000000157e-03 +7.944094699999999440e-03 +7.908679999999999530e-03 +7.822680099999999859e-03 +7.717214000000000018e-03 +7.650887700000000118e-03 +7.618592100000000020e-03 +7.541105700000000009e-03 +7.385948899999999692e-03 +7.215226199999999999e-03 +7.072313900000000084e-03 +6.882535000000000389e-03 +6.558852399999999701e-03 +6.181490999999999895e-03 +5.880664100000000324e-03 +5.627257099999999693e-03 +5.391251500000000287e-03 +5.256251800000000252e-03 +5.190011100000000051e-03 +5.127518299999999848e-03 +5.132723300000000162e-03 +5.121408499999998906e-03 +5.036516599999998900e-03 +5.098879399999999007e-03 +5.368242999999999106e-03 +5.693123499999999323e-03 +5.898668499999998142e-03 +5.964642599999998504e-03 +6.080778999999997964e-03 +6.258401699999998312e-03 +6.315105199999998010e-03 +6.200847599999998253e-03 +5.992307699999998606e-03 +5.727292199999999348e-03 +5.459243399999999177e-03 +5.249604199999998930e-03 +4.989591599999999155e-03 +4.676454299999997961e-03 +4.464239399999998456e-03 +4.281788599999998383e-03 +4.037726099999998028e-03 +3.897557799999998383e-03 +4.001366699999998194e-03 +4.240806799999998281e-03 +4.371551399999997096e-03 +4.260276499999997475e-03 +3.951237799999997476e-03 +3.595251199999997295e-03 +3.293662599999997755e-03 +3.060679399999997278e-03 +2.960910599999997360e-03 +2.887847499999997378e-03 +2.688836699999997207e-03 +2.372511899999997596e-03 +1.895788999999997769e-03 +1.276436199999998484e-03 +6.804240999999991695e-04 +2.025086999999997303e-04 +-1.229180999999998083e-04 +-2.804973999999995889e-04 +-3.483232999999993896e-04 +-4.218830999999992337e-04 +-5.431480999999988664e-04 +-6.942401999999985984e-04 +-7.316549999999983744e-04 +-5.348333999999986934e-04 +-2.127685999999994794e-04 +-8.048799999999977893e-06 +4.960899999999985825e-06 +-1.266643999999995864e-04 +-4.170026999999985884e-04 +-7.716099999999973371e-04 +-1.056813999999996201e-03 +-1.279527499999994888e-03 +-1.485169399999993574e-03 +-1.760486799999991725e-03 +-2.160260899999989683e-03 +-2.590751099999986234e-03 +-2.966429899999982987e-03 +-3.212020199999980879e-03 +-3.285862699999978626e-03 +-3.227883399999977986e-03 +-3.087066999999977645e-03 +-2.876086699999977174e-03 +-2.609166299999977987e-03 +-2.396600999999978256e-03 +-2.323129299999977283e-03 +-2.363925499999975244e-03 +-2.460354899999972651e-03 +-2.557120399999969311e-03 +-2.609023499999967022e-03 +-2.591607699999964789e-03 +-2.575008999999962769e-03 +-2.609714899999959065e-03 +-2.635536199999956222e-03 +-2.620715499999953790e-03 +-2.719899099999948007e-03 +-3.013843699999938213e-03 +-3.277885899999928663e-03 +-3.439550999999919662e-03 +-3.572654599999911060e-03 +-3.598794999999904275e-03 +-3.447545099999901799e-03 +-3.137565999999904643e-03 +-2.872966999999906901e-03 +-2.841563899999901503e-03 +-2.882005699999893103e-03 +-2.851735699999886822e-03 +-2.741388099999883792e-03 +-2.545848799999884775e-03 +-2.342060299999886887e-03 +-2.029551099999895181e-03 +-1.599088299999911443e-03 +-1.339131099999920802e-03 +-1.270780199999919620e-03 +-1.223719599999917437e-03 +-1.190830199999914126e-03 +-1.200972299999907098e-03 +-1.242192899999897343e-03 +-1.307820899999884634e-03 +-1.389672099999869279e-03 +-1.454103099999853443e-03 +-1.470197299999841719e-03 +-1.451994299999832989e-03 +-1.419956899999825746e-03 +-1.409250699999814969e-03 +-1.455911199999795642e-03 +-1.494266499999775911e-03 +-1.476879299999763265e-03 +-1.510102899999741545e-03 +-1.621359899999703404e-03 +-1.708275499999666221e-03 +-1.744704199999635909e-03 +-1.765592599999606062e-03 +-1.893477499999548889e-03 +-2.227311699999432598e-03 +-2.679139899999271376e-03 +-3.084597599999103473e-03 +-3.401239099998943933e-03 +-3.626347399998796923e-03 +-3.604902499998722219e-03 +-3.268565499998762631e-03 +-2.799460599998868007e-03 +-2.406086899998960763e-03 +-2.120387099999021703e-03 +-1.937677599999045302e-03 +-1.793274899999056267e-03 +-1.628918599999084303e-03 +-1.526856799999083301e-03 +-1.491134999999043720e-03 +-1.491880999998978488e-03 +-1.598142599998831096e-03 +-1.866351699998542238e-03 +-2.214548699998152535e-03 +-2.490171399997781650e-03 +-2.611208099997516189e-03 +-2.620644399997337434e-03 +-2.678061599997094352e-03 +-2.863244399996683377e-03 +-3.158352199996093158e-03 +-3.572564299995281516e-03 +-4.005669999994351110e-03 +-4.368616399993420843e-03 +-4.629208199992557345e-03 +-4.676593599991971627e-03 +-4.519003199991717366e-03 +-4.364922199991458536e-03 +-4.306998399991002376e-03 +-4.314096899990377265e-03 +-4.353703499989634330e-03 +-4.321706999989014149e-03 +-4.199702999988603677e-03 +-4.066302499988220034e-03 +-4.000793599987628908e-03 +-4.036930299986674596e-03 +-4.088016899985596336e-03 +-4.105046299984560845e-03 +-4.117786099983468569e-03 +-4.088808099982479093e-03 +-4.036033699981541982e-03 +-4.050544099980227762e-03 +-4.131371699978475358e-03 +-4.231671199976470496e-03 +-4.358936199974131759e-03 +-4.507163599971453390e-03 +-4.578053099969055934e-03 +-4.486046899967640819e-03 +-4.228128999967451992e-03 +-3.849151899968380509e-03 +-3.502922799969293392e-03 +-3.333729799968814401e-03 +-3.346546299966595122e-03 +-3.463494199963109560e-03 +-3.583752899959269812e-03 +-3.673705899955449772e-03 +-3.727409299951770557e-03 +-3.741333599948348711e-03 +-3.742282599944876317e-03 +-3.692587699941968747e-03 +-3.553726699940414329e-03 +-3.444387899938385674e-03 +-3.405358699935011248e-03 +-3.395995699930858674e-03 +-3.415115199925823544e-03 +-3.384326099921583161e-03 +-3.389032099916231694e-03 +-3.568438699905910304e-03 +-3.810448899892825755e-03 +-4.004750099879847945e-03 +-4.176967399866325127e-03 +-4.344382499851699893e-03 +-4.536212699834834584e-03 +-4.772425999814658426e-03 +-5.047821899790910262e-03 +-5.339185099764119473e-03 +-5.533285499739279238e-03 +-5.577741799719700827e-03 +-5.489184899705807502e-03 +-5.285091999697915169e-03 +-5.010674899694569397e-03 +-4.768900699689993840e-03 +-4.663154799676737239e-03 +-4.736596699649846774e-03 +-4.943698799610282343e-03 +-5.168083599565564262e-03 +-5.399437499516014476e-03 +-5.640868699460850622e-03 +-5.791753799409738238e-03 +-5.808248999368837914e-03 +-5.780199999330283209e-03 +-5.780966399285845068e-03 +-5.813845899234242401e-03 +-5.880533199174209531e-03 +-5.925237399112892774e-03 +-5.867756199063408132e-03 +-5.769230199018261264e-03 +-5.794019398948890495e-03 +-5.896612998859612070e-03 +-5.935198698776347585e-03 +-5.969867298687947868e-03 +-6.132594998563237199e-03 +-6.429072798394407963e-03 +-6.702228198215800722e-03 +-6.930541398033384162e-03 +-7.226519497814247982e-03 +-7.556361997563897960e-03 +-7.836272697307264043e-03 +-8.088931497037430904e-03 +-8.375104996730725268e-03 +-8.646447396402719490e-03 +-8.828559496085349595e-03 +-8.882209695802584237e-03 +-8.802185395566975573e-03 +-8.712605595323748633e-03 +-8.706136995020260366e-03 +-8.758847694661116984e-03 +-8.849227894251921953e-03 +-8.963388793795675977e-03 +-9.074160793306938755e-03 +-9.074163592867985281e-03 +-8.882935292560551963e-03 +-8.550282392369823459e-03 +-8.158119592242793136e-03 +-7.756126792141990363e-03 +-7.381857492031493155e-03 +-7.119477991811687390e-03 +-6.975946791451781079e-03 +-6.840558391069382661e-03 +-6.645270890757033234e-03 +-6.413318290496545539e-03 +-6.183768790237899500e-03 +-5.986746689931527962e-03 +-5.878494989467952618e-03 +-5.868052488800312196e-03 +-5.901071988002261522e-03 +-5.969205587071953548e-03 +-6.143687485826249996e-03 +-6.454836784137505182e-03 +-6.785226582238792874e-03 +-6.960543380592726197e-03 +-6.997538179218769361e-03 +-6.949728478016857502e-03 +-6.726897477336650152e-03 +-6.344616777233653276e-03 +-5.929198377340308412e-03 +-5.589526177249315962e-03 +-5.448425876381987609e-03 +-5.586922274207755702e-03 +-5.880401971089264934e-03 +-6.108515968017320073e-03 +-6.131459565812966486e-03 +-5.908097364920370138e-03 +-5.472564865398134304e-03 +-4.898676067017771786e-03 +-4.373003268648006925e-03 +-3.997752369480546235e-03 +-3.709423869846738796e-03 +-3.486323969824534422e-03 +-3.347236069152325754e-03 +-3.299703767621826964e-03 +-3.265814365880579870e-03 +-3.205098364348669265e-03 +-3.197356162134726808e-03 +-3.268248758792871491e-03 +-3.364618454836070492e-03 +-3.427963351012846410e-03 +-3.471437947187457334e-03 +-3.534342442758708815e-03 +-3.568431538476251382e-03 +-3.425519037129351376e-03 +-3.033620740730606519e-03 +-2.561474146728080423e-03 +-2.151448752371153909e-03 +-1.778843658082144988e-03 +-1.424282264275094669e-03 +-1.088609270936203959e-03 +-7.951466774043732021e-04 +-6.095517815635997060e-04 +-5.110374835487758831e-04 +-4.181316856738321371e-04 +-3.285105880207565550e-04 +-2.835595889952801881e-04 +-2.439460899243117698e-04 +-1.308015942504787098e-04 +-1.326059937968657961e-05 +2.057499897574330416e-06 +-5.817169691827921927e-05 +-1.467448917272726736e-04 +-2.560928846368948526e-04 +-3.595446770479364309e-04 +-4.117024720339357118e-04 +-3.658377735572238519e-04 +-2.519731806208344864e-04 +-1.299342893669362892e-04 +6.770459410480325017e-05 +3.575747668728406631e-04 +5.748520433366524542e-04 +6.484005319998326815e-04 +7.277972187938091045e-04 +8.857673948517058886e-04 +1.052490567078199178e-03 +1.185617040702274588e-03 +1.301945113904173085e-03 +1.463604877444511874e-03 +1.689601826686538445e-03 +1.863643379304142462e-03 +1.934084045960703753e-03 +2.019594406741989472e-03 +2.146565055382577882e-03 +2.207789513569490252e-03 +2.182791088450397512e-03 +2.196364652499915773e-03 +2.323187684029465877e-03 +2.473152302548303847e-03 +2.512023546529329118e-03 +2.509695499364583693e-03 +2.563160730334029455e-03 +2.537486684338328882e-03 +2.401237878462871098e-03 +2.305634058964112221e-03 +2.281332809773873888e-03 +2.266828953627810211e-03 +2.216506311947390260e-03 +2.145167180182272221e-03 +2.147358107968492472e-03 +2.192645705683219336e-03 +2.199243119533018497e-03 +2.250932097592837650e-03 +2.368397719091138148e-03 +2.438123660069747498e-03 +2.415585661722319775e-03 +2.349634495372846226e-03 +2.294705518426075255e-03 +2.285366195835035735e-03 +2.315925325194170565e-03 +2.351487036382372570e-03 +2.349385576897953729e-03 +2.291421476385441594e-03 +2.235592771293798148e-03 +2.250419465840242279e-03 +2.357551009519883844e-03 +2.493060576124726119e-03 +2.585395574268699748e-03 +2.651861283439576646e-03 +2.717330862508992185e-03 +2.809605753494086745e-03 +2.965391665180887315e-03 +3.099933460947788214e-03 +3.120062869449413776e-03 +3.044782088883985025e-03 +2.894905606371416321e-03 +2.676203743982339539e-03 +2.500153098851720830e-03 +2.475556095562903361e-03 +2.528017904037421337e-03 +2.558880637664435499e-03 +2.588272428257814162e-03 +2.628197623285394736e-03 +2.653594522045459817e-03 +2.708872622766875585e-03 +2.822576651875498277e-03 +2.918963251853483060e-03 +2.910199927418242061e-03 +2.834434551502356629e-03 +2.759817761042648952e-03 +2.650030702663792870e-03 +2.507479405294553085e-03 +2.433679239369901728e-03 +2.459508862100614427e-03 +2.536011147306928282e-03 +2.628947320718164667e-03 +2.746760158972090266e-03 +2.921346170144163527e-03 +3.167587860479035167e-03 +3.431217190425548454e-03 +3.584875368614994819e-03 +3.629435395444184642e-03 +3.637791484769573036e-03 +3.597413701259602296e-03 +3.568283816949101035e-03 +3.612054654760294553e-03 +3.688848191407640819e-03 +3.739189025047018246e-03 +3.690349787652327362e-03 +3.544221285720339058e-03 +3.348166024147307494e-03 +3.120971778995921750e-03 +2.884691057512901117e-03 +2.649801562544588408e-03 +2.444805812707451231e-03 +2.329627257465041821e-03 +2.349578650924864960e-03 +2.489104534611485953e-03 +2.669713006771980753e-03 +2.842790416360825578e-03 +3.004087598259988327e-03 +3.159140998037194507e-03 +3.295434951235261430e-03 +3.352225840825361503e-03 +3.334738020489467613e-03 +3.338339992237187442e-03 +3.388589582355287701e-03 +3.429482379517336151e-03 +3.444088454896270489e-03 +3.471379875388548239e-03 +3.495229934548001356e-03 +3.467466984995613063e-03 +3.419104466421034674e-03 +3.387597167816578780e-03 +3.378560246555434559e-03 +3.381349855840291505e-03 +3.371840532308259183e-03 +3.355793079961527994e-03 +3.318035228734675293e-03 +3.233548460624371696e-03 +3.166028467824306188e-03 +3.169550422119329219e-03 +3.183516837460761712e-03 +3.150777147511667816e-03 +3.098189235925091420e-03 +3.063758618226626769e-03 +3.054694731006676357e-03 +3.047811460464040258e-03 +3.029723191890826804e-03 +3.042657184561677400e-03 +3.099686707443235437e-03 +3.125080696399437381e-03 +3.078428996799052828e-03 +3.005337825648630480e-03 +2.934519761342400598e-03 +2.864410547547995619e-03 +2.802717224869541099e-03 +2.765019662966081843e-03 +2.770925892227835488e-03 +2.807080233339081122e-03 +2.825397211702412870e-03 +2.812964823827807451e-03 +2.785208827996808658e-03 +2.743620631231445586e-03 +2.687095902909412623e-03 +2.610906348919422946e-03 +2.509401775082949725e-03 +2.393567595722005670e-03 +2.274572528139923600e-03 +2.175979033471513082e-03 +2.134620380288268591e-03 +2.149287672578667398e-03 +2.187141691962393719e-03 +2.221885533575027310e-03 +2.241795981179783240e-03 +2.240751910796470389e-03 +2.224010071332167826e-03 +2.203237284957931634e-03 +2.175499813478519364e-03 +2.135776187361683714e-03 +2.088791341189204925e-03 +2.039956782102458205e-03 +1.988291393584031789e-03 +1.931894578909045023e-03 +1.874554473967342001e-03 +1.821427163874594479e-03 +1.774870545789176230e-03 +1.734216073845280381e-03 +1.698812765804825218e-03 +1.664742531521982332e-03 +1.635752966408991977e-03 +1.621284864067980324e-03 +1.609118929717515091e-03 +1.577989199444919041e-03 +1.534786598973272029e-03 +1.499431439524805077e-03 +1.471598326459930663e-03 +1.444520015897006720e-03 +1.412738691798831082e-03 +1.373639016406731726e-03 +1.331796342613739571e-03 +1.287956176927765230e-03 +1.239515769503776515e-03 +1.189418437771122333e-03 +1.141072611716982110e-03 +1.093035585688632372e-03 +1.047531537362105317e-03 +1.008173750848377626e-03 +9.700634434908090306e-04 +9.276239328637319323e-04 +8.867579556029608640e-04 +8.512461588232995112e-04 +8.127210770037260681e-04 +7.679846445517188400e-04 +7.239212721914887322e-04 +6.834360075909642548e-04 +6.436569052538000267e-04 +6.020091803919164946e-04 +5.603650698972224018e-04 +5.232746165240869957e-04 +4.883872426433173968e-04 +4.509083422646264984e-04 +4.128625769259334100e-04 +3.787336824515327520e-04 +3.495271320877427375e-04 +3.235776120066422186e-04 +2.977855632131105987e-04 +2.702250992364197768e-04 +2.411516328192560581e-04 +2.101206932811171128e-04 +1.766444073578459938e-04 +1.424239833389033885e-04 +1.096985524308155622e-04 +7.905680898966442572e-05 +4.990175710407217306e-05 +2.210669857053272034e-05 +-4.683966703311662793e-06 +-3.177084664544684088e-05 +-5.871468920287467591e-05 +-8.424687335377454634e-05 +-1.085187978333318644e-04 +-1.318489957820240331e-04 +-1.541709747248671408e-04 +-1.747891427037274797e-04 +-1.931989486724812043e-04 +-2.101781143370766642e-04 +-2.261494092628504220e-04 +-2.406718697597874938e-04 +-2.534899993640748637e-04 +-2.647205848809739749e-04 +-2.750344063276407062e-04 +-2.845508695622593338e-04 +-2.925579733810455092e-04 +-2.992869504936455493e-04 +-3.053001093011841458e-04 +-3.106046230705390883e-04 +-3.151934124274262655e-04 +-3.189964641178445726e-04 +-3.216482353844672421e-04 +-3.229466484510054645e-04 +-3.230857691696268903e-04 +-3.223041823953280444e-04 +-3.206999737129259090e-04 +-3.182645125334612160e-04 +-3.150048853415908057e-04 +-3.109462033942843122e-04 +-3.060606674231202773e-04 +-3.003354663150718871e-04 +-2.938073598063242623e-04 +-2.865187156495119106e-04 +-2.785334577526429444e-04 +-2.698924026169911622e-04 +-2.605910851738166886e-04 +-2.506345330199219413e-04 +-2.400558382866380266e-04 +-2.289221194051694827e-04 +-2.172985563539600454e-04 +-2.052232665657318733e-04 +-1.927302779034730266e-04 +-1.798619842721204776e-04 +-1.666701445315896875e-04 +-1.532078133168368779e-04 +-1.395255853614554506e-04 +-1.256735118647355756e-04 +-1.117017322091991494e-04 +-9.766081171927293010e-05 +-8.360216366892455394e-05 +-6.957669947077647844e-05 +-5.563388798244908083e-05 +-4.182221421668890957e-05 +-2.818863714746681760e-05 +-1.477804176584200199e-05 +-1.633399999999999896e-06 +-1.586710791753968441e-06 +-1.540111121511156519e-06 +-1.493676554581648908e-06 +-1.447481542264940336e-06 +-1.401598950283295735e-06 +-1.356099609073945537e-06 +-1.311051891686711958e-06 +-1.266521324403466065e-06 +-1.222570234460669003e-06 +-1.179257438448720425e-06 +-1.136637974103659841e-06 +-1.094762877324148072e-06 +-1.053679005369910233e-06 +-1.013428906344733878e-06 +-9.740507342676326918e-07 +-9.355782082995366070e-07 +-8.980406140429788393e-07 +-8.614628442720098403e-07 +-8.258654759936830633e-07 +-7.912648803859468830e-07 +-7.576733619054800176e-07 +-7.250993227055490406e-07 +-6.935474484433611523e-07 +-6.630189115798792164e-07 +-6.335115883727223988e-07 +-6.050202859236764344e-07 +-5.775369758552776026e-07 +-5.510510314436463527e-07 +-5.255494653187979583e-07 +-5.010171651442462784e-07 +-4.774371250011541543e-07 +-4.547906705149148821e-07 +-4.330576760716616624e-07 +-4.122167727681706971e-07 +-3.922455460206376648e-07 +-3.731207220196609785e-07 +-3.548183424586225658e-07 +-3.373139271791082388e-07 +-3.205826245695159084e-07 +-3.045993497212571660e-07 +-2.893389104912891005e-07 +-2.747761217413952204e-07 +-2.608859081251317883e-07 +-2.476433958739926225e-07 +-2.350239940967995394e-07 +-2.230034661521736758e-07 +-2.115579916863673024e-07 +-2.006642199472068518e-07 +-1.902993149936622415e-07 +-1.804409934189628199e-07 +-1.710675551970580932e-07 +-1.621579082466853483e-07 +-1.536915872874603057e-07 +-1.456487675383468092e-07 +-1.380102737819754310e-07 +-1.307575852893577726e-07 +-1.238728370693380951e-07 +-1.173388178762694944e-07 +-1.111389653784770771e-07 +-1.052573588592915546e-07 +-9.967870979274921819e-08 +-9.438835060669172619e-08 +-8.937222191846335031e-08 +-8.461685850163068284e-08 +-8.010937421732182679e-08 +-7.583744611990042135e-08 +-7.178929792487662559e-08 +-6.795368300625497014e-08 +-6.431986707164112373e-08 +-6.087761064587375184e-08 +-5.761715147777509228e-08 +-5.452918697009449081e-08 +-5.160485671914991626e-08 +-4.883572523866752365e-08 +-4.621376493117908982e-08 +-4.373133936060447972e-08 +-4.138118687063005250e-08 +-3.915640458561179209e-08 +-3.705043282362967471e-08 +-3.505703994503459643e-08 +-3.317030765426798878e-08 +-3.138461676783808263e-08 +-2.969463345704233979e-08 +-2.809529597029033874e-08 +-2.658180183659545539e-08 +-2.514959554907026503e-08 +-2.379435672476685698e-08 +-2.251198873523804436e-08 +-2.129860780040771572e-08 +-2.015053253696801625e-08 +-1.906427395126343731e-08 +-1.803652586572640731e-08 +-1.706415576711650330e-08 +-1.614419606428213615e-08 +-1.527383574267620712e-08 +-1.445041240258842958e-08 +-1.367140466786978915e-08 +-1.293442495183413654e-08 +-1.223721256701934343e-08 +-1.157762716557136131e-08 +-1.095364249715510770e-08 +-1.036334047148430254e-08 +-9.804905512779634841e-09 +-9.276619193765508619e-09 +-8.776855137083795520e-09 +-8.304074172350197564e-09 +-7.856819737392396091e-09 +-7.433713512590755412e-09 +-7.033451277582775859e-09 +-6.654798979972102321e-09 +-6.296589006051281709e-09 +-5.957716643919780934e-09 +-5.637136729748960142e-09 +-5.333860468312261054e-09 +-5.046952419260372997e-09 +-4.775527640976140313e-09 +-4.518748984191581767e-09 +-4.275824527888663199e-09 +-4.046005150335552717e-09 +-3.828582228432254754e-09 +-3.622885458845524417e-09 +-3.428280794723355234e-09 +-3.244168492057413323e-09 +-3.069981260052364265e-09 +-2.905182510122831260e-09 +-2.749264698403101694e-09 +-2.601747756901795828e-09 +-2.462177608668320871e-09 +-2.330124762574380372e-09 +-2.205182983525019084e-09 +-2.086968034129285611e-09 +-1.975116484054076014e-09 +-1.869284583482849049e-09 +-1.769147197277639389e-09 +-1.674396796619467252e-09 +-1.584742505067156872e-09 +-1.499909196132570396e-09 +-1.419636639620557979e-09 +-1.343678694124996699e-09 +-1.271802543208355287e-09 +-1.203787972921622697e-09 +-1.139426688444412001e-09 +-1.078521667741914500e-09 +-1.020886550246316306e-09 +-9.663450586760254593e-10 +-9.147304522048812964e-10 +-8.658850092908793574e-10 +-8.196595385609379224e-10 +-7.759129162363702356e-10 +-7.345116486625463382e-10 +-6.953294585853065925e-10 +-6.582468938872100513e-10 +-6.231509575670568843e-10 +-5.899347578113948253e-10 +-5.584971770684170415e-10 +-5.287425590931611762e-10 +-5.005804129887501798e-10 +-4.739251333211743668e-10 +-4.486957354348823349e-10 +-4.248156051429254901e-10 +-4.022122620114012114e-10 +-3.808171354989115989e-10 +-3.605653532528484608e-10 +-3.413955409010574725e-10 +-3.232496327145044890e-10 +-3.060726925494145382e-10 +-2.898127445103001659e-10 +-2.744206128047537156e-10 +-2.598497702905733976e-10 +-2.460561952421945885e-10 +-2.329982358894869765e-10 +-2.206364823061747501e-10 +-2.089336452481504097e-10 +-1.978544415636985574e-10 +-1.873654858182185172e-10 +-1.774351877954794362e-10 +-1.680336555559007436e-10 +-1.591326037495386300e-10 +-1.507052668983327855e-10 +-1.427263173771957240e-10 +-1.351717878387009777e-10 +-1.280189978397060887e-10 +-1.212464844416335717e-10 +-1.148339365684972498e-10 +-1.087621329183517980e-10 +-1.030128832353018958e-10 +-9.756897275939082841e-11 +-9.241410968190277265e-11 +-8.753287544272565526e-11 +-8.291067771562214735e-11 +-7.853370593538680868e-11 +-7.438888922903177085e-11 +-7.046385662042389537e-11 +-6.674689938514651395e-11 +-6.322693543887737828e-11 +-5.989347564902027654e-11 +-5.673659196530136932e-11 +-5.374688727071914873e-11 +-5.091546685960186321e-11 +-4.823391145459809551e-11 +-4.569425167922040358e-11 +-4.328894390711071693e-11 +-4.101084741342971708e-11 +-3.885320275793265163e-11 +-3.680961133299031376e-11 +-3.487401601355672423e-11 +-3.304068284941387928e-11 +-3.130418374336308177e-11 +-2.965938006199418998e-11 +-2.810140712861905641e-11 +-2.662565955068880195e-11 +-2.522777733659183954e-11 +-2.390363275916986050e-11 +-2.264931792561426590e-11 +-2.146113301560060451e-11 +-2.033557515157759266e-11 +-1.926932786707766378e-11 +-1.825925114077475112e-11 +-1.730237196576940536e-11 +-1.639587542523287314e-11 +-1.553709624708075154e-11 +-1.472351081187371502e-11 +-1.395272958949465257e-11 +-1.322248998151275902e-11 +-1.253064954735517023e-11 +-1.187517959363347645e-11 +-1.125415910705623682e-11 +-1.066576901243373542e-11 +-1.010828673827643469e-11 +-9.580081073435229466e-12 +-9.079607299126161613e-12 +-8.605402581528283411e-12 +-8.156081610943220480e-12 +-7.730332474264319028e-12 +-7.326912748209550096e-12 +-6.944645801468146126e-12 +-6.582417294527105075e-12 +-6.239171866570149297e-12 +-5.913909999399245329e-12 +-5.605685048881258505e-12 +-5.313600434929392608e-12 +-5.036806981512389421e-12 +-4.774500398645116255e-12 +-4.525918898748948228e-12 +-4.290340940179813768e-12 +-4.067083091103085898e-12 +-3.855498007273841733e-12 +-3.654972517615904447e-12 +-3.464925811831440827e-12 +-3.284807724572860486e-12 +-3.114097111013965362e-12 +-2.952300308926242934e-12 +-2.798949682633543910e-12 +-2.653602244465847479e-12 +-2.515838349568225622e-12 +-2.385260460143708717e-12 +-2.261491975419324246e-12 +-2.144176123823705591e-12 +-2.032974914053846642e-12 +-1.927568141884400730e-12 +-1.827652449746595959e-12 +-1.732940436257154602e-12 +-1.643159813034166149e-12 +-1.558052606275237188e-12 +-1.477374400713161268e-12 +-1.400893623687081982e-12 +-1.328390867192626362e-12 +-1.259658245885372105e-12 +-1.194498789124121388e-12 +-1.132725865239209604e-12 +-1.074162636310317831e-12 +-1.018641541829895363e-12 +-9.660038097147414159e-13 +-9.160989932102187362e-13 +-8.687845323097671505e-13 +-8.239253383862254135e-13 +-7.813934008010115436e-13 +-7.410674143219457882e-13 +-7.028324262451265735e-13 +-6.665795021731072578e-13 +-6.322054094593043302e-13 +-5.996123173795327069e-13 +-5.687075131436652471e-13 +-5.394031329061509866e-13 +-5.116159069797551090e-13 +-4.852669184990774569e-13 +-4.602813748205778606e-13 +-4.365883909838413809e-13 +-4.141207845947783192e-13 +-3.928148815254986119e-13 +-3.726103318578190228e-13 +-3.534499355278597910e-13 +-3.352794771580539982e-13 +-3.180475695902045702e-13 +-3.017055056591801030e-13 +-2.862071177710556780e-13 +-2.715086448730650926e-13 +-2.575686064244358872e-13 +-2.443476829978859368e-13 +-2.318086031613279410e-13 +-2.199160363079996386e-13 +-2.086364911208232383e-13 +-1.979382193731625218e-13 +-1.877911247845277744e-13 +-1.781666766641441719e-13 +-1.690378280899301098e-13 +-1.603789383833214443e-13 +-1.521656996536088930e-13 +-1.443750671970324605e-13 +-1.369851935474595786e-13 +-1.299753659861777244e-13 +-1.233259473285279468e-13 +-1.170183198147562892e-13 +-1.110348319415950947e-13 +-1.053587480797358546e-13 +-9.997420073054589964e-14 +-9.486614528313532802e-14 +-9.002031714022477558e-14 +-8.542319108821304248e-14 +-8.106194279345559834e-14 +-7.692441231290264006e-14 +-7.299906951334205976e-14 +-6.927498129883864566e-14 +-6.574178055147000346e-14 +-6.238963669529802815e-14 +-5.920922779844415281e-14 +-5.619171413244899400e-14 +-5.332871311246316905e-14 +-5.061227554583960489e-14 +-4.803486312049635123e-14 +-4.558932706802090668e-14 +-4.326888793993223653e-14 +-4.106711643877170302e-14 +-3.897791524876055100e-14 +-3.699550181361286364e-14 +-3.511439201195867010e-14 +-3.332938468333422986e-14 +-3.163554696025729334e-14 +-3.002820036415281135e-14 +-2.850290762521502254e-14 +-2.705546018830298547e-14 +-2.568186636902894458e-14 +-2.437834012600706064e-14 +-2.314129041709776585e-14 +-2.196731110910910446e-14 +-2.085317141205063696e-14 +-1.979580681054348482e-14 +-1.879231046642872589e-14 +-1.783992506797766875e-14 +-1.693603510239759035e-14 +-1.607815952954760190e-14 +-1.526394483594211134e-14 +-1.449115844919765082e-14 +-1.375768249415417336e-14 +-1.306150787284000014e-14 +-1.240072865142219561e-14 +-1.177353673813846872e-14 +-1.117821683706389778e-14 +-1.061314166335240407e-14 +-1.007676740632883020e-14 +-9.567629427549255025e-15 +-9.084338181592190256e-15 +-8.625575348006515439e-15 +-8.190090163421905550e-15 +-7.776695943428977464e-15 +-7.384266784355734310e-15 +-7.011734435601522254e-15 +-6.658085333657010196e-15 +-6.322357789423453171e-15 +-6.003639320865093261e-15 +-5.701064123452518026e-15 +-5.413810671245717259e-15 +-5.141099441838716403e-15 +-4.882190758740961843e-15 +-4.636382745105420327e-15 +-4.403009383030453189e-15 +-4.181438672964609297e-15 +-3.971070888023463143e-15 +-3.771336918307538396e-15 +-3.581696700553774444e-15 +-3.401637728706547180e-15 +-3.230673641215153678e-15 +-3.068342881091828411e-15 +-2.914207424961459556e-15 +-2.767851577535409513e-15 +-2.628880828126851438e-15 +-2.496920765999834472e-15 +-2.371616051510139693e-15 +-2.252629440154971907e-15 +-2.139640856798854549e-15 +-2.032346517484003298e-15 +-1.930458096367344601e-15 +-1.833701935454668112e-15 +-1.741818294923667139e-15 +-1.654560641941944898e-15 +-1.571694975992190984e-15 +-1.492999188824227227e-15 +-1.418262457246688526e-15 +-1.347284667067282204e-15 +-1.279875866574320792e-15 +-1.215855748039557170e-15 +-1.155053155797796459e-15 +-1.097305619535113891e-15 +-1.042458911487819062e-15 +-9.903666263215066656e-16 +-9.408897825231416591e-16 +-8.938964441994845027e-16 +-8.492613622322939086e-16 +-8.068656337952661517e-16 +-7.665963792881155834e-16 +-7.283464357938519722e-16 +-6.920140662091190931e-16 +-6.575026832433740465e-16 +-6.247205875227181245e-16 +-5.935807190746631428e-16 +-5.640004215069525241e-16 +-5.359012182288332926e-16 +-5.092086000970013945e-16 +-4.838518239004044473e-16 +-4.597637211282228724e-16 +-4.368805164933120835e-16 +-4.151416557117986856e-16 +-3.944896420640353226e-16 +-3.748698812875512455e-16 +-3.562305343747063216e-16 +-3.385223778708810735e-16 +-3.216986712889303585e-16 +-3.057150312758358091e-16 +-2.905293121860783594e-16 +-2.761014927340302478e-16 +-2.623935684144994373e-16 +-2.493694493965349638e-16 +-2.369948636107327142e-16 +-2.252372647647246874e-16 +-2.140657450348930903e-16 +-2.034509521957978393e-16 +-1.933650109603956380e-16 +-1.837814483163393575e-16 +-1.746751226541922327e-16 +-1.660221564943525153e-16 +-1.577998726288491813e-16 +-1.499867335040554245e-16 +-1.425622836789004855e-16 +-1.355070952020279064e-16 +-1.288027157589705679e-16 +-1.224316194482680241e-16 +-1.163771600526566857e-16 +-1.106235266782715669e-16 +-1.051557016412669003e-16 +-9.995942048747278236e-17 +-9.502113403658082298e-17 +-9.032797234788692291e-17 +-8.586771050975350686e-17 +-8.162873616019287020e-17 +-7.760001865046936075e-17 +-7.377107976831129719e-17 +-7.013196594137686551e-17 +-6.667322184589022488e-17 +-6.338586534902252000e-17 +-6.026136371732258875e-17 +-5.729161102693037116e-17 +-5.446890671458660190e-17 +-5.178593521156099875e-17 +-4.923574660557154808e-17 +-4.681173827856592960e-17 +-4.450763747089219871e-17 +-4.231748472490489333e-17 +-4.023561816344416411e-17 +-3.825665856089201632e-17 +-3.637549516667308011e-17 +-3.458727224307899447e-17 +-3.288737628127773786e-17 +-3.127142386118170182e-17 +-2.973525012258631201e-17 +-2.827489781665970753e-17 +-2.688660690844234234e-17 +-2.556680470250340191e-17 +-2.431209646527903723e-17 +-2.311925651902992617e-17 +-2.198521978356177898e-17 +-2.090707374311830753e-17 +-1.988205081694422371e-17 +-1.890752111316942721e-17 +-1.798098554664856879e-17 +-1.710006930239658545e-17 +-1.626251562718433256e-17 +-1.546617993274338855e-17 +-1.470902419486722026e-17 +-1.398911163349231074e-17 +-1.330460165959792653e-17 +-1.265374507548041652e-17 +-1.203487951563841151e-17 +-1.144642511615114738e-17 +-1.088688040104491182e-17 +-1.035481837472783977e-17 +-9.848882810113868371e-18 +-9.367784722604559894e-18 +-8.910299020565298716e-18 +-8.475261323431165824e-18 diff --git a/examples/opensees/DS_input/plotAcc.py b/examples/opensees/DS_input/plotAcc.py new file mode 100644 index 0000000..41a16db --- /dev/null +++ b/examples/opensees/DS_input/plotAcc.py @@ -0,0 +1,40 @@ +######################################################### +# +# Postprocessing python script +# +# Copyright: UW Computational Mechanics Group +# Pedro Arduino +# +# Participants: Alborz Ghofrani +# Long Chen +# +# ------------------------------------------------------- + +import numpy as np +import matplotlib.pyplot as plt + +from respSpectra import resp_spectra + + +def plot_acc(): + """ + Plot acceleration time history and response spectra + """ + plt.figure() + + for motion in ["motion1"]: + for profile in ["A", "B", "C", "D"]: + acc = np.loadtxt("Profile" + profile + "_acc" + motion + ".out") + [p, umax, vmax, amax] = resp_spectra(acc[:, -1], acc[-1, 0], acc.shape[0]) + plt.semilogx(p, amax) + + # response spectra on log-linear plot + + plt.ylabel("$S_a (g)$") + plt.xlabel("$Period (s)$") + # plt.savefig('logSpectra.eps') + # plt.savefig('logSpectra.png') + + +if __name__ == "__main__": + plot_acc() diff --git a/examples/opensees/DS_input/recordData.txt b/examples/opensees/DS_input/recordData.txt new file mode 100644 index 0000000..177bbc2 --- /dev/null +++ b/examples/opensees/DS_input/recordData.txt @@ -0,0 +1,2 @@ +motion1.vel 0.01 6610 +motion2.vel 0.01 3997 \ No newline at end of file diff --git a/examples/opensees/respSpectra.py b/examples/opensees/DS_input/respSpectra.py similarity index 97% rename from examples/opensees/respSpectra.py rename to examples/opensees/DS_input/respSpectra.py index ff3979b..61c2107 100644 --- a/examples/opensees/respSpectra.py +++ b/examples/opensees/DS_input/respSpectra.py @@ -1,70 +1,70 @@ -######################################################### -# -# Postprocessing python script -# -# Copyright: UW Computational Mechanics Group -# Pedro Arduino -# -# Participants: Alborz Ghofrani -# Long Chen -# -# ------------------------------------------------------- - -import numpy as np - - -def resp_spectra(a, time, nstep): - """ - This function builds response spectra from acceleration time history, - a should be a numpy array,T and nStep should be integers. - """ - - # add initial zero value to acceleration and change units - a = np.insert(a, 0, 0) - # number of periods at which spectral values are to be computed - nperiod = 100 - # define range of considered periods by power of 10 - minpower = -3.0 - maxpower = 1.0 - # create vector of considered periods - p = np.logspace(minpower, maxpower, nperiod) - # incremental circular frequency - dw = 2.0 * np.pi / time - # vector of circular freq - w = np.arange(0, (nstep + 1) * dw, dw) - # fast fourier Horm of acceleration - afft = np.fft.fft(a) - # arbitrary stiffness value - k = 1000.0 - # damping ratio - damp = 0.05 - umax = np.zeros(nperiod) - vmax = np.zeros(nperiod) - amax = np.zeros(nperiod) - # loop to compute spectral values at each period - for j in range(0, nperiod): - # compute mass and dashpot coeff to produce desired periods - m = ((p[j] / (2 * np.pi)) ** 2) * k - c = 2 * damp * (k * m) ** 0.5 - h = np.zeros(nstep + 2, dtype=complex) - # compute transfer function - for l in range(0, int(nstep / 2 + 1)): - h[l] = 1.0 / (-m * w[l] * w[l] + 1j * c * w[l] + k) - # mirror image of Her function - h[nstep + 1 - l] = np.conj(h[l]) - - # compute displacement in frequency domain using Her function - qfft = -m * afft - u = np.zeros(nstep + 1, dtype=complex) - for l in range(0, nstep + 1): - u[l] = h[l] * qfft[l] - - # compute displacement in time domain (ignore imaginary part) - utime = np.real(np.fft.ifft(u)) - - # spectral displacement, velocity, and acceleration - umax[j] = np.max(np.abs(utime)) - vmax[j] = (2 * np.pi / p[j]) * umax[j] - amax[j] = (2 * np.pi / p[j]) * vmax[j] - - return p, umax, vmax, amax +######################################################### +# +# Postprocessing python script +# +# Copyright: UW Computational Mechanics Group +# Pedro Arduino +# +# Participants: Alborz Ghofrani +# Long Chen +# +# ------------------------------------------------------- + +import numpy as np + + +def resp_spectra(a, time, nstep): + """ + This function builds response spectra from acceleration time history, + a should be a numpy array,T and nStep should be integers. + """ + + # add initial zero value to acceleration and change units + a = np.insert(a, 0, 0) + # number of periods at which spectral values are to be computed + nperiod = 100 + # define range of considered periods by power of 10 + minpower = -3.0 + maxpower = 1.0 + # create vector of considered periods + p = np.logspace(minpower, maxpower, nperiod) + # incremental circular frequency + dw = 2.0 * np.pi / time + # vector of circular freq + w = np.arange(0, (nstep + 1) * dw, dw) + # fast fourier Horm of acceleration + afft = np.fft.fft(a) + # arbitrary stiffness value + k = 1000.0 + # damping ratio + damp = 0.05 + umax = np.zeros(nperiod) + vmax = np.zeros(nperiod) + amax = np.zeros(nperiod) + # loop to compute spectral values at each period + for j in range(0, nperiod): + # compute mass and dashpot coeff to produce desired periods + m = ((p[j] / (2 * np.pi)) ** 2) * k + c = 2 * damp * (k * m) ** 0.5 + h = np.zeros(nstep + 2, dtype=complex) + # compute transfer function + for l in range(0, int(nstep / 2 + 1)): + h[l] = 1.0 / (-m * w[l] * w[l] + 1j * c * w[l] + k) + # mirror image of Her function + h[nstep + 1 - l] = np.conj(h[l]) + + # compute displacement in frequency domain using Her function + qfft = -m * afft + u = np.zeros(nstep + 1, dtype=complex) + for l in range(0, nstep + 1): + u[l] = h[l] * qfft[l] + + # compute displacement in time domain (ignore imaginary part) + utime = np.real(np.fft.ifft(u)) + + # spectral displacement, velocity, and acceleration + umax[j] = np.max(np.abs(utime)) + vmax[j] = (2 * np.pi / p[j]) * umax[j] + amax[j] = (2 * np.pi / p[j]) * vmax[j] + + return p, umax, vmax, amax diff --git a/examples/opensees/N10_T3.tcl b/examples/opensees/N10_T3.tcl deleted file mode 100644 index 5fd8a9b..0000000 --- a/examples/opensees/N10_T3.tcl +++ /dev/null @@ -1,515 +0,0 @@ -# ######################################################### -# # -# Effective stress site response analysis for a layered # -# soil profile located on a level ground and underlain by # -# an elastic half-space. SSPquadUP elements are used. # -# The finite rigidity of the elastic half space is # -# considered through the use of a viscous damper at the # -# base. PM4Sand model (Bounlanger and Ziotopoulou 2017) # -# is used to simualte the liquefiable layer. # -# # -# Created by: Chris McGann # -# Pedro Arduino # -# Modified by: Long Chen # -# Andrew Makdisi # -# Alborz Ghofrani # -# --University of Washington-- # -# # -# ---> Basic units are kN and m (unless specified) # -# # -# ######################################################### - -wipe - -# --------------------------------------------------------- -# 1. DEFINE SOIL AND MESH GEOMETRY -# --------------------------------------------------------- - -# ---SOIL GEOMETRY -# number of soil layers -set numLayers 3 -# layer thicknessess (m) -set layerThick(3) 2.0 -set layerThick(2) 3.0 -set layerThick(1) 1.0 - -# depth of water table, dry -set waterTable 2.0 - -# ---MESH GEOMETRY -# number of elements in horizontal direction -set nElemX 1 -# number of nodes in horizontal direction -set nNodeX [expr $nElemX + 1] -# horizontal element size (m) -set sElemX 0.50 -# number of elements in vertical direction for each layer -set nElemY(3) 4 -set nElemY(2) 6 -set nElemY(1) 2 - -# define grade of slope (%) -set grade 0.0 -set g -9.81 - -set N160 10.0 -set Cd 46.0 -set Dr [expr {sqrt($N160 / $Cd)} ] -set Gs 2.67 -set emax 0.8 -set emin 0.5 -set void [expr $emax - $Dr * ($emax - $emin)] -set por [expr $void / (1 + $void)] -set rho_d [expr $Gs / (1 + $void)] -set rho_s [expr $rho_d *(1.0+$void/$Gs)] - -set K0 0.5 -set nu [expr $K0 / (1 + $K0)] - -# define properties of the underlying rock -set rockVS 182.0 -set rockDen $rho_s - -# ---GROUND MOTION PARAMETERS -# define velocity time history file -set velocityFile velocity.input -# time step in ground motion record -set motionDT 0.005 -# number of steps in ground motion record -set motionSteps 7998 - -# ---RAYLEIGH DAMPING PARAMETERS -set pi 3.141592654 -set fmin 5.01 -set Omegamin [expr $fmin * 2.0 * $pi] -set ximin 0.025 - -# factor to mass matrix -set a0 [expr $ximin * $Omegamin] -# factor to stiffness matrix -set a1 [expr $ximin / $Omegamin] - - -# calculate the thickness of soil profile -set soilThick 0.0 -for {set i 1} {$i <= $numLayers} {incr i} { - set soilThick [expr $soilThick + $layerThick($i)] -} - -# total number of elements in vertical direction -set nElemT 0 -set layerBound(1) 0 -for {set i 1} {$i <= $numLayers} {incr i} { - incr nElemT [expr $nElemY($i)*$nElemX] - set sElemY($i) [expr $layerThick($i)/$nElemY($i)] - set layerBound([expr $i+1]) [expr $layerBound($i) + $nElemY($i)] - puts "size: $sElemY($i)" - puts "layerBound $layerBound([expr $i+1])" -} -set layerBound(1) 1 - -# number of nodes in vertical direction in each layer -set nNodeT 0 -for {set k 1} {$k < $numLayers} {incr k 1} { - set nNodeL($k) [expr $nNodeX*$nElemY($k)] - puts "number of nodes in layer $k: $nNodeL($k)" - set nNodeT [expr $nNodeT + $nNodeL($k)] -} -set nNodeL($numLayers) [expr $nNodeX*($nElemY($numLayers) + 1)] -puts "number of nodes in layer $numLayers: $nNodeL($numLayers)" -set nNodeT [expr $nNodeT + $nNodeL($numLayers)] -puts "total number of nodes: $nNodeT" - -#----------------------------------------------------------------------------------------- -# 2. CREATE PORE PRESSURE NODES AND FIXITIES -#----------------------------------------------------------------------------------------- -model BasicBuilder -ndm 2 -ndf 3 - -set yCoord 0.0 -set count 0 -set gwt 1 -set waterHeight [expr $soilThick-$waterTable] -set nodesInfo [open nodesInfo.dat w] -# loop over layers -for {set k 1} {$k <= $numLayers} {incr k 1} { - # loop over nodes - for {set j 1} {$j <= $nNodeL($k)} {incr j $nNodeX} { - for {set i 1} {$i <= $nNodeX} {incr i} { - node [expr $j+$count+$i-1] [expr ($i-1)*$sElemX] $yCoord - puts $nodesInfo "[expr $j+$count+$i-1] [expr ($i-1)*$sElemX] $yCoord" - - # designate nodes above water table - if {$yCoord>=$waterHeight} { - set dryNode($gwt) [expr $j+$count+$i-1] - set gwt [expr $gwt+1] - } - } - - set yCoord [expr $yCoord + $sElemY($k)] - } - set count [expr $count + $nNodeL($k)] -} -close $nodesInfo - - -# define fixities for pore pressure nodes at base of soil column -for {set i 1} {$i <= $nNodeX} {incr i} { - fix $i 0 1 0 - # puts "fix $i 0 1 0" - if {$i > 1} { - equalDOF 1 $i 1 - # puts "equalDOF 1 $i 1" - } -} -puts "Finished creating all -ndf 3 boundary conditions..." - - -# define equal degrees of freedom for pore pressure nodes -for {set j [expr $nNodeX + 1]} {$j < $nNodeT} {incr j $nNodeX} { - for {set i $j} {$i < [expr $j + $nNodeX-1]} {incr i} { - equalDOF $j [expr $i+1] 1 2 - # puts "equalDOF $j [expr $i+1] 1 2" - } -} -puts "Finished creating equalDOF for pore pressure nodes..." - -# define pore pressure boundaries for nodes above water table -for {set i 1} {$i < $gwt} {incr i 1} { - fix $dryNode($i) 0 0 1 -} - -#----------------------------------------------------------------------------------------- -# 3. CREATE SOIL MATERIALS -#----------------------------------------------------------------------------------------- -set slope [expr atan($grade/100.0)] - -nDMaterial PM4Sand 3 $Dr 468.3 0.463 $rho_d 101.3 -1.00 $emax $emin 0.5 0.1 -1.0 -1.0 250.0 -1.00 33.0 $nu -puts "nDMaterial PM4Sand 2 $Dr 468.3 0.463 $rho_d 101.3 -1.00 $emax $emin 0.5 0.1 -1.0 -1.0 250.0 -1.00 33.0 $nu" -set thick(3) 1.0 -set xWgt(3) [expr $g*sin($slope)] -set yWgt(3) [expr $g*cos($slope)] -set uBulk(3) 2.2e6 -set hPerm(3) 1.0e-5 -set vPerm(3) 1.0e-5 -set eInit(3) $void - -nDMaterial PM4Sand 2 $Dr 584.1 0.450 $rho_s 101.3 -1.00 $emax $emin 0.5 0.1 -1.0 -1.0 250.0 -1.00 33.0 $nu -puts "nDMaterial PM4Sand 1 $Dr 584.1 0.450 $rho_s 101.3 -1.00 $emax $emin 0.5 0.1 -1.0 -1.0 250.0 -1.00 33.0 $nu" -set thick(2) 1.0 -set xWgt(2) [expr $g*sin($slope)] -set yWgt(2) [expr $g*cos($slope)] -set uBulk(2) 2.2e6 -set hPerm(2) 1.0e-5 -set vPerm(2) 1.0e-5 -set eInit(2) $void - -set E [expr 2 * $rho_s * $rockVS * $rockVS * (1 + 0.3)] -nDMaterial ElasticIsotropic 1 $E 0.3 $rho_s -set thick(1) 1.0 -set xWgt(1) [expr $g*sin($slope)] -set yWgt(1) [expr $g*cos($slope)] -set uBulk(1) 2.2e6 -set hPerm(1) 1.0e-9 -set vPerm(1) 1.0e-9 -set eInit(1) [expr 0.2 / (1 - 0.2)] - -puts "Finished creating all soil materials..." - -#----------------------------------------------------------------------------------------- -# 4. CREATE SOIL ELEMENTS -#----------------------------------------------------------------------------------------- -set elemInfo [open elementInfo.dat w] -set count 0 -for {set i 1} {$i <= $numLayers} {incr i 1} { - for {set j 1} {$j <= $nElemY($i)} {incr j 1} { - for {set k 1} {$k <= $nElemX} {incr k} { - set nI [expr ($nNodeX)*($j+$count-1) + $k] - set nJ [expr $nI + 1] - set nK [expr $nI + $nNodeX + 1] - set nL [expr $nI + $nNodeX] - - # permeabilities are initially set at 1.0 m/s for gravity analysis, values are updated post-gravity - element SSPquadUP [expr ($nElemX)*($j+$count-1) + $k] $nI $nJ $nK $nL $i $thick($i) $uBulk($i) 1.0 1.0 1.0 $eInit($i) 1.0e-8 $xWgt($i) $yWgt($i) - puts $elemInfo "[expr ($nElemX)*($j+$count-1) + $k] $nI $nJ $nK $nL $i" - } - } - set count [expr $count + $nElemY($i)] -} -close $elemInfo -puts "Finished creating all soil elements..." - -#----------------------------------------------------------------------------------------- -# 6. LYSMER DASHPOT -#----------------------------------------------------------------------------------------- -model BasicBuilder -ndm 2 -ndf 2 - -# define dashpot nodes -set dashF [expr $nNodeT+1] -set dashS [expr $nNodeT+2] - -node $dashF 0.0 0.0 -node $dashS 0.0 0.0 - -# define fixities for dashpot nodes -fix $dashF 1 1 -fix $dashS 0 1 - -# define equal DOF for dashpot and base soil node -equalDOF 1 $dashS 1 -puts "Finished creating dashpot nodes and boundary conditions..." - -# define dashpot material -set colArea [expr $sElemX*$thick(1)] -set dashpotCoeff [expr $rockVS*$rockDen] -uniaxialMaterial Viscous [expr $numLayers+1] [expr $dashpotCoeff*$colArea] 1 - -# define dashpot element -element zeroLength [expr $nElemT+1] $dashF $dashS -mat [expr $numLayers+1] -dir 1 -puts "Finished creating dashpot material and element..." - -#----------------------------------------------------------------------------------------- -# 7. CREATE GRAVITY RECORDERS -#----------------------------------------------------------------------------------------- - -# create list for pore pressure nodes -set nodeList3 {} -set channel [open "nodesInfo.dat" r] -set count 0; -foreach line [split [read -nonewline $channel] \n] { -set count [expr $count+1]; -set lineData($count) $line -set nodeNumber [lindex $lineData($count) 0] -lappend nodeList3 $nodeNumber -} -close $channel - -# record nodal displacment, acceleration, and porepressure -eval "recorder Node -file Gdisplacement.out -time -node $nodeList3 -dof 1 2 disp" -eval "recorder Node -file Gacceleration.out -time -node $nodeList3 -dof 1 2 accel" -eval "recorder Node -file GporePressure.out -time -node $nodeList3 -dof 3 vel" -# record elemental stress and strain (files are names to reflect GiD gp numbering) -recorder Element -file Gstress.out -time -eleRange 1 $nElemT stress 3 -recorder Element -file Gstrain.out -time -eleRange 1 $nElemT strain -puts "Finished creating gravity recorders..." - - -# ----------------------------------------------------------------------------------------- -# 8. CREATE GID FLAVIA.MSH FILE FOR POSTPROCESSING -# ----------------------------------------------------------------------------------------- - -set meshFile [open freeFieldEffective.flavia.msh w] -puts $meshFile "MESH ffBrick dimension 2 ElemType Quadrilateral Nnode 4" -puts $meshFile "Coordinates" -puts $meshFile "#node_number coord_x coord_y" -set yCoord 0.0 -set count 0 -# loop over layers -for {set k 1} {$k <= $numLayers} {incr k 1} { - # loop over nodes - for {set j 1} {$j <= $nNodeL($k)} {incr j $nNodeX} { - for {set i 1} {$i <= $nNodeX} {incr i} { - puts $meshFile "[expr $j+$count+$i-1] [expr ($i-1)*$sElemX] $yCoord" - } - set yCoord [expr $yCoord + $sElemY($k)] - } - set count [expr $count + $nNodeL($k)] -} -puts $meshFile "end coordinates" -puts $meshFile "Elements" -puts $meshFile "# element node1 node2 node3 node4" -set count 0 -# loop over layers -for {set i 1} {$i <= $numLayers} {incr i 1} { - for {set j 1} {$j <= $nElemY($i)} {incr j 1} { - for {set k 1} {$k <= $nElemX} {incr k} { - set nI [expr ($nNodeX)*($j+$count-1) + $k] - set nJ [expr $nI + 1] - set nK [expr $nI + $nNodeX + 1] - set nL [expr $nI + $nNodeX] - puts $meshFile "[expr $j+$count] $nI $nJ $nK $nL" - } - } - set count [expr $count + $nElemY($i)] -} -puts $meshFile "end elements" -close $meshFile - - -#----------------------------------------------------------------------------------------- -# 9. DEFINE ANALYSIS PARAMETERS -#----------------------------------------------------------------------------------------- - -#---DETERMINE STABLE ANALYSIS TIME STEP USING CFL CONDITION - -# duration of ground motion (s) -set duration [expr $motionDT*$motionSteps] - -set AnalysisdT 0.001 -set nSteps [expr int(floor($duration/$AnalysisdT)+1)] -set dT $AnalysisdT - -puts "number of steps in analysis: $nSteps" -puts "analysis time step: $dT" - -#---ANALYSIS PARAMETERS -# Newmark parameters - -set gamma [expr 5.0/6.0] -set beta [expr 4.0/9.0] - -#----------------------------------------------------------------------------------------- -# 10. GRAVITY ANALYSIS -#----------------------------------------------------------------------------------------- - -# update materials to ensure elastic behavior -for {set i 1} {$i <= $numLayers} {incr i} { - updateMaterialStage -material $i -stage 0 -} - -# fix bottom nodes for additional stability -# fix 1 1 1 0 - -constraints Transformation -test NormDispIncr 1e-4 35 1 -algorithm Newton -numberer RCM -#system SparseGeneral -system ProfileSPD -integrator Newmark $gamma $beta -analysis Transient - -set startT [clock seconds] -analyze 10 1.0 -puts "Finished with elastic gravity analysis..." - -# update materials to consider plastic behavior -for {set i 1} {$i <= $numLayers} {incr i} { - updateMaterialStage -material $i -stage 1 -} -for {set i 1} {$i <= $numLayers} {incr i} { - setParameter -value 0 -eleRange $layerBound($i) $layerBound([expr $i+1]) FirstCall $i - setParameter -value 0.3 -eleRange $layerBound($i) $layerBound([expr $i+1]) poissonRatio $i -} -# plastic gravity loading -analyze 10 1.0 - -# remove extra bottom fixity for dynamic analysis -# remove sp 1 1 -puts "Finished with plastic gravity analysis..." - -#----------------------------------------------------------------------------------------- -# 11. UPDATE ELEMENT PERMEABILITY VALUES FOR POST-GRAVITY ANALYSIS -#----------------------------------------------------------------------------------------- - -# update permeability parameters for each element -for {set i 1} {$i <= $numLayers} {incr i} { - setParameter -value [expr $hPerm($i) / 9.81] -eleRange $layerBound($i) $layerBound([expr $i+1]) hPerm - setParameter -value [expr $vPerm($i) / 9.81] -eleRange $layerBound($i) $layerBound([expr $i+1]) vPerm -} -puts "Finished updating permeabilities for dynamic analysis..." - -#----------------------------------------------------------------------------------------- -# 12. CREATE POST-GRAVITY RECORDERS -#----------------------------------------------------------------------------------------- - -# reset time and analysis -setTime 0.0 -wipeAnalysis -remove recorders - -# recorder time step -set recDT 0.01 - -# record nodal displacment, acceleration, and porepressure -eval "recorder Node -file displacement.out -time -dT $recDT -node $nodeList3 -dof 1 2 disp" -eval "recorder Node -file acceleration.out -time -dT $recDT -node $nodeList3 -dof 1 2 accel" -eval "recorder Node -file porePressure.out -time -dT $recDT -node $nodeList3 -dof 3 vel" -# record elemental stress and strain (files are names to reflect GiD gp numbering) -recorder Element -file stress.out -time -dT $recDT -eleRange 1 $nElemT stress 3 -recorder Element -file strain.out -time -dT $recDT -eleRange 1 $nElemT strain -puts "Finished creating all recorders..." - -#----------------------------------------------------------------------------------------- -# 13. DYNAMIC ANALYSIS -#----------------------------------------------------------------------------------------- - -model BasicBuilder -ndm 2 -ndf 3 - -# define constant scaling factor for applied velocity -set cFactor [expr $colArea*$dashpotCoeff] - -# timeseries object for force history -set mSeries "Path -dt $motionDT -filePath $velocityFile -factor $cFactor" - -# loading object -pattern Plain 10 $mSeries { - load 1 1.0 0.0 0.0 -} -puts "Dynamic loading created..." - -set gamma 0.5 -set beta 0.25 - - -constraints Transformation -test NormDispIncr 1.0e-4 35 1 -algorithm Newton -numberer RCM -#system SparseGeneral -system ProfileSPD -integrator Newmark $gamma $beta -rayleigh $a0 $a1 0.0 0.0 -analysis Transient - -# Analyze and use substepping if needed -set remStep $nSteps -set success 0 - -proc subStepAnalyze {dT subStep} { - if {$subStep > 10} { - return -10 - } - for {set i 1} {$i < 3} {incr i} { - puts "Try dT = $dT" - set success [analyze 1 $dT] - if {$success != 0} { - set success [subStepAnalyze [expr $dT/2.0] [expr $subStep+1]] - if {$success == -10} { - puts "Did not converge." - return $success - } - } else { - if {$i==1} { - puts "Substep $subStep : Left side converged with dT = $dT" - } else { - puts "Substep $subStep : Right side converged with dT = $dT" - } - } - } - return $success -} - -puts "Start analysis" -set startT [clock seconds] - -while {$success != -10} { - set subStep 0 - set success [analyze $remStep $dT] - if {$success == 0} { - puts "Analysis Finished" - break - } else { - set curTime [getTime] - puts "Analysis failed at $curTime . Try substepping." - set success [subStepAnalyze [expr $dT/2.0] [incr subStep]] - set curStep [expr int($curTime/$dT + 1)] - set remStep [expr int($nSteps-$curStep)] - puts "Current step: $curStep , Remaining steps: $remStep" - } -} -set endT [clock seconds] -puts "loading analysis execution time: [expr $endT-$startT] seconds." - -puts "Finished with dynamic analysis..." - -wipe diff --git a/examples/opensees/OpenSeesMP-dapi.ipynb b/examples/opensees/OpenSeesMP-dapi.ipynb new file mode 100644 index 0000000..c6bb9f9 --- /dev/null +++ b/examples/opensees/OpenSeesMP-dapi.ipynb @@ -0,0 +1,627 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Multi-Free Field Analysis Example using DAPI" + ] + }, + { + "cell_type": "markdown", + "id": "cell-1", + "metadata": {}, + "source": [ + "This example shows how to run OpenSeesMP in DesignSafe from a jupyter notebook using the DesignSafe API (dapi).\n", + "\n", + "A set of four 1D profiles is analyzed using OpenSeesMP." + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "cell-3", + "metadata": {}, + "source": [ + "# Setup DAPI and start OpenSeesMP job" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cell-4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found existing installation: dapi 0.3.0\n", + "Uninstalling dapi-0.3.0:\n", + " Successfully uninstalled dapi-0.3.0\n", + "Requirement already satisfied: numpy in /opt/conda/lib/python3.12/site-packages (2.2.6)\n" + ] + } + ], + "source": [ + "# Dapi installation\n", + "!pip uninstall dapi --yes\n", + "\n", + "# Install the latest development version of dapi from GitHub\n", + "!pip install git+https://github.com/DesignSafe-CI/dapi.git@dev --user --quiet\n", + "\n", + "# Install editable local version of dapi\n", + "# !pip install -e ../" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f5e9e476-3d14-4885-b172-f85425c449da", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7b966d7b-d9ec-4e99-8727-201285489f21", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "\n", + "sys.path.append(os.path.join(os.getcwd(), \"./DS_input\"))\n", + "\n", + "from plotAcc import plot_acc" + ] + }, + { + "cell_type": "markdown", + "id": "cell-5", + "metadata": {}, + "source": [ + "### Setup job description" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-6", + "metadata": {}, + "outputs": [], + "source": [ + "# Import DAPI and other required libraries\n", + "from dapi import DSClient\n", + "import os\n", + "import json\n", + "from datetime import date" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authentication successful.\n", + "DatabaseAccessor initialized. Connections will be created on first access.\n" + ] + } + ], + "source": [ + "try:\n", + " ds = DSClient()\n", + "except Exception as e:\n", + " print(f\"Authentication failed: {e}\")\n", + " raise SystemExit(\"Stopping notebook due to authentication failure.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DesignSafe path: /home/jupyter/MyData/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input\n", + "Translated '/home/jupyter/MyData/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input' to 'tapis://designsafe.storage.default/kks32/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input' using t.username\n", + "Input URI: tapis://designsafe.storage.default/kks32/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input\n" + ] + } + ], + "source": [ + "ds_path = \"/home/jupyter/MyData/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input\"\n", + "print(f\"DesignSafe path: {ds_path}\")\n", + "input_uri = ds.files.translate_path_to_uri(ds_path)\n", + "print(f\"Input URI: {input_uri}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-9", + "metadata": {}, + "outputs": [], + "source": [ + "# Job configuration parameters\n", + "jobname: str = \"opensees-MP-multiMotion-dapi\"\n", + "app_id: str = \"opensees-mp-s3\"\n", + "input_filename: str = \"Main_multiMotion.tcl\"\n", + "control_exec_Dir: str = \"DS_input\" # Folder with files including input_filename\n", + "tacc_allocation: str = \"ASC25049\" # MUST USE YOUR OWN ALLOCATION !!\n", + "archive_system: str = \"designsafe\"\n", + "control_nodeCount: int = 1\n", + "control_corespernode: int = 16\n", + "max_job_minutes: int = 60" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5286f5ac", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating job request for app 'opensees-mp-s3'...\n", + "Using App Details: opensees-mp-s3 vlatest\n", + "Placing script 'Main_multiMotion.tcl' in appArgs: 'Main Script'\n", + "Adding allocation: ASC25049\n", + "Job request dictionary generated successfully.\n" + ] + } + ], + "source": [ + "# Generate job request dictionary using app defaults\n", + "job_dict = ds.jobs.generate_request(\n", + " app_id=app_id,\n", + " input_dir_uri=input_uri,\n", + " script_filename=input_filename,\n", + " archive_system=archive_system,\n", + " max_minutes=max_job_minutes,\n", + " allocation=tacc_allocation,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-10", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generated job request:\n", + "{\n", + " \"name\": \"opensees-MP-multiMotion-dapi\",\n", + " \"appId\": \"opensees-mp-s3\",\n", + " \"appVersion\": \"latest\",\n", + " \"description\": \"Runs all the processors in parallel. Requires understanding of parallel processing and the capabilities to write parallel scripts.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"designsafe.storage.default\",\n", + " \"archiveSystemDir\": \"${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 16,\n", + " \"maxMinutes\": 60,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Main Script\",\n", + " \"arg\": \"Main_multiMotion.tcl\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# Customize job settings\n", + "job_dict[\"name\"] = jobname\n", + "job_dict[\"nodeCount\"] = control_nodeCount\n", + "job_dict[\"coresPerNode\"] = control_corespernode\n", + "\n", + "print(\"Generated job request:\")\n", + "print(json.dumps(job_dict, indent=2, default=str))" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "### Run job" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-12", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Submitting Tapis Job Request ---\n", + "{\n", + " \"name\": \"opensees-MP-multiMotion-dapi\",\n", + " \"appId\": \"opensees-mp-s3\",\n", + " \"appVersion\": \"latest\",\n", + " \"description\": \"Runs all the processors in parallel. Requires understanding of parallel processing and the capabilities to write parallel scripts.\",\n", + " \"execSystemId\": \"stampede3\",\n", + " \"archiveSystemId\": \"designsafe.storage.default\",\n", + " \"archiveSystemDir\": \"${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}\",\n", + " \"archiveOnAppError\": true,\n", + " \"execSystemLogicalQueue\": \"skx\",\n", + " \"nodeCount\": 1,\n", + " \"coresPerNode\": 16,\n", + " \"maxMinutes\": 60,\n", + " \"memoryMB\": 192000,\n", + " \"isMpi\": false,\n", + " \"tags\": [],\n", + " \"fileInputs\": [\n", + " {\n", + " \"name\": \"Input Directory\",\n", + " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/template-notebooks/tapis3/opensees/OpenSeesMP_multiMotion/DS_input\",\n", + " \"autoMountLocal\": true,\n", + " \"targetPath\": \"inputDirectory\"\n", + " }\n", + " ],\n", + " \"parameterSet\": {\n", + " \"appArgs\": [\n", + " {\n", + " \"name\": \"Main Script\",\n", + " \"arg\": \"Main_multiMotion.tcl\"\n", + " }\n", + " ],\n", + " \"schedulerOptions\": [\n", + " {\n", + " \"name\": \"TACC Allocation\",\n", + " \"arg\": \"-A ASC25049\"\n", + " }\n", + " ]\n", + " }\n", + "}\n", + "------------------------------------\n", + "Job submitted successfully. UUID: 414da416-817a-48db-a70a-0fa79b6bc348-007\n", + "Job launched with UUID: 414da416-817a-48db-a70a-0fa79b6bc348-007\n", + "Can also check in DesignSafe portal under - Workspace > Tools & Application > Job Status\n" + ] + } + ], + "source": [ + "# Submit job using dapi\n", + "submitted_job = ds.jobs.submit_request(job_dict)\n", + "print(f\"Job launched with UUID: {submitted_job.uuid}\")\n", + "print(\n", + " \"Can also check in DesignSafe portal under - Workspace > Tools & Application > Job Status\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Monitoring Job: 414da416-817a-48db-a70a-0fa79b6bc348-007\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Waiting for job to start: 0 checks [00:00, ? checks/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b07354464e5e4d048083cc6dbded8a50", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Monitoring job: 0%| | 0/60 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_acc()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/opensees/ShortReport.tex b/examples/opensees/ShortReport.tex deleted file mode 100644 index 29fe5d3..0000000 --- a/examples/opensees/ShortReport.tex +++ /dev/null @@ -1,98 +0,0 @@ -%######################################################## -% -% Postprocessing LaTeX script -% -% Copyright: UW Computational Mechanics Group -% Pedro Arduino -% -% Participants: Alborz Ghofrani -% Long Chen -% -%------------------------------------------------------- - -\documentclass[11pt,fleqn]{article} - -\usepackage[T1]{fontenc} -\usepackage[ansinew]{inputenc} -\usepackage{fullpage, url} -\usepackage{amsmath, amsfonts} - -\usepackage[normalem]{ulem} -\usepackage{longtable} -\usepackage{xcolor} -\usepackage{graphicx} -\newcommand\suppress[1]{} -\newcommand\deleted[1]{\xout{#1}} -\newcommand\revised[1]{\uline{#1}} -\newlength\wvtextpercent -\setlength\wvtextpercent{0.009\textwidth} - -% \newif\ifpdf -% \ifx\pdfoutput\undefined -% \pdffalse -% \else -% \pdfoutput=1 -% \pdftrue -% \fi - -%\ifpdf -% \usepackage[pdftex]{xcolor} -% \usepackage[pdftex]{graphicx} -% \pdfinfo { -% /Title (Materials Modeling) -% /Subject (Transition from 1D to 3D) -% /Author (Peter Mackenzie) -% /Keywords (CEE503) -% } -%\else -% \usepackage{xcolor} -% \usepackage{graphicx} -%\fi - -\setlength{\parindent}{0pt} -\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} - -\input{short} -\input{macros} - - -\begin{document} - -%\tableofcontents -%\newpage - \begin{center} - - \textbf{{DesignSafe Example\hfill{}1D Site Response Examples\hfill{}May 2017}} - - \end{center} - - -\section{Soil profile} - -Free field response of single soil profile subjected to earthquake excitation - -\begin{figure}[h!] -\centering -\includegraphics[scale=0.7]{schematic} -\caption{1D Model} -\end{figure} - -\newpage -\section{Results} - -% Plot Results -\begin{figure}[h!] -\centering -\includegraphics[width=5in]{surfaceAccel} -\caption{Surface acceleration time history} -\end{figure} - -\begin{figure}[h!] -\centering -\includegraphics[width=5in]{logSpectra} -\caption{Surface response spectra} -\end{figure} - - - -\end{document} diff --git a/examples/opensees/interactiveplot.py b/examples/opensees/interactiveplot.py deleted file mode 100644 index d3b660c..0000000 --- a/examples/opensees/interactiveplot.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Create interactive plot for disp and pwp -@author: Long Chen -""" - -import matplotlib.pyplot as plt -from matplotlib import gridspec -from ipywidgets import interactive -import ipywidgets as widgets -import numpy as np - - -def pwpplot(timeStep): - Step = int(timeStep / 0.01) - 1 - plt.subplot(211) - plt.plot(time, uu) - plt.plot(time[Step], uu[Step], "ro") - plt.ylabel("pwp(kPa)") - plt.grid() - plt.subplot(212) - plt.plot(time, acc_input) - plt.plot(time[Step], acc_input[Step], "ro") - plt.xlabel("time(s)") - plt.ylabel("acceleration(g)") - plt.grid() - - -def dispplot(timeStep): - Step = int(timeStep / 0.01) - 1 - plt.figure(figsize=(7, 8)) - ax0 = plt.subplot(gs[0]) - ax0.plot(maxdisp[0, ::2], nodes[::2, 2], "b--") - ax0.plot(mindisp[0, ::2], nodes[::2, 2], "b--") - ax0.plot(disp[Step, ::4], nodes[::2, 2]) - plt.xlabel("displacement(m)") - plt.ylabel("Elevation(m)") - plt.grid() - ax1 = plt.subplot(gs[1]) - ax1.plot(time, acc_input) - ax1.plot(time[Step], acc_input[Step], "ro") - plt.xlabel("time(s)") - plt.ylabel("acceleration(g)") - plt.grid() - - -def createpwpplot(): - global time, acc_input, uu - pwp = np.loadtxt("porePressure.out") - time = pwp[:, 0] - pwp = np.delete(pwp, 0, 1) - uexcess = pwp - pwp[0, :] - uu = uexcess[0 : len(time), 12] - acc = np.loadtxt("acceleration.out") - acc_input = acc[:, 1] - - return interactive( - pwpplot, timeStep=widgets.FloatSlider(min=0.01, max=time[-1], step=0.01) - ) - - -def createDispplot(): - global maxdisp, mindisp, nodes, disp, gs - nodes = np.loadtxt("nodesInfo.dat") - disp = np.loadtxt("displacement.out") - disp = np.delete(disp, 0, 1) - disp = (disp.transpose() - disp[:, 0]).transpose() - ndof = 2 - nnodes = nodes.shape[0] - maxdisp = np.amax(disp, axis=0) - mindisp = np.amin(disp, axis=0) - maxdisp = maxdisp.reshape(ndof, nnodes, order="F") - mindisp = mindisp.reshape(ndof, nnodes, order="F") - gs = gridspec.GridSpec(2, 1, height_ratios=[6, 1]) - - return interactive( - dispplot, - timeStep=widgets.FloatSlider(min=0.01, max=time[-1], step=0.01), - continuous_update=False, - ) - - -if __name__ == "__main__": - createpwpplot() diff --git a/examples/opensees/multi-freeField.png b/examples/opensees/multi-freeField.png new file mode 100755 index 0000000..e6554d6 Binary files /dev/null and b/examples/opensees/multi-freeField.png differ diff --git a/examples/opensees/opensees-dapi-v3.ipynb b/examples/opensees/opensees-dapi-v3.ipynb deleted file mode 100644 index 3ceefeb..0000000 --- a/examples/opensees/opensees-dapi-v3.ipynb +++ /dev/null @@ -1,585 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Free Field Analysis Example\n", - "Pedro Arduino - UW Computational Geomechanics Group" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This example shows how to run OpenSees in DesignSafe from a jupyter notebook and how to postprocess the output results using python scripts, generate a LaTex report, and create interactive plots. \n", - "\n", - "A simple 1D free field analysis of a liquefiable soil layer is analyzed using OpenSees. An schematic of the soil profile in shown in the Figure. The soil profile consists of a 1 m dry crust, 3 m liquefiable layer, and 1 m of elastic base. The ground water table is at 2 m. An earthquake excitation is applied at the bottom of the soil column. A compliant rock is considered in the analysis. \n", - "\n", - "The results are presented in terms of:\n", - "\n", - "a) Time history of acceleration at the surface and corresponding response spectra.\n", - "\n", - "b) Profiles of maximum displacement, peak horizontal acceleration (PHA), maximum shear strain, and stress ratio\n", - "\n", - "c) Stress strain plots for a point near the center of the liquefiable zone, and\n", - "\n", - "d) Evolution of pore water pressure for a point near the center of the liquefiable zone. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Setup agave and start OpenSees job" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup job description" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install --user --upgrade setuptools --quiet\n", - "!pip install --user --only-binary=:all: atomicwrites==1.4.0 --quiet\n", - "!pip install --user \"jsonschema<4.18.0\" --quiet\n", - "!pip install git+https://github.com/DesignSafe-CI/dapi.git@tapisv3 --user --quiet" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import dapi\n", - "import uuid\n", - "from datetime import date\n", - "import json" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Authenticate\n", - "t = dapi.auth.init()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Define inputs\n", - "cur_dir = os.getcwd()\n", - "input_uri = dapi.jobs.get_ds_path_uri(t, cur_dir)\n", - "input_filename = \"N10_T3.tcl\"" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "---Job Info---\n", - "\n", - "{\n", - " \"name\": \"opensees-express_20241001_174715\",\n", - " \"appId\": \"opensees-express\",\n", - " \"appVersion\": \"3.7.0\",\n", - " \"execSystemId\": \"wma-exec-01\",\n", - " \"maxMinutes\": 30,\n", - " \"archiveOnAppError\": true,\n", - " \"fileInputs\": [\n", - " {\n", - " \"name\": \"Input Directory\",\n", - " \"sourceUrl\": \"tapis://designsafe.storage.default/kks32/freeFieldEffectiveJupyter\"\n", - " }\n", - " ],\n", - " \"execSystemLogicalQueue\": \"development\",\n", - " \"nodeCount\": 1,\n", - " \"coresPerNode\": 1,\n", - " \"parameterSet\": {\n", - " \"envVariables\": [\n", - " {\n", - " \"key\": \"tclScript\",\n", - " \"value\": \"N10_T3.tcl\"\n", - " }\n", - " ]\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "job_info = dapi.jobs.generate_job_info(t, \"opensees-express\", input_uri, input_filename)\n", - "job_info[\"maxMinutes\"] = 30\n", - "job_info[\"execSystemLogicalQueue\"] = \"development\"\n", - "print(\"\\n---Job Info---\\n\\n\" + json.dumps(job_info, indent=2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run job" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Submit job\n", - "job = t.jobs.submitJob(**job_info)\n", - "jobUuid = job.uuid" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Waiting for job to start: 3it [00:45, 15.07s/it, Status: RUNNING] \n", - "Monitoring job: 0%| | 0/120 [00:00 Fix\n", - "\n", - "```json\n", - "job_description[\"archiveSystemId\"] = \"designsafe.storage.default\"\n", - "job_description[\"archiveSystemDir\"] = (\n", - " f\"{t.username}/tapis-jobs-archive/${{JobCreateDate}}/${{JobName}}-${{JobUUID}}\"\n", - ")\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "# %cd ..\n", - "cur_dir_name = cur_dir.split(\"/\").pop()\n", - "os.chdir(jobinfo.archiveSystemDir.replace(user, \"/home/jupyter/MyData\"))\n", - "if not os.path.exists(cur_dir_name):\n", - " os.makedirs(cur_dir_name)\n", - "os.chdir(cur_dir_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Import python libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plot acceleration time history" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot acceleration time hisotory and response spectra on log-linear scale" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from plotAcc import plot_acc\n", - "\n", - "plot_acc()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plot profiles" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot profiles of max displacement, PGA, max shear strain, stress ratio and plot stress strain near the center of liquefiable layer " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from plotProfile import plot_profile\n", - "\n", - "plot_profile()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plot excess pore water pressure" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from plotPorepressure import plot_porepressure\n", - "\n", - "plot_porepressure()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Generate LaTeX Report " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# os.system('/usr/bin/pdflatex -interaction nonstopmode ShortReport.tex')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Before we start let us install a python package for plotting\n", - "try:\n", - " import rst2pdf\n", - "\n", - "except:\n", - " import pip\n", - "\n", - " pip.main([\"install\", \"--user\", \"rst2pdf\"])\n", - " print(\"********* Please restart the session ***********\")\n", - "\n", - "import rst2pdf" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "\n", - "!{sys.executable} -m pip install rst2pdf -q" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 2024 - JupyterHub\n", - "os.system(\"/home/jupyter/.local/bin/rst2pdf ShortReport.rst ShortReport.pdf\")\n", - "# 2022 - JupyterHub\n", - "# os.system('/opt/conda/bin/rst2pdf ShortReport.rst ShortReport.pdf')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class PDF(object):\n", - " def __init__(self, pdf, size=(200, 200)):\n", - " self.pdf = pdf\n", - " self.size = size\n", - "\n", - " def _repr_html_(self):\n", - " return \"\".format(\n", - " self.pdf, self.size\n", - " )\n", - "\n", - " def _repr_latex_(self):\n", - " return r\"\\includegraphics[width=1.0\\textwidth]{{{0}}}\".format(self.pdf)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# pdf_fn = jobinfo.archiveSystemDir.replace(user, '/user/' + user + '/files/MyData')\n", - "pdf_fn = jobinfo.archiveSystemDir.replace(\"/\" + user, \"../../../MyData\")\n", - "\n", - "pdf_fn += \"/\"\n", - "pdf_fn += cur_dir.split(\"/\")[-1]\n", - "pdf_fn += \"/ShortReport.pdf\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "PDF(pdf_fn, (750, 600))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Create Interactive Plots" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pore water pressure" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from interactiveplot import createpwpplot, createDispplot" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "createpwpplot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displacement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "createDispplot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "IMAGE_NAME": "taccsciapps/ds-nb-img:base-0.1.9", - "UUID": "73e0880d-9b87-11ec-9c1c-13579dd95994", - "celltoolbar": "Raw Cell Format", - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/opensees/plotAcc.py b/examples/opensees/plotAcc.py deleted file mode 100644 index 3504377..0000000 --- a/examples/opensees/plotAcc.py +++ /dev/null @@ -1,65 +0,0 @@ -######################################################### -# -# Postprocessing python script -# -# Copyright: UW Computational Mechanics Group -# Pedro Arduino -# -# Participants: Alborz Ghofrani -# Long Chen -# -# ------------------------------------------------------- - -import numpy as np -import matplotlib.pyplot as plt - -from respSpectra import resp_spectra - - -def plot_acc(ndof=2): - """ - Plot acceleration time history and response spectra - """ - acc = np.loadtxt("acceleration.out") - time = acc[:, 0] - acc = np.delete(acc, 0, 1) - # Bandaid to remove last 2 nodes associated with dashpot (not for all Openees) - # acc = acc[:,0:-4] - - [nstep, temp] = acc.shape - nnode = int(temp / ndof) - a = acc.reshape(nstep, ndof, nnode, order="F") / 9.81 - - # plot acceleration time history - plt.figure() - plt.plot(time, a[:, 0, nnode - 1]) - plt.grid() - plt.xlabel("time (sec)") - plt.ylabel("acceleration (g)") - plt.savefig("surfaceAccel.eps") - plt.savefig("surfaceAccel.png") - - # build response spectra - [p, umax, vmax, amax] = resp_spectra(a[:, 0, nnode - 1], time[-1], nstep) - - # response spectra on log-linear plot - plt.figure() - plt.subplot(3, 1, 1) - plt.semilogx(p, amax) - plt.grid() - plt.ylabel("$S_a (g)$") - plt.subplot(3, 1, 2) - plt.semilogx(p, vmax) - plt.grid() - plt.ylabel("$S_v (m/s)$") - plt.subplot(3, 1, 3) - plt.semilogx(p, umax) - plt.grid() - plt.ylabel("$S_d (m)$") - plt.xlabel("$Period (s)$") - plt.savefig("logSpectra.eps") - plt.savefig("logSpectra.png") - - -if __name__ == "__main__": - plot_acc() diff --git a/examples/opensees/plotPorepressure.py b/examples/opensees/plotPorepressure.py deleted file mode 100644 index d6bd32b..0000000 --- a/examples/opensees/plotPorepressure.py +++ /dev/null @@ -1,36 +0,0 @@ -######################################################### -# -# Postprocessing python script -# -# Copyright: UW Computational Mechanics Group -# Pedro Arduino -# -# Participants: Alborz Ghofrani -# Long Chen -# -# ------------------------------------------------------- - -import numpy as np -import matplotlib.pyplot as plt - - -def plot_porepressure(): - """ - Plot pore water pressure - """ - porepressure = np.loadtxt("porePressure.out") - time = porepressure[:, 0] - porepressure = np.delete(porepressure, 0, 1) - uexcess = porepressure - porepressure[0, :] - - plt.figure() - plt.plot(time, uexcess[:, 12]) - plt.xlabel("Time(s)") - plt.ylabel("u_excess(kPa)") - plt.grid() - plt.savefig("porePressure.eps") - plt.savefig("porePressure.png") - - -if __name__ == "__main__": - plot_porepressure() diff --git a/examples/opensees/plotProfile.py b/examples/opensees/plotProfile.py deleted file mode 100644 index 2277ce1..0000000 --- a/examples/opensees/plotProfile.py +++ /dev/null @@ -1,88 +0,0 @@ -######################################################### -# -# Postprocessing python script -# -# Copyright: UW Computational Mechanics Group -# Pedro Arduino -# -# Participants: Alborz Ghofrani -# Long Chen -# -# ------------------------------------------------------- - -from plotStressStrain import plot_stress_strain - -import numpy as np -import matplotlib.pyplot as plt - - -def plot_profile(ndof=2, nstraincomp=3, nstresscomp=3): - """ - Plot maximum displacement, PGA and maximum shear strain and maximum cyclic stress ratio - """ - nodes = np.loadtxt("nodesInfo.dat") - disp = np.loadtxt("displacement.out") - acc = np.loadtxt("acceleration.out") - strain = np.loadtxt("strain.out") - stress = np.loadtxt("stress.out") - - time = acc[:, 0] - disp = np.delete(disp, 0, 1) - acc = np.delete(acc, 0, 1) - strain = np.delete(strain, 0, 1) - stress = np.delete(stress, 0, 1) - - # Bandaid to remove last 2 nodes associated with dashpot (not correct for all Openees) - # disp = disp[:,0:-4] - # acc = acc[:,0:-4] - - # subtact base displacement - disp = (disp.transpose() - disp[:, 0]).transpose() - maxdisp = np.amax(np.abs(disp), axis=0) - pga = np.amax(np.abs(acc), axis=0) - maxstrain = np.amax(np.abs(strain), axis=0) - maxstressratio = np.amax(np.abs(stress[:, 2::nstresscomp]), axis=0) - maxstressratio = maxstressratio / np.abs(stress[0, 1::nstresscomp]) - - [nstep, temp] = strain.shape - nelem = int(temp / nstraincomp) - nnodes = nodes.shape[0] - - stress = stress.reshape(nstep, nstresscomp, nelem, order="F") - strain = strain.reshape(nstep, nstraincomp, nelem, order="F") - maxdisp = maxdisp.reshape(ndof, nnodes, order="F") - pga = pga.reshape(ndof, nnodes, order="F") - maxstrain = maxstrain.reshape(nstraincomp, nelem, order="F") - - plt.figure(figsize=(12, 6)) - plt.subplot(1, 4, 1) - plt.plot(maxdisp[0, ::2], nodes[::2, 2]) - plt.xticks(np.arange(0.0, max(maxdisp[0, ::2]), 0.2)) - plt.grid() - plt.xlabel("Maximum Displacement(m)") - plt.ylabel("Elevation(m)") - - plt.subplot(1, 4, 2) - plt.plot(pga[0, ::2] / 9.81, nodes[::2, 2]) - plt.xticks(np.arange(0.0, max(pga[0, ::2]) / 9.81, 0.2)) - plt.grid() - plt.xlabel("PHA(g)") - - plt.subplot(1, 4, 3) - plt.plot(maxstrain[2, :] * 100.0, nodes[:-2:2, 2] + np.diff(nodes[::2, 2])) - plt.grid() - plt.xlabel("Maximum Shear Strain(%)") - - plt.subplot(1, 4, 4) - plt.plot(maxstressratio, nodes[:-2:2, 2] + np.diff(nodes[::2, 2])) - plt.xticks(np.arange(0.0, max(maxstressratio), 0.2)) - plt.grid() - plt.xlabel("$(\\tau / \sigma_{v0})_{max} $") - plt.savefig("profilePlot.eps") - plt.savefig("profilePlot.png") - - plot_stress_strain(stress[:, 2, 6], strain[:, 2, 6]) - - -if __name__ == "__main__": - plot_profile() diff --git a/examples/opensees/plotStressStrain.py b/examples/opensees/plotStressStrain.py deleted file mode 100644 index 0e04f63..0000000 --- a/examples/opensees/plotStressStrain.py +++ /dev/null @@ -1,26 +0,0 @@ -######################################################### -# -# Postprocessing python script -# -# Copyright: UW Computational Mechanics Group -# Pedro Arduino -# -# Participants: Alborz Ghofrani -# Long Chen -# -# ------------------------------------------------------- - -import matplotlib.pyplot as plt - - -def plot_stress_strain(stress, strain): - """ - Plot stress strain curve - """ - plt.figure() - plt.plot(strain, stress) - plt.xlabel("strain(%)") - plt.ylabel("stress(kPa)") - plt.grid() - plt.savefig("stressstrain.eps") - plt.savefig("stressstrain.png") diff --git a/examples/opensees/schematic.png b/examples/opensees/schematic.png deleted file mode 100644 index f8fd135..0000000 Binary files a/examples/opensees/schematic.png and /dev/null differ diff --git a/examples/opensees/short.tex b/examples/opensees/short.tex deleted file mode 100644 index 384d4f7..0000000 --- a/examples/opensees/short.tex +++ /dev/null @@ -1,158 +0,0 @@ -% short.tex: abbreviations for boldface math - -\def\MathBold#1{\ensuremath{\mathrm{\bf #1}}} - -\def\BA{\MathBold{A}} -\def\BB{\MathBold{B}} -\def\BC{\MathBold{C}} -\def\BD{\MathBold{D}} -\def\BE{\MathBold{E}} -\def\BF{\MathBold{F}} -\def\BG{\MathBold{G}} -\def\BH{\MathBold{H}} -\def\BI{\MathBold{I}} -\def\BJ{\MathBold{J}} -\def\BK{\MathBold{K}} -\def\BL{\MathBold{L}} -\def\BM{\MathBold{M}} -\def\BN{\MathBold{N}} -\def\BO{\MathBold{O}} -\def\BP{\MathBold{P}} -\def\BQ{\MathBold{Q}} -\def\BR{\MathBold{R}} -\def\BS{\MathBold{S}} -\def\BT{\MathBold{T}} -\def\BU{\MathBold{U}} -\def\BV{\MathBold{V}} -\def\BW{\MathBold{W}} -\def\BX{\MathBold{X}} -\def\BY{\MathBold{Y}} -\def\BZ{\MathBold{Z}} - -\def\Ba{\MathBold{a}} -\def\Bb{\MathBold{b}} -\def\Bc{\MathBold{c}} -\def\Bd{\MathBold{d}} -\def\Be{\MathBold{e}} -\def\Bf{\MathBold{f}} -\def\Bg{\MathBold{g}} -\def\Bh{\MathBold{h}} -\def\Bi{\MathBold{i}} -\def\Bj{\MathBold{j}} -\def\Bk{\MathBold{k}} -\def\Bl{\MathBold{l}} -\def\Bm{\MathBold{m}} -\def\Bn{\MathBold{n}} -\def\Bo{\MathBold{o}} -\def\Bp{\MathBold{p}} -\def\Bq{\MathBold{q}} -\def\Br{\MathBold{r}} -\def\Bs{\MathBold{s}} -\def\Bt{\MathBold{t}} -\def\Bu{\MathBold{u}} -\def\Bv{\MathBold{v}} -\def\Bw{\MathBold{w}} -\def\Bx{\MathBold{x}} -\def\By{\MathBold{y}} -\def\Bz{\MathBold{z}} - -%\def\B{\MathBold{}} - -\def\al{\alpha} -\def\be{\beta} -\def\ga{\gamma} -\def\de{\delta} -\def\ep{\epsilon} -\def\vep{\varepsilon} -\def\et{\eta} -\def\la{\lambda} -\def\om{\omega} -\def\ph{\phi} -\def\vph{\varphi} -\def\rh{\rho} -\def\vrh{\varrho} -\def\ps{\psi} -\def\vpi{\varpi} -\def\ze{\zeta} -\def\io{\iota} -\def\ka{\kappa} -\def\ta{\tau} -\def\si{\sigma} - -\def\GA{\Gamma} -\def\DE{\Delta} -\def\LA{\Lambda} -\def\PS{\Psi} -\def\PH{\Phi} -\def\OM{\Omega} -\def\XI{\Xi} -\def\SI{\Sigma} - - -\def\BI#1{\hbox{\boldmath{$#1$}}} - -\def\Bal{\BI{\al}} -\def\Bbe{\BI{\be}} -\def\Bga{\BI{\ga}} -\def\Bde{\BI{\de}} -\def\Bep{\BI{\ep}} -\def\Bvep{\BI{\vep}} -\def\Bph{\BI{\ph}} -\def\Bvph{\BI{\vph}} -\def\Bga{\BI{\ga}} -\def\Bet{\BI{\et}} -\def\Bio{\BI{\io}} -\def\Bka{\BI{\ka}} -\def\Bla{\BI{\la}} -\def\Bmu{\BI{\mu}} -\def\Bnu{\BI{\nu}} -\def\Bom{\BI{\om}} -\def\Bpi{\BI{\pi}} -\def\Brh{\BI{\rh}} -\def\Bvrh{\BI{\vrh}} -\def\Bsi{\BI{\si}} -\def\Bta{\BI{\ta}} -\def\Bom{\BI{\om}} -\def\Bxi{\BI{\xi}} -\def\Bze{\BI{\ze}} - -\def\BGA{\BI\Gamma} -\def\BDE{\BI\Delta} -\def\BLA{\BI\Lambda} -\def\BPS{\BI\Psi} -\def\BPH{\BI\Phi} -\def\BOM{\BI\Omega} -\def\BXI{\BI\Xi} -\def\BSI{\BI\Sigma} - -\def\diff#1#2{\frac{d#1}{d#2}} -\def\ddiff#1#2{\frac{d^2#1}{d#2^2}} -\def\pdiff#1#2{\frac{\partial#1}{\partial#2}} -\def\pddiff#1#2{\frac{\partial^2#1}{\partial#2^2}} -\def\ppdiff#1#2#3{\frac{\partial^2#1}{\partial#2\,\partial#3}} - -\def\B#1{\MathBold#1} - -\def\Bone{\MathBold{1}} -\def\Btwo{\MathBold{2}} -\def\Bthree{\MathBold{3}} -\def\Bfour{\MathBold{4}} -\def\Bfive{\MathBold{5}} -\def\Bsix{\MathBold{6}} -\def\Bseven{\MathBold{7}} -\def\Beight{\MathBold{8}} -\def\Bnine{\MathBold{9}} -\def\Bzero{\MathBold{0}} - -\def\Bnabla{\BI{\nabla}} - -\def\vectorform#1{\ensuremath{\left\{#1\right\}}} -\def\matrixform#1{\ensuremath{\left[#1\right]}} - -\long\def\putinvector#1{\vectorform{\begin{array}{c}#1\end{array}}} -\long\def\putinmatrix#1{\matrixform{\begin{array}{ccc}#1\end{array}}} - -\def\REF#1{(\ref{#1})} - -\def\R{\mathbb{R}} -\def\N{\mathbb{N}} diff --git a/examples/opensees/velocity.input b/examples/opensees/velocity.input deleted file mode 100644 index 2d682bf..0000000 --- a/examples/opensees/velocity.input +++ /dev/null @@ -1,7998 +0,0 @@ -0.0000000000 --0.0000161757 --0.0000485153 --0.0000808320 --0.0001131265 --0.0001453999 --0.0001776531 --0.0002098862 --0.0002420983 --0.0002742892 --0.0003064605 --0.0003386168 --0.0003707611 --0.0004028916 --0.0004350039 --0.0004670890 --0.0004991363 --0.0005311601 --0.0005631963 --0.0005952525 --0.0006272994 --0.0006593158 --0.0006913311 --0.0007234181 --0.0007556164 --0.0007878817 --0.0008201309 --0.0008522577 --0.0008841746 --0.0009158507 --0.0009473774 --0.0009790176 --0.0010109211 --0.0010429220 --0.0010747942 --0.0011065244 --0.0011382479 --0.0011700401 --0.0012017394 --0.0012328562 --0.0012632516 --0.0012939210 --0.0013260719 --0.0013597536 --0.0013940006 --0.0014277679 --0.0014602098 --0.0014908409 --0.0015199265 --0.0015484713 --0.0015780452 --0.0016102319 --0.0016453161 --0.0016817428 --0.0017177683 --0.0017526039 --0.0017853816 --0.0018154853 --0.0018440466 --0.0018728473 --0.0019022749 --0.0019310705 --0.0019576169 --0.0019819036 --0.0020056016 --0.0020303834 --0.0020576764 --0.0020882710 --0.0021208789 --0.0021531782 --0.0021844001 --0.0022154692 --0.0022472374 --0.0022795536 --0.0023118764 --0.0023439971 --0.0023759616 --0.0024079247 --0.0024400346 --0.0024721671 --0.0025041260 --0.0025359563 --0.0025683407 --0.0026044530 --0.0026477617 --0.0026961770 --0.0027438016 --0.0027854225 --0.0028191847 --0.0028491080 --0.0028813249 --0.0029208710 --0.0029727897 --0.0030377850 --0.0031117732 --0.0031919906 --0.0032756709 --0.0033546776 --0.0034183381 --0.0034636223 --0.0034949271 --0.0035166610 --0.0035360967 --0.0035660352 --0.0036138045 --0.0036719024 --0.0037263912 --0.0037667983 --0.0037867794 --0.0037867054 --0.0037817677 --0.0037967728 --0.0038454589 --0.0039215169 --0.0040068515 --0.0040876513 --0.0041629947 --0.0042353258 --0.0043019146 --0.0043594653 --0.0044050499 --0.0044400185 --0.0044773914 --0.0045303608 --0.0045937122 --0.0046458363 --0.0046761592 --0.0046979183 --0.0047236582 --0.0047447148 --0.0047496434 --0.0047447177 --0.0047421740 --0.0047448918 --0.0047521998 --0.0047707468 --0.0048081839 --0.0048699249 --0.0049567394 --0.0050509990 --0.0051289802 --0.0051873130 --0.0052358675 --0.0052832555 --0.0053411087 --0.0054149874 --0.0055008885 --0.0055998989 --0.0057044570 --0.0057847766 --0.0058114669 --0.0057709056 --0.0056671649 --0.0055327309 --0.0054219259 --0.0053884217 --0.0054645139 --0.0056408002 --0.0058697915 --0.0060855418 --0.0062296714 --0.0062788634 --0.0062409476 --0.0061459392 --0.0060442615 --0.0059854915 --0.0059909868 --0.0060481310 --0.0061271289 --0.0061975508 --0.0062419846 --0.0062666783 --0.0062920992 --0.0063273256 --0.0063524729 --0.0063330002 --0.0062691331 --0.0062178544 --0.0062503945 --0.0064008882 --0.0066441690 --0.0069134602 --0.0071456150 --0.0073093105 --0.0073892611 --0.0073517460 --0.0071599933 --0.0068301658 --0.0064530903 --0.0061557222 --0.0060256127 --0.0060700091 --0.0062346024 --0.0064587259 --0.0067124126 --0.0069833451 --0.0072615452 --0.0075267016 --0.0077499811 --0.0079062044 --0.0079849901 --0.0080174343 --0.0080721941 --0.0082156773 --0.0084748792 --0.0087979978 --0.0090621785 --0.0091591901 --0.0090706865 --0.0088570432 --0.0086128207 --0.0084355084 --0.0083830093 --0.0084656017 --0.0086811773 --0.0090107451 --0.0094024703 --0.0098006097 --0.0101714651 --0.0104952937 --0.0107385615 --0.0108555046 --0.0108248631 --0.0106614466 --0.0104256227 --0.0102414916 --0.0102353032 --0.0104373910 --0.0107753443 --0.0111319407 --0.0114115431 --0.0115897011 --0.0116944604 --0.0117439192 --0.0117269054 --0.0116259979 --0.0114389251 --0.0111876902 --0.0108972592 --0.0105873367 --0.0102986854 --0.0100937892 --0.0100203052 --0.0100865736 --0.0102543805 --0.0104414938 --0.0105423916 --0.0104788870 --0.0102523091 --0.0099614990 --0.0097713134 --0.0098105227 --0.0100882026 --0.0105163077 --0.0109802015 --0.0113649416 --0.0115804516 --0.0116203613 --0.0115458832 --0.0114093200 --0.0112497704 --0.0111252720 --0.0110874518 --0.0111270631 --0.0111744685 --0.0111407662 --0.0109547049 --0.0106007740 --0.0101213898 --0.0095718813 --0.0089705949 --0.0083129638 --0.0076183907 --0.0069298349 --0.0063264651 --0.0059343211 --0.0058719236 --0.0061505420 --0.0066359995 --0.0071179331 --0.0074249260 --0.0074983540 --0.0073813495 --0.0072017004 --0.0071244925 --0.0072583859 --0.0076383204 --0.0082532114 --0.0090441395 --0.0099138913 --0.0107450752 --0.0114347149 --0.0119323399 --0.0122513768 --0.0124496036 --0.0125842300 --0.0126697192 --0.0126738592 --0.0125850049 --0.0124730317 --0.0124439080 --0.0125616578 --0.0127921215 --0.0129895567 --0.0130016950 --0.0127995946 --0.0125030009 --0.0123308609 --0.0124889267 --0.0130467630 --0.0139279047 --0.0149803713 --0.0160272249 --0.0168802401 --0.0173743486 --0.0174625442 --0.0172959638 --0.0171910705 --0.0174429044 --0.0181298498 --0.0190898983 --0.0200144749 --0.0205844166 --0.0206105720 --0.0201212891 --0.0193236098 --0.0184580327 --0.0176864707 --0.0170334655 --0.0164446652 --0.0159475489 --0.0156614035 --0.0156495749 --0.0158428851 --0.0160804023 --0.0162054677 --0.0161688868 --0.0160413572 --0.0158936178 --0.0156748592 --0.0152515550 --0.0145592403 --0.0137199911 --0.0130197360 --0.0127095920 --0.0128314207 --0.0132989158 --0.0140514722 --0.0150833228 --0.0163994544 --0.0179302921 --0.0194971626 --0.0208589000 --0.0217988689 --0.0222119767 --0.0221709637 --0.0218830590 --0.0215157944 --0.0211184560 --0.0206714140 --0.0201274340 --0.0194473939 --0.0186092102 --0.0175898224 --0.0164090505 --0.0152389114 --0.0143934838 --0.0141275764 --0.0144647880 --0.0151386478 --0.0157162840 --0.0158943035 --0.0157058007 --0.0154537230 --0.0154284418 --0.0156888534 --0.0160755850 --0.0163898117 --0.0165589577 --0.0166623022 --0.0168436661 --0.0172125312 --0.0178022825 --0.0185998764 --0.0195512919 --0.0205116145 --0.0212623572 --0.0215904573 --0.0214020042 --0.0208306296 --0.0201974324 --0.0198348506 --0.0199115549 --0.0204004708 --0.0211876199 --0.0221243948 --0.0230011019 --0.0235685706 --0.0236685452 --0.0233648653 --0.0229122484 --0.0225921963 --0.0225738242 --0.0228652010 --0.0233390653 --0.0238099570 --0.0240893529 --0.0240401577 --0.0236763346 --0.0231204757 --0.0224403355 --0.0216048443 --0.0205588675 --0.0193274496 --0.0180271486 --0.0167623989 --0.0155825212 --0.0145345379 --0.0136838738 --0.0131146988 --0.0128880781 --0.0129261140 --0.0130205750 --0.0130057134 --0.0129059645 --0.0129259313 --0.0132755017 --0.0139852396 --0.0148648731 --0.0155885742 --0.0158874836 --0.0157496536 --0.0154685314 --0.0155054916 --0.0162032371 --0.0175817184 --0.0194058708 --0.0213437661 --0.0230875182 --0.0244615745 --0.0254350772 --0.0260307815 --0.0262615248 --0.0261575677 --0.0257995102 --0.0252801375 --0.0246381998 --0.0238753660 --0.0230568334 --0.0223328018 --0.0218231643 --0.0215604554 --0.0215263451 --0.0216793757 --0.0219677584 --0.0222936691 --0.0225230532 --0.0225903276 --0.0225820664 --0.0227051099 --0.0231395237 --0.0239083254 --0.0248023513 --0.0254262556 --0.0254591906 --0.0248681125 --0.0238639716 --0.0227955268 --0.0219865871 --0.0215257942 --0.0212759793 --0.0210192608 --0.0205623743 --0.0197979780 --0.0187081966 --0.0173876976 --0.0160731797 --0.0150373170 --0.0144285353 --0.0142227682 --0.0142531442 --0.0142846311 --0.0141417587 --0.0138013249 --0.0133607530 --0.0129285744 --0.0125679474 --0.0122800333 --0.0120059212 --0.0116954037 --0.0113606995 --0.0110686705 --0.0109278265 --0.0110258422 --0.0113271503 --0.0116577243 --0.0118386771 --0.0118615603 --0.0119262222 --0.0123221800 --0.0132827730 --0.0148688939 --0.0168995959 --0.0190285856 --0.0209278316 --0.0224123601 --0.0234616908 --0.0242120581 --0.0249168949 --0.0258128697 --0.0270028978 --0.0285052190 --0.0303292218 --0.0324037583 --0.0344735396 --0.0361822385 --0.0372946272 --0.0378027842 --0.0378492863 --0.0376446399 --0.0373843722 --0.0371223177 --0.0367914753 --0.0363703655 --0.0359738185 --0.0357856457 --0.0359060037 --0.0362586649 --0.0366373873 --0.0368606920 --0.0369512225 --0.0371276782 --0.0375455483 --0.0380929336 --0.0385055280 --0.0386689244 --0.0387606961 --0.0390885638 --0.0398160990 --0.0408530464 --0.0419343210 --0.0427922329 --0.0433353348 --0.0436680105 --0.0439615985 --0.0443367445 --0.0448283135 --0.0454197180 --0.0461019000 --0.0468728726 --0.0476683147 --0.0483244326 --0.0486144445 --0.0483470299 --0.0474650222 --0.0460955123 --0.0445329937 --0.0431014408 --0.0419688286 --0.0410908576 --0.0403141101 --0.0395656631 --0.0389929099 --0.0388549138 --0.0392629390 --0.0401070687 --0.0411676413 --0.0422416344 --0.0432221190 --0.0440967047 --0.0449209250 --0.0457519439 --0.0465151496 --0.0469757373 --0.0468791641 --0.0461353800 --0.0448950743 --0.0434277276 --0.0419937171 --0.0408132247 --0.0400218619 --0.0396201968 --0.0395288870 --0.0397149131 --0.0402200519 --0.0410786244 --0.0422422054 --0.0436010955 --0.0450264558 --0.0463534741 --0.0473580312 --0.0478578766 --0.0478861406 --0.0476875692 --0.0475273214 --0.0475127420 --0.0475877589 --0.0476331212 --0.0475644076 --0.0474080024 --0.0472578831 --0.0471411855 --0.0469888363 --0.0467657073 --0.0465590468 --0.0464795727 --0.0464839876 --0.0463279405 --0.0457179857 --0.0445215953 --0.0428384387 --0.0408972594 --0.0389548492 --0.0372152294 --0.0357259158 --0.0343755665 --0.0330268074 --0.0316354304 --0.0302544050 --0.0289858525 --0.0279564235 --0.0272600628 --0.0268519499 --0.0265664723 --0.0262497568 --0.0257942671 --0.0250727936 --0.0238992185 --0.0220814826 --0.0195696421 --0.0165538366 --0.0133961142 --0.0104753651 --0.0080262021 --0.0060424565 --0.0043241441 --0.0026021322 --0.0006617413 -0.0015574639 -0.0039331393 -0.0062258041 -0.0082115747 -0.0097765496 -0.0109174521 -0.0116745926 -0.0120619295 -0.0121257094 -0.0120277683 -0.0119766666 -0.0120887191 -0.0123356193 -0.0125941060 -0.0127205493 -0.0126485163 -0.0124269436 -0.0121330640 -0.0117682007 -0.0112693744 -0.0106011777 -0.0098000702 -0.0089700954 -0.0082383757 -0.0076894272 -0.0073549228 -0.0072330125 -0.0073241745 -0.0077005871 -0.0085252546 -0.0099853338 -0.0121607062 -0.0149212404 -0.0179897383 -0.0211299705 -0.0242984138 -0.0276186440 -0.0312062421 -0.0350232911 -0.0388990932 -0.0426578875 -0.0461691203 -0.0493284623 -0.0520392732 -0.0542414682 -0.0560050344 -0.0575620761 -0.0592412504 -0.0613655667 -0.0641641042 -0.0677478941 -0.0721044923 -0.0771009635 -0.0825341639 -0.0881812007 -0.0938632375 -0.0994968931 -0.1050606100 -0.1105705600 -0.1161014710 -0.1217662800 -0.1276450730 -0.1337307630 -0.1399187470 -0.1460426840 -0.1519428770 -0.1574899720 -0.1625999810 -0.1672813170 -0.1715807040 -0.1754950130 -0.1790138650 -0.1821725500 -0.1850279820 -0.1876346580 -0.1900741200 -0.1924716380 -0.1949502720 -0.1975726690 -0.2003184470 -0.2030879940 -0.2057242050 -0.2081055700 -0.2102042100 -0.2120203020 -0.2135189920 -0.2146208640 -0.2152043160 -0.2150998140 -0.2141170220 -0.2121421170 -0.2091717000 -0.2053487710 -0.2010389780 -0.1967150960 -0.1927557170 -0.1893667530 -0.1866151020 -0.1844815690 -0.1828365420 -0.1814280570 -0.1800019030 -0.1784251310 -0.1766807910 -0.1747992770 -0.1728319210 -0.1708677020 -0.1690224410 -0.1674001490 -0.1660614940 -0.1650101530 -0.1642520430 -0.1638693580 -0.1639811680 -0.1646369350 -0.1657729590 -0.1672653240 -0.1690214270 -0.1710353960 -0.1733812680 -0.1761770730 -0.1795291930 -0.1835124810 -0.1882055340 -0.1936557420 -0.1998082280 -0.2065443080 -0.2137574910 -0.2213622290 -0.2293067390 -0.2375574290 -0.2460174790 -0.2545361700 -0.2630016400 -0.2713722590 -0.2796588360 -0.2879178420 -0.2962327540 -0.3046336740 -0.3130198900 -0.3211505540 -0.3287014810 -0.3353287660 -0.3407228820 -0.3446432870 -0.3469028010 -0.3474712500 -0.3465571380 -0.3444572880 -0.3414336870 -0.3377154840 -0.3334938180 -0.3288806820 -0.3239070510 -0.3185699830 -0.3128635990 -0.3067703080 -0.3002282940 -0.2931685380 -0.2855657270 -0.2774053360 -0.2686330060 -0.2591884450 -0.2490311090 -0.2380666560 -0.2261453570 -0.2131018530 -0.1987696980 -0.1831153700 -0.1663146440 -0.1486973040 -0.1306695850 -0.1126382150 -0.0950432781 -0.0782976681 -0.0625511890 -0.0476247053 -0.0331803851 -0.0189005591 -0.0045860520 --0.0097995067 --0.0241071541 --0.0380115128 --0.0510680915 --0.0627749124 --0.0725520125 --0.0797899919 --0.0841902100 --0.0861509009 --0.0866753044 --0.0867570174 --0.0869161768 --0.0873044550 --0.0879770477 --0.0889401422 --0.0901400265 --0.0915232802 --0.0930939388 --0.0949573359 --0.0972909486 --0.1002327610 --0.1038086490 --0.1079364250 --0.1124116680 --0.1169262030 --0.1211920800 --0.1250520180 --0.1284628420 --0.1314358750 --0.1340202280 --0.1362416340 --0.1380198890 --0.1391560580 --0.1394337750 --0.1387867870 --0.1372758580 --0.1349411480 --0.1317585980 --0.1276094240 --0.1223471360 --0.1158945780 --0.1082258640 --0.0993689191 --0.0894548544 --0.0787225670 --0.0674464592 --0.0558916463 --0.0442973053 --0.0328552738 --0.0217605007 --0.0112506159 --0.0015990360 -0.0069147936 -0.0141558744 -0.0201776919 -0.0250846017 -0.0289549484 -0.0318167091 -0.0336430961 -0.0343221632 -0.0336639831 -0.0315405936 -0.0279550163 -0.0229956596 -0.0167955596 -0.0095161961 -0.0013384968 --0.0075306277 --0.0169194285 --0.0267919670 --0.0372062959 --0.0481895330 --0.0596853515 --0.0715764393 --0.0837022566 --0.0959213719 --0.1081487640 --0.1202947950 --0.1322024640 --0.1436091520 --0.1541602810 --0.1635132730 --0.1713568650 --0.1773866940 --0.1813815690 --0.1831966790 --0.1828575830 --0.1807183860 --0.1773228040 --0.1731594690 --0.1685100680 --0.1634329040 --0.1578509980 --0.1516828020 --0.1449510000 --0.1377923710 --0.1303794870 --0.1228115260 --0.1151262560 --0.1074017150 --0.0997720305 --0.0923388815 --0.0851188188 --0.0780570894 --0.0710629989 --0.0640593371 --0.0569940870 --0.0497887221 --0.0422839649 --0.0343130463 --0.0258368400 --0.0169360155 --0.0076791852 -0.0019477604 -0.0119818438 -0.0223962438 -0.0331095504 -0.0440715170 -0.0552950514 -0.0668036185 -0.0785678769 -0.0904498102 -0.1022023640 -0.1135390870 -0.1241924600 -0.1339200980 -0.1424942360 -0.1496524560 -0.1550774130 -0.1585357330 -0.1599134460 -0.1591164810 -0.1560584450 -0.1509262600 -0.1443811690 -0.1371879570 -0.1297676990 -0.1221834200 -0.1143747540 -0.1063021950 -0.0979654683 -0.0894078840 -0.0806922606 -0.0718424724 -0.0628537558 -0.0537488207 -0.0445587196 -0.0352593088 -0.0257690091 -0.0160154032 -0.0060207083 --0.0040684394 --0.0140596972 --0.0237944497 --0.0331184434 --0.0418695105 --0.0499753270 --0.0575230495 --0.0647185392 --0.0718132214 --0.0791005405 --0.0868557840 --0.0951197916 --0.1036352290 --0.1120600930 --0.1201479880 --0.1277260860 --0.1345758600 --0.1404174530 --0.1450973680 --0.1487300410 --0.1515630980 --0.1537035290 --0.1550052620 --0.1552619110 --0.1544339270 --0.1526633220 --0.1501453130 --0.1469682850 --0.1430673230 --0.1383238800 --0.1327060180 --0.1263107780 --0.1192508410 --0.1115902410 --0.1033560140 --0.0945201904 --0.0850123048 --0.0747487140 --0.0636732600 --0.0517812994 --0.0391423148 --0.0259322939 --0.0123905042 -0.0012417959 -0.0147478698 -0.0279516954 -0.0406674587 -0.0526885164 -0.0638111429 -0.0738518090 -0.0827593877 -0.0906414827 -0.0976828461 -0.1040602750 -0.1098472380 -0.1149715740 -0.1192192190 -0.1223266580 -0.1242170690 -0.1251186490 -0.1253859260 -0.1252456850 -0.1247318990 -0.1238460120 -0.1227535040 -0.1217767930 -0.1211831470 -0.1210376360 -0.1212573370 -0.1217469880 -0.1224931810 -0.1235567480 -0.1249808520 -0.1267595570 -0.1288899550 -0.1313921520 -0.1342906890 -0.1375793400 -0.1411864390 -0.1449857250 -0.1488146750 -0.1525134990 -0.1559939700 -0.1592210510 -0.1621593040 -0.1648004270 -0.1672106650 -0.1694808820 -0.1716102220 -0.1734657900 -0.1748974820 -0.1758875740 -0.1765401190 -0.1769902640 -0.1774002910 -0.1780013840 -0.1790041860 -0.1804682870 -0.1823697860 -0.1847072400 -0.1874577980 -0.1904756610 -0.1934880230 -0.1962021630 -0.1983660490 -0.1997420210 -0.2000853810 -0.1992461630 -0.1973132090 -0.1945146590 -0.1910163840 -0.1869207500 -0.1823358790 -0.1773709490 -0.1720988920 -0.1665604410 -0.1607917800 -0.1548201600 -0.1486802930 -0.1424337460 -0.1361287150 -0.1297398590 -0.1231778100 -0.1163781050 -0.1093520050 -0.1021373830 -0.0947311260 -0.0870922114 -0.0791941684 -0.0710226033 -0.0625563164 -0.0537902549 -0.0447153183 -0.0352911178 -0.0254784613 -0.0152603806 -0.0046339658 --0.0063955637 --0.0178099061 --0.0295842923 --0.0417291835 --0.0542666521 --0.0671821572 --0.0804485639 --0.0940303991 --0.1078657950 --0.1218742440 --0.1359599640 --0.1499974090 --0.1638313680 --0.1773326340 --0.1904472540 --0.2031621250 --0.2154945120 --0.2275383040 --0.2394232400 --0.2511994260 --0.2627904030 --0.2739915390 --0.2844324320 --0.2936614880 --0.3013434530 --0.3072775850 --0.3113819770 --0.3137135810 --0.3143898320 --0.3136172290 --0.3117148730 --0.3089316270 --0.3053155580 --0.3007965700 --0.2953160260 --0.2888328050 --0.2813450400 --0.2729456820 --0.2637599520 --0.2538383090 --0.2431218320 --0.2315494580 --0.2191906080 --0.2063047950 --0.1932107300 --0.1801172810 --0.1671707500 --0.1545332880 --0.1423792080 --0.1308211520 --0.1198666600 --0.1095201610 --0.0999169013 --0.0913691579 --0.0842624601 --0.0788334075 --0.0750861492 --0.0729132243 --0.0721594170 --0.0725837199 --0.0738672481 --0.0756657058 --0.0776321502 --0.0794336978 --0.0808242530 --0.0817021693 --0.0820732991 --0.0819710127 --0.0814156213 --0.0804491338 --0.0791758776 --0.0777186410 --0.0761730414 --0.0746326574 --0.0731892360 --0.0718682836 --0.0706039382 --0.0692928548 --0.0678117393 --0.0659811523 --0.0635886793 --0.0604742238 --0.0566428817 --0.0523456797 --0.0480540906 --0.0443166618 --0.0415721291 --0.0400857739 --0.0400292027 --0.0414971195 --0.0443436722 --0.0481359344 --0.0524161780 --0.0569608434 --0.0617632594 --0.0668358938 --0.0720851435 --0.0773366462 --0.0824090747 --0.0871244562 --0.0912670389 --0.0946219076 --0.0970915616 --0.0988166479 --0.1001686640 --0.1015501720 --0.1032461140 --0.1054223820 --0.1081583370 --0.1115311110 --0.1156450420 --0.1205392210 --0.1261904360 --0.1325040550 --0.1392239490 --0.1460107390 --0.1525995630 --0.1588311170 --0.1645551660 --0.1695311350 --0.1734910850 --0.1762530510 --0.1777398070 --0.1779512500 --0.1769188420 --0.1747298440 --0.1715569260 --0.1675831380 --0.1629267760 --0.1576447800 --0.1517996440 --0.1455371070 --0.1390831870 --0.1326286830 --0.1262466400 --0.1199341430 --0.1136877390 --0.1075407660 --0.1015499890 --0.0957472155 --0.0901071341 --0.0845586320 --0.0790178208 --0.0734028297 --0.0676263525 --0.0616526046 --0.0555862281 --0.0496666277 --0.0441413233 --0.0391600742 --0.0348171899 --0.0312292860 --0.0285100711 --0.0266564628 --0.0255129228 --0.0249237785 --0.0248482585 --0.0253306644 --0.0263781750 --0.0278671833 --0.0296251992 --0.0315056079 --0.0333488926 --0.0349398305 --0.0360286764 --0.0363977821 --0.0359337582 --0.0346336512 --0.0325905156 --0.0300152471 --0.0271576705 --0.0241773101 --0.0211255601 --0.0179718518 --0.0146153319 --0.0109401282 --0.0069079113 --0.0025689379 -0.0019932111 -0.0066656515 -0.0113281818 -0.0158946925 -0.0202907950 -0.0244101595 -0.0281186356 -0.0313286873 -0.0340189995 -0.0362129344 -0.0380004622 -0.0394970715 -0.0408117799 -0.0420683113 -0.0433949542 -0.0449224356 -0.0467633269 -0.0489671893 -0.0514949956 -0.0542207853 -0.0569416975 -0.0594002065 -0.0613773828 -0.0627753997 -0.0635991527 -0.0639133741 -0.0638242290 -0.0634618680 -0.0629858700 -0.0626133214 -0.0625430587 -0.0628270193 -0.0634126477 -0.0642217664 -0.0651158941 -0.0658834608 -0.0662941362 -0.0661716673 -0.0654244634 -0.0640733519 -0.0622715462 -0.0602637474 -0.0583430130 -0.0567914026 -0.0557893542 -0.0553744820 -0.0554904589 -0.0560758582 -0.0570579329 -0.0582891892 -0.0595753274 -0.0607646723 -0.0618118127 -0.0627533408 -0.0636105793 -0.0642991625 -0.0646750991 -0.0647159261 -0.0646083737 -0.0645953628 -0.0647528891 -0.0649621262 -0.0650588222 -0.0649325079 -0.0645130873 -0.0637492860 -0.0626079553 -0.0610598670 -0.0591064975 -0.0568289268 -0.0543527129 -0.0517594382 -0.0490613581 -0.0462569600 -0.0433734661 -0.0404299920 -0.0373731035 -0.0340997964 -0.0305582356 -0.0267994898 -0.0229066274 -0.0189186364 -0.0148973375 -0.0109947728 -0.0073844271 -0.0041397457 -0.0012143855 --0.0014622695 --0.0039403063 --0.0062501627 --0.0084197236 --0.0105074430 --0.0125621921 --0.0145704249 --0.0164788159 --0.0182316337 --0.0198017879 --0.0211795862 --0.0223107585 --0.0231063578 --0.0235057317 --0.0235056952 --0.0231547788 --0.0224957043 --0.0215618724 --0.0204332525 --0.0192185618 --0.0180066193 --0.0168262754 --0.0156536308 --0.0144873465 --0.0133815607 --0.0124194459 --0.0116899388 --0.0112830095 --0.0113051178 --0.0118675507 --0.0130685189 --0.0149385456 --0.0173614344 --0.0201052877 --0.0229091538 --0.0255524307 --0.0279136707 --0.0299699406 --0.0317313983 --0.0332119588 --0.0344163255 --0.0353230116 --0.0359227429 --0.0362596988 --0.0363955203 --0.0363354467 --0.0360492789 --0.0355470507 --0.0348955677 --0.0341849632 --0.0334902530 --0.0328423948 --0.0322460011 --0.0317264933 --0.0312817323 --0.0308204876 --0.0302110491 --0.0293813051 --0.0283715479 --0.0272758832 --0.0261583699 --0.0250252455 --0.0238503652 --0.0226131477 --0.0212882674 --0.0198493881 --0.0183034161 --0.0167138373 --0.0151761585 --0.0137377750 --0.0123801578 --0.0110914473 --0.0099175006 --0.0089585882 --0.0083099704 --0.0080107519 --0.0081073583 --0.0086844470 --0.0098128423 --0.0115169123 --0.0137502329 --0.0164530040 --0.0196313797 --0.0233241789 --0.0275123682 --0.0321053843 --0.0370296578 --0.0422364839 --0.0476428214 --0.0531464409 --0.0586643511 --0.0641334021 --0.0694832827 --0.0746159779 --0.0794343307 --0.0838609770 --0.0877915238 --0.0910799811 --0.0935656153 --0.0951216478 --0.0957314367 --0.0955486268 --0.0949094831 --0.0942177919 --0.0937607567 --0.0936367542 --0.0938399572 --0.0943282174 --0.0949835029 --0.0956298663 --0.0961317403 --0.0964547034 --0.0966688355 --0.0968959660 --0.0972298154 --0.0977116272 --0.0983631739 --0.0992139834 --0.1003039530 --0.1016408840 --0.1031633720 --0.1047734450 --0.1063567690 --0.1077608000 --0.1087922360 --0.1092519040 --0.1090196970 --0.1080822930 --0.1064773620 --0.1042999740 --0.1016882740 --0.0987457969 --0.0955443385 --0.0921560338 --0.0886258624 --0.0849588922 --0.0811741156 --0.0773300647 --0.0734950764 --0.0697398920 --0.0661299636 --0.0627342428 --0.0596272502 --0.0568699264 --0.0545177821 --0.0525881469 --0.0510416515 --0.0498154596 --0.0488294100 --0.0479718358 --0.0471247921 --0.0462062441 --0.0451928014 --0.0441075051 --0.0429587575 --0.0417401717 --0.0404972700 --0.0393183817 --0.0382841574 --0.0374912003 --0.0370692212 --0.0371237898 --0.0376697162 --0.0386550629 --0.0400044567 --0.0415963869 --0.0432889009 --0.0449552552 --0.0464745372 --0.0477448156 --0.0487055967 --0.0493385334 --0.0496464426 --0.0496369405 --0.0493297435 --0.0487664911 --0.0479927413 --0.0469735291 --0.0455698944 --0.0436854782 --0.0413642836 --0.0386985211 --0.0357357221 --0.0325257684 --0.0291619622 --0.0257476924 --0.0223666407 --0.0190548198 --0.0157784207 --0.0124563844 --0.0090343059 --0.0055244144 --0.0019609531 -0.0016531563 -0.0053510070 -0.0091613279 -0.0130727522 -0.0170611172 -0.0210931081 -0.0250644760 -0.0288077908 -0.0321781295 -0.0350834675 -0.0374819394 -0.0393737601 -0.0408030044 -0.0418813595 -0.0427366865 -0.0434592083 -0.0441188632 -0.0447868083 -0.0455331773 -0.0464133587 -0.0474796252 -0.0487916978 -0.0503847104 -0.0522470246 -0.0543224332 -0.0565353518 -0.0588015683 -0.0610270770 -0.0631683073 -0.0652319782 -0.0671895489 -0.0689640708 -0.0705145507 -0.0718612138 -0.0729961110 -0.0738450020 -0.0743224122 -0.0743794654 -0.0740320355 -0.0733334721 -0.0722893051 -0.0708760477 -0.0691360668 -0.0671448213 -0.0649230289 -0.0624520000 -0.0597115184 -0.0566815247 -0.0533376818 -0.0497060940 -0.0459269764 -0.0421750178 -0.0385743739 -0.0352424468 -0.0323022067 -0.0298262779 -0.0278088816 -0.0261859850 -0.0248807986 -0.0238100634 -0.0228588715 -0.0219214129 -0.0209561336 -0.0199588956 -0.0189314590 -0.0178881616 -0.0168343233 -0.0157560961 -0.0146736072 -0.0136767495 -0.0128752370 -0.0123256352 -0.0120154855 -0.0118831500 -0.0118326923 -0.0117341682 -0.0114582300 -0.0109411798 -0.0102076777 -0.0093264847 -0.0083420566 -0.0072811987 -0.0061841055 -0.0050637090 -0.0038814320 -0.0025805186 -0.0011103311 --0.0005529336 --0.0023553020 --0.0041328242 --0.0056878355 --0.0068522651 --0.0074724892 --0.0074759538 --0.0069170781 --0.0058858069 --0.0044496117 --0.0026884139 --0.0006817146 -0.0015215969 -0.0038987946 -0.0064756637 -0.0093016370 -0.0123918124 -0.0157184713 -0.0192310226 -0.0228608663 -0.0265103680 -0.0300499704 -0.0333550934 -0.0363533073 -0.0390074918 -0.0413161211 -0.0432984927 -0.0449272626 -0.0461253050 -0.0468003876 -0.0468766307 -0.0463100870 -0.0450852499 -0.0432517017 -0.0409329806 -0.0382630165 -0.0353562828 -0.0323160337 -0.0292035381 -0.0260057494 -0.0226803965 -0.0192201225 -0.0156405420 -0.0119537488 -0.0081930574 -0.0044145250 -0.0006517169 --0.0030916928 --0.0068017120 --0.0104631270 --0.0140972337 --0.0177389459 --0.0213933148 --0.0250255173 --0.0285738317 --0.0319844677 --0.0352406682 --0.0383275727 --0.0411947831 --0.0438201229 --0.0462650914 --0.0486158726 --0.0509139708 --0.0531657162 --0.0553846791 --0.0575981459 --0.0598351203 --0.0621095156 --0.0644258929 --0.0668147678 --0.0693085984 --0.0718955586 --0.0745357628 --0.0771773166 --0.0797637771 --0.0822694706 --0.0847066158 --0.0870904013 --0.0894143938 --0.0916748286 --0.0939078324 --0.0961458325 --0.0983705400 --0.1005412710 --0.1026153770 --0.1045252920 --0.1061819070 --0.1074884590 --0.1083515880 --0.1087018700 --0.1085158810 --0.1078290250 --0.1067283140 --0.1053271670 --0.1036991370 --0.1018357330 --0.0996872312 --0.0972165899 --0.0944027764 --0.0912621063 --0.0878557414 --0.0842525406 --0.0805271519 --0.0767826974 --0.0731168944 --0.0695831926 --0.0662120473 --0.0630194760 --0.0599966948 --0.0571332474 --0.0544393945 --0.0519219882 --0.0495377827 --0.0472316629 --0.0450174000 --0.0429624842 --0.0411587843 --0.0397186216 --0.0387352796 --0.0382522048 --0.0382708664 --0.0387556718 --0.0396176099 --0.0407328533 --0.0419762066 --0.0432315742 --0.0444128791 --0.0454780823 --0.0464201790 --0.0472428402 --0.0479416749 --0.0485088812 --0.0489561043 --0.0493212247 --0.0496485347 --0.0499693739 --0.0502925812 --0.0506074098 --0.0508913731 --0.0511396261 --0.0513941159 --0.0516997432 --0.0520633733 --0.0524808731 --0.0529579338 --0.0534950392 --0.0540532376 --0.0545553895 --0.0549164543 --0.0550455985 --0.0548259899 --0.0541316038 --0.0529159739 --0.0512662786 --0.0493260336 --0.0471710353 --0.0447992460 --0.0422184054 --0.0394734522 --0.0366046855 --0.0336324051 --0.0305595619 --0.0273926803 --0.0241755495 --0.0209621635 --0.0177669463 --0.0145829821 --0.0114481403 --0.0084327256 --0.0055646708 --0.0028447211 --0.0002789614 -0.0021394629 -0.0044247178 -0.0065895253 -0.0086570780 -0.0106547688 -0.0126180209 -0.0146255709 -0.0167486302 -0.0189629573 -0.0211955316 -0.0234018019 -0.0255557923 -0.0276158299 -0.0295165029 -0.0312196711 -0.0327575227 -0.0341928020 -0.0355775367 -0.0369588093 -0.0383582405 -0.0397318460 -0.0409902331 -0.0420289939 -0.0427389182 -0.0430286095 -0.0428516234 -0.0422547387 -0.0413793179 -0.0403715621 -0.0393161517 -0.0382403059 -0.0371445775 -0.0360417927 -0.0349592491 -0.0339028851 -0.0328683796 -0.0318783267 -0.0309848956 -0.0302683040 -0.0297881725 -0.0295368445 -0.0294671645 -0.0295240746 -0.0296462814 -0.0297626415 -0.0298367845 -0.0298923684 -0.0299503178 -0.0299929502 -0.0299905096 -0.0299115406 -0.0297049580 -0.0293094931 -0.0287096380 -0.0279554162 -0.0271232403 -0.0262791461 -0.0254757402 -0.0247632697 -0.0241905076 -0.0238036315 -0.0236242877 -0.0236589034 -0.0239254753 -0.0244120007 -0.0250807301 -0.0259220260 -0.0269255194 -0.0280200536 -0.0290951460 -0.0300526534 -0.0308285553 -0.0314121466 -0.0318513764 -0.0322148912 -0.0325425736 -0.0328457015 -0.0331220553 -0.0333318888 -0.0333978253 -0.0332698570 -0.0329443162 -0.0324430306 -0.0318389319 -0.0312411222 -0.0307329244 -0.0303711483 -0.0302000144 -0.0302321243 -0.0304588558 -0.0308778667 -0.0315093802 -0.0323726245 -0.0334668167 -0.0347796743 -0.0362725321 -0.0379225257 -0.0397615187 -0.0418058517 -0.0440169299 -0.0463361477 -0.0487080385 -0.0511037362 -0.0535286184 -0.0559854282 -0.0584600606 -0.0609644414 -0.0635271578 -0.0661011142 -0.0685650732 -0.0708299438 -0.0728681187 -0.0746657431 -0.0762001774 -0.0774287074 -0.0782936723 -0.0787452436 -0.0787488022 -0.0782769196 -0.0773095098 -0.0758622741 -0.0740250769 -0.0719546825 -0.0698041106 -0.0676992745 -0.0657377817 -0.0639750175 -0.0624457011 -0.0611741811 -0.0601703528 -0.0594282871 -0.0589036465 -0.0584986622 -0.0580862937 -0.0575510986 -0.0568210587 -0.0558981936 -0.0548405538 -0.0536820900 -0.0524092450 -0.0510112058 -0.0495054954 -0.0479254786 -0.0462820290 -0.0445601325 -0.0427727940 -0.0409630003 -0.0391926490 -0.0375336602 -0.0360645017 -0.0348527498 -0.0338826005 -0.0330759479 -0.0323683441 -0.0316996461 -0.0309999617 -0.0302281999 -0.0293805815 -0.0284532934 -0.0274418306 -0.0263656768 -0.0252657582 -0.0241923839 -0.0232240228 -0.0224791864 -0.0220796406 -0.0221240784 -0.0226818309 -0.0237896043 -0.0254706867 -0.0277245197 -0.0305136234 -0.0337972141 -0.0375098137 -0.0415443039 -0.0457946987 -0.0501807227 -0.0546438440 -0.0591143273 -0.0634999171 -0.0677237976 -0.0717173786 -0.0754032090 -0.0787629053 -0.0818375016 -0.0846542228 -0.0872183465 -0.0894880777 -0.0913842822 -0.0928852457 -0.0940382344 -0.0948777527 -0.0953810858 -0.0955188184 -0.0953099340 -0.0947800815 -0.0939092319 -0.0926697606 -0.0910590678 -0.0890954159 -0.0868102637 -0.0842230127 -0.0813665734 -0.0782970002 -0.0750654271 -0.0717164522 -0.0682908820 -0.0648124277 -0.0612469673 -0.0575036739 -0.0535299943 -0.0493754833 -0.0451123538 -0.0407485299 -0.0362454172 -0.0315686697 -0.0267045750 -0.0216679727 -0.0164931089 -0.0112094453 -0.0058581819 -0.0004944371 --0.0048498022 --0.0101543712 --0.0153693491 --0.0204140762 --0.0252012080 --0.0296521231 --0.0337194447 --0.0373758330 --0.0405829356 --0.0433158783 --0.0455968777 --0.0474763871 --0.0490038366 --0.0502453793 --0.0512935776 --0.0522320693 --0.0531203042 --0.0539963286 --0.0548694548 --0.0557315143 --0.0565795603 --0.0574229464 --0.0582717124 --0.0591165338 --0.0599111249 --0.0605726607 --0.0610063376 --0.0611550252 --0.0610238439 --0.0606576669 --0.0601273456 --0.0595303304 --0.0589775276 --0.0585502164 --0.0582769223 --0.0581688060 --0.0582330417 --0.0584525084 --0.0588022880 --0.0592777127 --0.0598775235 --0.0605624057 --0.0612512986 --0.0618585035 --0.0622978994 --0.0624750231 --0.0623159578 --0.0617790455 --0.0608568593 --0.0595661301 --0.0579192976 --0.0559399325 --0.0536862881 --0.0512222711 --0.0485868742 --0.0458121762 --0.0429274849 --0.0399432311 --0.0368697071 --0.0337378438 --0.0305746721 --0.0273705230 --0.0241077035 --0.0207997939 --0.0175079482 --0.0143315301 --0.0113514284 --0.0086101250 --0.0061543604 --0.0040749321 --0.0024861970 --0.0014632526 --0.0010400838 --0.0012289887 --0.0019713972 --0.0030928477 --0.0043619783 --0.0056021410 --0.0067324787 --0.0077293267 --0.0086104814 --0.0094638458 --0.0103943203 --0.0114268294 --0.0125191431 --0.0136548135 --0.0148886166 --0.0162724513 --0.0177836877 --0.0193392776 --0.0208541802 --0.0223153728 --0.0237741323 --0.0252744078 --0.0268222576 --0.0284001586 --0.0299861842 --0.0315377723 --0.0329760239 --0.0342240268 --0.0352535504 --0.0360814325 --0.0367293515 --0.0372001992 --0.0374888177 --0.0376087636 --0.0375761936 --0.0373812367 --0.0370189259 --0.0365098695 --0.0358711673 --0.0351001670 --0.0341991258 --0.0331881828 --0.0320810363 --0.0308736513 --0.0295580608 --0.0281455994 --0.0266751347 --0.0251951239 --0.0237406256 --0.0223024936 --0.0208214007 --0.0192428683 --0.0175374306 --0.0156683434 --0.0136124428 --0.0113797370 --0.0089767920 --0.0064157292 --0.0037474091 --0.0010212048 -0.0017590013 -0.0045941335 -0.0074345478 -0.0102002879 -0.0128067839 -0.0151848011 -0.0173021086 -0.0191124331 -0.0205207487 -0.0214450152 -0.0218620845 -0.0217676704 -0.0211980963 -0.0202622156 -0.0190714799 -0.0177166436 -0.0162714859 -0.0147666682 -0.0132062201 -0.0116003164 -0.0099899015 -0.0084437379 -0.0070305313 -0.0058356258 -0.0049759413 -0.0045376254 -0.0045051187 -0.0047735138 -0.0052379284 -0.0058563825 -0.0066175127 -0.0075052097 -0.0084951150 -0.0095598602 -0.0106790184 -0.0118290786 -0.0129916638 -0.0141761684 -0.0154037592 -0.0166921206 -0.0180651612 -0.0195555381 -0.0211738800 -0.0228727296 -0.0245766086 -0.0262297227 -0.0277993832 -0.0292695167 -0.0306052648 -0.0317480725 -0.0326818028 -0.0334269962 -0.0339661961 -0.0342475664 -0.0342538849 -0.0340144837 -0.0335566369 -0.0328914503 -0.0320374390 -0.0310299229 -0.0299071843 -0.0286894965 -0.0273857739 -0.0260082713 -0.0245823248 -0.0231598604 -0.0218013680 -0.0205320781 -0.0193389255 -0.0182154723 -0.0171566427 -0.0161253496 -0.0150841474 -0.0140352499 -0.0130105511 -0.0120133362 -0.0110009896 -0.0099371603 -0.0088284229 -0.0077161732 -0.0066475063 -0.0056598842 -0.0047760209 -0.0039901966 -0.0032663205 -0.0025494865 -0.0017712189 -0.0008912278 --0.0000650461 --0.0010318173 --0.0019464943 --0.0027762477 --0.0035118026 --0.0041543035 --0.0047039453 --0.0051696489 --0.0056120868 --0.0061375769 --0.0068197561 --0.0076540081 --0.0086036902 --0.0096590534 --0.0108227740 --0.0120458219 --0.0132249252 --0.0142734471 --0.0151622480 --0.0158872814 --0.0164411727 --0.0168294245 --0.0170809762 --0.0172404953 --0.0173511758 --0.0174328596 --0.0174790122 --0.0174801537 --0.0174389073 --0.0173619515 --0.0172411946 --0.0170663510 --0.0168484695 --0.0166028092 --0.0163412571 --0.0160654919 --0.0157596358 --0.0154232919 --0.0150819298 --0.0147548511 --0.0144502678 --0.0141733954 --0.0139133111 --0.0136497858 --0.0133746780 --0.0130752321 --0.0126936019 --0.0121491444 --0.0113898133 --0.0103902009 --0.0091623867 --0.0077568727 --0.0062242784 --0.0046200833 --0.0030065113 --0.0014234429 -0.0001291324 -0.0016808156 -0.0032549700 -0.0048605331 -0.0064946523 -0.0081259804 -0.0096685520 -0.0109929947 -0.0119793206 -0.0125112388 -0.0125160278 -0.0120563414 -0.0112922104 -0.0103766518 -0.0094075353 -0.0084354627 -0.0075013876 -0.0066398236 -0.0058456804 -0.0050778849 -0.0042938518 -0.0034568927 -0.0025144562 -0.0014058400 -0.0000834404 --0.0014657499 --0.0032111144 --0.0051048215 --0.0071026724 --0.0091541471 --0.0112043271 --0.0132204252 --0.0152018991 --0.0171409709 --0.0189724204 --0.0206012967 --0.0219752973 --0.0230908011 --0.0239508097 --0.0245378696 --0.0248101141 --0.0247447420 --0.0243738964 --0.0237425754 --0.0228586140 --0.0217258040 --0.0203860030 --0.0188740137 --0.0172099966 --0.0154374522 --0.0135821419 --0.0116222920 --0.0095099518 --0.0072127735 --0.0047483099 --0.0021439034 -0.0005910007 -0.0034282349 -0.0063165772 -0.0092311018 -0.0122118740 -0.0153280803 -0.0186097411 -0.0220547657 -0.0256776178 -0.0294715040 -0.0333645607 -0.0372722670 -0.0411428115 -0.0449514268 -0.0486716447 -0.0522464721 -0.0555975984 -0.0586641508 -0.0613999610 -0.0637527337 -0.0656936857 -0.0672554350 -0.0685194702 -0.0695621920 -0.0704174799 -0.0710907790 -0.0715866241 -0.0719376928 -0.0721979227 -0.0723756608 -0.0724142171 -0.0722360671 -0.0717880903 -0.0710381829 -0.0699703971 -0.0686042025 -0.0669995894 -0.0652260283 -0.0633139142 -0.0612872406 -0.0592170178 -0.0571922289 -0.0552815581 -0.0535489106 -0.0520442538 -0.0507715001 -0.0496782504 -0.0486527486 -0.0475521096 -0.0462767190 -0.0448304121 -0.0432839753 -0.0416912515 -0.0400519979 -0.0383497081 -0.0366285454 -0.0349935050 -0.0335413634 -0.0323338387 -0.0313965826 -0.0307255565 -0.0303127119 -0.0301583866 -0.0302551081 -0.0305739319 -0.0310742369 -0.0317201737 -0.0325012496 -0.0334541365 -0.0346350227 -0.0360706947 -0.0377587965 -0.0396573955 -0.0416745026 -0.0437146067 -0.0457150941 -0.0476321564 -0.0494303553 -0.0510875734 -0.0525653562 -0.0538059415 -0.0547835214 -0.0554968465 -0.0559498346 -0.0561622919 -0.0561650746 -0.0559720856 -0.0555869770 -0.0550394223 -0.0543603758 -0.0535562422 -0.0526354584 -0.0516263712 -0.0505520782 -0.0494134217 -0.0482108251 -0.0469718034 -0.0457432737 -0.0445750548 -0.0435151930 -0.0426103125 -0.0419277361 -0.0415380581 -0.0414412596 -0.0415659718 -0.0418477273 -0.0422525395 -0.0427261189 -0.0431535068 -0.0433923568 -0.0433649852 -0.0430894782 -0.0425960648 -0.0418778971 -0.0409268482 -0.0397729755 -0.0384852196 -0.0371291144 -0.0357365887 -0.0343241391 -0.0329179626 -0.0315446028 -0.0302211954 -0.0289485857 -0.0277255248 -0.0265591405 -0.0254332366 -0.0243293500 -0.0232731944 -0.0223163370 -0.0214783451 -0.0207260076 -0.0200224111 -0.0193644748 -0.0187526320 -0.0181662569 -0.0176033174 -0.0170983543 -0.0166781812 -0.0163306687 -0.0160131106 -0.0156869068 -0.0153471956 -0.0150111343 -0.0146883899 -0.0143724107 -0.0140581914 -0.0137681275 -0.0135364597 -0.0133651007 -0.0132377192 -0.0131502214 -0.0130831255 -0.0129915040 -0.0128506157 -0.0126700940 -0.0124646759 -0.0122335389 -0.0119580138 -0.0115949051 -0.0110887890 -0.0104031793 -0.0095232821 -0.0084560305 -0.0072214343 -0.0058169038 -0.0042228709 -0.0024288445 -0.0004303414 --0.0017500321 --0.0040557339 --0.0064365179 --0.0088770667 --0.0113737192 --0.0139030143 --0.0164489844 --0.0190192723 --0.0215998575 --0.0241473756 --0.0266086606 --0.0289213844 --0.0310109999 --0.0327627257 --0.0340390012 --0.0347575483 --0.0349063185 --0.0344963305 --0.0335798321 --0.0322866189 --0.0307563134 --0.0290464897 --0.0271501459 --0.0250704876 --0.0228357007 --0.0204688959 --0.0179764208 --0.0153709858 --0.0126860675 --0.0099722691 --0.0073085378 --0.0047870022 --0.0024698609 --0.0003938005 -0.0013950796 -0.0028449107 -0.0039331578 -0.0047182557 -0.0053375736 -0.0059274195 -0.0065640770 -0.0072767582 -0.0081141147 -0.0091379181 -0.0103554000 -0.0117351008 -0.0132366293 -0.0147947994 -0.0163388128 -0.0178103070 -0.0191422832 -0.0202837437 -0.0212325165 -0.0220081399 -0.0226722862 -0.0233596401 -0.0241922142 -0.0251908359 -0.0263087665 -0.0275074947 -0.0287741262 -0.0300967761 -0.0314233726 -0.0326589867 -0.0337386746 -0.0346692603 -0.0354918860 -0.0362456096 -0.0369742807 -0.0377238459 -0.0385113797 -0.0393082524 -0.0400527784 -0.0406886718 -0.0411860856 -0.0415161350 -0.0416523618 -0.0416160137 -0.0414701403 -0.0412807713 -0.0410940629 -0.0409397694 -0.0408671729 -0.0409642740 -0.0413017981 -0.0418696866 -0.0426063793 -0.0434769092 -0.0444764724 -0.0455729002 -0.0466840594 -0.0477011379 -0.0485449690 -0.0491866659 -0.0496442209 -0.0499662050 -0.0501773014 -0.0502610987 -0.0501958166 -0.0499806567 -0.0496273049 -0.0491422764 -0.0485128814 -0.0476964984 -0.0466443888 -0.0453392708 -0.0438041172 -0.0420913502 -0.0402683724 -0.0383938575 -0.0365092190 -0.0346638805 -0.0329192118 -0.0313154747 -0.0298678562 -0.0285923737 -0.0275105396 -0.0266602741 -0.0260842104 -0.0257922521 -0.0257566913 -0.0259223009 -0.0262186852 -0.0265659184 -0.0268805142 -0.0270804806 -0.0270856510 -0.0268527209 -0.0263932245 -0.0257389846 -0.0249200685 -0.0239752081 -0.0229479855 -0.0218580205 -0.0206994560 -0.0194767678 -0.0182125626 -0.0169234964 -0.0156212032 -0.0143135278 -0.0129826299 -0.0115935066 -0.0101464047 -0.0086893366 -0.0072772513 -0.0059428156 -0.0047052997 -0.0035870420 -0.0025968484 -0.0016932516 -0.0008011444 --0.0001171582 --0.0010490589 --0.0019871201 --0.0029407367 --0.0038998290 --0.0048198879 --0.0056325383 --0.0062764949 --0.0067298485 --0.0069801794 --0.0069864910 --0.0067183555 --0.0062051828 --0.0055192760 --0.0047145772 --0.0038134635 --0.0028382779 --0.0018178462 --0.0007747562 -0.0002655947 -0.0012753056 -0.0022262449 -0.0030753686 -0.0037845858 -0.0043380713 -0.0047031422 -0.0048224434 -0.0046970159 -0.0043959706 -0.0039724877 -0.0034517271 -0.0028644080 -0.0022504276 -0.0016379756 -0.0010413893 -0.0004968603 -0.0000677190 --0.0001768651 --0.0001953843 --0.0000285682 -0.0002001341 -0.0003466973 -0.0003022152 -0.0000054182 --0.0005882579 --0.0015230133 --0.0028091339 --0.0044003997 --0.0062402206 --0.0082930918 --0.0105190696 --0.0128796477 --0.0153453877 --0.0178715616 --0.0204074490 --0.0229294696 --0.0254277092 --0.0278825542 --0.0302890110 --0.0326576261 --0.0349831771 --0.0372583652 --0.0394903281 --0.0416963201 --0.0439041157 --0.0461435785 --0.0484189285 --0.0507016447 --0.0529625419 --0.0551745700 --0.0572810125 --0.0591937745 --0.0608534905 --0.0622572467 --0.0634150331 --0.0643417421 --0.0650924429 --0.0657494090 --0.0663740600 --0.0669934051 --0.0675883064 --0.0681090733 --0.0685242575 --0.0688046497 --0.0688822148 --0.0687030004 --0.0682903747 --0.0676671348 --0.0668072824 --0.0657286460 --0.0644932949 --0.0631291078 --0.0616520471 --0.0601070444 --0.0585476831 --0.0569994132 --0.0554646129 --0.0539506034 --0.0524676437 --0.0510191255 --0.0495941102 --0.0481892387 --0.0468493980 --0.0456612297 --0.0447241633 --0.0441310818 --0.0439421529 --0.0441732791 --0.0447753900 --0.0456284087 --0.0466103382 --0.0476504771 --0.0487332019 --0.0498666239 --0.0510332021 --0.0521809533 --0.0532627536 --0.0542788081 --0.0552412964 --0.0561323147 --0.0569377248 --0.0576717106 --0.0583685927 --0.0590632762 --0.0597676771 --0.0604727559 --0.0611637069 --0.0618164221 --0.0623967941 --0.0628753607 --0.0632451871 --0.0635086603 --0.0636512293 --0.0636602476 --0.0635515999 --0.0633416433 --0.0630139888 --0.0625310070 --0.0618307286 --0.0608382586 --0.0595307068 --0.0579649359 --0.0562327696 --0.0543975188 --0.0524680722 --0.0504148424 --0.0482068146 --0.0458433548 --0.0433534103 --0.0407870274 --0.0382010330 --0.0356348950 --0.0331124907 --0.0306854049 --0.0284543163 --0.0265172999 --0.0249330476 --0.0237462728 --0.0230051458 --0.0227293852 --0.0228968254 --0.0234404572 --0.0242450774 --0.0252125495 --0.0262738624 --0.0273232485 --0.0282476817 --0.0289999667 --0.0295924235 --0.0300541973 --0.0304006985 --0.0306559219 --0.0308902032 --0.0311719168 --0.0315072552 --0.0318661238 --0.0322384364 --0.0326565124 --0.0331631047 --0.0337831015 --0.0345308708 --0.0354087337 --0.0363896983 --0.0374122975 --0.0384010527 --0.0392888286 --0.0400123858 --0.0404944878 --0.0406742385 --0.0405373031 --0.0400942535 --0.0393911696 --0.0384944094 --0.0374458296 --0.0362811347 --0.0350435622 --0.0337784456 --0.0325436272 --0.0314048236 --0.0304044019 --0.0295564275 --0.0288850684 --0.0284058053 --0.0280961220 --0.0279373519 --0.0278993142 --0.0279156424 --0.0279455272 --0.0279929808 --0.0280713778 --0.0281992853 --0.0283974378 --0.0286709482 --0.0290111127 --0.0294114659 --0.0298663382 --0.0303614162 --0.0308871475 --0.0314487207 --0.0320525075 --0.0326955141 --0.0333709724 --0.0340645541 --0.0347439617 --0.0353578524 --0.0358628872 --0.0362676299 --0.0366245107 --0.0369817168 --0.0373395204 --0.0376573235 --0.0378935544 --0.0380123170 --0.0379894552 --0.0378275222 --0.0375517336 --0.0371690329 --0.0366419326 --0.0359275667 --0.0350057044 --0.0338605103 --0.0324645351 --0.0307971825 --0.0288749406 --0.0267324143 --0.0243985329 --0.0219141902 --0.0193463405 --0.0167646651 --0.0141922518 --0.0115955056 --0.0089402725 --0.0062273772 --0.0034663610 --0.0006671109 -0.0021655490 -0.0050506525 -0.0080214521 -0.0111092881 -0.0143333991 -0.0176960827 -0.0211919433 -0.0248187073 -0.0285736579 -0.0324354740 -0.0363703291 -0.0403567323 -0.0443707429 -0.0483680607 -0.0523187999 -0.0562185515 -0.0600520992 -0.0637806579 -0.0673682759 -0.0708012595 -0.0740826649 -0.0772278191 -0.0802363444 -0.0830824423 -0.0857546915 -0.0882709849 -0.0906387263 -0.0928477151 -0.0948803123 -0.0967096987 -0.0983464634 -0.0998180478 -0.1011098640 -0.1022029630 -0.1030999560 -0.1038116970 -0.1043641200 -0.1047788800 -0.1050493180 -0.1051467280 -0.1050271280 -0.1046550830 -0.1040157360 -0.1030943520 -0.1018828110 -0.1003794200 -0.0985759454 -0.0964649073 -0.0940505326 -0.0913590389 -0.0884504547 -0.0853959409 -0.0822272591 -0.0789540158 -0.0756338129 -0.0723570549 -0.0691492881 -0.0659562456 -0.0627305535 -0.0594809298 -0.0562390810 -0.0530160924 -0.0498057801 -0.0466210502 -0.0435021753 -0.0404879306 -0.0375858131 -0.0347887927 -0.0321158616 -0.0296073019 -0.0272835960 -0.0251357073 -0.0231444618 -0.0212928170 -0.0195807100 -0.0180169566 -0.0166003159 -0.0153213058 -0.0141566990 -0.0130493872 -0.0119293158 -0.0107620986 -0.0095672893 -0.0083845303 -0.0072243776 -0.0060593589 -0.0048527513 -0.0035923610 -0.0022790814 -0.0008924063 --0.0006094990 --0.0022584002 --0.0040768157 --0.0060914112 --0.0082912382 --0.0106282455 --0.0130784356 --0.0156443168 --0.0182984484 --0.0209595113 --0.0235316858 --0.0259557497 --0.0282032346 --0.0302569714 --0.0321130662 --0.0337779794 --0.0352807113 --0.0366687837 --0.0379697442 --0.0391941577 --0.0403892914 --0.0416181232 --0.0428846773 --0.0441461580 --0.0453768330 --0.0465675986 --0.0476902190 --0.0487276844 --0.0496930162 --0.0506084679 --0.0515069535 --0.0524135226 --0.0533271557 --0.0542344758 --0.0551267042 --0.0559905440 --0.0568034906 --0.0575674852 --0.0583179766 --0.0590822606 --0.0598563618 --0.0606245100 --0.0613880659 --0.0621737516 --0.0629973388 --0.0638421126 --0.0647058809 --0.0656230755 --0.0666174710 --0.0676612450 --0.0687017656 --0.0697006578 --0.0706247835 --0.0714566998 --0.0722039829 --0.0728590159 --0.0733982716 --0.0738203046 --0.0741314159 --0.0743184406 --0.0743735120 --0.0743244041 --0.0742196863 --0.0740892666 --0.0739203886 --0.0736792527 --0.0733623692 --0.0730134894 --0.0726788114 --0.0723516688 --0.0719770306 --0.0715125077 --0.0709748760 --0.0704106310 --0.0698268468 --0.0691964434 --0.0685124749 --0.0677794440 --0.0669888145 --0.0661432413 --0.0652761794 --0.0644226932 --0.0636037261 --0.0628552348 --0.0622289439 --0.0617502329 --0.0613910913 --0.0610852890 --0.0607765017 --0.0604562050 --0.0601451329 --0.0598362205 --0.0594697584 --0.0589899392 --0.0584072681 --0.0577691008 --0.0571138523 --0.0564774054 --0.0558784449 --0.0552996260 --0.0547297412 --0.0541779225 --0.0536242724 --0.0530170831 --0.0523156948 --0.0514664257 --0.0503858062 --0.0490405299 --0.0474721838 --0.0457131968 --0.0437639896 --0.0416449904 --0.0394099659 --0.0371091782 --0.0347534257 --0.0323257226 --0.0298211981 --0.0272730352 --0.0247279090 --0.0222066443 --0.0197126656 --0.0172473637 --0.0148195677 --0.0124515027 --0.0101528629 --0.0079018063 --0.0056817891 --0.0034997254 --0.0013357865 -0.0008572182 -0.0031190816 -0.0054853738 -0.0079751111 -0.0105735713 -0.0132516438 -0.0159721873 -0.0186959152 -0.0214094620 -0.0241065205 -0.0267385222 -0.0292371867 -0.0315793266 -0.0337847971 -0.0358653092 -0.0378058008 -0.0395943808 -0.0412518098 -0.0428353249 -0.0443976711 -0.0459320125 -0.0474045158 -0.0488273197 -0.0502353558 -0.0516300569 -0.0530020133 -0.0543617880 -0.0557119124 -0.0570216327 -0.0582658428 -0.0594571115 -0.0606056465 -0.0616951109 -0.0627113929 -0.0636742416 -0.0646408133 -0.0656553838 -0.0666995086 -0.0677152466 -0.0686726132 -0.0695961042 -0.0704976965 -0.0713295507 -0.0720256152 -0.0725485483 -0.0728901863 -0.0730216579 -0.0728972379 -0.0725046214 -0.0718601272 -0.0710055171 -0.0700007469 -0.0688800593 -0.0676514977 -0.0663337200 -0.0649713206 -0.0636279586 -0.0623641514 -0.0612429823 -0.0603314137 -0.0596653603 -0.0592315822 -0.0589998884 -0.0589713852 -0.0591464377 -0.0594791101 -0.0598997848 -0.0603424254 -0.0607578406 -0.0611340479 -0.0614849135 -0.0618241336 -0.0621628030 -0.0625046260 -0.0628451795 -0.0631801413 -0.0635027789 -0.0637980677 -0.0640557365 -0.0642679127 -0.0644097135 -0.0644406807 -0.0643299740 -0.0640742220 -0.0636601040 -0.0630423772 -0.0622182043 -0.0612584995 -0.0602247631 -0.0591242802 -0.0579551003 -0.0567240112 -0.0554384366 -0.0541121534 -0.0527437541 -0.0513226329 -0.0498558699 -0.0483462335 -0.0467879039 -0.0451974263 -0.0435922479 -0.0419673705 -0.0403358669 -0.0387343284 -0.0371825719 -0.0356854654 -0.0342499270 -0.0328816493 -0.0315814189 -0.0303503874 -0.0292041756 -0.0281646416 -0.0272254030 -0.0263551575 -0.0255332698 -0.0247554134 -0.0240358443 -0.0233848571 -0.0227651525 -0.0221067895 -0.0213453580 -0.0204472584 -0.0194121765 -0.0182461725 -0.0169485654 -0.0155250487 -0.0140136410 -0.0124724717 -0.0109510994 -0.0094872748 -0.0081004428 -0.0068083262 -0.0056331049 -0.0045735841 -0.0036185196 -0.0027803705 -0.0020837718 -0.0015342547 -0.0010972621 -0.0007154420 -0.0003448092 --0.0000297372 --0.0004100254 --0.0008173045 --0.0012869968 --0.0018351496 --0.0024534566 --0.0031229976 --0.0038246776 --0.0045534804 --0.0053089219 --0.0060882794 --0.0068979152 --0.0077334082 --0.0085726971 --0.0094034506 --0.0102427490 --0.0111199149 --0.0120320447 --0.0129589386 --0.0139280746 --0.0149985369 --0.0161815504 --0.0174375910 --0.0187398857 --0.0200830329 --0.0214369162 --0.0227568587 --0.0240272403 --0.0252505218 --0.0264357523 --0.0276080047 --0.0287910066 --0.0299969836 --0.0312304677 --0.0324786589 --0.0337216395 --0.0349552251 --0.0361851793 --0.0373968304 --0.0385523818 --0.0396204596 --0.0405685091 --0.0413534584 --0.0419374837 --0.0423098141 --0.0424735191 --0.0424090215 --0.0421120327 --0.0416060349 --0.0409132992 --0.0400663513 --0.0391147476 --0.0381165243 --0.0371211368 --0.0361621639 --0.0352612618 --0.0344317219 --0.0336968248 --0.0330904615 --0.0326297675 --0.0323089552 --0.0321191783 --0.0320605377 --0.0321467675 --0.0323913317 --0.0327544967 --0.0331663502 --0.0336029972 --0.0340694523 --0.0345564364 --0.0350463660 --0.0355237662 --0.0359713098 --0.0363698066 --0.0366657434 --0.0367626442 --0.0365983616 --0.0361728191 --0.0354797794 --0.0344999894 --0.0332746789 --0.0318830170 --0.0303749918 --0.0287888026 --0.0271712073 --0.0255421445 --0.0238809021 --0.0221797065 --0.0204660209 --0.0187648365 --0.0170878026 --0.0154680016 --0.0139692820 --0.0126371086 --0.0114661765 --0.0104526121 --0.0096212389 --0.0089689371 --0.0084576795 --0.0080645294 --0.0077811473 --0.0075696087 --0.0073549392 --0.0070725069 --0.0067079892 --0.0062819935 --0.0058203054 --0.0053305722 --0.0047933725 --0.0042026608 --0.0035905086 --0.0029891835 --0.0023997800 --0.0018101878 --0.0012303159 --0.0006839764 --0.0001768471 -0.0003203699 -0.0008467295 -0.0014012767 -0.0019498193 -0.0024559694 -0.0028983076 -0.0032930370 -0.0036897621 -0.0041319274 -0.0046234415 -0.0051500755 -0.0057269983 -0.0063968820 -0.0071843116 -0.0080871917 -0.0091096205 -0.0102641211 -0.0115568413 -0.0129865727 -0.0145512531 -0.0162458001 -0.0180469946 -0.0199014544 -0.0217131935 -0.0233799982 -0.0248712256 -0.0262077085 -0.0273809025 -0.0283640253 -0.0291498280 -0.0297462035 -0.0301783084 -0.0304829259 -0.0306963261 -0.0308408910 -0.0309166380 -0.0309240534 -0.0308912466 -0.0308479594 -0.0307966968 -0.0307421904 -0.0306960152 -0.0306415446 -0.0305337296 -0.0303275316 -0.0299814218 -0.0294505324 -0.0286976759 -0.0277170801 -0.0265562934 -0.0252736066 -0.0238879931 -0.0224035184 -0.0208350464 -0.0192058642 -0.0175267061 -0.0157832314 -0.0139839754 -0.0121738159 -0.0103793396 -0.0085927190 -0.0068140776 -0.0050763186 -0.0034161124 -0.0018700398 -0.0004917024 --0.0006930758 --0.0017171352 --0.0026094597 --0.0033592609 --0.0039884813 --0.0045941104 --0.0052635015 --0.0060203969 --0.0068739256 --0.0078422371 --0.0089023750 --0.0099630274 --0.0109386628 --0.0118202946 --0.0126416332 --0.0134042258 --0.0140790206 --0.0146604287 --0.0151691298 --0.0156188111 --0.0160095261 --0.0163498763 --0.0166541977 --0.0169274818 --0.0171585630 --0.0173088547 --0.0173335972 --0.0171728721 --0.0167412473 --0.0159906809 --0.0149492026 --0.0136594671 --0.0121399732 --0.0104287179 --0.0085759135 --0.0066106209 --0.0045820668 --0.0025987311 --0.0007595405 -0.0009195811 -0.0024571969 -0.0038220124 -0.0049819515 -0.0059741898 -0.0068662397 -0.0077193136 -0.0085633411 -0.0093721002 -0.0101070931 -0.0107665050 -0.0113276339 -0.0117019349 -0.0118235511 -0.0117142100 -0.0114159586 -0.0109242658 -0.0102375875 -0.0094084269 -0.0084909842 -0.0075126794 -0.0065036043 -0.0054908875 -0.0044802472 -0.0034777580 -0.0025149144 -0.0016256547 -0.0008140951 -0.0000536389 --0.0006808255 --0.0013744972 --0.0019919846 --0.0025253007 --0.0030071283 --0.0034821237 --0.0039533001 --0.0043752130 --0.0047080091 --0.0049381104 --0.0050545433 --0.0050554247 --0.0049543409 --0.0047618525 --0.0044877143 --0.0041467338 --0.0037637817 --0.0033900318 --0.0030824843 --0.0028587308 --0.0027043003 --0.0026263533 --0.0026667607 --0.0028538492 --0.0031632973 --0.0035395180 --0.0039414332 --0.0043704649 --0.0048595426 --0.0054093171 --0.0059544700 --0.0064248426 --0.0068208055 --0.0071878667 --0.0075541594 --0.0079293740 --0.0083274391 --0.0087653649 --0.0092624946 --0.0098242598 --0.0104355845 --0.0110959327 --0.0118102925 --0.0125378478 --0.0132039148 --0.0137714222 --0.0142674550 --0.0147408795 --0.0151966444 --0.0155934329 --0.0159093755 --0.0161630119 --0.0163659860 --0.0165164164 --0.0166137134 --0.0166395747 --0.0165541918 --0.0163244641 --0.0159442566 --0.0154242941 --0.0147862769 --0.0140609223 --0.0132950872 --0.0125577524 --0.0118893314 --0.0112913192 --0.0107837718 --0.0103699789 --0.0100142159 --0.0097146007 --0.0094867603 --0.0093004237 --0.0091062035 --0.0088777441 --0.0086180957 --0.0083646574 --0.0081575171 --0.0080027576 --0.0078943801 --0.0078248159 --0.0077682986 --0.0076855440 --0.0075421725 --0.0073212193 --0.0069942709 --0.0064940335 --0.0057808934 --0.0049004158 --0.0039351811 --0.0029429502 --0.0019335794 --0.0009089784 -0.0000930602 -0.0010427262 -0.0019479086 -0.0028259046 -0.0036793016 -0.0045045695 -0.0053204114 -0.0061643943 -0.0070550737 -0.0079832317 -0.0089303506 -0.0098774197 -0.0108116397 -0.0117138010 -0.0125495845 -0.0132789739 -0.0138724697 -0.0143215533 -0.0146268463 -0.0148077164 -0.0149193243 -0.0150099896 -0.0150990988 -0.0152143723 -0.0154092783 -0.0157476149 -0.0162579542 -0.0169153827 -0.0176804693 -0.0185156250 -0.0193654989 -0.0201544059 -0.0208186358 -0.0213388370 -0.0217406627 -0.0220675541 -0.0223318154 -0.0225164361 -0.0226531864 -0.0228184420 -0.0230465225 -0.0233275596 -0.0236602720 -0.0240621797 -0.0245551480 -0.0251381173 -0.0257811236 -0.0264815722 -0.0272728720 -0.0281498702 -0.0290688504 -0.0300314130 -0.0310766632 -0.0322181126 -0.0334236953 -0.0346075708 -0.0356979408 -0.0366890874 -0.0375900893 -0.0384177593 -0.0392018189 -0.0399468328 -0.0406436872 -0.0412915216 -0.0418833304 -0.0424069511 -0.0428575117 -0.0432350762 -0.0435345794 -0.0437394552 -0.0438486225 -0.0439023051 -0.0439375302 -0.0439582015 -0.0439637042 -0.0439619144 -0.0439536524 -0.0439123806 -0.0437883841 -0.0435381738 -0.0431466509 -0.0426208751 -0.0419679388 -0.0411849992 -0.0402647887 -0.0392042542 -0.0380143303 -0.0367272940 -0.0353846351 -0.0340130067 -0.0326118198 -0.0311778738 -0.0297294210 -0.0282981979 -0.0269195400 -0.0256151695 -0.0243819715 -0.0232085534 -0.0221060954 -0.0211164019 -0.0202745434 -0.0195795145 -0.0190140800 -0.0185725833 -0.0182504157 -0.0180076780 -0.0177625172 -0.0174308967 -0.0169816433 -0.0164457728 -0.0158468895 -0.0151503082 -0.0143106695 -0.0133488791 -0.0123406476 -0.0113461864 -0.0103877067 -0.0094799993 -0.0086647793 -0.0080012925 -0.0075387603 -0.0072639821 -0.0070813859 -0.0068806753 -0.0065989997 -0.0062265463 -0.0057902196 -0.0053041140 -0.0047297091 -0.0040443758 -0.0032713078 -0.0024252373 -0.0014966515 -0.0004640493 --0.0006764323 --0.0019035423 --0.0032068321 --0.0045782497 --0.0060008977 --0.0074773156 --0.0090191027 --0.0106137211 --0.0122390645 --0.0138898112 --0.0155804657 --0.0173308085 --0.0191287279 --0.0209422587 --0.0227776428 --0.0246759673 --0.0266426515 --0.0286171210 --0.0305287288 --0.0323350076 --0.0340213091 --0.0356032973 --0.0370982416 --0.0385027974 --0.0398033925 --0.0410004901 --0.0421039461 --0.0431115294 --0.0440388479 --0.0449270646 --0.0457973227 --0.0466487596 --0.0474623649 --0.0481817197 --0.0487628215 --0.0492221305 --0.0495937587 --0.0498816806 --0.0500796459 --0.0502095700 --0.0503107244 --0.0504273540 --0.0506136142 --0.0508915069 --0.0512248735 --0.0515696111 --0.0519083079 --0.0522287110 --0.0525062279 --0.0527307223 --0.0529167366 --0.0530771038 --0.0532045752 --0.0532693854 --0.0532380007 --0.0531167643 --0.0529478978 --0.0527492848 --0.0525093921 --0.0522013350 --0.0517955060 --0.0512947823 --0.0507258284 --0.0500927775 --0.0493648558 --0.0485244568 --0.0475910788 --0.0465814376 --0.0455073534 --0.0443846509 --0.0432148070 --0.0420043727 --0.0407806957 --0.0395778665 --0.0384400455 --0.0374024080 --0.0364552097 --0.0355662852 --0.0347076570 --0.0338349672 --0.0328883016 --0.0318316488 --0.0306782642 --0.0294571806 --0.0281525666 --0.0267313955 --0.0252176677 --0.0236596357 --0.0220707265 --0.0204796277 --0.0189605795 --0.0175767970 --0.0163526316 --0.0152901576 --0.0143982232 --0.0136886767 --0.0131314349 --0.0126619506 --0.0122529363 --0.0119278175 --0.0117019853 --0.0115602276 --0.0115020637 --0.0115741899 --0.0118165218 --0.0122292205 --0.0127985032 --0.0134933266 --0.0142652880 --0.0150677897 --0.0158358766 --0.0164864356 --0.0169756080 --0.0173004068 --0.0174539689 --0.0174349016 --0.0172589191 --0.0169157961 --0.0163969359 --0.0157548879 --0.0150401447 --0.0142507641 --0.0133889829 --0.0124789669 --0.0115248539 --0.0105187458 --0.0094542202 --0.0083124028 --0.0070940288 --0.0058261498 --0.0045196147 --0.0031852234 --0.0018695762 --0.0006309215 -0.0004941834 -0.0014904358 -0.0023526627 -0.0030742971 -0.0036517936 -0.0041087177 -0.0045093180 -0.0049179003 -0.0053643574 -0.0058822299 -0.0065212444 -0.0073063308 -0.0082284792 -0.0092657186 -0.0103907656 -0.0115827250 -0.0128423362 -0.0141675691 -0.0155259105 -0.0168913223 -0.0182781562 -0.0197096422 -0.0211870635 -0.0226861657 -0.0241771513 -0.0256304191 -0.0270042156 -0.0282678186 -0.0293942295 -0.0303453236 -0.0311045363 -0.0316808360 -0.0321159218 -0.0324731221 -0.0327862264 -0.0330686386 -0.0333402415 -0.0336269481 -0.0339435729 -0.0342627754 -0.0345344780 -0.0347194621 -0.0347819539 -0.0346830801 -0.0343942032 -0.0339242516 -0.0333203036 -0.0326409350 -0.0319106134 -0.0311197211 -0.0302881961 -0.0294742336 -0.0287142584 -0.0279987971 -0.0273005823 -0.0266045359 -0.0259278562 -0.0252887948 -0.0246766922 -0.0240839792 -0.0235146404 -0.0229706727 -0.0224825148 -0.0220952065 -0.0218173707 -0.0216426960 -0.0215849207 -0.0216463904 -0.0217820494 -0.0219315904 -0.0220499542 -0.0221077216 -0.0220899238 -0.0219920013 -0.0218334928 -0.0216449445 -0.0214438149 -0.0212379788 -0.0210291637 -0.0208154638 -0.0205845527 -0.0203163487 -0.0200048981 -0.0196597900 -0.0192999188 -0.0189447430 -0.0186087845 -0.0183082978 -0.0180667551 -0.0179118209 -0.0178477456 -0.0178530320 -0.0179125922 -0.0180163277 -0.0181358310 -0.0182138775 -0.0181830979 -0.0180329870 -0.0178080301 -0.0175151431 -0.0171328570 -0.0166751699 -0.0161676174 -0.0156258287 -0.0150775739 -0.0145780958 -0.0141769111 -0.0138656939 -0.0135882954 -0.0133006426 -0.0130171346 -0.0127782870 -0.0126006141 -0.0124848141 -0.0124334501 -0.0124526725 -0.0125518295 -0.0127465568 -0.0130406265 -0.0134181103 -0.0138729742 -0.0143914393 -0.0149291818 -0.0154532487 -0.0159683121 -0.0164804205 -0.0169482854 -0.0173179588 -0.0175806788 -0.0177374657 -0.0177662337 -0.0176510018 -0.0174133718 -0.0171029449 -0.0167445350 -0.0163421497 -0.0159098557 -0.0154499219 -0.0149517828 -0.0144114501 -0.0138347924 -0.0132278159 -0.0125989966 -0.0119653063 -0.0113376138 -0.0107244873 -0.0101400710 -0.0095819533 -0.0090501070 -0.0085742873 -0.0081798152 -0.0078856737 -0.0076970155 -0.0075865650 -0.0075544699 -0.0076210279 -0.0077504489 -0.0078929608 -0.0080610158 -0.0082887996 -0.0085760813 -0.0089160227 -0.0093342666 -0.0098724188 -0.0105263963 -0.0112519269 -0.0120370139 -0.0128973187 -0.0138227056 -0.0147816547 -0.0157454663 -0.0167084239 -0.0176904621 -0.0186936802 -0.0196818078 -0.0206185640 -0.0214800358 -0.0222302369 -0.0228352758 -0.0232763837 -0.0235460319 -0.0236377140 -0.0235647261 -0.0234033304 -0.0232406365 -0.0230823663 -0.0228795581 -0.0226073741 -0.0222781397 -0.0218981203 -0.0214567097 -0.0209443652 -0.0203611042 -0.0197106232 -0.0189907050 -0.0181792565 -0.0172409809 -0.0161839449 -0.0150468722 -0.0138433629 -0.0125685194 -0.0112199565 -0.0098263845 -0.0084517873 -0.0071323148 -0.0058720703 -0.0046965491 -0.0036306509 -0.0026354024 -0.0016479308 -0.0006617369 --0.0002884251 --0.0011839401 --0.0020598527 --0.0029868060 --0.0039955170 --0.0050655426 --0.0061834064 --0.0073588601 --0.0086051098 --0.0099145155 --0.0112610948 --0.0126200209 --0.0139744997 --0.0153060705 --0.0165731019 --0.0177315754 --0.0187584773 --0.0196375008 --0.0203502212 --0.0208746451 --0.0211885974 --0.0212630841 --0.0210829676 --0.0206978194 --0.0202026353 --0.0196647173 --0.0191019387 --0.0185240887 --0.0179737812 --0.0174867878 --0.0170378510 --0.0165985277 --0.0161925062 --0.0158425236 --0.0155178458 --0.0151548981 --0.0147145128 --0.0142113715 --0.0136522314 --0.0130005491 --0.0122520195 --0.0114489816 --0.0106206524 --0.0097897901 --0.0089846242 --0.0082181661 --0.0074786094 --0.0067393593 --0.0059880878 --0.0052420837 --0.0045405096 --0.0039066702 --0.0033126667 --0.0027279648 --0.0021984925 --0.0018099901 --0.0015934089 --0.0015188620 --0.0015405544 --0.0016263069 --0.0017731798 --0.0019720585 --0.0021969905 --0.0024556449 --0.0027716266 --0.0031272831 --0.0034793943 --0.0037987778 --0.0040670400 --0.0042941004 --0.0045320330 --0.0048110225 --0.0050942616 --0.0053409808 --0.0055776868 --0.0058650827 --0.0062447904 --0.0067128559 --0.0072132093 --0.0077065694 --0.0082114389 --0.0087457060 --0.0092759020 --0.0097334305 --0.0100853878 --0.0103549822 --0.0105570963 --0.0106868886 --0.0107642340 --0.0108320045 --0.0109210614 --0.0110638123 --0.0113106780 --0.0116824262 --0.0121590849 --0.0127229442 --0.0133827849 --0.0141613013 --0.0150467486 --0.0160041052 --0.0170079499 --0.0180182756 --0.0189629578 --0.0197716046 --0.0204271725 --0.0209657410 --0.0214415799 --0.0218635574 --0.0221846916 --0.0223917385 --0.0225188545 --0.0225861185 --0.0225691161 --0.0224191441 --0.0221234243 --0.0217238541 --0.0212688988 --0.0207668722 --0.0201881053 --0.0195059613 --0.0187339076 --0.0178996845 --0.0170105717 --0.0160567666 --0.0150476143 --0.0140249611 --0.0130185500 --0.0120454685 --0.0111312303 --0.0102897589 --0.0095272453 --0.0088476097 --0.0082530531 --0.0077660528 --0.0073929445 --0.0070776566 --0.0067620764 --0.0064357589 --0.0060855564 --0.0056791285 --0.0052102177 --0.0046903740 --0.0041173817 --0.0034946239 --0.0028531815 --0.0022391727 --0.0017019175 --0.0013048822 --0.0010879494 --0.0010319554 --0.0011151097 --0.0013403448 --0.0016795991 --0.0020864311 --0.0025389443 --0.0030181615 --0.0035027157 --0.0039846319 --0.0044685452 --0.0049638215 --0.0054918231 --0.0060777140 --0.0067105214 --0.0073590585 --0.0080386589 --0.0087793755 --0.0095565093 --0.0103248888 --0.0110691265 --0.0117878230 --0.0124764308 --0.0131317962 --0.0137437412 --0.0142736331 --0.0146694261 --0.0149295378 --0.0151099528 --0.0152323537 --0.0152530518 --0.0151500899 --0.0149495323 --0.0146598925 --0.0142658700 --0.0137796450 --0.0132295343 --0.0126411270 --0.0120321360 --0.0113955383 --0.0107168053 --0.0099949976 --0.0092505010 --0.0085101620 --0.0077799323 --0.0070364873 --0.0062394216 --0.0053746671 --0.0044801687 --0.0036034655 --0.0027674669 --0.0019831982 --0.0012443113 --0.0005208568 -0.0001966553 -0.0008730526 -0.0014851231 -0.0020647523 -0.0026562838 -0.0032692906 -0.0038965982 -0.0045280727 -0.0051419405 -0.0057241040 -0.0062588459 -0.0067342346 -0.0071724028 -0.0075793280 -0.0079334054 -0.0082481550 -0.0085637193 -0.0089032313 -0.0092885957 -0.0097346480 -0.0102116383 -0.0106713232 -0.0110810618 -0.0114260594 -0.0117067710 -0.0119224762 -0.0120521641 -0.0120801794 -0.0120192154 -0.0118748716 -0.0116372821 -0.0113023211 -0.0108754287 -0.0103747056 -0.0097968110 -0.0091157732 -0.0083399980 -0.0075018136 -0.0066317353 -0.0057584183 -0.0048923369 -0.0040275470 -0.0031771648 -0.0023844141 -0.0016807301 -0.0010603894 -0.0005016209 --0.0000011890 --0.0004364955 --0.0007960883 --0.0010937541 --0.0013442697 --0.0015351604 --0.0016500121 --0.0016994747 --0.0016998572 --0.0016392950 --0.0014927856 --0.0012359623 --0.0008776883 --0.0004816972 --0.0000930943 -0.0003044719 -0.0007187353 -0.0011181688 -0.0014824132 -0.0017950658 -0.0020234746 -0.0021593842 -0.0022244910 -0.0022367637 -0.0022115935 -0.0021725664 -0.0021354461 -0.0020984639 -0.0020536466 -0.0020024160 -0.0019674932 -0.0019867874 -0.0020842700 -0.0022558715 -0.0024877870 -0.0027747728 -0.0031094510 -0.0034766229 -0.0038502166 -0.0041969591 -0.0044962993 -0.0047373442 -0.0049121288 -0.0050179438 -0.0050599743 -0.0050595271 -0.0050494246 -0.0050387382 -0.0049833460 -0.0048354170 -0.0045879824 -0.0042549919 -0.0038612662 -0.0034405057 -0.0030143578 -0.0025607446 -0.0020394999 -0.0014527225 -0.0008271786 -0.0001712277 --0.0004950177 --0.0011300290 --0.0017054808 --0.0022145893 --0.0026691860 --0.0030823082 --0.0034329693 --0.0036873604 --0.0038401676 --0.0038983613 --0.0038716814 --0.0037756196 --0.0036259618 --0.0034583493 --0.0033214361 --0.0032327656 --0.0031889971 --0.0031995134 --0.0032778868 --0.0034151295 --0.0035746868 --0.0037364292 --0.0039208795 --0.0041509324 --0.0044252636 --0.0047196538 --0.0050095859 --0.0053055133 --0.0056343489 --0.0059787866 --0.0062911048 --0.0065626743 --0.0068139080 --0.0070499628 --0.0072697717 --0.0074668063 --0.0076160436 --0.0077058448 --0.0077542657 --0.0077810935 --0.0077955261 --0.0077888928 --0.0077527811 --0.0077186835 --0.0077244172 --0.0077625315 --0.0078137287 --0.0078828791 --0.0079829003 --0.0080955531 --0.0081621757 --0.0081379743 --0.0080249134 --0.0078301073 --0.0075470592 --0.0071896888 --0.0068051831 --0.0064557952 --0.0061746548 --0.0059464545 --0.0057710002 --0.0056957870 --0.0057372573 --0.0058401730 --0.0059524908 --0.0060721281 --0.0062098502 --0.0063717752 --0.0065766153 --0.0068413222 --0.0071536551 --0.0075009181 --0.0078910584 --0.0083177148 --0.0087605389 --0.0092219865 --0.0097115406 --0.0102246534 --0.0107625705 --0.0113260081 --0.0119095685 --0.0125063637 --0.0130816824 --0.0135989478 --0.0140764107 --0.0145480520 --0.0149849224 --0.0153300564 --0.0155887180 --0.0158020562 --0.0159852928 --0.0161211332 --0.0161510607 --0.0160009890 --0.0156498285 --0.0151445397 --0.0145471088 --0.0138914860 --0.0131913701 --0.0124677896 --0.0117581093 --0.0111005612 --0.0105003903 --0.0099353914 --0.0094059863 --0.0089405266 --0.0085592294 --0.0082597663 --0.0080410710 --0.0078999700 --0.0078151289 --0.0077747738 --0.0077776450 --0.0078198064 --0.0078934987 --0.0079802764 --0.0080632832 --0.0081451356 --0.0082509835 --0.0084053008 --0.0086308683 --0.0089721442 --0.0094854619 --0.0102104516 --0.0111314804 --0.0121845528 --0.0133137733 --0.0144962099 --0.0157066126 --0.0168713403 --0.0179042976 --0.0187732552 --0.0194789712 --0.0200122905 --0.0203691975 --0.0205561734 --0.0205797944 --0.0204574999 --0.0202361212 --0.0199755644 --0.0196894159 --0.0193486449 --0.0189373296 --0.0184565677 --0.0179190988 --0.0173470279 --0.0167600035 --0.0161808363 --0.0156333313 --0.0151341330 --0.0147067643 --0.0143728294 --0.0141336231 --0.0139759967 --0.0138716248 --0.0138063107 --0.0137879580 --0.0138044143 --0.0138251862 --0.0138471691 --0.0138878539 --0.0139450181 --0.0140137644 --0.0140965238 --0.0141846247 --0.0142566745 --0.0142919396 --0.0142989596 --0.0143057323 --0.0143116896 --0.0142904529 --0.0142370545 --0.0141597574 --0.0140430265 --0.0138743169 --0.0136795523 --0.0134927329 --0.0133179703 --0.0131377780 --0.0129297134 --0.0126795742 --0.0123885682 --0.0120651373 --0.0117122824 --0.0113308385 --0.0109312904 --0.0105093869 --0.0100361901 --0.0095071007 --0.0089608024 --0.0084310060 --0.0079109510 --0.0073601100 --0.0067402755 --0.0060621280 --0.0053764537 --0.0047143594 --0.0040704920 --0.0034422552 --0.0028412118 --0.0022884739 --0.0018229156 --0.0014655386 --0.0011983691 --0.0010108760 --0.0009114042 --0.0008952829 --0.0009471260 --0.0010541666 --0.0011953928 --0.0013420056 --0.0014736358 --0.0015675708 --0.0015961532 --0.0015493421 --0.0014352711 --0.0012610663 --0.0010156467 --0.0006638756 --0.0001792881 -0.0004152768 -0.0010733373 -0.0017782921 -0.0025379456 -0.0033395934 -0.0041486067 -0.0049373215 -0.0056828421 -0.0063520035 -0.0069235351 -0.0074115915 -0.0078179751 -0.0081273135 -0.0083632904 -0.0085578806 -0.0087144096 -0.0088402731 -0.0089464106 -0.0090142044 -0.0090228670 -0.0089844423 -0.0089200211 -0.0088434706 -0.0087638306 -0.0086714091 -0.0085433318 -0.0083821420 -0.0082199072 -0.0080888742 -0.0080009253 -0.0079480497 -0.0079189100 -0.0078978060 -0.0078552145 -0.0077580090 -0.0076006132 -0.0073909077 -0.0071114722 -0.0067469085 -0.0063213894 -0.0058698500 -0.0054006190 -0.0049166725 -0.0044527822 -0.0040713779 -0.0038097539 -0.0036549507 -0.0035644459 -0.0035010731 -0.0034591121 -0.0034546787 -0.0034940901 -0.0035541370 -0.0036074047 -0.0036499409 -0.0036933757 -0.0037386309 -0.0037627691 -0.0037565860 -0.0037595269 -0.0038066123 -0.0038785701 -0.0039390324 -0.0039809156 -0.0040210112 -0.0040718272 -0.0041372603 -0.0042288807 -0.0043516565 -0.0044859611 -0.0046191702 -0.0047791455 -0.0050206063 -0.0053799392 -0.0058427364 -0.0063677291 -0.0069290382 -0.0075039222 -0.0080565163 -0.0085577123 -0.0089757611 -0.0092686594 -0.0094157939 -0.0094254598 -0.0093183031 -0.0091221212 -0.0088692915 -0.0085927565 -0.0083268745 -0.0080958087 -0.0078910892 -0.0076945979 -0.0075142478 -0.0073472237 -0.0071690350 -0.0069752752 -0.0067580946 -0.0064942335 -0.0061815389 -0.0058347635 -0.0054610666 -0.0050567417 -0.0046289338 -0.0041982511 -0.0037726003 -0.0033295737 -0.0028279841 -0.0022442399 -0.0015858552 -0.0008702235 -0.0001137515 --0.0006731007 --0.0014897105 --0.0023248632 --0.0031439313 --0.0039223959 --0.0046784607 --0.0054370340 --0.0061691372 --0.0068279283 --0.0074140338 --0.0079425041 --0.0083937007 --0.0087419997 --0.0089999831 --0.0092000229 --0.0093703522 --0.0095336949 --0.0096994371 --0.0098632426 --0.0100258815 --0.0102088154 --0.0104267727 --0.0106665937 --0.0109168167 --0.0111649174 --0.0113866698 --0.0115610637 --0.0116668280 --0.0116782608 --0.0115883131 --0.0114149785 --0.0111604473 --0.0108035027 --0.0103185003 --0.0096961842 --0.0089683376 --0.0081881220 --0.0073876280 --0.0065701518 --0.0057465106 --0.0049369376 --0.0041481272 --0.0033936685 --0.0026927813 --0.0020491419 --0.0014739513 --0.0009855388 --0.0005809511 --0.0002472200 -0.0000208118 -0.0002210755 -0.0003505702 -0.0004097759 -0.0004130704 -0.0003948175 -0.0003850760 -0.0003958702 -0.0004218137 -0.0004327567 -0.0003990681 -0.0003203307 -0.0002217347 -0.0001168009 --0.0000073754 --0.0001406297 --0.0002468218 --0.0003212740 --0.0003912844 --0.0004603756 --0.0005010650 --0.0004947066 --0.0004466792 --0.0003690237 --0.0002641299 --0.0001262982 -0.0000466302 -0.0002419387 -0.0004578906 -0.0007187502 -0.0010152218 -0.0012960121 -0.0015424871 -0.0017833843 -0.0020437837 -0.0023180623 -0.0025886166 -0.0028493338 -0.0031055704 -0.0033628696 -0.0036222543 -0.0038865164 -0.0041733628 -0.0044953785 -0.0048396034 -0.0052001747 -0.0055777167 -0.0059379478 -0.0062297949 -0.0064359263 -0.0065730608 -0.0066559724 -0.0066742808 -0.0065906411 -0.0063665124 -0.0059999057 -0.0055300014 -0.0049964331 -0.0044054628 -0.0037517206 -0.0030564107 -0.0023569882 -0.0016689384 -0.0009904116 -0.0003395399 --0.0002485735 --0.0007662401 --0.0012420053 --0.0016901178 --0.0020936923 --0.0024450064 --0.0027673386 --0.0031040228 --0.0034733918 --0.0038505774 --0.0041988280 --0.0044878158 --0.0047033816 --0.0048502083 --0.0049365708 --0.0049730533 --0.0049869246 --0.0050172923 --0.0050882087 --0.0051845227 --0.0052727548 --0.0053453085 --0.0054319262 --0.0055637378 --0.0057298075 --0.0058939222 --0.0060384076 --0.0061603280 --0.0062562980 --0.0063340462 --0.0063977658 --0.0064359675 --0.0064506873 --0.0064599507 --0.0064606699 --0.0064307066 --0.0063721229 --0.0063113642 --0.0062629520 --0.0062159987 --0.0061382980 --0.0059937013 --0.0057729987 --0.0055084008 --0.0052497560 --0.0050310901 --0.0048466374 --0.0046454421 --0.0043901010 --0.0041055452 --0.0038356538 --0.0035948549 --0.0033881082 --0.0032294755 --0.0031166462 --0.0030343086 --0.0029713863 --0.0029213292 --0.0028949560 --0.0029026683 --0.0029332444 --0.0029828107 --0.0030573525 --0.0031519538 --0.0032687345 --0.0034134336 --0.0035720151 --0.0037261142 --0.0038821256 --0.0040680838 --0.0042825953 --0.0044781897 --0.0046284112 --0.0047610036 --0.0049089337 --0.0050640354 --0.0051883751 --0.0052701154 --0.0053383259 --0.0053978618 --0.0053925419 --0.0052873834 --0.0051109027 --0.0048778903 --0.0045826495 --0.0042514417 --0.0039128458 --0.0035681404 --0.0032376083 --0.0029571545 --0.0027402854 --0.0025979721 --0.0025372477 --0.0025370658 --0.0025695518 --0.0026281136 --0.0027217789 --0.0028560287 --0.0030290871 --0.0032356789 --0.0034614555 --0.0037013168 --0.0039705206 --0.0042819753 --0.0046334656 --0.0050169443 --0.0054299326 --0.0058757901 --0.0063517688 --0.0068253382 --0.0072577183 --0.0076422491 --0.0079987120 --0.0083493602 --0.0086872832 --0.0089916087 --0.0092703856 --0.0095500231 --0.0098373063 --0.0101059832 --0.0103293766 --0.0105109652 --0.0106863240 --0.0108888740 --0.0111018770 --0.0112968554 --0.0114691131 --0.0116166725 --0.0117325274 --0.0118131681 --0.0118543386 --0.0118439618 --0.0117852953 --0.0116871783 --0.0115347148 --0.0113069168 --0.0110013893 --0.0106253257 --0.0101819901 --0.0096797984 --0.0091382868 --0.0085692417 --0.0079778585 --0.0073861740 --0.0068256409 --0.0062993655 --0.0057779543 --0.0052404243 --0.0046840752 --0.0040943221 --0.0034427990 --0.0027239475 --0.0019607624 --0.0011615216 --0.0003157150 -0.0005633100 -0.0014428437 -0.0022972611 -0.0031040823 -0.0038560369 -0.0045703342 -0.0052504288 -0.0058825512 -0.0064674566 -0.0070158925 -0.0075319876 -0.0080139221 -0.0084597221 -0.0088719455 -0.0092645642 -0.0096408238 -0.0099742021 -0.0102484117 -0.0104785914 -0.0106817459 -0.0108579642 -0.0109982579 -0.0110931413 -0.0111310104 -0.0111164977 -0.0110647728 -0.0109629908 -0.0107694411 -0.0104614278 -0.0100601384 -0.0095820231 -0.0090167742 -0.0083636454 -0.0076420772 -0.0068829562 -0.0061181665 -0.0053666054 -0.0046463241 -0.0039834944 -0.0033935028 -0.0028792144 -0.0024529034 -0.0021241243 -0.0018768949 -0.0016908903 -0.0015646777 -0.0015026046 -0.0014844137 -0.0014722222 -0.0014560501 -0.0014637916 -0.0015105930 -0.0015728289 -0.0016241884 -0.0016638614 -0.0017052264 -0.0017547181 -0.0018078865 -0.0018587652 -0.0019061545 -0.0019433774 -0.0019314135 -0.0018137416 -0.0015935765 -0.0013346425 -0.0010620831 -0.0007371670 -0.0003344487 --0.0001223513 --0.0006038044 --0.0010957239 --0.0015894164 --0.0020829792 --0.0025774253 --0.0030604244 --0.0035095692 --0.0039149351 --0.0042835209 --0.0046213733 --0.0049152704 --0.0051573918 --0.0053745880 --0.0056000094 --0.0058404662 --0.0060980642 --0.0063963339 --0.0067474909 --0.0071246051 --0.0075071600 --0.0079118760 --0.0083661136 --0.0088845567 --0.0094504764 --0.0100202720 --0.0105544390 --0.0110437237 --0.0115015032 --0.0119373384 --0.0123465179 --0.0127198127 --0.0130541670 --0.0133526208 --0.0136180339 --0.0138491622 --0.0140396853 --0.0141760321 --0.0142640485 --0.0143329358 --0.0143895666 --0.0144149197 --0.0143967231 --0.0143399208 --0.0142468413 --0.0141047298 --0.0139196537 --0.0137191680 --0.0135048928 --0.0132605585 --0.0129951959 --0.0127331568 --0.0124830083 --0.0122351135 --0.0119735006 --0.0116789967 --0.0113412461 --0.0109643487 --0.0105570448 --0.0101224550 --0.0096643086 --0.0091974823 --0.0087342836 --0.0082745401 --0.0078211942 --0.0073926039 --0.0069943283 --0.0065960851 --0.0061675173 --0.0057281682 --0.0053169570 --0.0049329786 --0.0045606755 --0.0042191150 --0.0039452735 --0.0037531274 --0.0036331885 --0.0035748518 --0.0035777091 --0.0036364171 --0.0037334963 --0.0038592011 --0.0040175709 --0.0042133279 --0.0044223969 --0.0045990550 --0.0047355099 --0.0048544026 --0.0049593040 --0.0050449448 --0.0051048518 --0.0051160714 --0.0050701541 --0.0049998595 --0.0049410107 --0.0048959527 --0.0048475776 --0.0047897384 --0.0047434427 --0.0047365054 --0.0047751283 --0.0048469600 --0.0049306392 --0.0050090770 --0.0050819312 --0.0051578694 --0.0052405450 --0.0053260867 --0.0054098710 --0.0054912878 --0.0055723856 --0.0056545295 --0.0057373531 --0.0058199639 --0.0059021021 --0.0059841012 --0.0060662682 --0.0061520384 --0.0062576348 --0.0063960740 --0.0065581732 --0.0067451925 --0.0069811653 --0.0072650026 --0.0075652538 --0.0078752598 --0.0082120581 --0.0085657493 --0.0088954212 --0.0091815859 --0.0094456768 --0.0096992830 --0.0099331913 --0.0101515523 --0.0103696687 --0.0105934417 --0.0108182806 --0.0110483762 --0.0113046982 --0.0115928505 --0.0118885271 --0.0121796171 --0.0124810656 --0.0127799250 --0.0130232152 --0.0131778332 --0.0132453901 --0.0132270669 --0.0131310904 --0.0129902197 --0.0128190800 --0.0125910214 --0.0122876103 --0.0119300230 --0.0115354107 --0.0110985802 --0.0106304716 --0.0101477664 --0.0096421869 --0.0091087716 --0.0085669346 --0.0080459769 --0.0075775201 --0.0071820199 --0.0068574472 --0.0065822445 --0.0063334779 --0.0061083662 --0.0059069197 --0.0057123246 --0.0054974391 --0.0052455452 --0.0049721963 --0.0047054213 --0.0044533373 --0.0042172255 --0.0040087917 --0.0038394899 --0.0037075851 --0.0035888594 --0.0034446409 --0.0032561750 --0.0030442513 --0.0028218863 --0.0025587668 --0.0022338876 --0.0018597616 --0.0014429949 --0.0009840705 --0.0004886681 -0.0000390794 -0.0006004226 -0.0011941766 -0.0017990377 -0.0023817337 -0.0029437935 -0.0035245708 -0.0041351747 -0.0047285231 -0.0052419097 -0.0056510699 -0.0059637112 -0.0061943509 -0.0063642011 -0.0064982792 -0.0066056676 -0.0066898822 -0.0067823752 -0.0069161067 -0.0071000275 -0.0073390603 -0.0076351011 -0.0079668546 -0.0082906797 -0.0085638381 -0.0087660206 -0.0089090261 -0.0090208307 -0.0091127648 -0.0091830447 -0.0092318000 -0.0092511326 -0.0092412185 -0.0092311829 -0.0092575810 -0.0093327699 -0.0094547838 -0.0096188542 -0.0098020291 -0.0099782033 -0.0101439804 -0.0102994097 -0.0104290285 -0.0105308205 -0.0106149580 -0.0106736948 -0.0107038643 -0.0107250710 -0.0107530748 -0.0107866296 -0.0108285020 -0.0108812305 -0.0109371601 -0.0110004330 -0.0110772598 -0.0111574379 -0.0112298740 -0.0112961057 -0.0113626141 -0.0114269942 -0.0114680742 -0.0114684742 -0.0114451564 -0.0114227761 -0.0113849502 -0.0112873348 -0.0111246710 -0.0109434203 -0.0107818424 -0.0106403842 -0.0105211143 -0.0104507919 -0.0104514951 -0.0105175990 -0.0106273979 -0.0107883097 -0.0110291246 -0.0113372801 -0.0116741979 -0.0120202092 -0.0123701776 -0.0127218521 -0.0130742886 -0.0134268899 -0.0137794175 -0.0141406836 -0.0145388487 -0.0150052649 -0.0155389213 -0.0160986353 -0.0166441199 -0.0171725701 -0.0176927053 -0.0181934726 -0.0186588839 -0.0190851952 -0.0194873395 -0.0198788116 -0.0202482189 -0.0205896372 -0.0209324243 -0.0213029356 -0.0216866745 -0.0220561466 -0.0223979526 -0.0227228880 -0.0230674168 -0.0234573875 -0.0238748093 -0.0242840205 -0.0246730507 -0.0250420501 -0.0253855324 -0.0257080648 -0.0260163231 -0.0263199377 -0.0266400718 -0.0269787555 -0.0273172463 -0.0276496811 -0.0279962128 -0.0283609704 -0.0287137804 -0.0290363334 -0.0293221651 -0.0295510923 -0.0297061995 -0.0297956205 -0.0298543099 -0.0299174577 -0.0299849408 -0.0300176540 -0.0299802337 -0.0298850195 -0.0297584065 -0.0295951992 -0.0293825598 -0.0291064644 -0.0287442511 -0.0282963742 -0.0277731928 -0.0271719459 -0.0264948393 -0.0257589221 -0.0249963506 -0.0242363139 -0.0234836685 -0.0227272367 -0.0219610304 -0.0211893358 -0.0204072469 -0.0195965115 -0.0187578590 -0.0179042524 -0.0170304721 -0.0161340636 -0.0152312190 -0.0143349334 -0.0134429460 -0.0125499779 -0.0116689966 -0.0108199010 -0.0099966600 -0.0091874640 -0.0083996781 -0.0076331833 -0.0068685669 -0.0060799303 -0.0052538095 -0.0044074238 -0.0035658703 -0.0027231544 -0.0018718899 -0.0010464659 -0.0002737305 --0.0004687876 --0.0011987804 --0.0018910798 --0.0025248981 --0.0031077090 --0.0036444929 --0.0041434572 --0.0046266478 --0.0050941927 --0.0055248315 --0.0059092201 --0.0062616521 --0.0066104701 --0.0069645010 --0.0072974069 --0.0075892145 --0.0078604959 --0.0081352246 --0.0084053192 --0.0086679738 --0.0089427811 --0.0092334565 --0.0095250085 --0.0098078855 --0.0100774731 --0.0103204555 --0.0105256382 --0.0106853553 --0.0107933300 --0.0108565888 --0.0108749183 --0.0108290495 --0.0107058860 --0.0105102280 --0.0102625339 --0.0099860655 --0.0096868638 --0.0093659715 --0.0090244770 --0.0086523639 --0.0082518273 --0.0078448203 --0.0074460813 --0.0070522430 --0.0066544458 --0.0062530783 --0.0058673558 --0.0055180324 --0.0051946369 --0.0048703938 --0.0045492873 --0.0042591186 --0.0040004788 --0.0037453582 --0.0034770491 --0.0032061387 --0.0029658135 --0.0027891520 --0.0026675291 --0.0025541049 --0.0024181510 --0.0022696883 --0.0021315567 --0.0020083261 --0.0018882030 --0.0017620080 --0.0016311252 --0.0015010547 --0.0013738523 --0.0012476747 --0.0011205101 --0.0009921531 --0.0008575162 --0.0006916833 --0.0004598118 --0.0001482721 -0.0002328124 -0.0006729020 -0.0011740136 -0.0017381137 -0.0023432987 -0.0029527055 -0.0035501012 -0.0041453224 -0.0047501135 -0.0053630718 -0.0059758807 -0.0065848923 -0.0072007453 -0.0078376235 -0.0084789141 -0.0090958247 -0.0096923137 -0.0102828950 -0.0108566112 -0.0114005204 -0.0119063716 -0.0123515154 -0.0127199689 -0.0130050998 -0.0132192593 -0.0134092685 -0.0136141734 -0.0138318482 -0.0140413686 -0.0142358837 -0.0144269205 -0.0146378312 -0.0148868475 -0.0151507506 -0.0153952560 -0.0156332513 -0.0158913266 -0.0161677560 -0.0164588538 -0.0167773890 -0.0171345407 -0.0175269668 -0.0179341794 -0.0183354788 -0.0187269072 -0.0191008678 -0.0194248205 -0.0196676021 -0.0198333303 -0.0199532586 -0.0200338665 -0.0200508603 -0.0199829498 -0.0198244316 -0.0196084486 -0.0193948353 -0.0192219183 -0.0190687905 -0.0188842968 -0.0186597856 -0.0184285884 -0.0182136838 -0.0180033921 -0.0177635633 -0.0174808421 -0.0171824935 -0.0168973346 -0.0166254376 -0.0163572059 -0.0161049059 -0.0158834828 -0.0156798546 -0.0154725207 -0.0152655532 -0.0150877718 -0.0149487076 -0.0148308012 -0.0147386175 -0.0146967614 -0.0146884302 -0.0146548412 -0.0145723603 -0.0144760153 -0.0144004492 -0.0143423392 -0.0142910262 -0.0142592923 -0.0142655204 -0.0143133170 -0.0143950104 -0.0145050949 -0.0146341446 -0.0147650855 -0.0148906537 -0.0150291343 -0.0152084403 -0.0154220273 -0.0156343582 -0.0158250930 -0.0159909586 -0.0161295606 -0.0162364939 -0.0162975277 -0.0163083282 -0.0162947856 -0.0162735252 -0.0162301369 -0.0161596819 -0.0160815244 -0.0160109483 -0.0159406669 -0.0158433693 -0.0157003448 -0.0155126172 -0.0152783466 -0.0150000115 -0.0146834073 -0.0143116055 -0.0138605375 -0.0133345718 -0.0127670674 -0.0121802875 -0.0115735905 -0.0109516787 -0.0103267916 -0.0097045724 -0.0090885682 -0.0085023889 -0.0079761962 -0.0074981142 -0.0070314771 -0.0065821879 -0.0061865815 -0.0058417204 -0.0055131893 -0.0051948588 -0.0048998255 -0.0046302171 -0.0043888869 -0.0041737115 -0.0039767167 -0.0038042774 -0.0036576798 -0.0035195581 -0.0033886361 -0.0032879186 -0.0032204539 -0.0031598591 -0.0030991706 -0.0030642270 -0.0030637306 -0.0030722051 -0.0030663658 -0.0030371232 -0.0029946534 -0.0029698556 -0.0029741490 -0.0029833567 -0.0029628605 -0.0028949988 -0.0027861245 -0.0026510421 -0.0025033476 -0.0023380508 -0.0021350624 -0.0018842680 -0.0015923736 -0.0012683435 -0.0009129745 -0.0005224336 -0.0000975606 --0.0003441220 --0.0007834632 --0.0012135024 --0.0016246313 --0.0020039825 --0.0023413871 --0.0026168532 --0.0027995563 --0.0028860020 --0.0029289470 --0.0029885386 --0.0030740372 --0.0031582198 --0.0032193375 --0.0032480388 --0.0032421055 --0.0032052984 --0.0031425298 --0.0030444875 --0.0028860281 --0.0026616100 --0.0023976915 --0.0021157279 --0.0018208125 --0.0015206585 --0.0012226912 --0.0009274067 --0.0006325054 --0.0003386379 --0.0000476013 -0.0002513736 -0.0005681397 -0.0008802471 -0.0011638231 -0.0014302905 -0.0017024674 -0.0019841420 -0.0022510233 -0.0024724064 -0.0026418723 -0.0027772586 -0.0029020529 -0.0030162994 -0.0030994704 -0.0031554124 -0.0032245629 -0.0033390164 -0.0034824801 -0.0036167525 -0.0037299103 -0.0038356552 -0.0039289843 -0.0039757047 -0.0039670611 -0.0039371872 -0.0038993902 -0.0038202562 -0.0036827396 -0.0035214064 -0.0033792207 -0.0032756092 -0.0032042866 -0.0031389534 -0.0030608656 -0.0029804463 -0.0029242255 -0.0028854864 -0.0028216857 -0.0026998317 -0.0025088555 -0.0022571791 -0.0019674649 -0.0016441045 -0.0012607943 -0.0008058923 -0.0003130765 --0.0001638911 --0.0005936581 --0.0009809247 --0.0013336624 --0.0016445702 --0.0019218542 --0.0021825223 --0.0024089786 --0.0025746641 --0.0027002245 --0.0028306506 --0.0029816414 --0.0031493852 --0.0033407099 --0.0035536870 --0.0037567584 --0.0039165038 --0.0040282108 --0.0041081090 --0.0041788694 --0.0042565248 --0.0043369963 --0.0043982084 --0.0044327075 --0.0044578024 --0.0044799474 --0.0045040550 --0.0045391044 --0.0045824191 --0.0046367882 --0.0047052547 --0.0047817995 --0.0048788816 --0.0050329878 --0.0052644485 --0.0055499531 --0.0058574450 --0.0061800234 --0.0065175672 --0.0068630666 --0.0072097070 --0.0075523482 --0.0078785297 --0.0081886662 --0.0084943979 --0.0087901978 --0.0090712911 --0.0093415647 --0.0095906715 --0.0098084924 --0.0100112615 --0.0102148258 --0.0103961419 --0.0105100345 --0.0105374252 --0.0104919305 --0.0103891728 --0.0102278532 --0.0099967305 --0.0096955630 --0.0093455138 --0.0089585069 --0.0085249915 --0.0080537972 --0.0075672660 --0.0070523473 --0.0064780586 --0.0058562174 --0.0052321328 --0.0046277146 --0.0040210515 --0.0033753196 --0.0026981807 --0.0020451912 --0.0014408532 --0.0008633182 --0.0002998144 -0.0002505039 -0.0007960380 -0.0013440121 -0.0018932033 -0.0024389378 -0.0029696798 -0.0034788112 -0.0039803034 -0.0044776204 -0.0049604452 -0.0054309004 -0.0058859259 -0.0063116708 -0.0067136928 -0.0071154259 -0.0075278976 -0.0079437402 -0.0083538666 -0.0087562218 -0.0091414834 -0.0094931721 -0.0098052643 -0.0100853217 -0.0103532112 -0.0106241006 -0.0108808077 -0.0110945002 -0.0112596697 -0.0113875451 -0.0114710410 -0.0114955147 -0.0114860813 -0.0114801975 -0.0114696810 -0.0114197175 -0.0113167281 -0.0111702821 -0.0109912912 -0.0107889367 -0.0105794432 -0.0103682731 -0.0101338314 -0.0098605345 -0.0095690322 -0.0092868320 -0.0090172008 -0.0087529402 -0.0085058482 -0.0082893814 -0.0080974882 -0.0079284255 -0.0077914959 -0.0077019099 -0.0076780650 -0.0077181422 -0.0077789551 -0.0078028527 -0.0077807288 -0.0077535538 -0.0077510543 -0.0077721185 -0.0078136566 -0.0078725460 -0.0079349919 -0.0079910749 -0.0080446027 -0.0081137006 -0.0082080053 -0.0082996421 -0.0083615051 -0.0084076797 -0.0084645289 -0.0085362471 -0.0086092808 -0.0086745717 -0.0087351137 -0.0087996063 -0.0088845582 -0.0090068238 -0.0091688898 -0.0093634097 -0.0095841563 -0.0098170911 -0.0100322965 -0.0102065165 -0.0103406735 -0.0104451646 -0.0105219562 -0.0105637585 -0.0105536507 -0.0104867980 -0.0103793312 -0.0102491246 -0.0101121690 -0.0099740050 -0.0098151920 -0.0096168569 -0.0093990503 -0.0092053207 -0.0090392759 -0.0088581167 -0.0086428963 -0.0084173219 -0.0082048663 -0.0080038986 -0.0078011712 -0.0075970573 -0.0074152841 -0.0072645306 -0.0071104178 -0.0069373084 -0.0067799743 -0.0066730463 -0.0066092433 -0.0065502449 -0.0064803870 -0.0064288924 -0.0064185667 -0.0064195812 -0.0063817598 -0.0062982273 -0.0062075812 -0.0061375033 -0.0060797487 -0.0060063485 -0.0058925617 -0.0057434940 -0.0055819855 -0.0054060807 -0.0051938729 -0.0049467809 -0.0046941356 -0.0044428750 -0.0041751768 -0.0038676284 -0.0034923487 -0.0030514836 -0.0025760215 -0.0020830296 -0.0015637922 -0.0010160876 -0.0004595338 --0.0000881034 --0.0006140140 --0.0011091454 --0.0015832160 --0.0020443107 --0.0024796498 --0.0028749397 --0.0032297610 --0.0035512756 --0.0038428154 --0.0040996806 --0.0043038978 --0.0044379155 --0.0045155203 --0.0045793985 --0.0046586265 --0.0047472840 --0.0048277391 --0.0048960941 --0.0049613833 --0.0050311490 --0.0051047800 --0.0051780616 --0.0052528770 --0.0053481337 --0.0054793645 --0.0056376409 --0.0058315464 --0.0060874281 --0.0064056789 --0.0067779396 --0.0072066710 --0.0076808507 --0.0081732022 --0.0086803884 --0.0092162166 --0.0097724359 --0.0103277472 --0.0108745707 --0.0114199381 --0.0119702858 --0.0125184405 --0.0130405439 --0.0135255477 --0.0139901637 --0.0144340101 --0.0148227228 --0.0151282049 --0.0153504109 --0.0155031218 --0.0155948736 --0.0156227763 --0.0155801586 --0.0154653673 --0.0152903585 --0.0150865477 --0.0148770627 --0.0146480734 --0.0143842442 --0.0141025936 --0.0138272116 --0.0135618533 --0.0132967280 --0.0130362467 --0.0128139869 --0.0126560550 --0.0125375689 --0.0124232472 --0.0123210998 --0.0122586292 --0.0122440633 --0.0122548665 --0.0122599409 --0.0122512136 --0.0122295278 --0.0121727072 --0.0120486998 --0.0118578246 --0.0116292080 --0.0113689000 --0.0110592169 --0.0106976402 --0.0102997640 --0.0098892877 --0.0094816178 --0.0090639814 --0.0086253604 --0.0081878665 --0.0077578962 --0.0073034904 --0.0068002508 --0.0062558533 --0.0057001295 --0.0051558077 --0.0046205000 --0.0040818722 --0.0035388461 --0.0030083843 --0.0024977094 --0.0019967489 --0.0015015001 --0.0009958732 --0.0004581056 -0.0000979540 -0.0006274797 -0.0011042901 -0.0015384051 -0.0019480333 -0.0023318036 -0.0026667087 -0.0029457908 -0.0031859136 -0.0033990822 -0.0035738942 -0.0036821129 -0.0037149583 -0.0037002792 -0.0036707956 -0.0036502674 -0.0036522166 -0.0036644926 -0.0036731387 -0.0036946029 -0.0037495347 -0.0038306324 -0.0039320239 -0.0040578800 -0.0041974658 -0.0043410662 -0.0045060989 -0.0047154427 -0.0049699403 -0.0052479128 -0.0055225898 -0.0057866045 -0.0060506726 -0.0063321471 -0.0066485567 -0.0069965644 -0.0073579995 -0.0077359837 -0.0081484746 -0.0086030607 -0.0090851759 -0.0095754755 -0.0100827325 -0.0106306654 -0.0112147786 -0.0118020660 -0.0123736707 -0.0129271315 -0.0134665590 -0.0140051040 -0.0145385698 -0.0150420312 -0.0155117030 -0.0159630026 -0.0163935923 -0.0167888358 -0.0171309109 -0.0174026838 -0.0176113672 -0.0177817155 -0.0179132585 -0.0179813490 -0.0179848230 -0.0179497405 -0.0178945157 -0.0178255897 -0.0177356666 -0.0176126067 -0.0174781582 -0.0173613436 -0.0172471217 -0.0171104204 -0.0169567738 -0.0168057283 -0.0166648728 -0.0165266204 -0.0163870870 -0.0162657940 -0.0161815849 -0.0161225305 -0.0160780960 -0.0160559065 -0.0160480132 -0.0160199745 -0.0159512138 -0.0158671973 -0.0158127860 -0.0157884297 -0.0157471591 -0.0156693302 -0.0155818648 -0.0155094243 -0.0154415314 -0.0153435621 -0.0152096240 -0.0150882126 -0.0150161847 -0.0149698774 -0.0149098073 -0.0148296947 -0.0147483330 -0.0146782022 -0.0146150482 -0.0145497308 -0.0144796885 -0.0144088138 -0.0143491389 -0.0143207597 -0.0143335915 -0.0143814859 -0.0144470490 -0.0145102488 -0.0145583854 -0.0145800924 -0.0145771310 -0.0145703292 -0.0145727128 -0.0145671916 -0.0145225844 -0.0144400847 -0.0143522580 -0.0142661845 -0.0141531521 -0.0140038732 -0.0138444968 -0.0136851467 -0.0135017215 -0.0132847021 -0.0130574166 -0.0128383111 -0.0126117076 -0.0123471973 -0.0120470462 -0.0117406915 -0.0114315775 -0.0110929227 -0.0107069759 -0.0102784304 -0.0098156438 -0.0093089424 -0.0087498319 -0.0081484585 -0.0075179541 -0.0068723613 -0.0062250940 -0.0055793788 -0.0049339610 -0.0043066109 -0.0037308022 -0.0032115023 -0.0027296458 -0.0022884605 -0.0019116648 -0.0016088222 -0.0013571636 -0.0011289796 -0.0009207348 -0.0007470788 -0.0006179386 -0.0005282435 -0.0004626494 -0.0004063428 -0.0003741042 -0.0003981744 -0.0004727134 -0.0005588615 -0.0006481217 -0.0007594386 -0.0008909456 -0.0010231004 -0.0011455986 -0.0012632001 -0.0013839485 -0.0015085824 -0.0016313071 -0.0017401112 -0.0018168905 -0.0018603234 -0.0018858621 -0.0018837410 -0.0018188772 -0.0016800707 -0.0014935665 -0.0012630599 -0.0009547585 -0.0005887279 -0.0002460690 --0.0000302263 --0.0002622796 --0.0004938151 --0.0007465054 --0.0010092997 --0.0012650971 --0.0015111753 --0.0017543122 --0.0019873550 --0.0021904409 --0.0023771128 --0.0025805584 --0.0027933007 --0.0029885740 --0.0031666055 --0.0033450169 --0.0035323893 --0.0037243484 --0.0039121455 --0.0040796831 --0.0042111080 --0.0043042666 --0.0043677836 --0.0044227793 --0.0045018287 --0.0046260972 --0.0047930064 --0.0049851161 --0.0051839510 --0.0053963178 --0.0056455410 --0.0059411188 --0.0062710519 --0.0066087624 --0.0069380026 --0.0072638912 --0.0075960436 --0.0079339530 --0.0082755810 --0.0086369272 --0.0090335944 --0.0094544329 --0.0098920447 --0.0103533157 --0.0108303750 --0.0113059844 --0.0117748205 --0.0122373975 --0.0126794598 --0.0130900058 --0.0134804148 --0.0138534486 --0.0142014309 --0.0145285449 --0.0148329228 --0.0151034607 --0.0153351713 --0.0155308422 --0.0156843757 --0.0157816568 --0.0158295419 --0.0158376715 --0.0157997221 --0.0157163435 --0.0155889356 --0.0154112908 --0.0151980753 --0.0149820998 --0.0147785731 --0.0145782081 --0.0143690366 --0.0141428655 --0.0138873831 --0.0136037769 --0.0133141557 --0.0130236644 --0.0127072914 --0.0123448652 --0.0119404362 --0.0115181498 --0.0111043015 --0.0107152176 --0.0103706685 --0.0100796960 --0.0098153865 --0.0095534144 --0.0093087254 --0.0091054203 --0.0089475712 --0.0088144183 --0.0086769194 --0.0085264761 --0.0083765420 --0.0082486729 --0.0081450413 --0.0080493353 --0.0079747051 --0.0079450935 --0.0079307017 --0.0078751697 --0.0077617589 --0.0076143403 --0.0074655178 --0.0073298985 --0.0071989301 --0.0070603237 --0.0069132596 --0.0067649296 --0.0066238269 --0.0065065159 --0.0064239368 --0.0063623279 --0.0063144366 --0.0062941625 --0.0063179497 --0.0063978217 --0.0065267836 --0.0066904191 --0.0068956359 --0.0071496160 --0.0074400651 --0.0077360243 --0.0080096172 --0.0082863132 --0.0086246935 --0.0090368522 --0.0094874999 --0.0099455099 --0.0103932298 --0.0108140110 --0.0111994949 --0.0115531757 --0.0118859311 --0.0122145998 --0.0125416726 --0.0128438505 --0.0131064126 --0.0133451467 --0.0135621967 --0.0137313511 --0.0138454312 --0.0139221052 --0.0139710836 --0.0139882130 --0.0139858911 --0.0140048947 --0.0140633459 --0.0141426998 --0.0142351676 --0.0143459547 --0.0144672403 --0.0145865597 --0.0147018134 --0.0148178420 --0.0149287094 --0.0150048789 --0.0150205631 --0.0149865086 --0.0149266476 --0.0148547396 --0.0147798894 --0.0147054510 --0.0146291023 --0.0145481578 --0.0144522431 --0.0143243704 --0.0141810560 --0.0140698106 --0.0140011755 --0.0139391053 --0.0138570679 --0.0137632998 --0.0136887681 --0.0136592386 --0.0136615950 --0.0136609636 --0.0136562458 --0.0136796927 --0.0137398640 --0.0138097283 --0.0138685934 --0.0139178596 --0.0139542409 --0.0139634619 --0.0139482283 --0.0139162627 --0.0138606597 --0.0137817458 --0.0136828319 --0.0135570609 --0.0134098309 --0.0132601065 --0.0131172578 --0.0129765945 --0.0128316119 --0.0126893682 --0.0125882893 --0.0125589543 --0.0125696362 --0.0125670814 --0.0125387614 --0.0125079489 --0.0124963023 --0.0125166876 --0.0125700663 --0.0126354415 --0.0126913153 --0.0127375382 --0.0127860474 --0.0128424065 --0.0129022934 --0.0129600478 --0.0130144445 --0.0130667653 --0.0131240298 --0.0132072407 --0.0133329940 --0.0134978111 --0.0136837643 --0.0138692933 --0.0140404390 --0.0141840580 --0.0142984385 --0.0144046260 --0.0145140706 --0.0146039442 --0.0146554952 --0.0146795303 --0.0146821428 --0.0146533336 --0.0145854787 --0.0144903906 --0.0143927834 --0.0143041818 --0.0142188435 --0.0141281187 --0.0140402335 --0.0139815442 --0.0139584005 --0.0139524732 --0.0139625948 --0.0140061343 --0.0140922262 --0.0142159778 --0.0143707722 --0.0145561885 --0.0147757211 --0.0150314482 --0.0153225924 --0.0156476015 --0.0160052629 --0.0163954369 --0.0168300656 --0.0173203240 --0.0178541215 --0.0184149955 --0.0189901920 --0.0195667522 --0.0201406067 --0.0207157550 --0.0212942318 --0.0218729076 --0.0224491343 --0.0230216083 --0.0235774526 --0.0240999102 --0.0245960981 --0.0250776539 --0.0255373237 --0.0259706811 --0.0263723503 --0.0267226605 --0.0270184016 --0.0272731889 --0.0274810357 --0.0276240279 --0.0277095736 --0.0277581220 --0.0277654324 --0.0277233123 --0.0276396469 --0.0275247152 --0.0273793867 --0.0272027197 --0.0270101072 --0.0268208777 --0.0266377826 --0.0264454233 --0.0262191110 --0.0259540108 --0.0256712794 --0.0253745291 --0.0250513830 --0.0247100957 --0.0243647425 --0.0240080814 --0.0236488993 --0.0233309573 --0.0230612612 --0.0227803023 --0.0224431739 --0.0220666450 --0.0216757925 --0.0212672411 --0.0208245145 --0.0203491743 --0.0198663082 --0.0193857010 --0.0188917869 --0.0183900662 --0.0179056438 --0.0174383754 --0.0169675982 --0.0164732798 --0.0159420536 --0.0153736204 --0.0147747928 --0.0141578395 --0.0135287160 --0.0128720843 --0.0121730822 --0.0114328431 --0.0106599531 --0.0098689884 --0.0090892752 --0.0083373716 --0.0076063391 --0.0068943643 --0.0061865666 --0.0054594638 --0.0047296088 --0.0040240041 --0.0033210446 --0.0025796506 --0.0018032000 --0.0010410178 --0.0003283173 -0.0003551081 -0.0010476706 -0.0017454572 -0.0024123932 -0.0030268917 -0.0035860678 -0.0041027461 -0.0046039481 -0.0050958924 -0.0055627990 -0.0060079341 -0.0064490186 -0.0068785790 -0.0072771710 -0.0076544854 -0.0080323603 -0.0083984226 -0.0087121058 -0.0089663187 -0.0092034467 -0.0094555744 -0.0097007772 -0.0099008871 -0.0100490449 -0.0101692812 -0.0102924790 -0.0104286069 -0.0105671645 -0.0106991546 -0.0108268234 -0.0109558246 -0.0110877514 -0.0112208929 -0.0113488855 -0.0114526876 -0.0115142328 -0.0115351288 -0.0115359644 -0.0115399249 -0.0115436938 -0.0115173451 -0.0114420616 -0.0113252297 -0.0111888824 -0.0110463638 -0.0108738619 -0.0106394000 -0.0103581239 -0.0100766234 -0.0098160000 -0.0095612451 -0.0092829232 -0.0089608221 -0.0086090232 -0.0082603899 -0.0079156523 -0.0075420938 -0.0071306306 -0.0067100793 -0.0063033840 -0.0059070598 -0.0055205831 -0.0051729857 -0.0048853611 -0.0046299643 -0.0043653702 -0.0040820304 -0.0037801867 -0.0034384461 -0.0030426650 -0.0026055357 -0.0021418345 -0.0016510676 -0.0011290655 -0.0005992860 -0.0000887043 --0.0004066875 --0.0008936625 --0.0013722795 --0.0018444941 --0.0022976876 --0.0027169023 --0.0031155428 --0.0035190716 --0.0039303856 --0.0043210648 --0.0046680132 --0.0049902714 --0.0053219398 --0.0056667959 --0.0059914604 --0.0062697411 --0.0065180729 --0.0067551102 --0.0069749226 --0.0071776498 --0.0073774147 --0.0075882993 --0.0078205614 --0.0080645312 --0.0083032146 --0.0085335516 --0.0087695048 --0.0090302461 --0.0093094115 --0.0095857658 --0.0098515686 --0.0101146842 --0.0103829342 --0.0106556537 --0.0109282617 --0.0112056546 --0.0115093053 --0.0118477050 --0.0121975892 --0.0125357369 --0.0128546070 --0.0131472795 --0.0134160567 --0.0136800855 --0.0139440634 --0.0141833787 --0.0143768638 --0.0145275468 --0.0146568404 --0.0147892144 --0.0149311403 --0.0150731124 --0.0152075289 --0.0153367196 --0.0154667383 --0.0155998284 --0.0157340610 --0.0158672873 --0.0160001361 --0.0161448670 --0.0163113098 --0.0164870369 --0.0166677515 --0.0168625337 --0.0170668389 --0.0172694886 --0.0174674538 --0.0176621630 --0.0178439488 --0.0180087140 --0.0181677340 --0.0183189744 --0.0184550827 --0.0185838390 --0.0187159404 --0.0188523505 --0.0189857868 --0.0190967022 --0.0191571360 --0.0191749697 --0.0191899722 --0.0192106969 --0.0192250722 --0.0192598898 --0.0193448785 --0.0194595719 --0.0195607473 --0.0196292440 --0.0197001979 --0.0198168550 --0.0199681936 --0.0201141106 --0.0202395582 --0.0203590933 --0.0204877840 --0.0206249212 --0.0207617612 --0.0208940538 --0.0210241781 --0.0211554150 --0.0212823111 --0.0213839812 --0.0214501090 --0.0214963763 --0.0215275230 --0.0215346486 --0.0215201195 --0.0214760405 --0.0213786681 --0.0212335133 --0.0210803500 --0.0209446197 --0.0208178584 --0.0206823930 --0.0205259735 --0.0203358084 --0.0201065502 --0.0198435322 --0.0195612859 --0.0192802284 --0.0190080483 --0.0187369070 --0.0184590978 --0.0181761226 --0.0178936961 --0.0176142634 --0.0173356788 --0.0170468318 --0.0167275984 --0.0163755243 --0.0160039740 --0.0156108536 --0.0151827888 --0.0147029914 --0.0141659265 --0.0135888552 --0.0129867016 --0.0123569946 --0.0116910321 --0.0109969686 --0.0102871910 --0.0095414161 --0.0087360604 --0.0078938590 --0.0070581524 --0.0062415314 --0.0054270062 --0.0046004963 --0.0037653944 --0.0029340219 --0.0021248818 --0.0013540512 --0.0006225847 -0.0000771754 -0.0007464143 -0.0013691513 -0.0019387963 -0.0024787059 -0.0029891773 -0.0034418287 -0.0038453878 -0.0042245615 -0.0045648923 -0.0048336911 -0.0050241643 -0.0051653986 -0.0052815380 -0.0053575193 -0.0053804067 -0.0053724359 -0.0053485909 -0.0052973063 -0.0052046713 -0.0050753990 -0.0049366898 -0.0048097942 -0.0046908217 -0.0045656790 -0.0044314346 -0.0042967899 -0.0041683771 -0.0040439373 -0.0039183047 -0.0037900957 -0.0036613577 -0.0035338037 -0.0034076074 -0.0032902140 -0.0031926057 -0.0031064561 -0.0030157128 -0.0029086470 -0.0027808811 -0.0026453502 -0.0025149384 -0.0023889967 -0.0022614029 -0.0021388082 -0.0020438248 -0.0019825930 -0.0019414557 -0.0019213241 -0.0019367115 -0.0020056787 -0.0021448101 -0.0023573560 -0.0026262794 -0.0029382391 -0.0033294549 -0.0038370358 -0.0044140765 -0.0049786998 -0.0055083857 -0.0060354659 -0.0065856589 -0.0071517588 -0.0077168530 -0.0082890571 -0.0088920508 -0.0095225564 -0.0101537090 -0.0107720518 -0.0113835352 -0.0119841974 -0.0125571419 -0.0131063040 -0.0136551187 -0.0142149252 -0.0147782863 -0.0153358664 -0.0158877467 -0.0164394833 -0.0169903829 -0.0175214694 -0.0180128189 -0.0184628295 -0.0188844759 -0.0192960720 -0.0196904644 -0.0200337198 -0.0203203098 -0.0205839090 -0.0208331133 -0.0210355078 -0.0211823701 -0.0213053172 -0.0214183080 -0.0215095369 -0.0215761339 -0.0216158114 -0.0216277256 -0.0216294411 -0.0216380381 -0.0216515987 -0.0216520394 -0.0216166374 -0.0215385952 -0.0214350341 -0.0213331987 -0.0212345461 -0.0211177720 -0.0209816133 -0.0208433474 -0.0207133991 -0.0205966136 -0.0205060215 -0.0204435400 -0.0203879169 -0.0203213478 -0.0202472014 -0.0201890005 -0.0201703803 -0.0201829442 -0.0201961102 -0.0201947553 -0.0201869791 -0.0201867503 -0.0202073728 -0.0202604110 -0.0203360745 -0.0203972021 -0.0204136766 -0.0203951321 -0.0203500036 -0.0202571786 -0.0201211601 -0.0199807150 -0.0198571702 -0.0197376543 -0.0195895770 -0.0193805090 -0.0191125179 -0.0188278544 -0.0185603961 -0.0183050673 -0.0180417675 -0.0177651396 -0.0174846384 -0.0172086765 -0.0169369025 -0.0166648533 -0.0163904760 -0.0161113492 -0.0158152672 -0.0155061349 -0.0152092792 -0.0149206660 -0.0146324202 -0.0143819464 -0.0142043457 -0.0140710479 -0.0139162712 -0.0137233750 -0.0135265332 -0.0133565756 -0.0132186587 -0.0130904302 -0.0129506372 -0.0128000137 -0.0126584139 -0.0125511375 -0.0124785976 -0.0124122045 -0.0123317035 -0.0122419478 -0.0121551184 -0.0120742712 -0.0119949408 -0.0119132397 -0.0118287810 -0.0117430179 -0.0116582099 -0.0115746570 -0.0114902673 -0.0114155747 -0.0113714487 -0.0113436681 -0.0112854668 -0.0111852326 -0.0110649001 -0.0109291128 -0.0107753596 -0.0106141304 -0.0104519946 -0.0102726673 -0.0100551087 -0.0098101364 -0.0095701413 -0.0093591666 -0.0091710731 -0.0089823358 -0.0087920284 -0.0085992068 -0.0083829241 -0.0081411029 -0.0078960501 -0.0076621318 -0.0074349405 -0.0072007308 -0.0069428252 -0.0066692931 -0.0064145771 -0.0061879603 -0.0059660718 -0.0057311651 -0.0054877722 -0.0052515093 -0.0050431843 -0.0048658835 -0.0046793670 -0.0044488346 -0.0041932909 -0.0039491223 -0.0037237328 -0.0035003192 -0.0032612250 -0.0029917192 -0.0026917358 -0.0023838506 -0.0020868845 -0.0017905451 -0.0014633002 -0.0010880314 -0.0006729261 -0.0002400040 --0.0001797389 --0.0005526445 --0.0008643793 --0.0011419029 --0.0014263365 --0.0017291505 --0.0020336297 --0.0023257977 --0.0026089251 --0.0028932292 --0.0031820127 --0.0034594872 --0.0036896116 --0.0038553501 --0.0039893445 --0.0041237653 --0.0042448208 --0.0043354648 --0.0044107212 --0.0044916390 --0.0045809258 --0.0046672308 --0.0047307266 --0.0047571559 --0.0047610115 --0.0047700123 --0.0047944137 --0.0048354150 --0.0048880327 --0.0049417662 --0.0050075680 --0.0051135874 --0.0052646543 --0.0054346034 --0.0056142473 --0.0058226153 --0.0060751155 --0.0063651029 --0.0066654601 --0.0069557363 --0.0072389831 --0.0075284250 --0.0078283993 --0.0081319591 --0.0084320974 --0.0087287403 --0.0090255364 --0.0093243368 --0.0096241194 --0.0099233671 --0.0102218337 --0.0105201854 --0.0108188882 --0.0111178301 --0.0114167112 --0.0117154390 --0.0120140924 --0.0123121682 --0.0126088778 --0.0129053891 --0.0132036332 --0.0135028076 --0.0137923377 --0.0140511565 --0.0142656297 --0.0144388373 --0.0145793840 --0.0146784964 --0.0147239913 --0.0147374386 --0.0147423620 --0.0147263919 --0.0146678813 --0.0145638431 --0.0144353321 --0.0143103832 --0.0141966761 --0.0140835360 --0.0139623055 --0.0138352538 --0.0137079355 --0.0135815585 --0.0134548629 --0.0133283124 --0.0132026983 --0.0130765384 --0.0129485572 --0.0128169808 --0.0126666056 --0.0124815182 --0.0122712925 --0.0120446635 --0.0117939218 --0.0115192389 --0.0112384580 --0.0109596645 --0.0106630989 --0.0103474777 --0.0100448453 --0.0097688684 --0.0094950330 --0.0091807120 --0.0087982489 --0.0083742787 --0.0079776823 --0.0076460252 --0.0073610668 --0.0070881217 --0.0068058078 --0.0065168814 --0.0062410588 --0.0059934510 --0.0057548572 --0.0054941190 --0.0052134804 --0.0049264856 --0.0046223906 --0.0042906027 --0.0039394270 --0.0035689713 --0.0031840954 --0.0028081194 --0.0024394607 --0.0020552877 --0.0016546100 --0.0012553403 --0.0008802350 --0.0005566704 --0.0002926771 --0.0000558662 -0.0001911776 -0.0004518866 -0.0007067727 -0.0009330164 -0.0011047465 -0.0012156713 -0.0013004695 -0.0013975094 -0.0015090602 -0.0016160573 -0.0017096941 -0.0017994693 -0.0019091270 -0.0020559006 -0.0022266988 -0.0024074527 -0.0026079204 -0.0028304422 -0.0030576893 -0.0032761013 -0.0034877261 -0.0037011381 -0.0039193849 -0.0041352534 -0.0043276744 -0.0044829385 -0.0046193454 -0.0047632713 -0.0049176937 -0.0050689849 -0.0052046315 -0.0053165547 -0.0054157294 -0.0055139500 -0.0056012380 -0.0056738504 -0.0057428355 -0.0058164495 -0.0058931469 -0.0059688980 -0.0060420229 -0.0061128542 -0.0061837208 -0.0062573084 -0.0063335608 -0.0064102865 -0.0064940668 -0.0065965424 -0.0067108948 -0.0068300717 -0.0069613842 -0.0071034114 -0.0072547896 -0.0074309240 -0.0076366263 -0.0078497893 -0.0080510324 -0.0082318850 -0.0083839960 -0.0085142222 -0.0086445142 -0.0087841402 -0.0089140674 -0.0090057832 -0.0090631693 -0.0091178802 -0.0091868325 -0.0092625410 -0.0093329174 -0.0093958155 -0.0094590356 -0.0095410484 -0.0096575396 -0.0097940491 -0.0099097511 -0.0099797167 -0.0100241019 -0.0100778892 -0.0101479717 -0.0102173593 -0.0102747101 -0.0103283584 -0.0104005286 -0.0104899236 -0.0105677514 -0.0106353619 -0.0107096279 -0.0107795406 -0.0108341251 -0.0108823849 -0.0109355231 -0.0109943507 -0.0110533759 -0.0111102358 -0.0111669838 -0.0112249992 -0.0112834115 -0.0113414447 -0.0114002479 -0.0114608983 -0.0115222181 -0.0115825067 -0.0116415727 -0.0116931402 -0.0117269123 -0.0117494710 -0.0117595314 -0.0117316696 -0.0116662171 -0.0115970219 -0.0115369684 -0.0114579419 -0.0113340302 -0.0111692717 -0.0109874753 -0.0108121884 -0.0106483446 -0.0104858407 -0.0103173043 -0.0101468094 -0.0099815537 -0.0098219281 -0.0096639648 -0.0095062433 -0.0093496397 -0.0091936618 -0.0090276831 -0.0088343360 -0.0086169325 -0.0083990400 -0.0081933653 -0.0079939737 -0.0077921808 -0.0075876270 -0.0073851317 -0.0071867767 -0.0069923735 -0.0068108740 -0.0066472060 -0.0064924562 -0.0063467171 -0.0062139599 -0.0060868705 -0.0059572087 -0.0058249227 -0.0056943938 -0.0055681119 -0.0054443346 -0.0053203650 -0.0051963897 -0.0050704159 -0.0049271104 -0.0047498620 -0.0045359557 -0.0042964433 -0.0040523518 -0.0038170953 -0.0035878202 -0.0033555800 -0.0031227952 -0.0029168777 -0.0027675420 -0.0026629210 -0.0025700137 -0.0025007465 -0.0024842261 -0.0025005335 -0.0025083741 -0.0024905855 -0.0024549859 -0.0024293555 -0.0024411409 -0.0024995892 -0.0025925180 -0.0026873324 -0.0027731163 -0.0028701205 -0.0029856151 -0.0031054054 -0.0032265167 -0.0033670419 -0.0035320786 -0.0037026316 -0.0038545968 -0.0039823607 -0.0041044545 -0.0042354045 -0.0043729986 -0.0045090191 -0.0046480462 -0.0047897941 -0.0049129920 -0.0050228479 -0.0051544038 -0.0053138902 -0.0054635377 -0.0055691008 -0.0056305617 -0.0056568680 -0.0056537241 -0.0056374493 -0.0056228004 -0.0055952075 -0.0055208548 -0.0053963737 -0.0052584445 -0.0051370259 -0.0050285250 -0.0049154492 -0.0047919356 -0.0046652805 -0.0045428445 -0.0044247548 -0.0043072756 -0.0041884445 -0.0040692066 -0.0039511725 -0.0038391787 -0.0037473747 -0.0036822479 -0.0036319189 -0.0035934438 -0.0035736223 -0.0035655820 -0.0035557627 -0.0035406129 -0.0035253999 -0.0035139569 -0.0035048100 -0.0034948749 -0.0034832576 -0.0034711026 -0.0034591381 -0.0034403672 -0.0033929793 -0.0033002803 -0.0031789634 -0.0030613672 -0.0029502879 -0.0028098529 -0.0026155095 -0.0024007484 -0.0022206573 -0.0020815115 -0.0019463955 -0.0018003635 -0.0016676642 -0.0015638374 -0.0014732848 -0.0013764927 -0.0012713893 -0.0011746127 -0.0010981132 -0.0010340432 -0.0009757767 -0.0009234623 -0.0008740029 -0.0008239887 -0.0007735001 -0.0007242313 -0.0006766129 -0.0006312192 -0.0005973819 -0.0005868571 -0.0005929670 -0.0005973056 -0.0005929450 -0.0005840602 -0.0005654419 -0.0005270819 -0.0004787628 -0.0004486658 -0.0004503862 -0.0004655835 -0.0004718668 -0.0004676688 -0.0004642461 -0.0004678460 -0.0004788004 -0.0005036337 -0.0005466578 -0.0005967929 -0.0006413886 -0.0006801338 -0.0007200028 -0.0007647076 -0.0008112274 -0.0008515563 -0.0008771672 -0.0008925237 -0.0009050311 -0.0009114847 -0.0009230939 -0.0009712994 -0.0010622865 -0.0011621739 -0.0012386451 -0.0012846839 -0.0013157476 -0.0013521424 -0.0013984451 -0.0014454173 -0.0014854896 -0.0015144472 -0.0015247324 -0.0015221837 -0.0015335098 -0.0015709125 -0.0016165325 -0.0016516306 -0.0016770585 -0.0017035968 -0.0017359878 -0.0017706153 -0.0018029600 -0.0018325450 -0.0018610424 -0.0018827967 -0.0018855489 -0.0018707653 -0.0018546468 -0.0018463085 -0.0018412933 -0.0018327039 -0.0018199192 -0.0018066296 -0.0017952001 -0.0017849500 -0.0017743043 -0.0017614798 -0.0017383045 -0.0016957349 -0.0016394454 -0.0015767789 -0.0015029649 -0.0014182440 -0.0013402537 -0.0012858879 -0.0012481967 -0.0012076718 -0.0011576285 -0.0011057130 -0.0010610528 -0.0010297576 -0.0010071858 -0.0009849915 -0.0009671536 -0.0009574587 -0.0009522810 -0.0009573540 -0.0009897008 -0.0010526010 -0.0011336053 -0.0012223008 -0.0013148695 -0.0014176371 -0.0015365251 -0.0016629287 -0.0017846943 -0.0018995903 -0.0020121790 -0.0021254035 -0.0022385296 -0.0023497181 -0.0024584029 -0.0025679079 -0.0026875713 -0.0028182963 -0.0029398730 -0.0030370499 -0.0031248082 -0.0032349836 -0.0033825170 -0.0035480952 -0.0037031352 -0.0038414907 -0.0039761502 -0.0041164943 -0.0042591882 -0.0043971841 -0.0045286749 -0.0046560387 -0.0047814945 -0.0049054368 -0.0050265999 -0.0051386240 -0.0052267709 -0.0052835171 -0.0053240093 -0.0053683971 -0.0054148762 -0.0054450428 -0.0054541717 -0.0054568703 -0.0054603069 -0.0054542373 -0.0054327054 -0.0053951164 -0.0053334267 -0.0052506332 -0.0051658601 -0.0050900754 -0.0050174057 -0.0049340309 -0.0048314456 -0.0047120795 -0.0045831940 -0.0044527532 -0.0043257999 -0.0042015097 -0.0040768885 -0.0039512770 -0.0038255403 -0.0036949114 -0.0035478349 -0.0033814074 -0.0032091310 -0.0030446335 -0.0028866616 -0.0027202862 -0.0025316395 -0.0023254864 -0.0021203904 -0.0019254771 -0.0017300809 -0.0015234136 -0.0013167123 -0.0011271950 -0.0009528536 -0.0007798137 -0.0006033729 -0.0004356143 -0.0002922713 -0.0001718170 -0.0000588205 --0.0000521964 --0.0001553516 --0.0002498038 --0.0003410499 --0.0004326099 --0.0005235301 --0.0006118264 --0.0006972672 --0.0007808982 --0.0008633686 --0.0009429189 --0.0010154936 --0.0010822496 --0.0011465303 --0.0012084182 --0.0012703277 --0.0013314989 --0.0013870205 --0.0014371377 --0.0014863265 --0.0015370045 --0.0015878771 --0.0016367094 --0.0016810140 --0.0017171109 --0.0017432643 --0.0017607603 --0.0017731686 --0.0017852377 --0.0017989756 --0.0018130620 --0.0018262519 --0.0018435764 --0.0018741727 --0.0019166540 --0.0019591404 --0.0019927490 --0.0020167779 --0.0020394306 --0.0020705771 --0.0021093879 --0.0021471182 --0.0021794535 --0.0022090112 --0.0022395040 --0.0022716580 --0.0023036264 --0.0023338137 --0.0023624385 --0.0023903572 --0.0024175045 --0.0024412986 --0.0024583735 --0.0024681489 --0.0024726671 --0.0024752697 --0.0024785013 --0.0024817070 --0.0024793597 --0.0024662007 --0.0024459034 --0.0024268139 --0.0024118735 --0.0023981107 --0.0023824935 --0.0023646932 --0.0023443021 --0.0023207129 --0.0022958584 --0.0022723483 --0.0022504941 --0.0022288969 --0.0022066886 --0.0021842528 --0.0021622876 --0.0021409733 --0.0021206649 --0.0021031494 --0.0020892928 --0.0020768535 --0.0020634246 --0.0020489922 --0.0020348182 --0.0020214577 --0.0020084164 --0.0019949971 --0.0019805378 --0.0019645450 --0.0019484522 --0.0019343227 --0.0019216925 --0.0019087904 --0.0018950116 --0.0018810335 --0.0018675016 --0.0018543649 --0.0018412502 --0.0018279899 --0.0018146888 --0.0018014853 --0.0017883952 --0.0017753096 --0.0017614222 --0.0017454790 --0.0017277931 --0.0017094834 --0.0016902880 --0.0016699813 --0.0016495555 --0.0016298540 --0.0016107734 --0.0015918232 --0.0015722697 --0.0015513067 --0.0015293733 --0.0015078704 --0.0014874892 --0.0014683722 --0.0014502424 --0.0014325643 --0.0014156463 --0.0013998655 --0.0013847394 --0.0013696989 --0.0013547147 --0.0013400476 --0.0013258104 --0.0013119020 --0.0012982022 --0.0012846950 --0.0012714291 --0.0012584321 --0.0012456890 --0.0012332887 --0.0012216386 --0.0012105987 --0.0011992162 --0.0011872107 --0.0011752535 --0.0011638668 --0.0011530491 --0.0011430855 --0.0011346107 --0.0011274068 --0.0011204255 --0.0011130672 --0.0011055554 --0.0010982780 --0.0010912737 --0.0010843344 --0.0010773216 --0.0010702656 --0.0010632506 --0.0010563028 --0.0010493934 --0.0010424949 --0.0010356080 --0.0010287467 --0.0010219173 --0.0010151156 --0.0010083271 --0.0010015320 --0.0009947323 --0.0009879632 --0.0009812598 --0.0009746171 --0.0009679996 --0.0009613880 --0.0009547917 --0.0009482251 --0.0009416844 --0.0009350497 --0.0009280196 --0.0009205521 --0.0009130534 --0.0009057236 --0.0008984137 --0.0008910559 --0.0008837351 --0.0008765297 --0.0008694371 --0.0008624197 --0.0008554669 --0.0008486685 --0.0008422273 --0.0008362173 --0.0008304114 --0.0008245434 --0.0008185929 --0.0008127419 --0.0008070742 --0.0008014937 --0.0007960030 --0.0007906863 --0.0007854754 --0.0007802229 --0.0007748846 --0.0007695228 --0.0007642328 --0.0007590571 --0.0007539225 --0.0007487258 --0.0007434482 --0.0007381351 --0.0007328178 --0.0007274788 --0.0007220562 --0.0007165175 --0.0007109174 --0.0007053257 --0.0006997516 --0.0006941648 --0.0006885421 --0.0006828567 --0.0006770759 --0.0006712181 --0.0006653540 --0.0006595273 --0.0006537246 --0.0006479181 --0.0006421030 --0.0006362924 --0.0006304960 --0.0006247180 --0.0006189759 --0.0006132898 --0.0006076431 --0.0006019935 --0.0005963215 --0.0005906386 --0.0005849593 --0.0005792837 --0.0005736038 --0.0005679152 --0.0005622196 --0.0005565129 --0.0005507779 --0.0005450109 --0.0005392358 --0.0005334723 --0.0005277176 --0.0005219633 --0.0005162091 --0.0005104555 --0.0005047029 --0.0004989528 --0.0004932023 --0.0004874472 --0.0004816864 --0.0004759194 --0.0004701435 --0.0004643584 --0.0004585680 --0.0004527750 --0.0004469781 --0.0004411753 --0.0004353659 --0.0004295499 --0.0004237255 --0.0004178891 --0.0004120416 --0.0004061885 --0.0004003333 --0.0003944747 --0.0003886078 --0.0003827296 --0.0003768402 --0.0003709408 --0.0003650314 --0.0003591108 --0.0003531776 --0.0003472308 --0.0003412701 --0.0003352964 --0.0003293102 --0.0003233107 --0.0003172970 --0.0003112686 --0.0003052254 --0.0002991673 --0.0002930934 --0.0002870030 --0.0002808956 --0.0002747707 --0.0002686282 --0.0002624676 --0.0002562883 --0.0002500896 --0.0002438712 --0.0002376328 --0.0002313740 --0.0002250943 --0.0002187933 --0.0002124707 --0.0002061259 --0.0001997586 --0.0001933683 --0.0001869545 --0.0001805169 --0.0001740550 --0.0001675685 --0.0001610568 --0.0001545197 --0.0001479567 --0.0001413673 --0.0001347513 --0.0001281081 --0.0001214373 --0.0001147387 --0.0001080117 --0.0001012560 --0.0000944711 --0.0000876568 --0.0000808125 --0.0000739379 --0.0000670326 --0.0000600962 --0.0000531283 --0.0000461286 --0.0000390966 --0.0000320320 --0.0000249344 --0.0000178033 --0.0000106385 --0.0000034396 -0.0000037939 -0.0000074193 diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..0bd61ed --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,76 @@ +site_name: DAPI - DesignSafe API +site_description: User documentation for the DesignSafe API (dapi) package +site_author: Krishna Kumar, Pedro Arduino, Scott Brandenberg +site_url: https://designsafe-ci.github.io/dapi +repo_url: https://github.com/DesignSafe-CI/dapi +repo_name: DesignSafe-CI/dapi + +theme: + name: material + logo: nheri.png + favicon: favicon.ico + palette: + # Palette toggle for light mode + - scheme: default + primary: blue + accent: blue + toggle: + icon: material/brightness-7 + name: Switch to dark mode + # Palette toggle for dark mode + - scheme: slate + primary: blue + accent: blue + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.tabs + - navigation.sections + - navigation.expand + - navigation.path + - navigation.top + - search.highlight + - search.share + - content.code.copy + - content.tabs.link + +plugins: + - search + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - admonition + - pymdownx.details + - pymdownx.superfences + - attr_list + - md_in_html + +nav: + - Home: + - Overview: index.md + - Getting Started: + - Installation: installation.md + - Authentication: authentication.md + - Quick Start: quickstart.md + - User Guide: + - Jobs: jobs.md + - Database Access: database.md + - Examples: + - Overview: examples.md + - MPM Job Submission: examples/mpm.md + - OpenSees Job Submission: examples/opensees.md + - Database Queries: examples/database.md + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/DesignSafe-CI/dapi + css: + - stylesheets/extra.css \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 4fee5e8..4326696 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "appnope" @@ -6,6 +6,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -17,6 +19,7 @@ version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, @@ -26,8 +29,8 @@ files = [ six = ">=1.12.0" [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\""] +test = ["astroid (>=1,<2) ; python_version < \"3\"", "astroid (>=2,<4) ; python_version >= \"3\"", "pytest"] [[package]] name = "atomicwrites" @@ -35,6 +38,7 @@ version = "1.4.1" description = "Atomic file writes." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] files = [ {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, ] @@ -45,18 +49,34 @@ version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\""] + +[[package]] +name = "babel" +version = "2.17.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] [[package]] name = "black" @@ -64,6 +84,7 @@ version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, @@ -102,7 +123,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -112,6 +133,7 @@ version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -123,6 +145,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -192,6 +215,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "implementation_name == \"pypy\""} [package.dependencies] pycparser = "*" @@ -202,6 +226,7 @@ version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, @@ -316,6 +341,7 @@ version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -330,6 +356,7 @@ version = "3.1.0" description = "Pickler class to extend the standard pickle.Pickler functionality" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cloudpickle-3.1.0-py3-none-any.whl", hash = "sha256:fe11acda67f61aaaec473e3afe030feb131d78a43461b718185363384f1ba12e"}, {file = "cloudpickle-3.1.0.tar.gz", hash = "sha256:81a929b6e3c7335c863c771d673d105f02efdb89dfaba0c90495d1c64796601b"}, @@ -341,10 +368,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {dev = "platform_system == \"Windows\" or sys_platform == \"win32\""} [[package]] name = "comm" @@ -352,6 +381,7 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -369,6 +399,7 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -418,6 +449,7 @@ version = "1.8.8" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"}, {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"}, @@ -453,6 +485,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -464,10 +497,12 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] +markers = {dev = "python_version == \"3.10\""} [package.extras] test = ["pytest (>=6)"] @@ -478,13 +513,32 @@ version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "greenlet" @@ -492,6 +546,8 @@ version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" files = [ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, @@ -572,12 +628,28 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "griffe" +version = "1.7.3" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75"}, + {file = "griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b"}, +] + +[package.dependencies] +colorama = ">=0.4" + [[package]] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -592,6 +664,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -603,6 +676,7 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -636,6 +710,7 @@ version = "8.29.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, @@ -657,7 +732,7 @@ typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing-extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -674,6 +749,7 @@ version = "0.7.2" description = "An ISO 8601 date/time/duration parser and formatter" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, @@ -685,6 +761,7 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -704,6 +781,7 @@ version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, @@ -721,6 +799,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -742,6 +821,7 @@ version = "0.1.3" description = "JSONSchema Spec with object-oriented paths" optional = false python-versions = ">=3.7.0,<4.0.0" +groups = ["main"] files = [ {file = "jsonschema_spec-0.1.3-py3-none-any.whl", hash = "sha256:b3cde007ad65c2e631e2f8653cf187124a2c714d02d9fafbab68ad64bf5745d6"}, {file = "jsonschema_spec-0.1.3.tar.gz", hash = "sha256:8d8db7c255e524fab1016a952a9143e5b6e3c074f4ed25d1878f8e97806caec0"}, @@ -759,6 +839,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -773,6 +854,7 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, @@ -787,7 +869,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -795,6 +877,7 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, @@ -815,6 +898,7 @@ version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, @@ -855,12 +939,29 @@ files = [ {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] +[[package]] +name = "markdown" +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + [[package]] name = "markupsafe" version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -931,6 +1032,7 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -939,12 +1041,158 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4) ; platform_system == \"Windows\"", "ghp-import (==1.0)", "importlib-metadata (==4.3) ; python_version < \"3.10\"", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10) ; python_version < \"3.8\"", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.2" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13"}, + {file = "mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-material" +version = "9.4.14" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mkdocs_material-9.4.14-py3-none-any.whl", hash = "sha256:dbc78a4fea97b74319a6aa9a2f0be575a6028be6958f813ba367188f7b8428f6"}, + {file = "mkdocs_material-9.4.14.tar.gz", hash = "sha256:a511d3ff48fa8718b033e7e37d17abd9cc1de0fdf0244a625ca2ae2387e2416d"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocstrings" +version = "0.23.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, + {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, +] + +[package.dependencies] +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.9.1" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mkdocstrings_python-1.9.1-py3-none-any.whl", hash = "sha256:bf2406ed37ff19c9f8e0acc9d72c41953fb789bfb4ae10eb00ee17e537eeb220"}, + {file = "mkdocstrings_python-1.9.1.tar.gz", hash = "sha256:077188fa43eab3b689826b15da7da6753501224b2482e4eca3ce4412ce3b71cb"}, +] + +[package.dependencies] +griffe = ">=0.37" +markdown = ">=3.3,<3.6" +mkdocstrings = ">=0.20" + [[package]] name = "more-itertools" version = "10.5.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"}, {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, @@ -956,6 +1204,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -967,6 +1216,7 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -978,6 +1228,7 @@ version = "2.1.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, @@ -1042,6 +1293,7 @@ version = "0.16.0" description = "client-side and server-side support for the OpenAPI Specification v3" optional = false python-versions = ">=3.7.0,<4.0.0" +groups = ["main"] files = [ {file = "openapi-core-0.16.0.tar.gz", hash = "sha256:5db8fa034e5c262de865cab5f2344995c52f1ba0386182c0be584d02f0282c6a"}, {file = "openapi_core-0.16.0-py3-none-any.whl", hash = "sha256:4331f528f5a74c7a3963f37b2ad73c54e3dd477276354fd6b7188d2352fd7e8e"}, @@ -1070,6 +1322,7 @@ version = "0.3.4" description = "OpenAPI schema validation for Python" optional = false python-versions = ">=3.7.0,<4.0.0" +groups = ["main"] files = [ {file = "openapi-schema-validator-0.3.4.tar.gz", hash = "sha256:7cf27585dd7970b7257cefe48e1a3a10d4e34421831bdb472d96967433bc27bd"}, {file = "openapi_schema_validator-0.3.4-py3-none-any.whl", hash = "sha256:34fbd14b7501abe25e64d7b4624a9db02cde1a578d285b3da6f34b290cdf0b3a"}, @@ -1090,6 +1343,7 @@ version = "0.5.4" description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3 spec validator" optional = false python-versions = ">=3.7.0,<4.0.0" +groups = ["main"] files = [ {file = "openapi_spec_validator-0.5.4-py3-none-any.whl", hash = "sha256:96be4258fdccc89d3da094738e19d56b94956914b93a22de795b9dd220cb4c7c"}, {file = "openapi_spec_validator-0.5.4.tar.gz", hash = "sha256:68654e81cc56c71392dba31bf55d11e1c03c99458bebcb0018959a7134e104da"}, @@ -1110,17 +1364,35 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "paginate" +version = "0.5.7" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, +] + +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, @@ -1207,6 +1479,7 @@ version = "1.20.2" description = "parse() is the opposite of format()" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "parse-1.20.2-py2.py3-none-any.whl", hash = "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558"}, {file = "parse-1.20.2.tar.gz", hash = "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce"}, @@ -1218,6 +1491,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1233,6 +1507,7 @@ version = "0.4.3" description = "Object-oriented paths" optional = false python-versions = ">=3.7.0,<4.0.0" +groups = ["main"] files = [ {file = "pathable-0.4.3-py3-none-any.whl", hash = "sha256:cdd7b1f9d7d5c8b8d3315dbf5a86b2596053ae845f056f57d97c0eefff84da14"}, {file = "pathable-0.4.3.tar.gz", hash = "sha256:5c869d315be50776cc8a993f3af43e0c60dc01506b399643f919034ebf4cdcab"}, @@ -1244,6 +1519,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1255,6 +1531,7 @@ version = "14.7.0" description = "API Documentation for Python Projects" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pdoc-14.7.0-py3-none-any.whl", hash = "sha256:72377a907efc6b2c5b3c56b717ef34f11d93621dced3b663f3aede0b844c0ad2"}, {file = "pdoc-14.7.0.tar.gz", hash = "sha256:2d28af9c0acc39180744ad0543e4bbc3223ecba0d1302db315ec521c51f71f93"}, @@ -1274,6 +1551,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -1288,6 +1567,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -1304,6 +1584,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1319,6 +1600,7 @@ version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, @@ -1333,6 +1615,7 @@ version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dev"] files = [ {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, @@ -1363,6 +1646,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -1374,6 +1659,7 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -1388,10 +1674,12 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "implementation_name == \"pypy\""} [[package]] name = "pygments" @@ -1399,6 +1687,7 @@ version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -1413,6 +1702,7 @@ version = "2.9.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, @@ -1424,12 +1714,32 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pymdown-extensions" +version = "10.7.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pymysql" version = "1.1.1" description = "Pure Python MySQL Driver" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "PyMySQL-1.1.1-py3-none-any.whl", hash = "sha256:4de15da4c61dc132f4fb9ab763063e693d521a80fd0e87943b9a453dd4c19d6c"}, {file = "pymysql-1.1.1.tar.gz", hash = "sha256:e127611aaf2b417403c60bf4dc570124aeb4a57f5f37b8e95ae399a42f904cd0"}, @@ -1445,6 +1755,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -1467,6 +1778,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1481,6 +1793,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1495,6 +1808,7 @@ version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -1506,6 +1820,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -1533,6 +1849,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -1589,12 +1906,28 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +description = "A custom YAML tag for referencing environment variables in YAML files." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"}, + {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"}, +] + +[package.dependencies] +pyyaml = "*" + [[package]] name = "pyzmq" version = "26.2.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, @@ -1716,6 +2049,7 @@ version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, @@ -1725,12 +2059,117 @@ files = [ attrs = ">=22.2.0" rpds-py = ">=0.7.0" +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + [[package]] name = "requests" version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1752,6 +2191,7 @@ version = "0.21.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, @@ -1851,19 +2291,20 @@ version = "75.4.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-75.4.0-py3-none-any.whl", hash = "sha256:b3c5d862f98500b06ffdf7cc4499b48c46c317d8d56cb30b5c8bce4d88f5c216"}, {file = "setuptools-75.4.0.tar.gz", hash = "sha256:1dc484f5cf56fd3fe7216d7b8df820802e7246cfb534a1db2aa64f14fcb9cdcb"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] -core = ["importlib-metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.7.0) ; sys_platform != \"cygwin\""] +core = ["importlib-metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "six" @@ -1871,6 +2312,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main", "dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1882,6 +2324,7 @@ version = "2.0.36" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, @@ -1977,6 +2420,7 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -1996,6 +2440,7 @@ version = "1.7.0" description = "Python lib for interacting with an instance of the Tapis API Framework" optional = false python-versions = "<4.0,>=3.7" +groups = ["main"] files = [ {file = "tapipy-1.7.0-py3-none-any.whl", hash = "sha256:018cdf0f09f579b8e8b0585eaa872cc55ff6d8f414df22bb741f826d2d6ef0ee"}, {file = "tapipy-1.7.0.tar.gz", hash = "sha256:ddfad6fcecd9543db87588cedc41bddc19ed803f5a7447d5c02f307660702e5a"}, @@ -2023,6 +2468,7 @@ version = "6.1.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc"}, {file = "tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86"}, @@ -2034,6 +2480,8 @@ version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, @@ -2045,6 +2493,7 @@ version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -2065,6 +2514,7 @@ version = "4.67.0" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, @@ -2086,6 +2536,7 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -2101,10 +2552,12 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +markers = {dev = "python_version < \"3.12\""} [[package]] name = "tzdata" @@ -2112,6 +2565,7 @@ version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, @@ -2123,22 +2577,67 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "watchdog" +version = "6.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, + {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, + {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, + {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, + {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -2150,6 +2649,7 @@ version = "3.1.3" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, @@ -2162,6 +2662,6 @@ MarkupSafe = ">=2.1.1" watchdog = ["watchdog (>=2.3)"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" -content-hash = "c45711a47e1a8eccc36c79b90cd6ce99ff663e48c41e0431b22a142123650f4a" +content-hash = "4124e40db595577d92ab46368cf245119f5f7cf864eccf28ab2343641cd84420" diff --git a/pyproject.toml b/pyproject.toml index e4f0232..fb67a73 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "dapi" -version = "1.0.0" +version = "0.3.0" description = "DesignSafe API" authors = [ "Krishna Kumar ", @@ -21,6 +21,9 @@ numpy = "^2.1.1" pandas = "^2.2.3" tapipy = "^1.6.3" jsonschema = ">=4.18.0" +mkdocs = ">=1.5,<1.6" +mkdocs-material = ">=9.0,<9.5" +mkdocstrings = {version = ">=0.20,<0.24", extras = ["python"]} [tool.poetry.group.dev.dependencies] diff --git a/tests/files/test_uri_translation.py b/tests/files/test_uri_translation.py new file mode 100644 index 0000000..ab7143d --- /dev/null +++ b/tests/files/test_uri_translation.py @@ -0,0 +1,67 @@ +import unittest +from dapi.files import tapis_uri_to_local_path + + +class TestTapisUriToLocalPath(unittest.TestCase): + """Test cases for the tapis_uri_to_local_path function""" + + def test_designsafe_storage_default_with_path(self): + """Test translation of designsafe.storage.default URIs with paths""" + input_uri = "tapis://designsafe.storage.default/kks32/tapis-jobs-archive/2025-06-06Z/80986fb9-0d7e-440a-a4cf-ce54ec26226d-007" + expected = "/home/jupyter/MyData/tapis-jobs-archive/2025-06-06Z/80986fb9-0d7e-440a-a4cf-ce54ec26226d-007" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_designsafe_storage_default_simple_path(self): + """Test translation of simple designsafe.storage.default URI""" + input_uri = "tapis://designsafe.storage.default/user/folder/file.txt" + expected = "/home/jupyter/MyData/folder/file.txt" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_designsafe_storage_default_root(self): + """Test translation of designsafe.storage.default root URI""" + input_uri = "tapis://designsafe.storage.default/kks32/" + expected = "/home/jupyter/MyData/" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_designsafe_storage_community(self): + """Test translation of designsafe.storage.community URI""" + input_uri = "tapis://designsafe.storage.community/datasets/earthquake.csv" + expected = "/home/jupyter/CommunityData/datasets/earthquake.csv" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_project_system(self): + """Test translation of project system URI""" + input_uri = "tapis://project-1234-abcd/analysis/results.txt" + expected = "/home/jupyter/MyProjects/analysis/results.txt" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_unknown_system(self): + """Test that unknown systems return the original URI""" + input_uri = "tapis://unknown-system/path/file.txt" + expected = "tapis://unknown-system/path/file.txt" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_non_tapis_uri(self): + """Test that non-Tapis URIs are returned unchanged""" + input_uri = "/local/path/file.txt" + expected = "/local/path/file.txt" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + def test_empty_path(self): + """Test handling of URIs with empty paths""" + input_uri = "tapis://designsafe.storage.default/user" + expected = "/home/jupyter/MyData/" + result = tapis_uri_to_local_path(input_uri) + self.assertEqual(result, expected) + + +# This allows running the test from the command line +if __name__ == "__main__": + unittest.main() diff --git a/tests/jobs/test_archive_config.py b/tests/jobs/test_archive_config.py new file mode 100644 index 0000000..08e3762 --- /dev/null +++ b/tests/jobs/test_archive_config.py @@ -0,0 +1,135 @@ +import unittest +from unittest.mock import MagicMock, patch +from dapi.jobs import generate_job_request + + +class TestArchiveConfiguration(unittest.TestCase): + """Test cases for archive system configuration in job generation""" + + def setUp(self): + """Set up test fixtures""" + self.mock_tapis = MagicMock() + self.mock_tapis.username = "testuser" + + # Mock app details + self.mock_app = MagicMock() + self.mock_app.id = "test-app" + self.mock_app.version = "1.0" + self.mock_app.description = "Test app" + + # Mock job attributes + self.mock_job_attrs = MagicMock() + self.mock_job_attrs.execSystemId = "test-system" + self.mock_job_attrs.archiveSystemId = "default-archive" + self.mock_job_attrs.archiveSystemDir = None + self.mock_job_attrs.archiveOnAppError = True + self.mock_job_attrs.execSystemLogicalQueue = "normal" + self.mock_job_attrs.nodeCount = 1 + self.mock_job_attrs.coresPerNode = 1 + self.mock_job_attrs.maxMinutes = 60 + self.mock_job_attrs.memoryMB = 1000 + self.mock_job_attrs.isMpi = False + + # Mock parameter set + self.mock_param_set = MagicMock() + self.mock_param_set.appArgs = [MagicMock(name="Main Script")] + self.mock_param_set.envVariables = [] + self.mock_param_set.schedulerOptions = [] + self.mock_job_attrs.parameterSet = self.mock_param_set + + self.mock_app.jobAttributes = self.mock_job_attrs + + @patch("dapi.jobs.get_app_details") + def test_designsafe_archive_system_default_path(self, mock_get_app): + """Test archive system configuration with DesignSafe and default path""" + mock_get_app.return_value = self.mock_app + + job_request = generate_job_request( + tapis_client=self.mock_tapis, + app_id="test-app", + input_dir_uri="tapis://test-system/input", + script_filename="test.sh", + archive_system="designsafe", + ) + + self.assertEqual(job_request["archiveSystemId"], "designsafe.storage.default") + self.assertEqual( + job_request["archiveSystemDir"], + "${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}", + ) + + @patch("dapi.jobs.get_app_details") + def test_designsafe_archive_system_custom_dir(self, mock_get_app): + """Test archive system configuration with DesignSafe and custom directory name""" + mock_get_app.return_value = self.mock_app + + job_request = generate_job_request( + tapis_client=self.mock_tapis, + app_id="test-app", + input_dir_uri="tapis://test-system/input", + script_filename="test.sh", + archive_system="designsafe", + archive_path="my-jobs", + ) + + self.assertEqual(job_request["archiveSystemId"], "designsafe.storage.default") + self.assertEqual( + job_request["archiveSystemDir"], + "${EffectiveUserId}/my-jobs/${JobCreateDate}/${JobUUID}", + ) + + @patch("dapi.jobs.get_app_details") + def test_designsafe_archive_system_full_path(self, mock_get_app): + """Test archive system configuration with DesignSafe and full path""" + mock_get_app.return_value = self.mock_app + + job_request = generate_job_request( + tapis_client=self.mock_tapis, + app_id="test-app", + input_dir_uri="tapis://test-system/input", + script_filename="test.sh", + archive_system="designsafe", + archive_path="${EffectiveUserId}/custom/path/${JobUUID}", + ) + + self.assertEqual(job_request["archiveSystemId"], "designsafe.storage.default") + self.assertEqual( + job_request["archiveSystemDir"], "${EffectiveUserId}/custom/path/${JobUUID}" + ) + + @patch("dapi.jobs.get_app_details") + def test_custom_archive_system(self, mock_get_app): + """Test archive system configuration with custom system""" + mock_get_app.return_value = self.mock_app + + job_request = generate_job_request( + tapis_client=self.mock_tapis, + app_id="test-app", + input_dir_uri="tapis://test-system/input", + script_filename="test.sh", + archive_system="custom.storage.system", + archive_path="/custom/archive/path", + ) + + self.assertEqual(job_request["archiveSystemId"], "custom.storage.system") + self.assertEqual(job_request["archiveSystemDir"], "/custom/archive/path") + + @patch("dapi.jobs.get_app_details") + def test_no_archive_system_uses_app_default(self, mock_get_app): + """Test that no archive system specification uses app defaults""" + mock_get_app.return_value = self.mock_app + + job_request = generate_job_request( + tapis_client=self.mock_tapis, + app_id="test-app", + input_dir_uri="tapis://test-system/input", + script_filename="test.sh", + ) + + self.assertEqual(job_request["archiveSystemId"], "default-archive") + self.assertNotIn("archiveSystemDir", job_request) + + +# This allows running the test from the command line +if __name__ == "__main__": + unittest.main()