diff --git a/content/docs/anselm/compute-nodes.mdx b/content/docs/anselm/compute-nodes.mdx deleted file mode 100644 index d5936e58b580dac1b15f78568ab23e4cf9bba8fc..0000000000000000000000000000000000000000 --- a/content/docs/anselm/compute-nodes.mdx +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: "Compute Nodes" ---- -## Node Configuration - -Anselm is a cluster of x86-64 Intel-based nodes built with the Bull Extreme Computing bullx technology. The cluster contains four types of compute nodes. - -### Compute Nodes Without Accelerators - -* 180 nodes -* 2880 cores in total -* two Intel Sandy Bridge E5-2665, 8-core, 2.4GHz processors per node -* 64 GB of physical memory per node -* one 500GB SATA 2,5” 7,2 krpm HDD per node -* bullx B510 blade servers -* cn[1-180] - -### Compute Nodes With a GPU Accelerator - -* 23 nodes -* 368 cores in total -* two Intel Sandy Bridge E5-2470, 8-core, 2.3GHz processors per node -* 96 GB of physical memory per node -* one 500GB SATA 2,5” 7,2 krpm HDD per node -* GPU accelerator 1x NVIDIA Tesla Kepler K20m per node -* bullx B515 blade servers -* cn[181-203] - -### Compute Nodes With a MIC Accelerator - -* 4 nodes -* 64 cores in total -* two Intel Sandy Bridge E5-2470, 8-core, 2.3GHz processors per node -* 96 GB of physical memory per node -* one 500GB SATA 2,5” 7,2 krpm HDD per node -* MIC accelerator 1x Intel Phi 5110P per node -* bullx B515 blade servers -* cn[204-207] - -### Fat Compute Nodes - -* 2 nodes -* 32 cores in total -* 2 Intel Sandy Bridge E5-2665, 8-core, 2.4GHz processors per node -* 512 GB of physical memory per node -* two 300GB SAS 3,5” 15krpm HDD (RAID1) per node -* two 100GB SLC SSD per node -* bullx R423-E3 servers -* cn[208-209] - - -**Anselm bullx B510 servers** - -### Compute Node Summary - -| Node type | Count | Range | Memory | Cores | Queues | -| ---------------------------- | ----- | ----------- | ------ | ----------- | -------------------------------------- | -| Nodes without an accelerator | 180 | cn[1-180] | 64GB | 16 @ 2.4GHz | qexp, qprod, qlong, qfree, qprace, qatlas | -| Nodes with a GPU accelerator | 23 | cn[181-203] | 96GB | 16 @ 2.3GHz | qnvidia, qexp | -| Nodes with a MIC accelerator | 4 | cn[204-207] | 96GB | 16 @ 2.3GHz | qmic, qexp | -| Fat compute nodes | 2 | cn[208-209] | 512GB | 16 @ 2.4GHz | qfat, qexp | - -## Processor Architecture - -Anselm is equipped with Intel Sandy Bridge processors Intel Xeon E5-2665 (nodes without accelerators and fat nodes) and Intel Xeon E5-2470 (nodes with accelerators). The processors support Advanced Vector Extensions (AVX) 256-bit instruction set. - -### Intel Sandy Bridge E5-2665 Processor - -* eight-core -* speed: 2.4 GHz, up to 3.1 GHz using Turbo Boost Technology -* peak performance: 19.2 GFLOP/s per core -* caches: - * L2: 256 KB per core - * L3: 20 MB per processor -* memory bandwidth at the level of the processor: 51.2 GB/s - -### Intel Sandy Bridge E5-2470 Processor - -* eight-core -* speed: 2.3 GHz, up to 3.1 GHz using Turbo Boost Technology -* peak performance: 18.4 GFLOP/s per core -* caches: - * L2: 256 KB per core - * L3: 20 MB per processor -* memory bandwidth at the level of the processor: 38.4 GB/s - -Nodes equipped with Intel Xeon E5-2665 CPU have a set PBS resource attribute cpu_freq = 24, nodes equipped with Intel Xeon E5-2470 CPU have set PBS resource attribute cpu_freq = 23. - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=4:ncpus=16:cpu_freq=24 -I -``` - -In this example, we allocate 4 nodes, 16 cores at 2.4GHhz per node. - -Intel Turbo Boost Technology is used by default, you can disable it for all nodes of job by using the cpu_turbo_boost resource attribute. - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=4:ncpus=16 -l cpu_turbo_boost=0 -I -``` - -## Memmory Architecture - -The cluster contains three types of compute nodes. - -### Compute Nodes Without Accelerators - -* 2 sockets -* Memory Controllers are integrated into processors. - * 8 DDR3 DIMMs per node - * 4 DDR3 DIMMs per CPU - * 1 DDR3 DIMMs per channel - * Data rate support: up to 1600MT/s -* Populated memory: 8 x 8 GB DDR3 DIMM 1600 MHz - -### Compute Nodes With a GPU or MIC Accelerator - -* 2 sockets -* Memory Controllers are integrated into processors. - * 6 DDR3 DIMMs per node - * 3 DDR3 DIMMs per CPU - * 1 DDR3 DIMMs per channel - * Data rate support: up to 1600MT/s -* Populated memory: 6 x 16 GB DDR3 DIMM 1600 MHz - -### Fat Compute Nodes - -* 2 sockets -* Memory Controllers are integrated into processors. - * 16 DDR3 DIMMs per node - * 8 DDR3 DIMMs per CPU - * 2 DDR3 DIMMs per channel - * Data rate support: up to 1600MT/s -* Populated memory: 16 x 32 GB DDR3 DIMM 1600 MHz diff --git a/content/docs/anselm/hardware-overview.mdx b/content/docs/anselm/hardware-overview.mdx deleted file mode 100644 index ea4fc2f5a38eb33618fbdfeb7a2836436430a7dd..0000000000000000000000000000000000000000 --- a/content/docs/anselm/hardware-overview.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Hardware Overview" ---- -The Anselm cluster consists of 209 computational nodes named cn[1-209] of which 180 are regular compute nodes, 23 are GPU Kepler K20 accelerated nodes, 4 are MIC Xeon Phi 5110P accelerated nodes, and 2 are fat nodes. Each node is a powerful x86-64 computer, equipped with 16 cores (two eight-core Intel Sandy Bridge processors), at least 64 GB of RAM, and a local hard drive. User access to the Anselm cluster is provided by two login nodes login[1,2]. The nodes are interlinked through high speed InfiniBand and Ethernet networks. All nodes share a 320 TB /home disk for storage of user files. The 146 TB shared /scratch storage is available for scratch data. - -The Fat nodes are equipped with a large amount (512 GB) of memory. Virtualization infrastructure provides resources to run long-term servers and services in virtual mode. Fat nodes and virtual servers may access 45 TB of dedicated block storage. Accelerated nodes, fat nodes, and virtualization infrastructure are available [upon request][a] from a PI. - -Schematic representation of the Anselm cluster. Each box represents a node (computer) or storage capacity: - - - -The cluster compute nodes cn[1-207] are organized within 13 chassis. - -There are four types of compute nodes: - -* 180 compute nodes without an accelerator -* 23 compute nodes with a GPU accelerator - an NVIDIA Tesla Kepler K20m -* 4 compute nodes with a MIC accelerator - an Intel Xeon Phi 5110P -* 2 fat nodes - equipped with 512 GB of RAM and two 100 GB SSD drives - -[More about Compute nodes][1]. - -GPU and accelerated nodes are available upon request, see the [Resources Allocation Policy][2]. - -All of these nodes are interconnected through fast InfiniBand and Ethernet networks. [More about the Network][3]. -Every chassis provides an InfiniBand switch, marked **isw**, connecting all nodes in the chassis, as well as connecting the chassis to the upper level switches. - -All of the nodes share a 360 TB /home disk for storage of user files. The 146 TB shared /scratch storage is available for scratch data. These file systems are provided by the Lustre parallel file system. There is also local disk storage available on all compute nodes in /lscratch. [More about Storage][4]. - -User access to the Anselm cluster is provided by two login nodes login1, login2, and data mover node dm1. [More about accessing the cluster][5]. - -The parameters are summarized in the following tables: - -| **In general** | | -| ------------------------------------------- | -------------------------------------------- | -| Primary purpose | High Performance Computing | -| Architecture of compute nodes | x86-64 | -| Operating system | Linux (CentOS) | -| [**Compute nodes**][1] | | -| Total | 209 | -| Processor cores | 16 (2 x 8 cores) | -| RAM | min. 64 GB, min. 4 GB per core | -| Local disk drive | yes - usually 500 GB | -| Compute network | InfiniBand QDR, fully non-blocking, fat-tree | -| w/o accelerator | 180, cn[1-180] | -| GPU accelerated | 23, cn[181-203] | -| MIC accelerated | 4, cn[204-207] | -| Fat compute nodes | 2, cn[208-209] | -| **In total** | | -| Total theoretical peak performance (Rpeak) | 94 TFLOP/s | -| Total max. LINPACK performance (Rmax) | 73 TFLOP/s | -| Total amount of RAM | 15.136 TB | - -| Node | Processor | Memory | Accelerator | -| ---------------- | --------------------------------------- | ------ | -------------------- | -| w/o accelerator | 2 x Intel Sandy Bridge E5-2665, 2.4 GHz | 64 GB | - | -| GPU accelerated | 2 x Intel Sandy Bridge E5-2470, 2.3 GHz | 96 GB | NVIDIA Kepler K20m | -| MIC accelerated | 2 x Intel Sandy Bridge E5-2470, 2.3 GHz | 96 GB | Intel Xeon Phi 5110P | -| Fat compute node | 2 x Intel Sandy Bridge E5-2665, 2.4 GHz | 512 GB | - | - -For more details, refer to [Compute nodes][1], [Storage][4], and [Network][3]. - -[1]: compute-nodes.md -[2]: ../general/resources-allocation-policy.md -[3]: network.md -[4]: storage.md -[5]: ../general/shell-and-data-access.md - -[a]: https://support.it4i.cz/rt diff --git a/content/docs/anselm/introduction.mdx b/content/docs/anselm/introduction.mdx deleted file mode 100644 index 32d1a5235c16f8b281dcb8564b55cf39d4223621..0000000000000000000000000000000000000000 --- a/content/docs/anselm/introduction.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Introduction" ---- -Welcome to the Anselm supercomputer cluster. The Anselm cluster consists of 209 compute nodes, totaling 3344 compute cores with 15 TB RAM, giving over 94 TFLOP/s theoretical peak performance. Each node is a powerful x86-64 computer, equipped with 16 cores, at least 64 GB of RAM, and a 500 GB hard disk drive. Nodes are interconnected through a fully non-blocking fat-tree InfiniBand network and are equipped with Intel Sandy Bridge processors. A few nodes are also equipped with NVIDIA Kepler GPU or Intel Xeon Phi MIC accelerators. Read more in [Hardware Overview][1]. - -Anselm runs with an operating system compatible with the Red Hat [Linux family][a]. We have installed a wide range of software packages targeted at different scientific domains. These packages are accessible via the [modules environment][2]. - -The user data shared file-system (HOME, 320 TB) and job data shared file-system (SCRATCH, 146 TB) are available to users. - -The PBS Professional workload manager provides [computing resources allocations and job execution][3]. - -Read more on how to [apply for resources][4], [obtain login credentials][5] and [access the cluster][6]. - -[1]: hardware-overview.md -[2]: ../environment-and-modules.md -[3]: ../general/resources-allocation-policy.md -[4]: ../general/applying-for-resources.md -[5]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[6]: ../general/shell-and-data-access.md - -[a]: http://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg diff --git a/content/docs/anselm/meta.json b/content/docs/anselm/meta.json deleted file mode 100644 index 6c29436544951295c9df8afd502512da92758785..0000000000000000000000000000000000000000 --- a/content/docs/anselm/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Anselm", - "pages": [ - "compute-nodes", - "hardware-overview", - "introduction", - "network", - "storage" - ] -} diff --git a/content/docs/anselm/network.mdx b/content/docs/anselm/network.mdx deleted file mode 100644 index b4055bc80e125e738589a0c54cd1853513047c5f..0000000000000000000000000000000000000000 --- a/content/docs/anselm/network.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Network" ---- -All of the compute and login nodes of Anselm are interconnected through an [InfiniBand][a] QDR network and a Gigabit [Ethernet][b] network. Both networks may be used to transfer user data. - -## InfiniBand Network - -All of the compute and login nodes of Anselm are interconnected through a high-bandwidth, low-latency [InfiniBand][a] QDR network (IB 4 x QDR, 40 Gbps). The network topology is a fully non-blocking fat-tree. - -The compute nodes may be accessed via the InfiniBand network using the ib0 network interface, in address range 10.2.1.1-209. The MPI may be used to establish native InfiniBand connection among the nodes. - -<Callout> - The network provides **2170 MB/s** transfer rates via the TCP connection (single stream) and up to **3600 MB/s** via the native InfiniBand protocol. -</Callout> - -The Fat tree topology ensures that peak transfer rates are achieved between any two nodes, independent of network traffic exchanged among other nodes concurrently. - -## Ethernet Network - -The compute nodes may be accessed via the regular Gigabit Ethernet network interface eth0, in the address range 10.1.1.1-209, or by using aliases cn1-cn209. The network provides **114 MB/s** transfer rates via the TCP connection. - -## Example - -In this example, we access the node cn110 through the InfiniBand network via the ib0 interface, then from cn110 to cn108 through the Ethernet network. - -```console -$ qsub -q qexp -l select=4:ncpus=16 -N Name0 ./myjob -$ qstat -n -u username - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -15209.srv11 username qexp Name0 5530 4 64 -- 01:00 R 00:00 - cn17/0*16+cn108/0*16+cn109/0*16+cn110/0*16 - -$ ssh 10.2.1.110 -$ ssh 10.1.1.108 -``` - -[a]: http://en.wikipedia.org/wiki/InfiniBand -[b]: http://en.wikipedia.org/wiki/Ethernet diff --git a/content/docs/anselm/storage.mdx b/content/docs/anselm/storage.mdx deleted file mode 100644 index c5781e577f6391d2cc004d4f965c5d3fb7e44fe5..0000000000000000000000000000000000000000 --- a/content/docs/anselm/storage.mdx +++ /dev/null @@ -1,444 +0,0 @@ ---- -title: "Storage" ---- -There are two main shared file systems on Anselm cluster, the [HOME][1] and [SCRATCH][2]. All login and compute nodes may access same data on shared file systems. Compute nodes are also equipped with local (non-shared) scratch, RAM disk, and tmp file systems. - -## Archiving - -Do not use shared filesystems as a backup for large amount of data or long-term archiving mean. The academic staff and students of research institutions in the Czech Republic can use [CESNET storage service][3], which is available via SSHFS. - -## Shared Filesystems - -Anselm computer provides two main shared filesystems, the [HOME filesystem][1] and the [SCRATCH filesystem][2]. Both HOME and SCRATCH filesystems are realized as a parallel Lustre filesystem. Both shared file systems are accessible via the Infiniband network. Extended ACLs are provided on both Lustre filesystems for sharing data with other users using fine-grained control. - -### Understanding the Lustre Filesystems - -A user file on the [Lustre filesystem][a] can be divided into multiple chunks (stripes) and stored across a subset of the object storage targets (OSTs) (disks). The stripes are distributed among the OSTs in a round-robin fashion to ensure load balancing. - -When a client (a compute node from your job) needs to create or access a file, the client queries the metadata server (MDS) and the metadata target (MDT) for the layout and location of the [file's stripes][b]. Once the file is opened and the client obtains the striping information, the MDS is no longer involved in the file I/O process. The client interacts directly with the object storage servers (OSSes) and OSTs to perform I/O operations such as locking, disk allocation, storage, and retrieval. - -If multiple clients try to read and write the same part of a file at the same time, the Lustre distributed lock manager enforces coherency so that all clients see consistent results. - -There is a default stripe configuration for Anselm Lustre filesystems. However, users can set the following stripe parameters for their own directories or files to get optimum I/O performance: - -1. stripe_size: the size of the chunk in bytes; specify with k, m, or g to use units of KB, MB, or GB, respectively; the size must be an even multiple of 65,536 bytes; default is 1MB for all Anselm Lustre filesystems -1. stripe_count the number of OSTs to stripe across; default is 1 for Anselm Lustre filesystems one can specify -1 to use all OSTs in the filesystem. -1. stripe_offset The index of the OST where the first stripe is to be placed; default is -1 which results in random selection; using a non-default value is NOT recommended. - -<Callout> - Setting stripe size and stripe count correctly may significantly affect the I/O performance. -</Callout> - -Use the lfs getstripe to get the stripe parameters. Use the lfs setstripe command to set the stripe parameters for optimal I/O performance. The correct stripe setting depends on your needs and file access patterns. - -```console -$ lfs getstripe dir|filename -$ lfs setstripe -s stripe_size -c stripe_count -o stripe_offset dir|filename -``` - -Example: - -```console -$ lfs getstripe /scratch/username/ -/scratch/username/ -stripe_count: 1 stripe_size: 1048576 stripe_offset: -1 - -$ lfs setstripe -c -1 /scratch/username/ -$ lfs getstripe /scratch/username/ -/scratch/username/ -stripe_count: 10 stripe_size: 1048576 stripe_offset: -1 -``` - -In this example, we view the current stripe setting of the /scratch/username/ directory. The stripe count is changed to all OSTs and verified. All files written to this directory will be striped over 10 OSTs. - -Use lfs check OSTs to see the number and status of active OSTs for each filesystem on Anselm. Learn more by reading the man page: - -```console -$ lfs check osts -$ man lfs -``` - -### Hints on Lustre Stripping - -<Callout> - Increase the stripe_count for parallel I/O to the same file. -</Callout> - -When multiple processes are writing blocks of data to the same file in parallel, the I/O performance for large files will improve when the stripe_count is set to a larger value. The stripe count sets the number of OSTs to which the file will be written. By default, the stripe count is set to 1. While this default setting provides for efficient access of metadata (for example to support the ls -l command), large files should use stripe counts of greater than 1. This will increase the aggregate I/O bandwidth by using multiple OSTs in parallel instead of just one. A rule of thumb is to use a stripe count approximately equal to the number of gigabytes in the file. - -Another good practice is to make the stripe count be an integral factor of the number of processes performing the write in parallel, so that you achieve load balance among the OSTs. For example, set the stripe count to 16 instead of 15 when you have 64 processes performing the writes. - -<Callout> - Using a large stripe size can improve performance when accessing very large files. -</Callout> - -Large stripe size allows each client to have exclusive access to its own part of a file. However, it can be counterproductive in some cases if it does not match your I/O pattern. The choice of stripe size has no effect on a single-stripe file. - -Read more [here][c]. - -### Lustre on Anselm - -The architecture of Lustre on Anselm is composed of two metadata servers (MDS) and four data/object storage servers (OSS). Two object storage servers are used for file system HOME and another two object storage servers are used for file system SCRATCH. - - Configuration of the storages - -* HOME Lustre object storage - * One disk array NetApp E5400 - * 22 OSTs - * 227 2TB NL-SAS 7.2krpm disks - * 22 groups of 10 disks in RAID6 (8+2) - * 7 hot-spare disks -* SCRATCH Lustre object storage - * Two disk arrays NetApp E5400 - * 10 OSTs - * 106 2TB NL-SAS 7.2krpm disks - * 10 groups of 10 disks in RAID6 (8+2) - * 6 hot-spare disks -* Lustre metadata storage - * One disk array NetApp E2600 - * 12 300GB SAS 15krpm disks - * 2 groups of 5 disks in RAID5 - * 2 hot-spare disks - -### HOME File System - -The HOME filesystem is mounted in directory /home. Users home directories /home/username reside on this filesystem. Accessible capacity is 320TB, shared among all users. Individual users are restricted by filesystem usage quotas, set to 250GB per user. If 250GB should prove as insufficient for particular user, contact [support][d], the quota may be lifted upon request. - -<Callout> - The HOME filesystem is intended for preparation, evaluation, processing and storage of data generated by active Projects. -</Callout> - -The HOME filesystem should not be used to archive data of past Projects or other unrelated data. - -The files on HOME filesystem will not be deleted until the end of the [user's lifecycle][4]. - -The filesystem is backed up, such that it can be restored in case of catastrophic failure resulting in significant data loss. This backup however is not intended to restore old versions of user data or to restore (accidentally) deleted files. - -The HOME filesystem is realized as Lustre parallel filesystem and is available on all login and computational nodes. -Default stripe size is 1MB, stripe count is 1. There are 22 OSTs dedicated for the HOME filesystem. - -<Callout> - Setting stripe size and stripe count correctly for your needs may significantly affect the I/O performance. -</Callout> - -| HOME filesystem | | -| -------------------- | ------ | -| Mountpoint | /home | -| Capacity | 320 TB | -| Throughput | 2 GB/s | -| User space quota | 250 GB | -| User inodes quota | 500 k | -| Default stripe size | 1 MB | -| Default stripe count | 1 | -| Number of OSTs | 22 | - -### SCRATCH File System - -The SCRATCH filesystem is mounted in directory /scratch. Users may freely create subdirectories and files on the filesystem. Accessible capacity is 146TB, shared among all users. Individual users are restricted by filesystem usage quotas, set to 100TB per user. The purpose of this quota is to prevent runaway programs from filling the entire filesystem and deny service to other users. If 100TB should prove as insufficient for particular user, contact [support][d], the quota may be lifted upon request. - -<Callout> - The Scratch filesystem is intended for temporary scratch data generated during the calculation as well as for high performance access to input and output files. All I/O intensive jobs must use the SCRATCH filesystem as their working directory. - - Users are advised to save the necessary data from the SCRATCH filesystem to HOME filesystem after the calculations and clean up the scratch files. -</Callout> - -<Callout type=warn> - Files on the SCRATCH filesystem that are **not accessed for more than 90 days** will be automatically **deleted**. -</Callout> - -The SCRATCH filesystem is realized as Lustre parallel filesystem and is available from all login and computational nodes. Default stripe size is 1MB, stripe count is 1. There are 10 OSTs dedicated for the SCRATCH filesystem. - -<Callout> - Setting stripe size and stripe count correctly for your needs may significantly affect the I/O performance. -</Callout> - -| SCRATCH filesystem | | -| -------------------- | -------- | -| Mountpoint | /scratch | -| Capacity | 146 TB | -| Throughput | 6 GB/s | -| User space quota | 100 TB | -| User inodes quota | 10 M | -| Default stripe size | 1 MB | -| Default stripe count | 1 | -| Number of OSTs | 10 | - -### Disk Usage and Quota Commands - -Disk usage and user quotas can be checked and reviewed using the following command: - -```console -$ it4i-disk-usage -``` - -Example: - -```console -$ it4i-disk-usage -h -# Using human-readable format -# Using power of 1024 for space -# Using power of 1000 for entries - -Filesystem: /home -Space used: 112GiB -Space limit: 238GiB -Entries: 15K -Entries limit: 500K - -Filesystem: /scratch -Space used: 0 -Space limit: 93TiB -Entries: 0 -Entries limit: 10M -``` - -In this example, we view current size limits and space occupied on the /home and /scratch filesystem, for a particular user executing the command. -Note that limits are imposed also on number of objects (files, directories, links, etc...) that are allowed to create. - -To have a better understanding of where the space is exactly used, you can use following command to find out. - -```console -$ du -hs dir -``` - -Example for your HOME directory: - -```console -$ cd /home -$ du -hs * .[a-zA-z0-9]* | grep -E "[0-9]*G|[0-9]*M" | sort -hr -258M cuda-samples -15M .cache -13M .mozilla -5,5M .eclipse -2,7M .idb_13.0_linux_intel64_app -``` - -This will list all directories that have MegaBytes or GigaBytes of consumed space in your actual (in this example HOME) directory. List is sorted in descending order from largest to smallest files/directories. - -To have a better understanding of previous commands, you can read man pages: - -```console -$ man lfs -``` - -```console -$ man du -``` - -### Extended ACLs - -Extended ACLs provide another security mechanism beside the standard POSIX ACLs that are defined by three entries (for owner/group/others). Extended ACLs have more than the three basic entries. In addition, they also contain a mask entry and may contain any number of named user and named group entries. - -ACLs on a Lustre file system work exactly like ACLs on any Linux file system. They are manipulated with the standard tools in the standard manner. Below, we create a directory and allow a specific user access. - -```console -[vop999@login1.anselm ~]$ umask 027 -[vop999@login1.anselm ~]$ mkdir test -[vop999@login1.anselm ~]$ ls -ld test -drwxr-x--- 2 vop999 vop999 4096 Nov 5 14:17 test -[vop999@login1.anselm ~]$ getfacl test -# file: test -# owner: vop999 -# group: vop999 -user::rwx -group::r-x -other::--- - -[vop999@login1.anselm ~]$ setfacl -m user:johnsm:rwx test -[vop999@login1.anselm ~]$ ls -ld test -drwxrwx---+ 2 vop999 vop999 4096 Nov 5 14:17 test -[vop999@login1.anselm ~]$ getfacl test -# file: test -# owner: vop999 -# group: vop999 -user::rwx -user:johnsm:rwx -group::r-x -mask::rwx -other::--- -``` - -Default ACL mechanism can be used to replace setuid/setgid permissions on directories. Setting a default ACL on a directory (-d flag to setfacl) will cause the ACL permissions to be inherited by any newly created file or subdirectory within the directory. For more information, see [ACL in Linux][e]. - -## Local Filesystems - -### Local Scratch - -<Callout> - Every computational node is equipped with 330GB local scratch disk. -</Callout> - -Use local scratch in case you need to access large amount of small files during your calculation. - -The local scratch disk is mounted as /lscratch and is accessible to user at /lscratch/$PBS_JOBID directory. - -The local scratch filesystem is intended for temporary scratch data generated during the calculation as well as for high performance access to input and output files. All I/O intensive jobs that access large number of small files within the calculation must use the local scratch filesystem as their working directory. This is required for performance reasons, as frequent access to number of small files may overload the metadata servers (MDS) of the Lustre filesystem. - -<Callout> - The local scratch directory /lscratch/$PBS_JOBID will be deleted immediately after the calculation end. Users should take care to save the output data from within the jobscript. -</Callout> - -| local SCRATCH filesystem | | -| ------------------------ | -------------------- | -| Mountpoint | /lscratch | -| Accesspoint | /lscratch/$PBS_JOBID | -| Capacity | 330 GB | -| Throughput | 100 MB/s | -| User quota | none | - -### RAM Disk - -Every computational node is equipped with filesystem realized in memory, so called RAM disk. - -<Callout> - Use RAM disk in case you need a fast access to your data of limited size during your calculation. Be very careful, use of RAM disk filesystem is at the expense of operational memory. -</Callout> - -The local RAM disk is mounted as /ramdisk and is accessible to user at /ramdisk/$PBS_JOBID directory. - -The local RAM disk filesystem is intended for temporary scratch data generated during the calculation as well as for high performance access to input and output files. Size of RAM disk filesystem is limited. Be very careful, use of RAM disk filesystem is at the expense of operational memory. It is not recommended to allocate large amount of memory and use large amount of data in RAM disk filesystem at the same time. - -<Callout> - The local RAM disk directory /ramdisk/$PBS_JOBID will be deleted immediately after the calculation end. Users should take care to save the output data from within the jobscript. -</Callout> - -| RAM disk | | -| ----------- | -------------------------------------------------------------------------------------------------------- | -| Mountpoint | /ramdisk | -| Accesspoint | /ramdisk/$PBS_JOBID | -| Capacity | 60 GB at compute nodes without accelerator, 90 GB at compute nodes with accelerator, 500 GB at fat nodes | -| Throughput | over 1.5 GB/s write, over 5 GB/s read, single thread, over 10 GB/s write, over 50 GB/s read, 16 threads | -| User quota | none | - -### TMP - -Each node is equipped with local /tmp directory of few GB capacity. The /tmp directory should be used to work with small temporary files. Old files in /tmp directory are automatically purged. - -## Summary - -| Mountpoint | Usage | Protocol | Net Capacity | Throughput | Space/Inodes quota | Access | Services | | -| ---------- | ------------------------- | -------- | -------------- | ---------- | ------------------------ | ----------------------- | --------------------------- | ------ | -| /home | home directory | Lustre | 320 TiB | 2 GB/s | 250 GB / 500 k | Compute and login nodes | backed up | | -| /scratch | cluster shared jobs' data | Lustre | 146 TiB | 6 GB/s | 100 TB / 10 M | Compute and login nodes | files older 90 days removed | | -| /lscratch | node local jobs' data | local | 330 GB | 100 MB/s | none / none | Compute nodes | purged after job ends | | -| /ramdisk | node local jobs' data | local | 60, 90, 500 GB | 5-50 GB/s | none / none | Compute nodes | purged after job ends | | -| /tmp | local temporary files | local | 9.5 GB | 100 MB/s | none / none | Compute and login nodes | auto | purged | - -## CESNET Data Storage - -Do not use shared filesystems at IT4Innovations as a backup for large amount of data or long-term archiving purposes. - -<Callout> - The IT4Innovations does not provide storage capacity for data archiving. Academic staff and students of research institutions in the Czech Republic can use [CESNET Storage service][f]. -</Callout> - -The CESNET Storage service can be used for research purposes, mainly by academic staff and students of research institutions in the Czech Republic. - -User of data storage CESNET (DU) association can become organizations or an individual person who is in the current employment relationship (employees) or the current study relationship (students) to a legal entity (organization) that meets the “Principles for access to CESNET Large infrastructure (Access Policy)”. - -User may only use data storage CESNET for data transfer and storage associated with activities in science, research, development, spread of education, culture and prosperity. For details, see "Acceptable Use Policy CESNET Large Infrastructure (Acceptable Use Policy, AUP)". - -The service is documented [here][g]. For special requirements contact directly CESNET Storage Department via e-mail [du-support(at)cesnet.cz][h]. - -The procedure to obtain the CESNET access is quick and trouble-free. - -## CESNET Storage Access - -### Understanding CESNET Storage - -<Callout> - It is very important to understand the CESNET storage before uploading data. [Read][i] first. -</Callout> - -Once registered for CESNET Storage, you may [access the storage][j] in number of ways. We recommend the SSHFS and RSYNC methods. - -### SSHFS Access - -<Callout> - SSHFS: The storage will be mounted like a local hard drive -</Callout> - -The SSHFS provides a very convenient way to access the CESNET Storage. The storage will be mounted onto a local directory, exposing the vast CESNET Storage as if it was a local removable hard drive. Files can be than copied in and out in a usual fashion. - -First, create the mount point - -```console -$ mkdir cesnet -``` - -Mount the storage. Note that you can choose among the ssh.du1.cesnet.cz (Plzen), ssh.du2.cesnet.cz (Jihlava), ssh.du3.cesnet.cz (Brno) Mount tier1_home **(only 5120 MB!)**: - -```console -$ sshfs username@ssh.du1.cesnet.cz:. cesnet/ -``` - -For easy future access from Anselm, install your public key - -```console -$ cp .ssh/id_rsa.pub cesnet/.ssh/authorized_keys -``` - -Mount tier1_cache_tape for the Storage VO: - -```console -$ sshfs username@ssh.du1.cesnet.cz:/cache_tape/VO_storage/home/username cesnet/ -``` - -View the archive, copy the files and directories in and out - -```console -$ ls cesnet/ -$ cp -a mydir cesnet/. -$ cp cesnet/myfile . -``` - -Once done, remember to unmount the storage - -```console -$ fusermount -u cesnet -``` - -### RSYNC Access - -<Callout> - RSYNC provides delta transfer for best performance and can resume interrupted transfers. -</Callout> - -RSYNC is a fast and extraordinarily versatile file copying tool. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination. RSYNC is widely used for backups and mirroring and as an improved copy command for everyday use. - -RSYNC finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time. Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file's data does not need to be updated. - -[More about RSYNC][k]. - -Transfer large files to/from CESNET storage, assuming membership in the Storage VO: - -```console -$ rsync --progress datafile username@ssh.du1.cesnet.cz:VO_storage-cache_tape/. -$ rsync --progress username@ssh.du1.cesnet.cz:VO_storage-cache_tape/datafile . -``` - -Transfer large directories to/from CESNET storage, assuming membership in the Storage VO: - -```console -$ rsync --progress -av datafolder username@ssh.du1.cesnet.cz:VO_storage-cache_tape/. -$ rsync --progress -av username@ssh.du1.cesnet.cz:VO_storage-cache_tape/datafolder . -``` - -Transfer rates of about 28 MB/s can be expected. - -[1]: #home -[2]: #scratch -[3]: #cesnet-data-storage -[4]: ../general/obtaining-login-credentials/obtaining-login-credentials.md - -[a]: http://www.nas.nasa.gov -[b]: http://www.nas.nasa.gov/hecc/support/kb/Lustre_Basics_224.html#striping -[c]: http://doc.lustre.org/lustre_manual.xhtml#managingstripingfreespace -[d]: https://support.it4i.cz/rt -[e]: https://www.geeksforgeeks.org/access-control-listsacl-linux/ -[f]: https://du.cesnet.cz/ -[g]: https://du.cesnet.cz/en/start -[h]: mailto:du-support@cesnet.cz -[i]: https://du.cesnet.cz/en/navody/home-migrace-plzen/start -[j]: https://du.cesnet.cz/en/navody/faq/start -[k]: https://du.cesnet.cz/en/navody/rsync/start#pro_bezne_uzivatele diff --git a/content/docs/apiv1.mdx b/content/docs/apiv1.mdx deleted file mode 100644 index 36def4dc2b54ac3dfdb5f03e5692c3b6cf11fedb..0000000000000000000000000000000000000000 --- a/content/docs/apiv1.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "API Placeholder" ---- -This page is created automatically from the API source code. diff --git a/content/docs/archive/archive-intro.mdx b/content/docs/archive/archive-intro.mdx deleted file mode 100644 index 6fdaba9021cb86375b04f6eea7d9ad40a8d039dd..0000000000000000000000000000000000000000 --- a/content/docs/archive/archive-intro.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Introduction" ---- -This section contains documentation of decommissioned IT4Innovations' supercomputers and services. - -## Salomon - -The second supercomputer, built by SGI (now Hewlett Packard Enterprise), was launched in 2015. With a performance of 2 PFlop/s, it was immediately included in the TOP500 list, which ranks the world's most powerful supercomputers. It stayed there until November 2020, falling from the 40th place to 460th. - -Salomon was decommissioned after six years - at the end of 2021. - -### Interesting Facts - -| Salomon's facts | | -| ---------------------------- | ------------------ | -| In operation | Q2 2015 - Q4 2021 | -| Theoretical peak performance | 2 PFLOP/s | -| Number of nodes | 1,008 | -| HOME storage capacity | 500 TB | -| SCRATCH storage capacity | 1,638 TB | -| Projects computed | 1,085 | -| Computing jobs run | ca. 8,700,000 | -| Corehours used | ca. 1,014,000,000 | - -## Anselm - -The first supercomputer, built by Atos, was launched in 2013. For the first 3 years, it was placed in makeshift containers on the campus of VSB – Technical University of Ostrava, and was subsequently moved to the data room of the newly constructed IT4Innovations building. Anselm's computational resources were available to Czech and foreign students and scientists in fields such as material sciences, computational chemistry, biosciences, and engineering. - -At the end of January 2021, after more than seven years, its operation permanently ceased. In the future, it will be a part of the [World of Civilization exhibition][a] in Lower Vitkovice. - -### Interesting Facts - -| Anselm's facts | | -| ---------------------------- | ------------------ | -| Cost | 90,000,000 CZK | -| In operation | Q2 2013 - Q1 2021 | -| Theoretical peak performance | 94 TFLOP/s | -| Number of nodes | 209 | -| HOME storage capacity | 320 TB | -| SCRATCH storage capacity | 146 TB | -| Projects computed | 725 | -| Computing jobs run | 2,630,567 | -| Corehours used | 134,130,309 | -| Power consumption | 77 kW | - -## PRACE - -Partnership for Advanced Computing in Europe aims to facilitate the access to a research infrastructure that enables high-impact scientific discovery and engineering research and development across all disciplines to enhance European competitiveness for the benefit of society. For more information, see the [official website][b]. - -[a]: https://www.dolnivitkovice.cz/en/science-and-technology-centre/exhibitions/ -[b]: https://prace-ri.eu/ diff --git a/content/docs/archive/meta.json b/content/docs/archive/meta.json deleted file mode 100644 index 6e4ae1ca36e0036edcf24eeec7d63a63480d9b42..0000000000000000000000000000000000000000 --- a/content/docs/archive/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Archive", - "pages": [ - "archive-intro" - ] -} diff --git a/content/docs/barbora/compute-nodes.mdx b/content/docs/barbora/compute-nodes.mdx deleted file mode 100644 index ea3c845f10671c99f984ed48aec26a0896ac7805..0000000000000000000000000000000000000000 --- a/content/docs/barbora/compute-nodes.mdx +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: "Compute Nodes" ---- -Barbora is a cluster of x86-64 Intel-based nodes built with the BullSequana Computing technology. -The cluster contains three types of compute nodes. - -## Compute Nodes Without Accelerators - -* 192 nodes -* 6912 cores in total -* 2x Intel Cascade Lake 6240, 18-core, 2.6 GHz processors per node -* 192 GB DDR4 2933 MT/s of physical memory per node (12x16 GB) -* BullSequana X1120 blade servers -* 2995.2 GFLOP/s per compute node -* 1x 1 GB Ethernet -* 1x HDR100 IB port -* 3 compute nodes per X1120 blade server -* cn[1-192] - - - -## Compute Nodes With a GPU Accelerator - -* 8 nodes -* 192 cores in total -* two Intel Skylake Gold 6126, 12-core, 2.6 GHz processors per node -* 192 GB DDR4 2933MT/s with ECC of physical memory per node (12x16 GB) -* 4x GPU accelerator NVIDIA Tesla V100-SXM2 per node -* Bullsequana X410-E5 NVLink-V blade servers -* 1996.8 GFLOP/s per compute nodes -* GPU-to-GPU All-to-All NVLINK 2.0, GPU-Direct -* 1 GB Ethernet -* 2x HDR100 IB ports -* cn[193-200] - - - -## Fat Compute Node - -* 1x BullSequana X808 server -* 128 cores in total -* 8 Intel Skylake 8153, 16-core, 2.0 GHz, 125 W -* 6144 GiB DDR4 2667 MT/s of physical memory per node (92x64 GB) -* 2x HDR100 IB port -* 8192 GFLOP/s -* cn[201] - - - -## Compute Node Summary - -| Node type | Count | Range | Memory | Cores | -| ---------------------------- | ----- | ----------- | -------- | ------------- | -| Nodes without an accelerator | 192 | cn[1-192] | 192 GB | 36 @ 2.6 GHz | -| Nodes with a GPU accelerator | 8 | cn[193-200] | 192 GB | 24 @ 2.6 GHz | -| Fat compute nodes | 1 | cn[201] | 6144 GiB | 128 @ 2.0 GHz | - -## Processor Architecture - -Barbora is equipped with Intel Cascade Lake processors Intel Xeon 6240 (nodes without accelerators), -Intel Skylake Gold 6126 (nodes with accelerators) and Intel Skylake Platinum 8153. - -### Intel [Cascade Lake 6240][d] - -Cascade Lake core is largely identical to that of [Skylake's][a]. -For in-depth detail of the Skylake core/pipeline see [Skylake (client) § Pipeline][b]. - -Xeon Gold 6240 is a 64-bit 18-core x86 multi-socket high performance server microprocessor set to be introduced by Intel in late 2018. This chip supports up to 4-way multiprocessing. The Gold 6240, which is based on the Cascade Lake microarchitecture and is manufactured on a 14 nm process, sports 2 AVX-512 FMA units as well as three Ultra Path Interconnect links. This microprocessor, which operates at 2.6 GHz with a TDP of 150 W and a turbo boost frequency of up to 3.9 GHz, supports up 1 TB of hexa-channel DDR4-2933 ECC memory. - -* **Family**: Xeon Gold -* **Cores**: 18 -* **Threads**: 36 -* **L1I Cache**: 576 KiB, 18x32 KiB, 8-way set associative -* **L1D Cache**: 576 KiB, 18x32 KiB, 8-way set associative, write-back -* **L2 Cache**: 18 MiB, 18x1 MiB, 16-way set associative, write-back -* **L3 Cache**: 24.75 MiB, 18x1.375 MiB, 11-way set associative, write-back -* **Instructions**: x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA3, F16C, BMI, BMI2, VT-x, VT-d, TXT, TSX, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVE, SGX, MPX, AVX-512 (New instructions for [Vector Neural Network Instructions][c]) -* **Frequency**: 2.6 GHz -* **Max turbo**: 3.9 GHz -* **Process**: 14 nm -* **TDP**: 140+ W - -### Intel [Skylake Gold 6126][e] - -Xeon Gold 6126 is a 64-bit dodeca-core x86 multi-socket high performance server microprocessor introduced by Intel in mid-2017. This chip supports up to 4-way multiprocessing. The Gold 6126, which is based on the server configuration of the Skylake microarchitecture and is manufactured on a 14 nm+ process, sports 2 AVX-512 FMA units as well as three Ultra Path Interconnect links. This microprocessor, which operates at 2.6 GHz with a TDP of 125 W and a turbo boost frequency of up to 3.7 GHz, supports up to 768 GiB of hexa-channel DDR4-2666 ECC memory. - -* **Family**: Xeon Gold -* **Cores**: 12 -* **Threads**: 24 -* **L1I Cache**: 384 KiB, 12x32 KiB, 8-way set associative -* **L1D Cache**: 384 KiB, 12x32 KiB, 8-way set associative, write-back -* **L2 Cache**: 12 MiB, 12x1 MiB, 16-way set associative, write-back -* **L3 Cache**: 19.25 MiB, 14x1.375 MiB, 11-way set associative, write-back -* **Instructions**: x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA3, F16C, BMI, BMI2, VT-x, VT-d, TXT, TSX, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVE, SGX, MPX, AVX-512 -* **Frequency**: 2.6 GHz -* **Max turbo**: 3.7 GHz -* **Process**: 14 nm -* **TDP**: 125 W - -### Intel [Skylake Platinum 8153][f] - -Xeon Platinum 8153 is a 64-bit 16-core x86 multi-socket highest performance server microprocessor introduced by Intel in mid-2017. This chip supports up to 8-way multiprocessing. The Platinum 8153, which is based on the server configuration of the Skylake microarchitecture and is manufactured on a 14 nm+ process, sports 2 AVX-512 FMA units as well as three Ultra Path Interconnect links. This microprocessor, which operates at 2 GHz with a TDP of 125 W and a turbo boost frequency of up to 2.8 GHz, supports up to 768 GiB of hexa-channel DDR4-2666 ECC memory. - -* **Family**: Xeon Platinum -* **Cores**: 16 -* **Threads**: 32 -* **L1I Cache**: 512 KiB, 16x32 KiB, 8-way set associative -* **L1D Cache**: 512 KiB, 16x32 KiB, 8-way set associative, write-back -* **L2 Cache**: 16 MiB, 16x1 MiB, 16-way set associative, write-back -* **L3 Cache**: 22 MiB, 16x1.375 MiB, 11-way set associative, write-back -* **Instructions**: x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA3, F16C, BMI, BMI2, VT-x, VT-d, TXT, TSX, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVE, SGX, MPX, AVX-512 -* **Frequency**: 2.0 GHz -* **Max turbo**: 2.8 GHz -* **Process**: 14 nm -* **TDP**: 125 W - -## GPU Accelerator - -Barbora is equipped with an [NVIDIA Tesla V100-SXM2][g] accelerator. - - - -| NVIDIA Tesla V100-SXM2 | | -| ---------------------------- | -------------------------------------- | -| GPU Architecture | NVIDIA Volta | -| NVIDIA Tensor Cores | 640 | -| NVIDIA CUDA® Cores | 5120 | -| Double-Precision Performance | 7.8 TFLOP/s | -| Single-Precision Performance | 15.7 TFLOP/s | -| Tensor Performance | 125 TFLOP/s | -| GPU Memory | 16 GB HBM2 | -| Memory Bandwidth | 900 GB/sec | -| ECC | Yes | -| Interconnect Bandwidth | 300 GB/sec | -| System Interface | NVIDIA NVLink | -| Form Factor | SXM2 | -| Max Power Consumption | 300 W | -| Thermal Solution | Passive | -| Compute APIs | CUDA, DirectCompute, OpenCLTM, OpenACC | - -[a]: https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(server)#Core -[b]: https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(client)#Pipeline -[c]: https://en.wikichip.org/wiki/x86/avx512vnni -[d]: https://en.wikichip.org/wiki/intel/xeon_gold/6240 -[e]: https://en.wikichip.org/wiki/intel/xeon_gold/6126 -[f]: https://en.wikichip.org/wiki/intel/xeon_platinum/8153 -[g]: https://images.nvidia.com/content/technologies/volta/pdf/tesla-volta-v100-datasheet-letter-fnl-web.pdf diff --git a/content/docs/barbora/hardware-overview.mdx b/content/docs/barbora/hardware-overview.mdx deleted file mode 100644 index a1c4312e41b03a9cf3e260d1f18ecbcf08c85975..0000000000000000000000000000000000000000 --- a/content/docs/barbora/hardware-overview.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Hardware Overview" ---- -The Barbora cluster consists of 201 computational nodes named **cn[001-201]** -of which 192 are regular compute nodes, 8 are GPU Tesla V100 accelerated nodes and 1 is a fat node. -Each node is a powerful x86-64 computer, equipped with 36/24/128 cores -(18-core Intel Cascade Lake 6240 / 12-core Intel Skylake Gold 6126 / 16-core Intel Skylake 8153), at least 192 GB of RAM. -User access to the Barbora cluster is provided by two login nodes **login[1,2]**. -The nodes are interlinked through high speed InfiniBand and Ethernet networks. - -The fat node is equipped with 6144 GB of memory. -Virtualization infrastructure provides resources for running long-term servers and services in virtual mode. -The Accelerated nodes, fat node, and virtualization infrastructure are available [upon request][a] from a PI. - -**There are three types of compute nodes:** - -* 192 compute nodes without an accelerator -* 8 compute nodes with a GPU accelerator - 4x NVIDIA Tesla V100-SXM2 -* 1 fat node - equipped with 6144 GB of RAM - -[More about compute nodes][1]. - -GPU and accelerated nodes are available upon request, see the [Resources Allocation Policy][2]. - -All of these nodes are interconnected through fast InfiniBand and Ethernet networks. -[More about the computing network][3]. -Every chassis provides an InfiniBand switch, marked **isw**, connecting all nodes in the chassis, -as well as connecting the chassis to the upper level switches. - -User access to Barbora is provided by two login nodes: login1 and login2. -[More about accessing the cluster][5]. - -The parameters are summarized in the following tables: - -| **In general** | | -| ------------------------------------------- | -------------------------------------------- | -| Primary purpose | High Performance Computing | -| Architecture of compute nodes | x86-64 | -| Operating system | Linux | -| [**Compute nodes**][1] | | -| Total | 201 | -| Processor cores | 36/24/128 (2x18 cores/2x12 cores/8x16 cores) | -| RAM | min. 192 GB | -| Local disk drive | no | -| Compute network | InfiniBand HDR | -| w/o accelerator | 192, cn[001-192] | -| GPU accelerated | 8, cn[193-200] | -| Fat compute nodes | 1, cn[201] | -| **In total** | | -| Total theoretical peak performance (Rpeak) | 848.8448 TFLOP/s | -| Total amount of RAM | 44.544 TB | - -| Node | Processor | Memory | Accelerator | -| ---------------- | --------------------------------------- | ------ | ---------------------- | -| Regular node | 2x Intel Cascade Lake 6240, 2.6 GHz | 192GB | - | -| GPU accelerated | 2x Intel Skylake Gold 6126, 2.6 GHz | 192GB | NVIDIA Tesla V100-SXM2 | -| Fat compute node | 2x Intel Skylake Platinum 8153, 2.0 GHz | 6144GB | - | - -For more details refer to the sections [Compute Nodes][1], [Storage][4], [Visualization Servers][6], and [Network][3]. - -[1]: compute-nodes.md -[2]: ../general/resources-allocation-policy.md -[3]: network.md -[4]: storage.md -[5]: ../general/shell-and-data-access.md -[6]: visualization.md - -[a]: https://support.it4i.cz/rt diff --git a/content/docs/barbora/introduction.mdx b/content/docs/barbora/introduction.mdx deleted file mode 100644 index 74533dabbd2b4f76a7e4680fa5cf650896515eb8..0000000000000000000000000000000000000000 --- a/content/docs/barbora/introduction.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Introduction" ---- -Welcome to Barbora supercomputer cluster. The Barbora cluster consists of 201 compute nodes, totaling 7232 compute cores with 44544 GB RAM, giving over 848 TFLOP/s theoretical peak performance. - -Nodes are interconnected through a fully non-blocking fat-tree InfiniBand network, and are equipped with Intel Cascade Lake processors. A few nodes are also equipped with NVIDIA Tesla V100-SXM2. Read more in [Hardware Overview][1]. - -The cluster runs with an operating system compatible with the Red Hat [Linux family][a]. We have installed a wide range of software packages targeted at different scientific domains. These packages are accessible via the [modules environment][2]. - -The user data shared file system and job data shared file system are available to users. - -The [Slurm][b] workload manager provides [computing resources allocations and job execution][3]. - -Read more on how to [apply for resources][4], [obtain login credentials][5] and [access the cluster][6]. - - - -[1]: hardware-overview.md -[2]: ../environment-and-modules.md -[3]: ../general/resources-allocation-policy.md -[4]: ../general/applying-for-resources.md -[5]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[6]: ../general/shell-and-data-access.md - -[a]: http://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg -[b]: https://slurm.schedmd.com/ diff --git a/content/docs/barbora/meta.json b/content/docs/barbora/meta.json deleted file mode 100644 index a1d72e17e30337b99afde79d666f18d42e974574..0000000000000000000000000000000000000000 --- a/content/docs/barbora/meta.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "Barbora", - "pages": [ - "compute-nodes", - "hardware-overview", - "introduction", - "network", - "storage", - "visualization" - ] -} diff --git a/content/docs/barbora/network.mdx b/content/docs/barbora/network.mdx deleted file mode 100644 index e2cf0692f24bbac0ae21ee72da72ed6ced15dd65..0000000000000000000000000000000000000000 --- a/content/docs/barbora/network.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Network" ---- -All of the compute and login nodes of Barbora are interconnected through a [InfiniBand][a] HDR 200 Gbps network and a Gigabit Ethernet network. - -Compute nodes and the service infrastructure is connected by the HDR100 technology -that allows one 200 Gbps HDR port (aggregation 4x 50 Gbps) to be divided into two HDR100 ports with 100 Gbps (2x 50 Gbps) bandwidth. - -The cabling between the L1 and L2 layer is realized by HDR cabling, -connecting the end devices is realized by so called Y or splitter cable (1x HRD200 - 2x HDR100). - - - -**The computing network thus implemented fulfills the following parameters** - -* 100Gbps -* Latencies less than 10 microseconds (0.6 ÎĽs end-to-end, <90ns switch hop) -* Adaptive routing support -* MPI communication support -* IP protocol support (IPoIB) -* Support for SCRATCH Data Storage and NVMe over Fabric Data Storage. - -## Mellanox QM8700 40-Ports Switch - -**Performance** - -* 40x HDR 200 Gb/s ports in a 1U switch -* 80x HDR100 100 Gb/s ports in a 1U switch -* 16 Tb/s aggregate switch throughput -* Up to 15.8 billion messages-per-second -* 90ns switch latency - -**Optimized Design** - -* 1+1 redundant & hot-swappable power -* 80 gold+ and energy star certified power supplies -* Dual-core x86 CPU - -**Advanced Design** - -* Adaptive routing -* Collective offloads (Mellanox SHARP technology) -* VL mapping (VL2VL) - - - -## BullSequana XH2000 HDRx WH40 MODULE - -* Mellanox QM8700 switch modified for direct liquid cooling (Atos Cold Plate), with form factor for installing the Bull Sequana XH2000 rack - - - -[a]: http://en.wikipedia.org/wiki/InfiniBand diff --git a/content/docs/barbora/storage.mdx b/content/docs/barbora/storage.mdx deleted file mode 100644 index 8fc87ad4fd455e36fe5514219d5b1d88cd65e2a2..0000000000000000000000000000000000000000 --- a/content/docs/barbora/storage.mdx +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: "Storage" ---- -There are three main shared file systems on the Barbora cluster: [HOME][1], [SCRATCH][2], and [PROJECT][5]. All login and compute nodes may access same data on shared file systems. Compute nodes are also equipped with local (non-shared) scratch, RAM disk, and tmp file systems. - -## Archiving - -Do not use shared filesystems as a backup for large amount of data or long-term archiving mean. The academic staff and students of research institutions in the Czech Republic can use [CESNET storage service][3], which is available via SSHFS. - -## Shared Filesystems - -Barbora computer provides three main shared filesystems, the [HOME filesystem][1], [SCRATCH filesystem][2], and the [PROJECT filesystems][5]. - -All filesystems are accessible via the Infiniband network. - -The HOME and PROJECT filesystems are realized as NFS filesystem. - -The SCRATCH filesystem is realized as a parallel Lustre filesystem. - -Extended ACLs are provided on both Lustre filesystems for sharing data with other users using fine-grained control - -### Understanding the Lustre Filesystems - -A user file on the [Lustre filesystem][a] can be divided into multiple chunks (stripes) and stored across a subset of the object storage targets (OSTs) (disks). The stripes are distributed among the OSTs in a round-robin fashion to ensure load balancing. - -When a client (a compute node from your job) needs to create or access a file, the client queries the metadata server (MDS) and the metadata target (MDT) for the layout and location of the [file's stripes][b]. Once the file is opened and the client obtains the striping information, the MDS is no longer involved in the file I/O process. The client interacts directly with the object storage servers (OSSes) and OSTs to perform I/O operations such as locking, disk allocation, storage, and retrieval. - -If multiple clients try to read and write the same part of a file at the same time, the Lustre distributed lock manager enforces coherency, so that all clients see consistent results. - -There is default stripe configuration for Barbora Lustre filesystems. However, users can set the following stripe parameters for their own directories or files to get optimum I/O performance: - -1. `stripe_size` the size of the chunk in bytes; specify with k, m, or g to use units of KB, MB, or GB, respectively; the size must be an even multiple of 65,536 bytes; default is 1MB for all Barbora Lustre filesystems -1. `stripe_count` the number of OSTs to stripe across; default is 1 for Barbora Lustre filesystems one can specify -1 to use all OSTs in the filesystem. -1. `stripe_offset` the index of the OST where the first stripe is to be placed; default is -1 which results in random selection; using a non-default value is NOT recommended. - -<Callout> - Setting stripe size and stripe count correctly for your needs may significantly affect the I/O performance. -</Callout> - -Use the `lfs getstripe` command for getting the stripe parameters. Use `lfs setstripe` for setting the stripe parameters to get optimal I/O performance. The correct stripe setting depends on your needs and file access patterns. - -```console -$ lfs getstripe dir|filename -$ lfs setstripe -s stripe_size -c stripe_count -o stripe_offset dir|filename -``` - -Example: - -```console -$ lfs getstripe /scratch/projname -$ lfs setstripe -c -1 /scratch/projname -$ lfs getstripe /scratch/projname -``` - -In this example, we view the current stripe setting of the /scratch/projname/ directory. The stripe count is changed to all OSTs and verified. All files written to this directory will be striped over 5 OSTs - -Use `lfs check osts` to see the number and status of active OSTs for each filesystem on Barbora. Learn more by reading the man page: - -```console -$ lfs check osts -$ man lfs -``` - -### Hints on Lustre Stripping - -<Callout> - Increase the `stripe_count` for parallel I/O to the same file. -</Callout> - -When multiple processes are writing blocks of data to the same file in parallel, the I/O performance for large files will improve when the `stripe_count` is set to a larger value. The stripe count sets the number of OSTs to which the file will be written. By default, the stripe count is set to 1. While this default setting provides for efficient access of metadata (for example to support the `ls -l` command), large files should use stripe counts of greater than 1. This will increase the aggregate I/O bandwidth by using multiple OSTs in parallel instead of just one. A rule of thumb is to use a stripe count approximately equal to the number of gigabytes in the file. - -Another good practice is to make the stripe count be an integral factor of the number of processes performing the write in parallel, so that you achieve load balance among the OSTs. For example, set the stripe count to 16 instead of 15 when you have 64 processes performing the writes. - -<Callout> - Using a large stripe size can improve performance when accessing very large files -</Callout> - -Large stripe size allows each client to have exclusive access to its own part of a file. However, it can be counterproductive in some cases if it does not match your I/O pattern. The choice of stripe size has no effect on a single-stripe file. - -Read more [here][c]. - -### Lustre on Barbora - -The architecture of Lustre on Barbora is composed of two metadata servers (MDS) and two data/object storage servers (OSS). - - Configuration of the SCRATCH storage - -* 2x Metadata server -* 2x Object storage server -* Lustre object storage - * One disk array NetApp E2800 - * 54x 8TB 10kRPM 2,5” SAS HDD - * 5 x RAID6(8+2) OST Object storage target - * 4 hotspare -* Lustre metadata storage - * One disk array NetApp E2600 - * 12 300GB SAS 15krpm disks - * 2 groups of 5 disks in RAID5 Metadata target - * 2 hot-spare disks - -### HOME File System - -The HOME filesystem is mounted in directory /home. Users home directories /home/username reside on this filesystem. Accessible capacity is 28TB, shared among all users. Individual users are restricted by filesystem usage quotas, set to 25GB per user. Should 25GB prove insufficient, contact [support][d], the quota may be lifted upon request. - -<Callout> - The HOME filesystem is intended for preparation, evaluation, processing and storage of data generated by active Projects. -</Callout> - -The HOME filesystem should not be used to archive data of past Projects or other unrelated data. - -The files on HOME filesystem will not be deleted until the end of the [user's lifecycle][4]. - -The filesystem is backed up, so that it can be restored in case of a catastrophic failure resulting in significant data loss. However, this backup is not intended to restore old versions of user data or to restore (accidentally) deleted files. - -| HOME filesystem | | -| -------------------- | --------------- | -| Accesspoint | /home/username | -| Capacity | 28TB | -| Throughput | 1GB/s | -| User space quota | 25GB | -| User inodes quota | 500K | -| Protocol | NFS | - -### SCRATCH File System - -The SCRATCH is realized as Lustre parallel file system and is available from all login and computational nodes. There are 5 OSTs dedicated for the SCRATCH file system. - -The SCRATCH filesystem is mounted in the `/scratch/project/PROJECT_ID` directory created automatically with the `PROJECT_ID` project. Accessible capacity is 310TB, shared among all users. Individual users are restricted by filesystem usage quotas, set to 10TB per user. The purpose of this quota is to prevent runaway programs from filling the entire filesystem and deny service to other users. Should 10TB prove insufficient, contact [support][d], the quota may be lifted upon request. - -<Callout> - The Scratch filesystem is intended for temporary scratch data generated during the calculation as well as for high-performance access to input and output files. All I/O intensive jobs must use the SCRATCH filesystem as their working directory. - - Users are advised to save the necessary data from the SCRATCH filesystem to HOME filesystem after the calculations and clean up the scratch files. -</Callout> - -<Callout type=warn> - Files on the SCRATCH filesystem that are **not accessed for more than 90 days** will be automatically **deleted**. -</Callout> - -The SCRATCH filesystem is realized as Lustre parallel filesystem and is available from all login and computational nodes. Default stripe size is 1MB, stripe count is 1. There are 5 OSTs dedicated for the SCRATCH filesystem. - -<Callout> - Setting stripe size and stripe count correctly for your needs may significantly affect the I/O performance. -</Callout> - -| SCRATCH filesystem | | -| -------------------- | --------- | -| Mountpoint | /scratch | -| Capacity | 310TB | -| Throughput | 5GB/s | -| Throughput [Burst] | 38GB/s | -| User space quota | 10TB | -| User inodes quota | 10M | -| Default stripe size | 1MB | -| Default stripe count | 1 | -| Number of OSTs | 5 | - -### PROJECT File System - -The PROJECT data storage is a central storage for projects'/users' data on IT4Innovations that is accessible from all clusters. -For more information, see the [PROJECT storage][6] section. - -### Disk Usage and Quota Commands - -Disk usage and user quotas can be checked and reviewed using the `it4ifsusage` command. You can see an example output [here][9]. - -To have a better understanding of where the space is exactly used, you can use following command: - -```console -$ du -hs dir -``` - -Example for your HOME directory: - -```console -$ cd /home -$ du -hs * .[a-zA-z0-9]* | grep -E "[0-9]*G|[0-9]*M" | sort -hr -258M cuda-samples -15M .cache -13M .mozilla -5,5M .eclipse -2,7M .idb_13.0_linux_intel64_app -``` - -This will list all directories with MegaBytes or GigaBytes of consumed space in your actual (in this example HOME) directory. List is sorted in descending order from largest to smallest files/directories. - -### Extended ACLs - -Extended ACLs provide another security mechanism beside the standard POSIX ACLs, which are defined by three entries (for owner/group/others). Extended ACLs have more than the three basic entries. In addition, they also contain a mask entry and may contain any number of named user and named group entries. - -ACLs on a Lustre file system work exactly like ACLs on any Linux file system. They are manipulated with the standard tools in the standard manner. - -For more information, see the [Access Control List][7] section of the documentation. - -## Local Filesystems - -### TMP - -Each node is equipped with local /tmp RAMDISK directory. The /tmp directory should be used to work with temporary files. Old files in /tmp directory are automatically purged. - -### SCRATCH and RAMDISK - -Each node is equipped with RAMDISK storage accessible at /tmp, /lscratch and /ramdisk. The RAMDISK capacity is 180GB. Data placed on RAMDISK occupies the node RAM memory of 192GB total. The RAMDISK directory should only be used to work with temporary files, where very high throughput or I/O performance is required. Old files in RAMDISK directory are automatically purged with job's end. - -#### Global RAM Disk - -The Global RAM disk spans the local RAM disks of all the allocated nodes within a single job. -For more information, see the [Job Features][8] section. - -## Summary - -| Mountpoint | Usage | Protocol | Net Capacity | Throughput | Limitations | Access | Services | -| ---------- | ------------------------- | -------- | -------------- | ------------------------------ | ----------- | ----------------------- | ------------------------------- | -| /home | home directory | NFS | 28TB | 1GB/s | Quota 25GB | Compute and login nodes | backed up | -| /scratch | scratch temoporary | Lustre | 310TB | 5GB/s, 30GB/s burst buffer | Quota 10TB | Compute and login nodes |files older 90 days autoremoved | -| /lscratch | local scratch ramdisk | tmpfs | 180GB | 130GB/s | none | Node local | auto purged after job end | - -[1]: #home-file-system -[2]: #scratch-file-system -[3]: ../storage/cesnet-storage.md -[4]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[5]: #project-file-system -[6]: ../storage/project-storage.md -[7]: ../storage/standard-file-acl.md -[8]: ../job-features.md#global-ram-disk -[9]: ../storage/project-storage.md#project-quotas - -[a]: http://www.nas.nasa.gov -[b]: http://www.nas.nasa.gov/hecc/support/kb/Lustre_Basics_224.html#striping -[c]: http://doc.lustre.org/lustre_manual.xhtml#managingstripingfreespace -[d]: https://support.it4i.cz/rt -[e]: http://man7.org/linux/man-pages/man1/nfs4_setfacl.1.html diff --git a/content/docs/barbora/visualization.mdx b/content/docs/barbora/visualization.mdx deleted file mode 100644 index cb335d2263ffe6fd6a93749122edd6daea304580..0000000000000000000000000000000000000000 --- a/content/docs/barbora/visualization.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Visualization Servers" ---- -Remote visualization with [VirtualGL][3] is available on two nodes. - -* 2 nodes -* 32 cores in total -* 2x Intel Skylake Gold 6130 – 16-core@2,1 GHz processors per node -* 192 GB DDR4 2667 MT/s of physical memory per node (12x 16 GB) -* BullSequana X450-E5 blade servers -* 2150.4 GFLOP/s per compute node -* 1x 1 GB Ethernet and 2x 10 GB Ethernet -* 1x HDR100 IB port -* 2x SSD 240 GB - - - -## NVIDIA Quadro P6000 - -* GPU Memory: 24 GB GDDR5X -* Memory Interface: 384-bit -* Memory Bandwidth: Up to 432 GB/s -* NVIDIA CUDA® Cores: 3840 -* System Interface: PCI Express 3.0 x16 -* Max Power Consumption: 250 W -* Thermal Solution: Active -* Form Factor: 4.4”H x 10.5” L, Dual Slot, Full Height -* Display Connectors: 4x DP 1.4 + DVI-D DL -* Max Simultaneous Displays: 4 direct, 4 DP1.4 Multi-Stream -* Max DP 1.4 Resolution: 7680 x 4320 @ 30 Hz -* Max DVI-D DL Resolution: 2560 x 1600 @ 60 Hz -* Graphics APIs: Shader Model 5.1, OpenGL 4.5, DirectX 12.0, Vulkan 1.0, -* Compute APIs: CUDA, DirectCompute, OpenCL™ -* Floating-Point Performance-Single Precision: 12.6 TFLOP/s, Peak - - - -## Resource Allocation Policy - -| queue | active project | project resources | nodes | min ncpus | priority | authorization | walltime | -|-------|----------------|-------------------|-------|-----------|----------|---------------|----------| -| qviz Visualization queue | yes | none required | 2 | 4 | 150 | no | 1h/8h | - -## References - -* [Graphical User Interface][1] -* [VPN Access][2] - -[1]: ../general/shell-and-data-access.md#graphical-user-interface -[2]: ../general/shell-and-data-access.md#vpn-access -[3]: ../software/viz/vgl.md diff --git a/content/docs/cloud/einfracz-cloud.mdx b/content/docs/cloud/einfracz-cloud.mdx deleted file mode 100644 index 94dac82ef2400de30ed62765c4156628a0de3605..0000000000000000000000000000000000000000 --- a/content/docs/cloud/einfracz-cloud.mdx +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "e-INFRA CZ Cloud Ostrava" ---- -Ostrava cloud consists of 22 nodes from the [Karolina][a] supercomputer. -The cloud site is built on top of OpenStack, -which is a free open standard cloud computing platform. - -## Access - -To acces the cloud you must: - -* have an [e-Infra CZ account][3], -* be a member of an [active project][b]. - -The dashboard is available at [https://ostrava.openstack.cloud.e-infra.cz/][6]. - -You can specify resources/quotas for your project. -For more information, see the [Quota Limits][5] section. - -## Creating First Instance - -To create your first VM instance, follow the [e-INFRA CZ guide][4]. -Note that the guide is similar for clouds in Brno and Ostrava, -so make sure that you follow steps for Ostrava cloud where applicable. - -### Process Automatization - -You can automate the process using Terraform or Openstack. - -#### Terraform - -Prerequisites: - -* Linux/Mac/WSL terminal BASH shell -* installed Terraform and sshuttle -* downloaded [application credentials][9] from OpenStack Horizon dashboard and saved as a `project_openrc.sh.inc` text file - -Follow the guide: [https://code.it4i.cz/terraform][8] - -#### OpenStack - -Prerequisites: - -* Linux/Mac/WSL terminal BASH shell -* installed [OpenStack client][7] - -Follow the guide: [https://code.it4i.cz/commandline][10] - -Run commands: - -```console -source project_openrc.sh.inc -``` - -```console -./cmdline-demo.sh basic-infrastructure-1 -``` - -## Technical Reference - -For the list of deployed OpenStack services, see the [list of components][1]. - -More information can be found on the [e-INFRA CZ website][2]. - -[1]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-site/openstack-components/ -[2]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-site/ -[3]: https://docs.e-infra.cz/account/ -[4]: https://docs.e-infra.cz/compute/openstack/getting-started/creating-first-infrastructure/ -[5]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-g2-site/quota-limits/ -[6]: https://ostrava.openstack.cloud.e-infra.cz/ -[7]: https://docs.fuga.cloud/how-to-use-the-openstack-cli-tools-on-linux -[8]: https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/terraform -[9]: https://docs.e-infra.cz/compute/openstack/how-to-guides/obtaining-api-key/ -[10]: https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/commandline - -[a]: ../karolina/introduction.md -[b]: ../general/access/project-access.md diff --git a/content/docs/cloud/it4i-cloud.mdx b/content/docs/cloud/it4i-cloud.mdx deleted file mode 100644 index 8d34f7eb7a0dd4e43ca74b7bd0476fe2a7365208..0000000000000000000000000000000000000000 --- a/content/docs/cloud/it4i-cloud.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "IT4I Cloud" ---- -IT4I cloud consists of 14 nodes from the [Karolina][a] supercomputer. -The cloud site is built on top of OpenStack, -which is a free open standard cloud computing platform. - -<Callout> - The guide describes steps for personal projects.<br> - Some steps may differ for large projects.<br> - For large project, apply for resources to the [Allocation Committee][11]. -</Callout> - -## Access - -To access the cloud you must be a member of an active EUROHPC project, -or fall into the **Access Category B**, i.e. [Access For Thematic HPC Resource Utilisation][11]. - -A personal OpenStack project is required. Request one by contacting [IT4I Support][12]. - -The dashboard is available at [https://cloud.it4i.cz][6]. - -You can see quotas set for the IT4I Cloud in the [Quota Limits][f] section. - -## Creating First Instance - -To create your first VM instance, follow the steps below: - -### Log In - -Go to [https://cloud.it4i.cz][6], enter your LDAP username and password and choose the `IT4I_LDAP` domain. After you sign in, you will be redirected to the dashboard. - - - -### Create Key Pair - -SSH key is required for remote access to your instance. - -1. Go to **Project > Compute > Key Pairs** and click the **Create Key Pair** button. - -  - -1. In the Create Key Pair window, name your key pair, select `SSH Key` for key type and confirm by clicking Create Key Pair. - -  - -1. Download and manage the private key according to your operating system. - -### Update Security Group - -To be able to remotely access your VM instance, you have to allow access in the security group. - -1. Go to **Project > Network > Security Groups** and click on **Manage Rules**, for the default security group. - -  - -1. Click on **Add Rule**, choose **SSH**, and leave the remaining fields unchanged. - -  - -### Create VM Instance - -1. In **Compute > Instances**, click **Launch Instance**. - -  - -1. Choose Instance Name, Description, and number of instances. Click **Next**. - -  - -1. Choose an image from which to boot the instance. Choose to delete the volume after instance delete. Click **Next**. - -  - -1. Choose the hardware resources of the instance by selecting a flavor. Additional volumes for data can be attached later on. Click **Next**. - -  - -1. Select the network and continue to **Security Groups**. - -  - -1. Allocate the security group with SSH rule that you added in the [Update Security Group](it4i-cloud.md#update-security-group) step. Then click **Next** to go to the **Key Pair**. - -  - -1. Select the key that you created in the [Create Key Pair][g] section and launch the instance. - -  - -### Associate Floating IP - -1. Click on the **Associate** button next to the floating IP. - -  - -1. Select Port to be associated with the instance, then click the **Associate** button. - -Now you can join the VM using your preferred SSH client. - -## Process Automatization - -You can automate the process using Openstack. - -### OpenStack - -Prerequisites: - -* Linux/Mac/WSL terminal BASH shell -* installed [OpenStack client][7] - -Follow the guide: [https://code.it4i.cz/commandline][10] - -Run commands: - -```console -source project_openrc.sh.inc -``` - -```console -./cmdline-demo.sh basic-infrastructure-1 -``` - -[1]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-site/openstack-components/ -[2]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-site/ -[3]: https://docs.e-infra.cz/account/ -[4]: https://docs.e-infra.cz/compute/openstack/getting-started/creating-first-infrastructure/ -[5]: https://docs.e-infra.cz/compute/openstack/technical-reference/ostrava-g2-site/quota-limits/ -[6]: https://cloud.it4i.cz -[7]: https://docs.fuga.cloud/how-to-use-the-openstack-cli-tools-on-linux -[8]: https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/terraform -[9]: https://docs.e-infra.cz/compute/openstack/how-to-guides/obtaining-api-key/ -[10]: https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/commandline -[11]: https://www.it4i.cz/en/for-users/computing-resources-allocation -[12]: mailto:support@it4i.cz @@ - -[a]: ../karolina/introduction.md -[b]: ../general/access/project-access.md -[c]: einfracz-cloud.md -[d]: ../general/accessing-the-clusters/vpn-access.md -[e]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[f]: it4i-quotas.md -[g]: it4i-cloud.md#create-key-pair - - diff --git a/content/docs/cloud/it4i-quotas.mdx b/content/docs/cloud/it4i-quotas.mdx deleted file mode 100644 index 56558fe46eb90b7ffdbe61a8e5c45a1d41217654..0000000000000000000000000000000000000000 --- a/content/docs/cloud/it4i-quotas.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "IT4I Cloud Quotas" ---- -| Resource | Quota | -|---------------------------------------|-------| -| Instances | 10 | -| VCPUs | 20 | -| RAM | 32GB | -| Volumes | 20 | -| Volume Snapshots | 12 | -| Volume Storage | 500 | -| Floating-IPs | 1 | -| Security Groups | 10 | -| Security Group Rules | 100 | -| Networks | 1 | -| Ports | 10 | -| Routers | 1 | -| Backups | 12 | -| Groups | 10 | -| rbac_policies | 10 | -| Subnets | 1 | -| Subnet_pools | -1 | -| Fixed-ips | -1 | -| Injected-file-size | 10240 | -| Injected-path-size | 255 | -| Injected-files | 5 | -| Key-pairs | 100 | -| Properties | 128 | -| Server-groups | 10 | -| Server-group-members | 10 | -| Backup-gigabytes | 1002 | -| Per-volume-gigabytes | -1 | diff --git a/content/docs/cloud/meta.json b/content/docs/cloud/meta.json deleted file mode 100644 index 9808c48466c15abaa1c76d5116e95b83d27c90d3..0000000000000000000000000000000000000000 --- a/content/docs/cloud/meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "title": "Cloud", - "pages": [ - "einfracz-cloud", - "it4i-cloud", - "it4i-quotas" - ] -} diff --git a/content/docs/cs/accessing.mdx b/content/docs/cs/accessing.mdx deleted file mode 100644 index 9fffeed863c0be8bc7fbaf3e73c4a4b83718c45f..0000000000000000000000000000000000000000 --- a/content/docs/cs/accessing.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Accessing Complementary Systems" ---- -Complementary systems can be accessed at `login.cs.it4i.cz` -by any user with an active account assigned to an active project. - -**SSH is required** to access Complementary systems. - -## Data Storage - -### Home - -The `/home` file system is shared across all Complementary systems. Note that this file system is **not** shared with the file system on IT4I clusters. - -### Scratch - -There are local `/lscratch` storages on individual nodes. - -### PROJECT - -Complementary systems are connected to the [PROJECT storage][1]. - -[1]: ../storage/project-storage.md diff --git a/content/docs/cs/guides/amd.mdx b/content/docs/cs/guides/amd.mdx deleted file mode 100644 index 11241b5a407bbb24afbb128ad44b9660d68351dd..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/amd.mdx +++ /dev/null @@ -1,560 +0,0 @@ ---- -title: "Using AMD Partition" ---- -For testing your application on the AMD partition, -you need to prepare a job script for that partition or use the interactive job: - -```console -salloc -N 1 -c 64 -A PROJECT-ID -p p03-amd --gres=gpu:4 --time=08:00:00 -``` - -where: - -- `-N 1` means allocating one server, -- `-c 64` means allocating 64 cores, -- `-A` is your project, -- `-p p03-amd` is AMD partition, -- `--gres=gpu:4` means allocating all 4 GPUs of the node, -- `--time=08:00:00` means allocation for 8 hours. - -You have also an option to allocate subset of the resources only, -by reducing the `-c` and `--gres=gpu` to smaller values. - -```console -salloc -N 1 -c 48 -A PROJECT-ID -p p03-amd --gres=gpu:3 --time=08:00:00 -salloc -N 1 -c 32 -A PROJECT-ID -p p03-amd --gres=gpu:2 --time=08:00:00 -salloc -N 1 -c 16 -A PROJECT-ID -p p03-amd --gres=gpu:1 --time=08:00:00 -``` - -<Callout> - p03-amd01 server has hyperthreading **enabled** therefore htop shows 128 cores.<br> - p03-amd02 server has hyperthreading **disabled** therefore htop shows 64 cores. -</Callout> - -## Using AMD MI100 GPUs - -The AMD GPUs can be programmed using the [ROCm open-source platform](https://docs.amd.com/). - -ROCm and related libraries are installed directly in the system. -You can find it here: - -```console -/opt/rocm/ -``` - -The actual version can be found here: - -```console -[user@p03-amd02.cs]$ cat /opt/rocm/.info/version - -5.5.1-74 -``` - -## Basic HIP Code - -The first way how to program AMD GPUs is to use HIP. - -The basic vector addition code in HIP looks like this. -This a full code and you can copy and paste it into a file. -For this example we use `vector_add.hip.cpp`. - -```console -#include <cstdio> -#include <hip/hip_runtime.h> - - - -__global__ void add_vectors(float * x, float * y, float alpha, int count) -{ - long long idx = blockIdx.x * blockDim.x + threadIdx.x; - - if(idx < count) - y[idx] += alpha * x[idx]; -} - -int main() -{ - // number of elements in the vectors - long long count = 10; - - // allocation and initialization of data on the host (CPU memory) - float * h_x = new float[count]; - float * h_y = new float[count]; - for(long long i = 0; i < count; i++) - { - h_x[i] = i; - h_y[i] = 10 * i; - } - - // print the input data - printf("X:"); - for(long long i = 0; i < count; i++) - printf(" %7.2f", h_x[i]); - printf("\n"); - printf("Y:"); - for(long long i = 0; i < count; i++) - printf(" %7.2f", h_y[i]); - printf("\n"); - - // allocation of memory on the GPU device - float * d_x; - float * d_y; - hipMalloc(&d_x, count * sizeof(float)); - hipMalloc(&d_y, count * sizeof(float)); - - // copy the data from host memory to the device - hipMemcpy(d_x, h_x, count * sizeof(float), hipMemcpyHostToDevice); - hipMemcpy(d_y, h_y, count * sizeof(float), hipMemcpyHostToDevice); - - int tpb = 256; - int bpg = (count - 1) / tpb + 1; - // launch the kernel on the GPU - add_vectors<<< bpg, tpb >>>(d_x, d_y, 100, count); - // hipLaunchKernelGGL(add_vectors, bpg, tpb, 0, 0, d_x, d_y, 100, count); - - // copy the result back to CPU memory - hipMemcpy(h_y, d_y, count * sizeof(float), hipMemcpyDeviceToHost); - - // print the results - printf("Y:"); - for(long long i = 0; i < count; i++) - printf(" %7.2f", h_y[i]); - printf("\n"); - - // free the allocated memory - hipFree(d_x); - hipFree(d_y); - delete[] h_x; - delete[] h_y; - - return 0; -} -``` - -To compile the code we use `hipcc` compiler. -For compiler information, use `hipcc --version`: - -```console -[user@p03-amd02.cs ~]$ hipcc --version - -HIP version: 5.5.30202-eaf00c0b -AMD clang version 16.0.0 (https://github.com/RadeonOpenCompute/llvm-project roc-5.5.1 23194 69ef12a7c3cc5b0ccf820bc007bd87e8b3ac3037) -Target: x86_64-unknown-linux-gnu -Thread model: posix -InstalledDir: /opt/rocm-5.5.1/llvm/bin -``` - -The code is compiled a follows: - -```console -hipcc vector_add.hip.cpp -o vector_add.x -``` - -The correct output of the code is: - -```console -[user@p03-amd02.cs ~]$ ./vector_add.x -X: 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 -Y: 0.00 10.00 20.00 30.00 40.00 50.00 60.00 70.00 80.00 90.00 -Y: 0.00 110.00 220.00 330.00 440.00 550.00 660.00 770.00 880.00 990.00 -``` - -More details on HIP programming is in the [HIP Programming Guide](https://docs.amd.com/bundle/HIP-Programming-Guide-v5.5/page/Introduction_to_HIP_Programming_Guide.html) - -## HIP and ROCm Libraries - -The list of official AMD libraries can be found [here](https://docs.amd.com/category/libraries). - -The libraries are installed in the same directory is ROCm - -```console -/opt/rocm/ -``` - -Following libraries are installed: - -```console -drwxr-xr-x 4 root root 44 Jun 7 14:09 hipblas -drwxr-xr-x 3 root root 17 Jun 7 14:09 hipblas-clients -drwxr-xr-x 3 root root 29 Jun 7 14:09 hipcub -drwxr-xr-x 4 root root 44 Jun 7 14:09 hipfft -drwxr-xr-x 3 root root 25 Jun 7 14:09 hipfort -drwxr-xr-x 4 root root 32 Jun 7 14:09 hiprand -drwxr-xr-x 4 root root 44 Jun 7 14:09 hipsolver -drwxr-xr-x 4 root root 44 Jun 7 14:09 hipsparse -``` - -and - -```console -drwxr-xr-x 4 root root 32 Jun 7 14:09 rocalution -drwxr-xr-x 4 root root 44 Jun 7 14:09 rocblas -drwxr-xr-x 4 root root 44 Jun 7 14:09 rocfft -drwxr-xr-x 4 root root 32 Jun 7 14:09 rocprim -drwxr-xr-x 4 root root 32 Jun 7 14:09 rocrand -drwxr-xr-x 4 root root 44 Jun 7 14:09 rocsolver -drwxr-xr-x 4 root root 44 Jun 7 14:09 rocsparse -drwxr-xr-x 3 root root 29 Jun 7 14:09 rocthrust -``` - -## Using HipBlas Library - -The basic code in HIP that uses hipBlas looks like this. -This a full code and you can copy and paste it into a file. -For this example we use `hipblas.hip.cpp`. - -```console -#include <cstdio> -#include <vector> -#include <cstdlib> -#include <hip/hip_runtime.h> -#include <hipblas/hipblas.h> - - -int main() -{ - srand(9600); - - int width = 10; - int height = 7; - int elem_count = width * height; - - - // initialization of data in CPU memory - - float * h_A; - hipHostMalloc(&h_A, elem_count * sizeof(*h_A)); - for(int i = 0; i < elem_count; i++) - h_A[i] = (100.0f * rand()) / (float)RAND_MAX; - printf("Matrix A:\n"); - for(int r = 0; r < height; r++) - { - for(int c = 0; c < width; c++) - printf("%6.3f ", h_A[r + height * c]); - printf("\n"); - } - - float * h_x; - hipHostMalloc(&h_x, width * sizeof(*h_x)); - for(int i = 0; i < width; i++) - h_x[i] = (100.0f * rand()) / (float)RAND_MAX; - printf("vector x:\n"); - for(int i = 0; i < width; i++) - printf("%6.3f ", h_x[i]); - printf("\n"); - - float * h_y; - hipHostMalloc(&h_y, height * sizeof(*h_y)); - for(int i = 0; i < height; i++) - h_x[i] = 100.0f + i; - printf("vector y:\n"); - for(int i = 0; i < height; i++) - printf("%6.3f ", h_x[i]); - printf("\n"); - - - // initialization of data in GPU memory - - float * d_A; - size_t pitch_A; - hipMallocPitch((void**)&d_A, &pitch_A, height * sizeof(*d_A), width); - hipMemcpy2D(d_A, pitch_A, h_A, height * sizeof(*d_A), height * sizeof(*d_A), width, hipMemcpyHostToDevice); - int lda = pitch_A / sizeof(float); - - float * d_x; - hipMalloc(&d_x, width * sizeof(*d_x)); - hipMemcpy(d_x, h_x, width * sizeof(*d_x), hipMemcpyHostToDevice); - - float * d_y; - hipMalloc(&d_y, height * sizeof(*d_y)); - hipMemcpy(d_y, h_y, height * sizeof(*d_y), hipMemcpyHostToDevice); - - - // basic calculation of the result on the CPU - - float alpha=2.0f, beta=10.0f; - - for(int i = 0; i < height; i++) - h_y[i] *= beta; - for(int r = 0; r < height; r++) - for(int c = 0; c < width; c++) - h_y[r] += alpha * h_x[c] * h_A[r + height * c]; - printf("result y CPU:\n"); - for(int i = 0; i < height; i++) - printf("%6.3f ", h_y[i]); - printf("\n"); - - - // calculation of the result on the GPU using the hipBLAS library - - hipblasHandle_t blas_handle; - hipblasCreate(&blas_handle); - - hipblasSgemv(blas_handle, HIPBLAS_OP_N, height, width, &alpha, d_A, lda, d_x, 1, &beta, d_y, 1); - hipDeviceSynchronize(); - - hipblasDestroy(blas_handle); - - - // copy the GPU result to CPU memory and print it - hipMemcpy(h_y, d_y, height * sizeof(*d_y), hipMemcpyDeviceToHost); - printf("result y BLAS:\n"); - for(int i = 0; i < height; i++) - printf("%6.3f ", h_y[i]); - printf("\n"); - - - // free all the allocated memory - hipFree(d_A); - hipFree(d_x); - hipFree(d_y); - hipHostFree(h_A); - hipHostFree(h_x); - hipHostFree(h_y); - - return 0; -} -``` - -The code compilation can be done as follows: - -```console -hipcc hipblas.hip.cpp -o hipblas.x -lhipblas -``` - -## Using HipSolver Library - -The basic code in HIP that uses hipSolver looks like this. -This a full code and you can copy and paste it into a file. -For this example we use `hipsolver.hip.cpp`. - -```console -#include <cstdio> -#include <vector> -#include <cstdlib> -#include <algorithm> -#include <hipsolver/hipsolver.h> -#include <hipblas/hipblas.h> - -int main() -{ - srand(63456); - - int size = 10; - - - // allocation and initialization of data on host. this time we use std::vector - - int h_A_ld = size; - int h_A_pitch = h_A_ld * sizeof(float); - std::vector<float> h_A(size * h_A_ld); - for(int r = 0; r < size; r++) - for(int c = 0; c < size; c++) - h_A[r * h_A_ld + c] = (10.0 * rand()) / RAND_MAX; - printf("System matrix A:\n"); - for(int r = 0; r < size; r++) - { - for(int c = 0; c < size; c++) - printf("%6.3f ", h_A[r * h_A_ld + c]); - printf("\n"); - } - - std::vector<float> h_b(size); - for(int i = 0; i < size; i++) - h_b[i] = (10.0 * rand()) / RAND_MAX; - printf("RHS vector b:\n"); - for(int i = 0; i < size; i++) - printf("%6.3f ", h_b[i]); - printf("\n"); - - std::vector<float> h_x(size); - - - // memory allocation on the device and initialization - - float * d_A; - size_t d_A_pitch; - hipMallocPitch((void**)&d_A, &d_A_pitch, size, size); - int d_A_ld = d_A_pitch / sizeof(float); - - float * d_b; - hipMalloc(&d_b, size * sizeof(float)); - - float * d_x; - hipMalloc(&d_x, size * sizeof(float)); - - int * d_piv; - hipMalloc(&d_piv, size * sizeof(int)); - - int * info; - hipMallocManaged(&info, sizeof(int)); - - hipMemcpy2D(d_A, d_A_pitch, h_A.data(), h_A_pitch, size * sizeof(float), size, hipMemcpyHostToDevice); - hipMemcpy(d_b, h_b.data(), size * sizeof(float), hipMemcpyHostToDevice); - - - // solving the system using hipSOLVER - - hipsolverHandle_t solverHandle; - hipsolverCreate(&solverHandle); - - int wss_trf, wss_trs; // wss = WorkSpace Size - hipsolverSgetrf_bufferSize(solverHandle, size, size, d_A, d_A_ld, &wss_trf); - hipsolverSgetrs_bufferSize(solverHandle, HIPSOLVER_OP_N, size, 1, d_A, d_A_ld, d_piv, d_b, size, &wss_trs); - float * workspace; - int wss = std::max(wss_trf, wss_trs); - hipMalloc(&workspace, wss * sizeof(float)); - - hipsolverSgetrf(solverHandle, size, size, d_A, d_A_ld, workspace, wss, d_piv, info); - hipsolverSgetrs(solverHandle, HIPSOLVER_OP_N, size, 1, d_A, d_A_ld, d_piv, d_b, size, workspace, wss, info); - - hipMemcpy(d_x, d_b, size * sizeof(float), hipMemcpyDeviceToDevice); - hipMemcpy(h_x.data(), d_x, size * sizeof(float), hipMemcpyDeviceToHost); - printf("Solution vector x:\n"); - for(int i = 0; i < size; i++) - printf("%6.3f ", h_x[i]); - printf("\n"); - - hipFree(workspace); - - hipsolverDestroy(solverHandle); - - - // perform matrix-vector multiplication A*x using hipBLAS to check if the solution is correct - - hipblasHandle_t blasHandle; - hipblasCreate(&blasHandle); - - float alpha = 1; - float beta = 0; - hipMemcpy2D(d_A, d_A_pitch, h_A.data(), h_A_pitch, size * sizeof(float), size, hipMemcpyHostToDevice); - hipblasSgemv(blasHandle, HIPBLAS_OP_N, size, size, &alpha, d_A, d_A_ld, d_x, 1, &beta, d_b, 1); - hipDeviceSynchronize(); - - hipblasDestroy(blasHandle); - - for(int i = 0; i < size; i++) - h_b[i] = 0; - hipMemcpy(h_b.data(), d_b, size * sizeof(float), hipMemcpyDeviceToHost); - printf("Check multiplication vector Ax:\n"); - for(int i = 0; i < size; i++) - printf("%6.3f ", h_b[i]); - printf("\n"); - - - // free all the allocated memory - - hipFree(info); - hipFree(d_piv); - hipFree(d_x); - hipFree(d_b); - hipFree(d_A); - - return 0; -} -``` - -The code compilation can be done as follows: - -```console -hipcc hipsolver.hip.cpp -o hipsolver.x -lhipblas -lhipsolver -``` - -## Using OpenMP Offload to Program AMD GPUs - -The ROCm™ installation includes an LLVM-based implementation that fully supports the OpenMP 4.5 standard -and a subset of the OpenMP 5.0 standard. -Fortran, C/C++ compilers, and corresponding runtime libraries are included. - -The OpenMP toolchain is automatically installed as part of the standard ROCm installation -and is available under `/opt/rocm/llvm`. The sub-directories are: - -- `bin` : Compilers (flang and clang) and other binaries. -- `examples` : The usage section below shows how to compile and run these programs. -- `include` : Header files. -- `lib` : Libraries including those required for target offload. -- `lib-debug` : Debug versions of the above libraries. - -More information can be found in the [AMD OpenMP Support Guide](https://docs.amd.com/bundle/OpenMP-Support-Guide-v5.5/page/Introduction_to_OpenMP_Support_Guide.html). - -## Compilation of OpenMP Code - -Basic example that uses OpenMP offload is here. -Again, code is complete and can be copied and pasted into a file. -Here we use `vadd.cpp`. - -```console -#include <cstdio> -#include <cstdlib> - -int main(int argc, char ** argv) -{ - long long count = 1 << 20; - if(argc > 1) - count = atoll(argv[1]); - long long print_count = 16; - if(argc > 2) - print_count = atoll(argv[2]); - - long long * a = new long long[count]; - long long * b = new long long[count]; - long long * c = new long long[count]; - -#pragma omp parallel for - for(long long i = 0; i < count; i++) - { - a[i] = i; - b[i] = 10 * i; - } - - printf("A: "); - for(long long i = 0; i < print_count; i++) - printf("%3lld ", a[i]); - printf("\n"); - - printf("B: "); - for(long long i = 0; i < print_count; i++) - printf("%3lld ", b[i]); - printf("\n"); - -#pragma omp target map(to: a[0:count],b[0:count]) map(from: c[0:count]) -#pragma omp teams distribute parallel for - for(long long i = 0; i < count; i++) - { - c[i] = a[i] + b[i]; - } - - printf("C: "); - for(long long i = 0; i < print_count; i++) - printf("%3lld ", c[i]); - printf("\n"); - - delete[] a; - delete[] b; - delete[] c; - - return 0; -} -``` - -This code can be compiled like this: - -```console -/opt/rocm/llvm/bin/clang++ -O3 -target x86_64-pc-linux-gnu -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908 vadd.cpp -o vadd.x -``` - -These options are required for target offload from an OpenMP program: - -- `-target x86_64-pc-linux-gnu` -- `-fopenmp` -- `-fopenmp-targets=amdgcn-amd-amdhsa` -- `-Xopenmp-target=amdgcn-amd-amdhsa` - -This flag specifies the GPU architecture of targeted GPU. -You need to chage this when moving for instance to LUMI with MI250X GPU. -The MI100 GPUs presented in CS have code `gfx908`: - -- `-march=gfx908` - -Note: You also have to include the `O0`, `O2`, `O3` or `O3` flag. -Without this flag the execution of the compiled code fails. diff --git a/content/docs/cs/guides/arm.mdx b/content/docs/cs/guides/arm.mdx deleted file mode 100644 index 73bb7d785531adfffc3c76db64ab58b69e2e3196..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/arm.mdx +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Using ARM Partition" ---- -For testing your application on the ARM partition, -you need to prepare a job script for that partition or use the interactive job: - -``` -salloc -A PROJECT-ID -p p01-arm -``` - -On the partition, you should reload the list of modules: - -``` -ml architecture/aarch64 -``` - -For compilation, `gcc` and `OpenMPI` compilers are available. -Hence, the compilation process should be the same as on the `x64` architecture. - -Let's have the following `hello world` example: - -``` -#include "mpi.h" -#include "omp.h" - -int main(int argc, char **argv) -{ - int rank; - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - #pragma omp parallel - { - printf("Hello on rank %d, thread %d\n", rank, omp_get_thread_num()); - } - MPI_Finalize(); -} -``` - -You can compile and run the example: - -``` -ml OpenMPI/4.1.4-GCC-11.3.0 -mpic++ -fopenmp hello.cpp -o hello -mpirun -n 4 ./hello -``` - -Please see [gcc options](https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html) for more advanced compilation settings. -No complications are expected as long as the application does not use any intrinsic for `x64` architecture. -If you want to use intrinsic, -[SVE](https://developer.arm.com/documentation/102699/0100/Optimizing-with-intrinsics) instruction set is available. diff --git a/content/docs/cs/guides/grace.mdx b/content/docs/cs/guides/grace.mdx deleted file mode 100644 index 05c90528b009cde9fd28fc4456808e503cd3c2ad..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/grace.mdx +++ /dev/null @@ -1,308 +0,0 @@ ---- -title: "Using NVIDIA Grace Partition" ---- -For testing your application on the NVIDIA Grace Partition, -you need to prepare a job script for that partition or use the interactive job: - -```console -salloc -N 1 -c 144 -A PROJECT-ID -p p11-grace --time=08:00:00 -``` - -where: - -- `-N 1` means allocation single node, -- `-c 144` means allocation 144 cores, -- `-p p11-grace` is NVIDIA Grace partition, -- `--time=08:00:00` means allocation for 8 hours. - -## Available Toolchains - -The platform offers three toolchains: - -- Standard GCC (as a module `ml GCC`) -- [NVHPC](https://developer.nvidia.com/hpc-sdk) (as a module `ml NVHPC`) -- [Clang for NVIDIA Grace](https://developer.nvidia.com/grace/clang) (installed in `/opt/nvidia/clang`) - -<Callout> - The NVHPC toolchain showed strong results with minimal amount of tuning necessary in our initial evaluation. -</Callout> - -### GCC Toolchain - -The GCC compiler seems to struggle with vectorization of short (constant length) loops, which tend to get completely unrolled/eliminated instead of being vectorized. For example simple nested loop such as - -```cpp -for(int i = 0; i < 1000000; ++i) { - // Iterations dependent in "i" - // ... - for(int j = 0; j < 8; ++j) { - // but independent in "j" - // ... - } -} -``` - -may emit scalar code for the inner loop leading to no vectorization being used at all. - -### Clang (For Grace) Toolchain - -The Clang/LLVM tends to behave similarly, but can be guided to properly vectorize the inner loop with either flags `-O3 -ffast-math -march=native -fno-unroll-loops -mllvm -force-vector-width=8` or pragmas such as `#pragma clang loop vectorize_width(8)` and `#pragma clang loop unroll(disable)`. - -```cpp -for(int i = 0; i < 1000000; ++i) { - // Iterations dependent in "i" - // ... - #pragma clang loop unroll(disable) vectorize_width(8) - for(int j = 0; j < 8; ++j) { - // but independent in "j" - // ... - } -} -``` - -<Callout> - Our basic experiments show that fixed width vectorization (NEON) tends to perform better in the case of short (register-length) loops than SVE. In cases (like above), where specified `vectorize_width` is larger than availiable vector unit width, Clang will emit multiple NEON instructions (eg. 4 instructions will be emitted to process 8 64-bit operations in 128-bit units of Grace). -</Callout> - -### NVHPC Toolchain - -The NVHPC toolchain handled aforementioned case without any additional tuning. Simple `-O3 -march=native -fast` should be therefore sufficient. - -## Basic Math Libraries - -The basic libraries (BLAS and LAPACK) are included in NVHPC toolchain and can be used simply as `-lblas` and `-llapack` for BLAS and LAPACK respectively (`lp64` and `ilp64` versions are also included). - -<Callout> - The Grace platform doesn't include CUDA-capable GPU, therefore `nvcc` will fail with an error. This means that `nvc`, `nvc++` and `nvfortran` should be used instead. -</Callout> - -### NVIDIA Performance Libraries - -The [NVPL](https://developer.nvidia.com/nvpl) package includes more extensive set of libraries in both sequential and multi-threaded versions: - -- BLACS: `-lnvpl_blacs_{lp64,ilp64}_{mpich,openmpi3,openmpi4,openmpi5}` -- BLAS: `-lnvpl_blas_{lp64,ilp64}_{seq,gomp}` -- FFTW: `-lnvpl_fftw` -- LAPACK: `-lnvpl_lapack_{lp64,ilp64}_{seq,gomp}` -- ScaLAPACK: `-lnvpl_scalapack_{lp64,ilp64}` -- RAND: `-lnvpl_rand` or `-lnvpl_rand_mt` -- SPARSE: `-lnvpl_sparse` - -This package should be compatible with all availiable toolchains and includes CMake module files for easy integration into CMake-based projects. For further documentation see also [NVPL](https://docs.nvidia.com/nvpl). - -### Recommended BLAS Library - -We recommend to use the multi-threaded BLAS library from the NVPL package. - -<Callout> - It is important to pin the processes using **OMP_PROC_BIND=spread** -</Callout> - -Example: - -```console -$ ml NVHPC -$ nvc -O3 -march=native myprog.c -o myprog -lnvpl_blas_lp64_gomp -$ OMP_PROC_BIND=spread ./myprog -``` - -## Basic Communication Libraries - -The OpenMPI 4 implementation is included with NVHPC toolchain and is exposed as a module (`ml OpenMPI`). The following example - -```cpp -#include <mpi.h> -#include <sched.h> -#include <omp.h> - -int main(int argc, char **argv) -{ - int rank; - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - #pragma omp parallel - { - printf("Hello on rank %d, thread %d on CPU %d\n", rank, omp_get_thread_num(), sched_getcpu()); - } - MPI_Finalize(); -} -``` - -can be compiled and run as follows - -```console -ml OpenMPI -mpic++ -fast -fopenmp hello.cpp -o hello -OMP_PROC_BIND=close OMP_NUM_THREADS=4 mpirun -np 4 --map-by slot:pe=36 ./hello -``` - -In this configuration we run 4 ranks bound to one quarter of cores each with 4 OpenMP threads. - -## Simple BLAS Application - -The `hello world` example application (written in `C++` and `Fortran`) uses simple stationary probability vector estimation to illustrate use of GEMM (BLAS 3 routine). - -Stationary probability vector estimation in `C++`: - -```cpp -#include <iostream> -#include <vector> -#include <chrono> -#include "cblas.h" - -const size_t ITERATIONS = 32; -const size_t MATRIX_SIZE = 1024; - -int main(int argc, char *argv[]) -{ - const size_t matrixElements = MATRIX_SIZE*MATRIX_SIZE; - - std::vector<float> a(matrixElements, 1.0f / float(MATRIX_SIZE)); - - for(size_t i = 0; i < MATRIX_SIZE; ++i) - a[i] = 0.5f / (float(MATRIX_SIZE) - 1.0f); - a[0] = 0.5f; - - std::vector<float> w1(matrixElements, 0.0f); - std::vector<float> w2(matrixElements, 0.0f); - - std::copy(a.begin(), a.end(), w1.begin()); - - std::vector<float> *t1, *t2; - t1 = &w1; - t2 = &w2; - - auto c1 = std::chrono::steady_clock::now(); - - for(size_t i = 0; i < ITERATIONS; ++i) - { - std::fill(t2->begin(), t2->end(), 0.0f); - - cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, MATRIX_SIZE, MATRIX_SIZE, MATRIX_SIZE, - 1.0f, t1->data(), MATRIX_SIZE, - a.data(), MATRIX_SIZE, - 1.0f, t2->data(), MATRIX_SIZE); - - std::swap(t1, t2); - } - - auto c2 = std::chrono::steady_clock::now(); - - for(size_t i = 0; i < MATRIX_SIZE; ++i) - { - std::cout << (*t1)[i*MATRIX_SIZE + i] << " "; - } - - std::cout << std::endl; - - std::cout << "Elapsed Time: " << std::chrono::duration<double>(c2 - c1).count() << std::endl; - - return 0; -} -``` - -Stationary probability vector estimation in `Fortran`: - -```fortran -program main - implicit none - - integer :: matrix_size, iterations - integer :: i - real, allocatable, target :: a(:,:), w1(:,:), w2(:,:) - real, dimension(:,:), contiguous, pointer :: t1, t2, tmp - real, pointer :: out_data(:), out_diag(:) - integer :: cr, cm, c1, c2 - - iterations = 32 - matrix_size = 1024 - - call system_clock(count_rate=cr) - call system_clock(count_max=cm) - - allocate(a(matrix_size, matrix_size)) - allocate(w1(matrix_size, matrix_size)) - allocate(w2(matrix_size, matrix_size)) - - a(:,:) = 1.0 / real(matrix_size) - a(:,1) = 0.5 / real(matrix_size - 1) - a(1,1) = 0.5 - - w1 = a - w2(:,:) = 0.0 - - t1 => w1 - t2 => w2 - - call system_clock(c1) - - do i = 0, iterations - t2(:,:) = 0.0 - - call sgemm('N', 'N', matrix_size, matrix_size, matrix_size, 1.0, t1, matrix_size, a, matrix_size, 1.0, t2, matrix_size) - - tmp => t1 - t1 => t2 - t2 => tmp - end do - - call system_clock(c2) - - out_data(1:size(t1)) => t1 - out_diag => out_data(1::matrix_size+1) - - print *, out_diag - print *, "Elapsed Time: ", (c2 - c1) / real(cr) - - deallocate(a) - deallocate(w1) - deallocate(w2) -end program main -``` - -### Using NVHPC Toolchain - -The C++ version of the example can be compiled with NVHPC and ran as follows - -```console -ml NVHPC -nvc++ -O3 -march=native -fast -I$NVHPC/Linux_aarch64/$EBVERSIONNVHPC/compilers/include/lp64 -lblas main.cpp -o main -OMP_NUM_THREADS=144 OMP_PROC_BIND=spread ./main -``` - -The Fortran version is just as simple: - -```console -ml NVHPC -nvfortran -O3 -march=native -fast -lblas main.f90 -o main.x -OMP_NUM_THREADS=144 OMP_PROC_BIND=spread ./main -``` - -<Callout> - It may be advantageous to use NVPL libraries instead NVHPC ones. For example DGEMM BLAS 3 routine from NVPL is almost 30% faster than NVHPC one. -</Callout> - -### Using Clang (For Grace) Toolchain - -Similarly Clang for Grace toolchain with NVPL BLAS can be used to compile C++ version of the example. - -```console -ml NVHPC -/opt/nvidia/clang/17.23.11/bin/clang++ -O3 -march=native -ffast-math -I$NVHPC/Linux_aarch64/$EBVERSIONNVHPC/compilers/include/lp64 -lnvpl_blas_lp64_gomp main.cpp -o main -``` - -<Callout> - NVHPC module is used just for the `cblas.h` include in this case. This can be avoided by changing the code to use `nvpl_blas.h` instead. -</Callout> - -## Additional Resources - -- [https://www.nvidia.com/en-us/data-center/grace-cpu-superchip/][1] -- [https://developer.nvidia.com/hpc-sdk][2] -- [https://developer.nvidia.com/grace/clang][3] -- [https://docs.nvidia.com/nvpl][4] - -[1]: https://www.nvidia.com/en-us/data-center/grace-cpu-superchip/ -[2]: https://developer.nvidia.com/hpc-sdk -[3]: https://developer.nvidia.com/grace/clang -[4]: https://docs.nvidia.com/nvpl diff --git a/content/docs/cs/guides/hm_management.mdx b/content/docs/cs/guides/hm_management.mdx deleted file mode 100644 index 074578df438f17ec5738fe724fc07b9cfacf2d82..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/hm_management.mdx +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: "Heterogeneous Memory Management on Intel Platforms" ---- -Partition `p10-intel` offser heterogeneous memory directly exposed to the user. This allows to manually pick appropriate kind of memory to be used at process or even single allocation granularity. Both kinds of memory are exposed as memory-only NUMA nodes. This allows both coarse (process level) and fine (allocation level) grained control over memory type used. - -## Overview - -At the process level the `numactl` facilities can be utilized, while Intel provided `memkind` library allows for finer control. Both `memkind` library and `numactl` can be accessed by loading `memkind` module or `OpenMPI` module (only `numactl`). - -```bash -ml memkind -``` - -### Process Level (NUMACTL) - -The `numactl` allows to either restrict memory pool of the process to specific set of memory NUMA nodes - -```bash -numactl --membind <node_ids_set> -``` - -or select single preffered node - -```bash -numactl --preffered <node_id> -``` - -where `<node_ids_set>` is comma separated list (eg. `0,2,5,...`) in combination with ranges (such as `0-5`). The `membind` option kills the process if it requests more memory than can be satisfied from specified nodes. The `preffered` option just reverts to using other nodes according to their NUMA distance in the same situation. - -Convenient way to check `numactl` configuration is - -```bash -numactl -s -``` - -which prints configuration in its execution environment eg. - -```bash -numactl --membind 8-15 numactl -s -policy: bind -preferred node: 0 -physcpubind: 0 1 2 ... 189 190 191 -cpubind: 0 1 2 3 4 5 6 7 -nodebind: 0 1 2 3 4 5 6 7 -membind: 8 9 10 11 12 13 14 15 -``` - -The last row shows allocations memory are restricted to NUMA nodes `8-15`. - -### Allocation Level (MEMKIND) - -The `memkind` library (in its simplest use case) offers new variant of `malloc/free` function pair, which allows to specify kind of memory to be used for given allocation. Moving specific allocation from default to HBM memory pool then can be achieved by replacing: - -```cpp -void *pData = malloc(<SIZE>); -/* ... */ -free(pData); -``` - -with - -```cpp -#include <memkind.h> - -void *pData = memkind_malloc(MEMKIND_HBW, <SIZE>); -/* ... */ -memkind_free(NULL, pData); // "kind" parameter is deduced from the address -``` - -Similarly other memory types can be chosen. - -<Callout> - The allocation will return `NULL` pointer when memory of specified kind is not available. -</Callout> - -## High Bandwidth Memory (HBM) - -Intel Sapphire Rapids (partition `p10-intel`) consists of two sockets each with `128GB` of DDR and `64GB` on-package HBM memory. The machine is configured in FLAT mode and therefore exposes HBM memory as memory-only NUMA nodes (`16GB` per 12-core tile). The configuration can be verified by running - -```bash -numactl -H -``` - -which should show 16 NUMA nodes (`0-7` should contain 12 cores and `32GB` of DDR DRAM, while `8-15` should have no cores and `16GB` of HBM each). - - - -### Process Level - -With this we can easily restrict application to DDR DRAM or HBM memory: - -```bash -# Only DDR DRAM -numactl --membind 0-7 ./stream -# ... -Function Best Rate MB/s Avg time Min time Max time -Copy: 369745.8 0.043355 0.043273 0.043588 -Scale: 366989.8 0.043869 0.043598 0.045355 -Add: 378054.0 0.063652 0.063483 0.063899 -Triad: 377852.5 0.063621 0.063517 0.063884 - -# Only HBM -numactl --membind 8-15 ./stream -# ... -Function Best Rate MB/s Avg time Min time Max time -Copy: 1128430.1 0.015214 0.014179 0.015615 -Scale: 1045065.2 0.015814 0.015310 0.016309 -Add: 1096992.2 0.022619 0.021878 0.024182 -Triad: 1065152.4 0.023449 0.022532 0.024559 -``` - -The DDR DRAM achieves bandwidth of around 400GB/s, while the HBM clears 1TB/s bar. - -Some further improvements can be achieved by entirely isolating a process to a single tile. This can be useful for MPI jobs, where `$OMPI_COMM_WORLD_RANK` can be used to bind each process individually. The simple wrapper script to do this may look like - -```bash -#!/bin/bash -numactl --membind $((8 + $OMPI_COMM_WORLD_RANK)) $@ -``` - -and can be used as - -```bash -mpirun -np 8 --map-by slot:pe=12 membind_wrapper.sh ./stream_mpi -``` - -(8 tiles with 12 cores each). However, this approach assumes `16GB` of HBM memory local to the tile is sufficient for each process (memory cannot spill between tiles). This approach may be significantly more useful in combination with `--preferred` instead of `--membind` to force preference of local HBM with spill to DDR DRAM. Otherwise - -```bash -mpirun -n 8 --map-by slot:pe=12 numactl --membind 8-15 ./stream_mpi -``` - -is most likely preferable even for MPI workloads. Applying above approach to MPI Stream with 8 ranks and 1-24 threads per rank we can expect these results: - - - -### Allocation Level - -Allocation level memory kind selection using `memkind` library can be illustrated using modified stream benchmark. The stream benchmark uses three working arrays (A, B and C), whose allocation can be changed to `memkind_malloc` as follows - -```cpp -#include <memkind.h> -// ... -STREAM_TYPE *a = (STREAM_TYPE *)memkind_malloc(MEMKIND_HBW_ALL, STREAM_ARRAY_SIZE * sizeof(STREAM_TYPE)); -STREAM_TYPE *b = (STREAM_TYPE *)memkind_malloc(MEMKIND_REGULAR, STREAM_ARRAY_SIZE * sizeof(STREAM_TYPE)); -STREAM_TYPE *c = (STREAM_TYPE *)memkind_malloc(MEMKIND_HBW_ALL, STREAM_ARRAY_SIZE * sizeof(STREAM_TYPE)); -// ... -memkind_free(NULL, a); -memkind_free(NULL, b); -memkind_free(NULL, c); -``` - -Arrays A and C are allocated from HBM (`MEMKIND_HBW_ALL`), while DDR DRAM (`MEMKIND_REGULAR`) is used for B. -The code then has to be linked with `memkind` library - -```bash -gcc -march=native -O3 -fopenmp -lmemkind memkind_stream.c -o memkind_stream -``` - -and can be run as - -```bash -export MEMKIND_HBW_NODES=8,9,10,11,12,13,14,15 -OMP_NUM_THREADS=$((N*12)) OMP_PROC_BIND=spread ./memkind_stream -``` - -While the `memkind` library should be able to detect HBM memory on its own (through `HMAT` and `hwloc`) this is not supported on `p10-intel`. This means that NUMA nodes representing HBM have to be specified manually using `MEMKIND_HBW_NODES` environment variable. - - - -With this setup we can see that simple copy operation (C[i] = A[i]) achieves bandwidth comparable to the application bound entirely to HBM memory. On the other hand the scale operation (B[i] = s*C[i]) is mostly limited by DDR DRAM bandwidth. Its also worth noting that operations combining all three arrays are performing close to HBM-only configuration. - -## Simple Application - -One of applications that can greatly benefit from availability of large slower and faster smaller memory is computing histogram with many bins over large dataset. - -```cpp -#include <iostream> -#include <vector> -#include <chrono> -#include <cmath> -#include <cstring> -#include <omp.h> -#include <memkind.h> - -const size_t N_DATA_SIZE = 2 * 1024 * 1024 * 1024ull; -const size_t N_BINS_COUNT = 1 * 1024 * 1024ull; -const size_t N_ITERS = 10; - -#if defined(HBM) - #define DATA_MEMKIND MEMKIND_REGULAR - #define BINS_MEMKIND MEMKIND_HBW_ALL -#else - #define DATA_MEMKIND MEMKIND_REGULAR - #define BINS_MEMKIND MEMKIND_REGULAR -#endif - -int main(int argc, char *argv[]) -{ - const double binWidth = 1.0 / double(N_BINS_COUNT + 1); - - double *pData = (double *)memkind_malloc(DATA_MEMKIND, N_DATA_SIZE * sizeof(double)); - size_t *pBins = (size_t *)memkind_malloc(BINS_MEMKIND, N_BINS_COUNT * omp_get_max_threads() * sizeof(double)); - - #pragma omp parallel - { - drand48_data state; - srand48_r(omp_get_thread_num(), &state); - - #pragma omp for - for(size_t i = 0; i < N_DATA_SIZE; ++i) - drand48_r(&state, &pData[i]); - } - - auto c1 = std::chrono::steady_clock::now(); - - for(size_t it = 0; it < N_ITERS; ++it) - { - #pragma omp parallel - { - for(size_t i = 0; i < N_BINS_COUNT; ++i) - pBins[omp_get_thread_num()*N_BINS_COUNT + i] = size_t(0); - - #pragma omp for - for(size_t i = 0; i < N_DATA_SIZE; ++i) - { - const size_t idx = size_t(pData[i] / binWidth) % N_BINS_COUNT; - pBins[omp_get_thread_num()*N_BINS_COUNT + idx]++; - } - } - } - - auto c2 = std::chrono::steady_clock::now(); - - #pragma omp parallel for - for(size_t i = 0; i < N_BINS_COUNT; ++i) - { - for(size_t j = 1; j < omp_get_max_threads(); ++j) - pBins[i] += pBins[j*N_BINS_COUNT + i]; - } - - std::cout << "Elapsed Time [s]: " << std::chrono::duration<double>(c2 - c1).count() << std::endl; - - size_t total = 0; - #pragma omp parallel for reduction(+:total) - for(size_t i = 0; i < N_BINS_COUNT; ++i) - total += pBins[i]; - - std::cout << "Total Items: " << total << std::endl; - - memkind_free(NULL, pData); - memkind_free(NULL, pBins); - - return 0; -} -``` - -### Using HBM Memory (P10-Intel) - -Following commands can be used to compile and run example application above - -```bash -ml GCC memkind -export MEMKIND_HBW_NODES=8,9,10,11,12,13,14,15 -g++ -O3 -fopenmp -lmemkind histogram.cpp -o histogram_dram -g++ -O3 -fopenmp -lmemkind -DHBM histogram.cpp -o histogram_hbm -OMP_PROC_BIND=spread GOMP_CPU_AFFINITY=0-95 OMP_NUM_THREADS=96 ./histogram_dram -OMP_PROC_BIND=spread GOMP_CPU_AFFINITY=0-95 OMP_NUM_THREADS=96 ./histogram_hbm -``` - -Moving histogram bins data into HBM memory should speedup the algorithm more than twice. It should be noted that moving also `pData` array into HBM memory worsens this result (presumably because the algorithm can saturate both memory interfaces). - -## Additional Resources - -- [https://linux.die.net/man/8/numactl][1] -- [http://memkind.github.io/memkind/man_pages/memkind.html][2] -- [https://lenovopress.lenovo.com/lp1738-implementing-intel-high-bandwidth-memory][3] - -[1]: https://linux.die.net/man/8/numactl -[2]: http://memkind.github.io/memkind/man_pages/memkind.html -[3]: https://lenovopress.lenovo.com/lp1738-implementing-intel-high-bandwidth-memory diff --git a/content/docs/cs/guides/horizon.mdx b/content/docs/cs/guides/horizon.mdx deleted file mode 100644 index e90a14c7e78e3299ee874e86d093adbb739160b3..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/horizon.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Using VMware Horizon" ---- -VMware Horizon is a virtual desktop infrastructure (VDI) solution -that enables users to access virtual desktops and applications from any device and any location. -It provides a comprehensive end-to-end solution for managing and delivering virtual desktops and applications, -including features such as session management, user authentication, and virtual desktop provisioning. - - - -## How to Access VMware Horizon - -<Callout type=warn> - Access to VMware Horizon requires IT4I VPN. -</Callout> - -1. Contact [IT4I support][a] with a request for an access and VM allocation. -1. [Download][1] and install the VMware Horizon Client for Windows. -1. Add a new server `https://vdi-cs01.msad.it4i.cz/` in the Horizon client. -1. Connect to the server using your IT4I username and password. - Username is in the `domain\username` format and the domain is `msad.it4i.cz`. - For example: `msad.it4i.cz\user123` - -## Example - -Below is an example of how to mount a remote folder and check the conection on Windows OS: - -### Prerequsities - -3D applications - -* [Blender][3] - -SSHFS for remote access - -* [sshfs-win][4] -* [winfsp][5] -* [shfs-win-manager][6] -* ssh keys for access to clusters - -### Steps - -1. Start the VPN and connect to the server via VMware Horizon Client. - -  - -1. Mount a remote folder. - * Run sshfs-win-manager. - -  - - * Add a new connection. - -  - - * Click on **Connect**. - -  - -1. Check that the folder is mounted. - -  - -1. Check the GPU resources. - -  - -### Blender - -Now if you run, for example, Blender, you can check the available GPU resources in Blender Preferences. - -  - -[a]: mailto:support@it4i.cz - -[1]: https://vdi-cs01.msad.it4i.cz/ -[2]: https://www.paraview.org/download/ -[3]: https://www.blender.org/download/ -[4]: https://github.com/winfsp/sshfs-win/releases -[5]: https://github.com/winfsp/winfsp/releases/ -[6]: https://github.com/evsar3/sshfs-win-manager/releases diff --git a/content/docs/cs/guides/meta.json b/content/docs/cs/guides/meta.json deleted file mode 100644 index 9368e761bbb69f48a3aeda784f466df3b50edb85..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/meta.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Guides", - "pages": [ - "amd", - "arm", - "grace", - "hm_management", - "horizon", - "power10", - "xilinx" - ] -} diff --git a/content/docs/cs/guides/power10.mdx b/content/docs/cs/guides/power10.mdx deleted file mode 100644 index 43e7ec3ddd2f27ca32e0dd3845c2c913ca599095..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/power10.mdx +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: "Using IBM Power Partition" ---- -For testing your application on the IBM Power partition, -you need to prepare a job script for that partition or use the interactive job: - -```console -scalloc -N 1 -c 192 -A PROJECT-ID -p p07-power --time=08:00:00 -``` - -where: - -- `-N 1` means allocation single node, -- `-c 192` means allocation 192 cores (threads), -- `-p p07-power` is IBM Power partition, -- `--time=08:00:00` means allocation for 8 hours. - -On the partition, you should reload the list of modules: - -``` -ml architecture/ppc64le -``` - -The platform offers both `GNU` based and proprietary IBM toolchains for building applications. IBM also provides optimized BLAS routines library ([ESSL](https://www.ibm.com/docs/en/essl/6.1)), which can be used by both toolchain. - -## Building Applications - -Our sample application depends on `BLAS`, therefore we start by loading following modules (regardless of which toolchain we want to use): - -``` -ml GCC OpenBLAS -``` - -### GCC Toolchain - -In the case of GCC toolchain we can go ahead and compile the application as usual using either `g++` - -``` -g++ -lopenblas hello.cpp -o hello -``` - -or `gfortran` - -``` -gfortran -lopenblas hello.f90 -o hello -``` - -as usual. - -### IBM Toolchain - -The IBM toolchain requires additional environment setup as it is installed in `/opt/ibm` and is not exposed as a module - -``` -IBM_ROOT=/opt/ibm -OPENXLC_ROOT=$IBM_ROOT/openxlC/17.1.1 -OPENXLF_ROOT=$IBM_ROOT/openxlf/17.1.1 - -export PATH=$OPENXLC_ROOT/bin:$PATH -export LD_LIBRARY_PATH=$OPENXLC_ROOT/lib:$LD_LIBRARY_PATH - -export PATH=$OPENXLF_ROOT/bin:$PATH -export LD_LIBRARY_PATH=$OPENXLF_ROOT/lib:$LD_LIBRARY_PATH -``` - -from there we can use either `ibm-clang++` - -``` -ibm-clang++ -lopenblas hello.cpp -o hello -``` - -or `xlf` - -``` -xlf -lopenblas hello.f90 -o hello -``` - -to build the application as usual. - -<Callout> - Combination of `xlf` and `openblas` seems to cause severe performance degradation. Therefore `ESSL` library should be preferred (see below). -</Callout> - -### Using ESSL Library - -The [ESSL](https://www.ibm.com/docs/en/essl/6.1) library is installed in `/opt/ibm/math/essl/7.1` so we define additional environment variables - -``` -IBM_ROOT=/opt/ibm -ESSL_ROOT=${IBM_ROOT}math/essl/7.1 -export LD_LIBRARY_PATH=$ESSL_ROOT/lib64:$LD_LIBRARY_PATH -``` - -The simplest way to utilize `ESSL` in application, which already uses `BLAS` or `CBLAS` routines is to link with the provided `libessl.so`. This can be done by replacing `-lopenblas` with `-lessl` or `-lessl -lopenblas` (in case `ESSL` does not provide all required `BLAS` routines). -In practice this can look like - -``` -g++ -L${ESSL_ROOT}/lib64 -lessl -lopenblas hello.cpp -o hello -``` - -or - -``` -gfortran -L${ESSL_ROOT}/lib64 -lessl -lopenblas hello.f90 -o hello -``` - -and similarly for IBM compilers (`ibm-clang++` and `xlf`). - -## Hello World Applications - -The `hello world` example application (written in `C++` and `Fortran`) uses simple stationary probability vector estimation to illustrate use of GEMM (BLAS 3 routine). - -Stationary probability vector estimation in `C++`: - -```c++ -#include <iostream> -#include <vector> -#include <chrono> -#include "cblas.h" - -const size_t ITERATIONS = 32; -const size_t MATRIX_SIZE = 1024; - -int main(int argc, char *argv[]) -{ - const size_t matrixElements = MATRIX_SIZE*MATRIX_SIZE; - - std::vector<float> a(matrixElements, 1.0f / float(MATRIX_SIZE)); - - for(size_t i = 0; i < MATRIX_SIZE; ++i) - a[i] = 0.5f / (float(MATRIX_SIZE) - 1.0f); - a[0] = 0.5f; - - std::vector<float> w1(matrixElements, 0.0f); - std::vector<float> w2(matrixElements, 0.0f); - - std::copy(a.begin(), a.end(), w1.begin()); - - std::vector<float> *t1, *t2; - t1 = &w1; - t2 = &w2; - - auto c1 = std::chrono::steady_clock::now(); - - for(size_t i = 0; i < ITERATIONS; ++i) - { - std::fill(t2->begin(), t2->end(), 0.0f); - - cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, MATRIX_SIZE, MATRIX_SIZE, MATRIX_SIZE, - 1.0f, t1->data(), MATRIX_SIZE, - a.data(), MATRIX_SIZE, - 1.0f, t2->data(), MATRIX_SIZE); - - std::swap(t1, t2); - } - - auto c2 = std::chrono::steady_clock::now(); - - for(size_t i = 0; i < MATRIX_SIZE; ++i) - { - std::cout << (*t1)[i*MATRIX_SIZE + i] << " "; - } - - std::cout << std::endl; - - std::cout << "Elapsed Time: " << std::chrono::duration<double>(c2 - c1).count() << std::endl; - - return 0; -} -``` - -Stationary probability vector estimation in `Fortran`: - -```fortran -program main - implicit none - - integer :: matrix_size, iterations - integer :: i - real, allocatable, target :: a(:,:), w1(:,:), w2(:,:) - real, dimension(:,:), contiguous, pointer :: t1, t2, tmp - real, pointer :: out_data(:), out_diag(:) - integer :: cr, cm, c1, c2 - - iterations = 32 - matrix_size = 1024 - - call system_clock(count_rate=cr) - call system_clock(count_max=cm) - - allocate(a(matrix_size, matrix_size)) - allocate(w1(matrix_size, matrix_size)) - allocate(w2(matrix_size, matrix_size)) - - a(:,:) = 1.0 / real(matrix_size) - a(:,1) = 0.5 / real(matrix_size - 1) - a(1,1) = 0.5 - - w1 = a - w2(:,:) = 0.0 - - t1 => w1 - t2 => w2 - - call system_clock(c1) - - do i = 0, iterations - t2(:,:) = 0.0 - - call sgemm('N', 'N', matrix_size, matrix_size, matrix_size, 1.0, t1, matrix_size, a, matrix_size, 1.0, t2, matrix_size) - - tmp => t1 - t1 => t2 - t2 => tmp - end do - - call system_clock(c2) - - out_data(1:size(t1)) => t1 - out_diag => out_data(1::matrix_size+1) - - print *, out_diag - print *, "Elapsed Time: ", (c2 - c1) / real(cr) - - deallocate(a) - deallocate(w1) - deallocate(w2) -end program main -``` diff --git a/content/docs/cs/guides/xilinx.mdx b/content/docs/cs/guides/xilinx.mdx deleted file mode 100644 index 4195b9222704d576e210ed634e4a399bf971ea20..0000000000000000000000000000000000000000 --- a/content/docs/cs/guides/xilinx.mdx +++ /dev/null @@ -1,878 +0,0 @@ ---- -title: "Using Xilinx Accelerator Platform" ---- -The first step to use Xilinx accelerators is to initialize Vitis (compiler) and XRT (runtime) environments. - -```console -$ . /tools/Xilinx/Vitis/2023.1/settings64.sh -$ . /opt/xilinx/xrt/setup.sh -``` - -## Platform Level Accelerator Management - -This should allow to examine current platform using `xbutil examine`, -which should output user-level information about XRT platform and list available devices - -``` -$ xbutil examine -System Configuration - OS Name : Linux - Release : 4.18.0-477.27.1.el8_8.x86_64 - Version : #1 SMP Thu Aug 31 10:29:22 EDT 2023 - Machine : x86_64 - CPU Cores : 64 - Memory : 257145 MB - Distribution : Red Hat Enterprise Linux 8.8 (Ootpa) - GLIBC : 2.28 - Model : ProLiant XL675d Gen10 Plus - -XRT - Version : 2.16.0 - Branch : master - Hash : f2524a2fcbbabd969db19abf4d835c24379e390d - Hash Date : 2023-10-11 14:01:19 - XOCL : 2.16.0, f2524a2fcbbabd969db19abf4d835c24379e390d - XCLMGMT : 2.16.0, f2524a2fcbbabd969db19abf4d835c24379e390d - -Devices present -BDF : Shell Logic UUID Device ID Device Ready* -------------------------------------------------------------------------------------------------------------------------- -[0000:88:00.1] : xilinx_u280_gen3x16_xdma_base_1 283BAB8F-654D-8674-968F-4DA57F7FA5D7 user(inst=132) Yes -[0000:8c:00.1] : xilinx_u280_gen3x16_xdma_base_1 283BAB8F-654D-8674-968F-4DA57F7FA5D7 user(inst=133) Yes - - -* Devices that are not ready will have reduced functionality when using XRT tools -``` - -Here two Xilinx Alveo u280 accelerators (`0000:88:00.1` and `0000:8c:00.1`) are available. -The `xbutil` can be also used to query additional information about specific device using its BDF address - -```console -$ xbutil examine -d "0000:88:00.1" - -------------------------------------------------- -[0000:88:00.1] : xilinx_u280_gen3x16_xdma_base_1 -------------------------------------------------- -Platform - XSA Name : xilinx_u280_gen3x16_xdma_base_1 - Logic UUID : 283BAB8F-654D-8674-968F-4DA57F7FA5D7 - FPGA Name : - JTAG ID Code : 0x14b7d093 - DDR Size : 0 Bytes - DDR Count : 0 - Mig Calibrated : true - P2P Status : disabled - Performance Mode : not supported - P2P IO space required : 64 GB - -Clocks - DATA_CLK (Data) : 300 MHz - KERNEL_CLK (Kernel) : 500 MHz - hbm_aclk (System) : 450 MHz - -Mac Addresses : 00:0A:35:0E:20:B0 - : 00:0A:35:0E:20:B1 - - Device Status: HEALTHY - Hardware Context ID: 0 - Xclbin UUID: 6306D6AE-1D66-AEA7-B15D-446D4ECC53BD - PL Compute Units - Index Name Base Address Usage Status - ------------------------------------------------- - 0 vadd:vadd_1 0x800000 1 (IDLE) -``` - -Basic functionality of the device can be checked using `xbutil validate -d <BDF>` as - -```console -$ xbutil validate -d "0000:88:00.1" -Validate Device : [0000:88:00.1] - Platform : xilinx_u280_gen3x16_xdma_base_1 - SC Version : 4.3.27 - Platform ID : 283BAB8F-654D-8674-968F-4DA57F7FA5D7 -------------------------------------------------------------------------------- -Test 1 [0000:88:00.1] : aux-connection - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 2 [0000:88:00.1] : pcie-link - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 3 [0000:88:00.1] : sc-version - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 4 [0000:88:00.1] : verify - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 5 [0000:88:00.1] : dma - Details : Buffer size - '16 MB' Memory Tag - 'HBM[0]' - Host -> PCIe -> FPGA write bandwidth = 11988.9 MB/s - Host <- PCIe <- FPGA read bandwidth = 12571.2 MB/s - ... - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 6 [0000:88:00.1] : iops - Details : IOPS: 387240(verify) - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 7 [0000:88:00.1] : mem-bw - Details : Throughput (Type: DDR) (Bank count: 2) : 33932.9MB/s - Throughput of Memory Tag: DDR[0] is 16974.1MB/s - Throughput of Memory Tag: DDR[1] is 16974.2MB/s - Throughput (Type: HBM) (Bank count: 1) : 12383.7MB/s - Test Status : [PASSED] -------------------------------------------------------------------------------- -Test 8 [0000:88:00.1] : p2p -Test 9 [0000:88:00.1] : vcu -Test 10 [0000:88:00.1] : aie -Test 11 [0000:88:00.1] : ps-aie -Test 12 [0000:88:00.1] : ps-pl-verify -Test 13 [0000:88:00.1] : ps-verify -Test 14 [0000:88:00.1] : ps-iops -``` - -Finally, the device can be reinitialized using `xbutil reset -d <BDF>` as - -```console -$ xbutil reset -d "0000:88:00.1" -Performing 'HOT Reset' on '0000:88:00.1' -Are you sure you wish to proceed? [Y/n]: Y -Successfully reset Device[0000:88:00.1] -``` - -This can be useful to recover the device from states such as `HANGING`, reported by `xbutil examine -d <BDF>`. - -## OpenCL Platform Level - -The `clinfo` utility can be used to verify that the accelerator is visible to OpenCL - -```console -$ clinfo -Number of platforms: 2 - Platform Profile: FULL_PROFILE - Platform Version: OpenCL 2.1 AMD-APP (3590.0) - Platform Name: AMD Accelerated Parallel Processing - Platform Vendor: Advanced Micro Devices, Inc. - Platform Extensions: cl_khr_icd cl_amd_event_callback - Platform Profile: EMBEDDED_PROFILE - Platform Version: OpenCL 1.0 - Platform Name: Xilinx - Platform Vendor: Xilinx - Platform Extensions: cl_khr_icd -<...> - Platform Name: Xilinx -Number of devices: 2 - Device Type: CL_DEVICE_TYPE_ACCRLERATOR - Vendor ID: 0h - Max compute units: 0 - Max work items dimensions: 3 - Max work items[0]: 4294967295 - Max work items[1]: 4294967295 - Max work items[2]: 4294967295 - Max work group size: 4294967295 - Preferred vector width char: 1 - Preferred vector width short: 1 - Preferred vector width int: 1 - Preferred vector width long: 1 - Preferred vector width float: 1 - Preferred vector width double: 0 - Max clock frequency: 0Mhz - Address bits: 64 - Max memory allocation: 4294967296 - Image support: Yes - Max number of images read arguments: 128 - Max number of images write arguments: 8 - Max image 2D width: 8192 - Max image 2D height: 8192 - Max image 3D width: 2048 - Max image 3D height: 2048 - Max image 3D depth: 2048 - Max samplers within kernel: 0 - Max size of kernel argument: 2048 - Alignment (bits) of base address: 32768 - Minimum alignment (bytes) for any datatype: 128 - Single precision floating point capability - Denorms: No - Quiet NaNs: Yes - Round to nearest even: Yes - Round to zero: No - Round to +ve and infinity: No - IEEE754-2008 fused multiply-add: No - Cache type: None - Cache line size: 64 - Cache size: 0 - Global memory size: 0 - Constant buffer size: 4194304 - Max number of constant args: 8 - Local memory type: Scratchpad - Local memory size: 16384 - Error correction support: 1 - Profiling timer resolution: 1 - Device endianess: Little - Available: No - Compiler available: No - Execution capabilities: - Execute OpenCL kernels: Yes - Execute native function: No - Queue on Host properties: - Out-of-Order: Yes - Profiling: Yes - Platform ID: 0x16fbae8 - Name: xilinx_u280_gen3x16_xdma_base_1 - Vendor: Xilinx - Driver version: 1.0 - Profile: EMBEDDED_PROFILE - Version: OpenCL 1.0 -<...> -``` - -which shows that both `Xilinx` platform and accelerator devices are present. - -## Building Applications - -To simplify the build process we define two environment variables `IT4I_PLATFORM` and `IT4I_BUILD_MODE`. -The first `IT4I_PLATFORM` denotes specific accelerator hardware such as `Alveo u250` or `Alveo u280` -and its configuration stored in (`*.xpfm` files). -The list of available platforms can be obtained using `platforminfo` utility: - -```console -$ platforminfo -l -{ - "platforms": [ - { - "baseName": "xilinx_u280_gen3x16_xdma_1_202211_1", - "version": "202211.1", - "type": "sdaccel", - "dataCenter": "true", - "embedded": "false", - "externalHost": "true", - "serverManaged": "true", - "platformState": "impl", - "usesPR": "true", - "platformFile": "\/opt\/xilinx\/platforms\/xilinx_u280_gen3x16_xdma_1_202211_1\/xilinx_u280_gen3x16_xdma_1_202211_1.xpfm" - }, - { - "baseName": "xilinx_u250_gen3x16_xdma_4_1_202210_1", - "version": "202210.1", - "type": "sdaccel", - "dataCenter": "true", - "embedded": "false", - "externalHost": "true", - "serverManaged": "true", - "platformState": "impl", - "usesPR": "true", - "platformFile": "\/opt\/xilinx\/platforms\/xilinx_u250_gen3x16_xdma_4_1_202210_1\/xilinx_u250_gen3x16_xdma_4_1_202210_1.xpfm" - } - ] -} -``` - -Here, `baseName` and potentially `platformFile` are of interest and either can be specified as value of `IT4I_PLATFORM`. -In this case we have platform files `xilinx_u280_gen3x16_xdma_1_202211_1` (Alveo u280) and `xilinx_u250_gen3x16_xdma_4_1_202210_1` (Alveo u250). - -The `IT4I_BUILD_MODE` is used to specify build type (`hw`, `hw_emu` and `sw_emu`): - -- `hw` performs full synthesis for the accelerator -- `hw_emu` allows to run both synthesis and emulation for debugging -- `sw_emu` compiles kernels only for emulation (doesn't require accelerator and allows much faster build) - -For example to configure build for `Alveo u280` we set: - -```console -$ export IT4I_PLATFORM=xilinx_u280_gen3x16_xdma_1_202211_1 -``` - -### Software Emulation Mode - -The software emulation mode is preferable for development as HLS synthesis is very time consuming. To build following applications in this mode we set: - -```console -$ export IT4I_BUILD_MODE=sw_emu -``` - -and run each application with `XCL_EMULATION_MODE` set to `sw_emu`: - -``` -$ XCL_EMULATION_MODE=sw_emu <application> -``` - -### Hardware Synthesis Mode - -<Callout> - The HLS of these simple applications **can take up to 2 hours** to finish. -</Callout> - -To allow the application to utilize real hardware we have to synthetize FPGA design for the accelerator. This can be done by repeating same steps used to build kernels in emulation mode, but with `IT4I_BUILD_MODE` set to `hw` like so: - -```console -$ export IT4I_BUILD_MODE=hw -``` - -the host application binary can be reused, but it has to be run without `XCL_EMULATION_MODE`: - -```console -$ <application> -``` - -## Sample Applications - -The first two samples illustrate two main approaches to building FPGA accelerated applications using Xilinx platform - **XRT** and **OpenCL**. -The final example combines **HIP** with **XRT** to show basics necessary to build application, which utilizes both GPU and FPGA accelerators. - -### Using HLS and XRT - -The applications are typically separated into host and accelerator/kernel side. -The following host-side code should be saved as `host.cpp` - -```c++ -/* -# Copyright (C) 2023, Advanced Micro Devices, Inc. All rights reserved. -# SPDX-License-Identifier: X11 -*/ -#include <iostream> -#include <cstring> - -// XRT includes -#include "xrt/xrt_bo.h" -#include <experimental/xrt_xclbin.h> -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" - -#define DATA_SIZE 4096 - -int main(int argc, char** argv) -{ - if(argc != 2) - { - std::cout << "Usage: " << argv[0] << " <XCLBIN File>" << std::endl; - return EXIT_FAILURE; - } - - // Read settings - std::string binaryFile = argv[1]; - int device_index = 0; - - std::cout << "Open the device" << device_index << std::endl; - auto device = xrt::device(device_index); - std::cout << "Load the xclbin " << binaryFile << std::endl; - auto uuid = device.load_xclbin("./vadd.xclbin"); - - size_t vector_size_bytes = sizeof(int) * DATA_SIZE; - - //auto krnl = xrt::kernel(device, uuid, "vadd"); - auto krnl = xrt::kernel(device, uuid, "vadd", xrt::kernel::cu_access_mode::exclusive); - - std::cout << "Allocate Buffer in Global Memory\n"; - auto boIn1 = xrt::bo(device, vector_size_bytes, krnl.group_id(0)); //Match kernel arguments to RTL kernel - auto boIn2 = xrt::bo(device, vector_size_bytes, krnl.group_id(1)); - auto boOut = xrt::bo(device, vector_size_bytes, krnl.group_id(2)); - - // Map the contents of the buffer object into host memory - auto bo0_map = boIn1.map<int*>(); - auto bo1_map = boIn2.map<int*>(); - auto bo2_map = boOut.map<int*>(); - std::fill(bo0_map, bo0_map + DATA_SIZE, 0); - std::fill(bo1_map, bo1_map + DATA_SIZE, 0); - std::fill(bo2_map, bo2_map + DATA_SIZE, 0); - - // Create the test data - int bufReference[DATA_SIZE]; - for (int i = 0; i < DATA_SIZE; ++i) - { - bo0_map[i] = i; - bo1_map[i] = i; - bufReference[i] = bo0_map[i] + bo1_map[i]; //Generate check data for validation - } - - // Synchronize buffer content with device side - std::cout << "synchronize input buffer data to device global memory\n"; - boIn1.sync(XCL_BO_SYNC_BO_TO_DEVICE); - boIn2.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - std::cout << "Execution of the kernel\n"; - auto run = krnl(boIn1, boIn2, boOut, DATA_SIZE); //DATA_SIZE=size - run.wait(); - - // Get the output; - std::cout << "Get the output data from the device" << std::endl; - boOut.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - - // Validate results - if (std::memcmp(bo2_map, bufReference, vector_size_bytes)) - throw std::runtime_error("Value read back does not match reference"); - - std::cout << "TEST PASSED\n"; - return 0; -} -``` - -The host-side code can now be compiled using GCC toolchain as: - -```console -$ g++ host.cpp -I$XILINX_XRT/include -I$XILINX_VIVADO/include -L$XILINX_XRT/lib -lxrt_coreutil -o host -``` - -The accelerator side (simple vector-add kernel) should be saved as `vadd.cpp`. - -```c++ -/* -# Copyright (C) 2023, Advanced Micro Devices, Inc. All rights reserved. -# SPDX-License-Identifier: X11 -*/ - -extern "C" { - void vadd( - const unsigned int *in1, // Read-Only Vector 1 - const unsigned int *in2, // Read-Only Vector 2 - unsigned int *out, // Output Result - int size // Size in integer - ) - { -#pragma HLS INTERFACE m_axi port=in1 bundle=aximm1 -#pragma HLS INTERFACE m_axi port=in2 bundle=aximm2 -#pragma HLS INTERFACE m_axi port=out bundle=aximm1 - - for(int i = 0; i < size; ++i) - { - out[i] = in1[i] + in2[i]; - } - } -} -``` - -The accelerator-side code is build using Vitis `v++`. -This is two-step process, which either builds emulation binary or performs full HLS (depending on the value of `-t` argument). -The platform (specific accelerator) has to be also specified at this step (both for emulation and full HLS). - -```console -$ v++ -c -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM -k vadd vadd.cpp -o vadd.xo -$ v++ -l -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM vadd.xo -o vadd.xclbin -``` - -This process should result in `vadd.xclbin`, which can be loaded by host-side application. - -### Running the Application - -With both host application and kernel binary at hand the application (in emulation mode) can be launched as - -```console -$ XCL_EMULATION_MODE=sw_emu ./host vadd.xclbin -``` - -or with real hardware (having compiled kernels with `IT4I_BUILD_MODE=hw`) - -```console -./host vadd.xclbin -``` - -## Using HLS and OpenCL - -The host-side application code should be saved as `host.cpp`. -This application attempts to find `Xilinx` OpenCL platform in the system and selects first device in that platform. -The device is then configured with provided kernel binary. -Other than that the only difference to typical vector-add in OpenCL is use of `enqueueTask(...)` to launch the kernel -(compared to typical `enqueueNDRangeKernel`). - -```c++ -#include <iostream> -#include <fstream> -#include <iterator> -#include <vector> - -#define CL_HPP_TARGET_OPENCL_VERSION 120 -#define CL_HPP_MINIMUM_OPENCL_VERSION 120 -#define CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY 1 -#define CL_USE_DEPRECATED_OPENCL_1_2_APIS - -#include <CL/cl2.hpp> -#include <CL/cl_ext_xilinx.h> - -std::vector<unsigned char> read_binary_file(const std::string &filename) -{ - std::cout << "INFO: Reading " << filename << std::endl; - std::ifstream file(filename, std::ios::binary); - file.unsetf(std::ios::skipws); - - std::streampos file_size; - file.seekg(0, std::ios::end); - file_size = file.tellg(); - file.seekg(0, std::ios::beg); - - std::vector<unsigned char> data; - data.reserve(file_size); - data.insert(data.begin(), - std::istream_iterator<unsigned char>(file), - std::istream_iterator<unsigned char>()); - - return data; -} - -cl::Device select_device() -{ - std::vector<cl::Platform> platforms; - cl::Platform::get(&platforms); - cl::Platform platform; - - for(cl::Platform &p: platforms) - { - const std::string name = p.getInfo<CL_PLATFORM_NAME>(); - std::cout << "PLATFORM: " << name << std::endl; - if(name == "Xilinx") - { - platform = p; - break; - } - } - - if(platform == cl::Platform()) - { - std::cout << "Xilinx platform not found!" << std::endl; - exit(EXIT_FAILURE); - } - - std::vector<cl::Device> devices; - platform.getDevices(CL_DEVICE_TYPE_ACCELERATOR, &devices); - return devices[0]; -} - -static const int DATA_SIZE = 1024; - -int main(int argc, char *argv[]) -{ - if(argc != 2) - { - std::cout << "Usage: " << argv[0] << " <XCLBIN File>" << std::endl; - return EXIT_FAILURE; - } - - std::string binary_file = argv[1]; - - std::vector<int> source_a(DATA_SIZE, 10); - std::vector<int> source_b(DATA_SIZE, 32); - - auto program_binary = read_binary_file(binary_file); - cl::Program::Binaries bins{{program_binary.data(), program_binary.size()}}; - - cl::Device device = select_device(); - cl::Context context(device, nullptr, nullptr, nullptr); - cl::CommandQueue q(context, device, CL_QUEUE_PROFILING_ENABLE); - - cl::Program program(context, {device}, bins, nullptr); - - cl::Kernel vadd_kernel = cl::Kernel(program, "vector_add"); - - cl::Buffer buffer_a(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, source_a.size() * sizeof(int), source_a.data()); - cl::Buffer buffer_b(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, source_b.size() * sizeof(int), source_b.data()); - cl::Buffer buffer_res(context, CL_MEM_READ_WRITE, source_a.size() * sizeof(int)); - - int narg = 0; - vadd_kernel.setArg(narg++, buffer_res); - vadd_kernel.setArg(narg++, buffer_a); - vadd_kernel.setArg(narg++, buffer_b); - vadd_kernel.setArg(narg++, DATA_SIZE); - - q.enqueueTask(vadd_kernel); - - std::vector<int> result(DATA_SIZE, 0); - q.enqueueReadBuffer(buffer_res, CL_TRUE, 0, result.size() * sizeof(int), result.data()); - - int mismatch_count = 0; - for(size_t i = 0; i < DATA_SIZE; ++i) - { - int host_result = source_a[i] + source_b[i]; - if(result[i] != host_result) - { - mismatch_count++; - std::cout << "ERROR: " << result[i] << " != " << host_result << std::endl; - break; - } - } - - std::cout << "RESULT: " << (mismatch_count == 0 ? "PASSED" : "FAILED") << std::endl; - - return 0; -} -``` - -The host-side code can now be compiled using GCC toolchain as: - -```console -$ g++ host.cpp -I$XILINX_XRT/include -I$XILINX_VIVADO/include -lOpenCL -o host -``` - -The accelerator side (simple vector-add kernel) should be saved as `vadd.cl`. - -```c++ -#define BUFFER_SIZE 256 -#define DATA_SIZE 1024 - -// TRIPCOUNT indentifier -__constant uint c_len = DATA_SIZE / BUFFER_SIZE; -__constant uint c_size = BUFFER_SIZE; - -__attribute__((reqd_work_group_size(1, 1, 1))) -__kernel void vector_add(__global int* c, - __global const int* a, - __global const int* b, - const int n_elements) -{ - int arrayA[BUFFER_SIZE]; - int arrayB[BUFFER_SIZE]; - - __attribute__((xcl_loop_tripcount(c_len, c_len))) - for (int i = 0; i < n_elements; i += BUFFER_SIZE) - { - int size = BUFFER_SIZE; - - if(i + size > n_elements) - size = n_elements - i; - - __attribute__((xcl_loop_tripcount(c_size, c_size))) - __attribute__((xcl_pipeline_loop(1))) readA: - for(int j = 0; j < size; j++) - arrayA[j] = a[i + j]; - - __attribute__((xcl_loop_tripcount(c_size, c_size))) - __attribute__((xcl_pipeline_loop(1))) readB: - for(int j = 0; j < size; j++) - arrayB[j] = b[i + j]; - - __attribute__((xcl_loop_tripcount(c_size, c_size))) - __attribute__((xcl_pipeline_loop(1))) vadd_writeC: - for(int j = 0; j < size; j++) - c[i + j] = arrayA[j] + arrayB[j]; - } -} -``` - -The accelerator-side code is build using Vitis `v++`. -This is three-step process, which either builds emulation binary or performs full HLS (depending on the value of `-t` argument). -The platform (specific accelerator) has to be also specified at this step (both for emulation and full HLS). - -```console -$ v++ -c -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM -k vector_add -o vadd.xo vadd.cl -$ v++ -l -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM -o vadd.link.xclbin vadd.xo -$ v++ -p vadd.link.xclbin -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM -o vadd.xclbin -``` - -This process should result in `vadd.xclbin`, which can be loaded by host-side application. - -### Running the Application - -With both host application and kernel binary at hand the application (in emulation mode) can be launched as - -```console -$ XCL_EMULATION_MODE=sw_emu ./host vadd.xclbin -``` - -or with real hardware (having compiled kernels with `IT4I_BUILD_MODE=hw`) - -```console -./host vadd.xclbin -``` - -## Hybrid GPU and FPGA Application (HIP+XRT) - -This simple 8-bit quantized dot product (`R = sum(X[i]*Y[i])`) example illustrates basic approach to utilize both GPU and FPGA accelerators in a single application. -The application takes the simplest approach, where both synchronization and data transfers are handled explicitly by the host. -The HIP toolchain is used to compile the single source host/GPU code as usual, but it is also linked with XRT runtime, which allows host to control the FPGA accelerator. -The FPGA kernels are built separately as in previous examples. - -The host/GPU HIP code should be saved as `main.hip` - -```c++ -#include <iostream> -#include <vector> - -#include "xrt/xrt_bo.h" -#include "experimental/xrt_xclbin.h" -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" -#include "hip/hip_runtime.h" - -const size_t DATA_SIZE = 1024; - -float compute_reference(const float *srcX, const float *srcY, size_t count); - -__global__ void quantize(int8_t *out, const float *in, size_t count) -{ - size_t idx = blockIdx.x * blockDim.x + threadIdx.x; - - for(size_t i = idx; i < count; i += blockDim.x * gridDim.x) - out[i] = int8_t(in[i] * 127); -} - -__global__ void dequantize(float *out, const int16_t *in, size_t count) -{ - size_t idx = blockIdx.x * blockDim.x + threadIdx.x; - - for(size_t i = idx; i < count; i += blockDim.x * gridDim.x) - out[i] = float(in[i] / float(127*127)); -} - -int main(int argc, char *argv[]) -{ - if(argc != 2) - { - std::cout << "Usage: " << argv[0] << " <XCLBIN File>" << std::endl; - return EXIT_FAILURE; - } - - // Prepare experiment data - std::vector<float> srcX(DATA_SIZE); - std::vector<float> srcY(DATA_SIZE); - float outR = 0.0f; - - for(size_t i = 0; i < DATA_SIZE; ++i) - { - srcX[i] = float(rand()) / float(RAND_MAX); - srcY[i] = float(rand()) / float(RAND_MAX); - outR += srcX[i] * srcY[i]; - } - - float outR_quant = compute_reference(srcX.data(), srcY.data(), DATA_SIZE); - - std::cout << "REFERENCE: " << outR_quant << " (" << outR << ")" << std::endl; - - // Initialize XRT (FPGA device), load kernels binary and create kernel object - xrt::device device(0); - std::cout << "Loading xclbin file " << argv[1] << std::endl; - xrt::uuid xclbinId = device.load_xclbin(argv[1]); - xrt::kernel mulKernel(device, xclbinId, "multiply", xrt::kernel::cu_access_mode::exclusive); - - // Allocate GPU buffers - float *srcX_gpu, *srcY_gpu, *res_gpu; - int8_t *srcX_gpu_quant, *srcY_gpu_quant; - int16_t *res_gpu_quant; - hipMalloc(&srcX_gpu, DATA_SIZE * sizeof(float)); - hipMalloc(&srcY_gpu, DATA_SIZE * sizeof(float)); - hipMalloc(&res_gpu, DATA_SIZE * sizeof(float)); - hipMalloc(&srcX_gpu_quant, DATA_SIZE * sizeof(int8_t)); - hipMalloc(&srcY_gpu_quant, DATA_SIZE * sizeof(int8_t)); - hipMalloc(&res_gpu_quant, DATA_SIZE * sizeof(int16_t)); - - // Allocate FPGA buffers - xrt::bo srcX_fpga_quant(device, DATA_SIZE * sizeof(int8_t), mulKernel.group_id(0)); - xrt::bo srcY_fpga_quant(device, DATA_SIZE * sizeof(int8_t), mulKernel.group_id(1)); - xrt::bo res_fpga_quant(device, DATA_SIZE * sizeof(int16_t), mulKernel.group_id(2)); - - // Copy experiment data from HOST to GPU - hipMemcpy(srcX_gpu, srcX.data(), DATA_SIZE * sizeof(float), hipMemcpyHostToDevice); - hipMemcpy(srcY_gpu, srcY.data(), DATA_SIZE * sizeof(float), hipMemcpyHostToDevice); - - // Execute quantization kernels on both input vectors - quantize<<<16, 256>>>(srcX_gpu_quant, srcX_gpu, DATA_SIZE); - quantize<<<16, 256>>>(srcY_gpu_quant, srcY_gpu, DATA_SIZE); - - // Map FPGA buffers into HOST memory, copy data from GPU to these mapped buffers and synchronize them into FPGA memory - hipMemcpy(srcX_fpga_quant.map<int8_t *>(), srcX_gpu_quant, DATA_SIZE * sizeof(int8_t), hipMemcpyDeviceToHost); - srcX_fpga_quant.sync(XCL_BO_SYNC_BO_TO_DEVICE); - hipMemcpy(srcY_fpga_quant.map<int8_t *>(), srcY_gpu_quant, DATA_SIZE * sizeof(int8_t), hipMemcpyDeviceToHost); - srcY_fpga_quant.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - // Execute FPGA kernel (8-bit integer multiplication) - auto kernelRun = mulKernel(res_fpga_quant, srcX_fpga_quant, srcY_fpga_quant, DATA_SIZE); - kernelRun.wait(); - - // Synchronize output FPGA buffer back to HOST and copy its contents to GPU buffer for dequantization - res_fpga_quant.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - hipMemcpy(res_gpu_quant, res_fpga_quant.map<int16_t *>(), DATA_SIZE * sizeof(int16_t), hipMemcpyDeviceToHost); - - // Dequantize multiplication result on GPU - dequantize<<<16, 256>>>(res_gpu, res_gpu_quant, DATA_SIZE); - - // Copy dequantized results from GPU to HOST - std::vector<float> res(DATA_SIZE); - hipMemcpy(res.data(), res_gpu, DATA_SIZE * sizeof(float), hipMemcpyDeviceToHost); - - // Perform simple sum on CPU - float out = 0.0; - for(size_t i = 0; i < DATA_SIZE; ++i) - out += res[i]; - - std::cout << "RESULT: " << out << std::endl; - - hipFree(srcX_gpu); - hipFree(srcY_gpu); - hipFree(res_gpu); - hipFree(srcX_gpu_quant); - hipFree(srcY_gpu_quant); - hipFree(res_gpu_quant); - - return 0; -} - -float compute_reference(const float *srcX, const float *srcY, size_t count) -{ - float out = 0.0f; - - for(size_t i = 0; i < count; ++i) - { - int16_t quantX(srcX[i] * 127); - int16_t quantY(srcY[i] * 127); - - out += float(int16_t(quantX * quantY) / float(127*127)); - } - - return out; -} -``` - -The host/GPU application can be built using HIPCC as: - -```console -$ hipcc -I$XILINX_XRT/include -I$XILINX_VIVADO/include -L$XILINX_XRT/lib -lxrt_coreutil main.hip -o host -``` - -The accelerator side (simple vector-multiply kernel) should be saved as `kernels.cpp`. - -```c++ -extern "C" { - void multiply( - short *out, - const char *inX, - const char *inY, - int size) - { -#pragma HLS INTERFACE m_axi port=inX bundle=aximm1 -#pragma HLS INTERFACE m_axi port=inY bundle=aximm2 -#pragma HLS INTERFACE m_axi port=out bundle=aximm1 - for(int i = 0; i < size; ++i) - out[i] = short(inX[i]) * short(inY[i]); - } -} -``` - -Once again the HLS kernel is build using Vitis `v++` in two steps: - -```console -v++ -c -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM -k multiply kernels.cpp -o kernels.xo -v++ -l -t $IT4I_BUILD_MODE --platform $IT4I_PLATFORM kernels.xo -o kernels.xclbin -``` - -### Running the Application - -In emulation mode (FPGA emulation, GPU HW is required) the application can be launched as: - -```console -$ XCL_EMULATION_MODE=sw_emu ./host kernels.xclbin -REFERENCE: 256.554 (260.714) -Loading xclbin file ./kernels.xclbin -RESULT: 256.554 -``` - -or, having compiled kernels with `IT4I_BUILD_MODE=hw` set, using real hardware (both FPGA and GPU HW is required) - -```console -$ ./host kernels.xclbin -REFERENCE: 256.554 (260.714) -Loading xclbin file ./kernels.xclbin -RESULT: 256.554 -``` - -## Additional Resources - -- [https://xilinx.github.io/Vitis-Tutorials/][1] -- [http://xilinx.github.io/Vitis_Accel_Examples/][2] - -[1]: https://xilinx.github.io/Vitis-Tutorials/ -[2]: http://xilinx.github.io/Vitis_Accel_Examples/ diff --git a/content/docs/cs/introduction.mdx b/content/docs/cs/introduction.mdx deleted file mode 100644 index 7ca54e561f9baf2b1fd3a3562e3f7eb3a96a65a1..0000000000000000000000000000000000000000 --- a/content/docs/cs/introduction.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Complementary Systems" ---- -Complementary systems offer development environment for users -that need to port and optimize their code and applications -for various hardware architectures and software technologies -that are not available on standard clusters. - -## Complementary Systems 1 - -First stage of complementary systems implementation comprises of these partitions: - -- compute partition 0 – based on ARM technology - legacy -- compute partition 1 – based on ARM technology - A64FX -- compute partition 2 – based on Intel technologies - Ice Lake, NVDIMMs + Bitware FPGAs -- compute partition 3 – based on AMD technologies - Milan, MI100 GPUs + Xilinx FPGAs -- compute partition 4 – reflecting Edge type of servers -- partition 5 – FPGA synthesis server - - - -## Complementary Systems 2 - -Second stage of complementary systems implementation comprises of these partitions: - -- compute partition 6 - based on ARM technology + CUDA programmable GPGPU accelerators on ampere architecture + DPU network processing units -- compute partition 7 - based on IBM Power10 architecture -- compute partition 8 - modern CPU with a very high L3 cache capacity (over 750MB) -- compute partition 9 - virtual GPU accelerated workstations -- compute partition 10 - Sapphire Rapids-HBM server -- compute partition 11 - NVIDIA Grace CPU Superchip - - - -## Modules and Architecture Availability - -Complementary systems list available modules automatically based on the detected architecture. - -However, you can load one of the three modules -- `aarch64`, `avx2`, and `avx512` -- -to reload the list of modules available for the respective architecture: - -```console -[user@login.cs ~]$ ml architecture/aarch64 - - aarch64 modules + all modules - -[user@login.cs ~]$ ml architecture/avx2 - - avx2 modules + all modules - -[user@login.cs ~]$ ml architecture/avx512 - - avx512 modules + all modules -``` diff --git a/content/docs/cs/job-scheduling.mdx b/content/docs/cs/job-scheduling.mdx deleted file mode 100644 index b32c32fee14b4a81b6fda1d2141c5bb0333e3cad..0000000000000000000000000000000000000000 --- a/content/docs/cs/job-scheduling.mdx +++ /dev/null @@ -1,441 +0,0 @@ ---- -title: "Complementary System Job Scheduling" ---- -## Introduction - -[Slurm][1] workload manager is used to allocate and access Complementary systems resources. - -## Getting Partition Information - -Display partitions/queues - -```console -$ sinfo -s -PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST -p00-arm up 1-00:00:00 0/1/0/1 p00-arm01 -p01-arm* up 1-00:00:00 0/8/0/8 p01-arm[01-08] -p02-intel up 1-00:00:00 0/2/0/2 p02-intel[01-02] -p03-amd up 1-00:00:00 0/2/0/2 p03-amd[01-02] -p04-edge up 1-00:00:00 0/1/0/1 p04-edge01 -p05-synt up 1-00:00:00 0/1/0/1 p05-synt01 -p06-arm up 1-00:00:00 0/2/0/2 p06-arm[01-02] -p07-power up 1-00:00:00 0/1/0/1 p07-power01 -p08-amd up 1-00:00:00 0/1/0/1 p08-amd01 -p10-intel up 1-00:00:00 0/1/0/1 p10-intel01 -``` - -## Getting Job Information - -Show jobs - -```console -$ squeue --me - JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) - 104 p01-arm interact user R 1:48 2 p01-arm[01-02] -``` - -Show job details for specific job - -```console -$ scontrol -d show job JOBID -``` - -Show job details for executing job from job session - -```console -$ scontrol -d show job $SLURM_JOBID -``` - -## Running Interactive Jobs - -Run interactive job - -```console - $ salloc -A PROJECT-ID -p p01-arm -``` - -Run interactive job, with X11 forwarding - -```console - $ salloc -A PROJECT-ID -p p01-arm --x11 -``` - -<Callout type=warn> - Do not use `srun` for initiating interactive jobs, subsequent `srun`, `mpirun` invocations would block forever. -</Callout> - -## Running Batch Jobs - -Run batch job - -```console - $ sbatch -A PROJECT-ID -p p01-arm ./script.sh -``` - -Useful command options (salloc, sbatch, srun) - -* -n, --ntasks -* -c, --cpus-per-task -* -N, --nodes - -## Slurm Job Environment Variables - -Slurm provides useful information to the job via environment variables. Environment variables are available on all nodes allocated to job when accessed via Slurm supported means (srun, compatible mpirun). - -See all Slurm variables - -``` -set | grep ^SLURM -``` - -### Useful Variables - -| variable name | description | example | -| ------ | ------ | ------ | -| SLURM_JOB_ID | job id of the executing job| 593 | -| SLURM_JOB_NODELIST | nodes allocated to the job | p03-amd[01-02] | -| SLURM_JOB_NUM_NODES | number of nodes allocated to the job | 2 | -| SLURM_STEP_NODELIST | nodes allocated to the job step | p03-amd01 | -| SLURM_STEP_NUM_NODES | number of nodes allocated to the job step | 1 | -| SLURM_JOB_PARTITION | name of the partition | p03-amd | -| SLURM_SUBMIT_DIR | submit directory | /scratch/project/open-xx-yy/work | - -See [Slurm srun documentation][2] for details. - -Get job nodelist - -``` -$ echo $SLURM_JOB_NODELIST -p03-amd[01-02] -``` - -Expand nodelist to list of nodes. - -``` -$ scontrol show hostnames $SLURM_JOB_NODELIST -p03-amd01 -p03-amd02 -``` - -## Modifying Jobs - -``` -$ scontrol update JobId=JOBID ATTR=VALUE -``` - -for example - -``` -$ scontrol update JobId=JOBID Comment='The best job ever' -``` - -## Deleting Jobs - -``` -$ scancel JOBID -``` - -## Partitions - -| PARTITION | nodes | whole node | cores per node | features | -| --------- | ----- | ---------- | -------------- | -------- | -| p00-arm | 1 | yes | 64 | aarch64,cortex-a72 | -| p01-arm | 8 | yes | 48 | aarch64,a64fx,ib | -| p02-intel | 2 | no | 64 | x86_64,intel,icelake,ib,fpga,bitware,nvdimm | -| p03-amd | 2 | no | 64 | x86_64,amd,milan,ib,gpu,mi100,fpga,xilinx | -| p04-edge | 1 | yes | 16 | 86_64,intel,broadwell,ib | -| p05-synt | 1 | yes | 8 | x86_64,amd,milan,ib,ht | -| p06-arm | 2 | yes | 80 | aarch64,ib | -| p07-power | 1 | yes | 192 | ppc64le,ib | -| p08-amd | 1 | yes | 128 | x86_64,amd,milan-x,ib,ht | -| p10-intel | 1 | yes | 96 | x86_64,intel,sapphire_rapids,ht| - -Use `-t`, `--time` option to specify job run time limit. Default job time limit is 2 hours, maximum job time limit is 24 hours. - -FIFO scheduling with backfilling is employed. - -## Partition 00 - ARM (Cortex-A72) - -Whole node allocation. - -One node: - -```console -salloc -A PROJECT-ID -p p00-arm -``` - -## Partition 01 - ARM (A64FX) - -Whole node allocation. - -One node: - -```console -salloc -A PROJECT-ID -p p01-arm -``` - -```console -salloc -A PROJECT-ID -p p01-arm -N=1 -``` - -Multiple nodes: - -```console -salloc -A PROJECT-ID -p p01-arm -N=8 -``` - -## Partition 02 - Intel (Ice Lake, NVDIMMs + Bitware FPGAs) - -FPGAs are treated as resources. See below for more details about resources. - -Partial allocation - per FPGA, resource separation is not enforced. -Use only FPGAs allocated to the job! - -One FPGA: - -```console -salloc -A PROJECT-ID -p p02-intel --gres=fpga -``` - -Two FPGAs on the same node: - -```console -salloc -A PROJECT-ID -p p02-intel --gres=fpga:2 -``` - -All FPGAs: - -```console -salloc -A PROJECT-ID -p p02-intel -N 2 --gres=fpga:2 -``` - -## Partition 03 - AMD (Milan, MI100 GPUs + Xilinx FPGAs) - -GPUs and FPGAs are treated as resources. See below for more details about resources. - -Partial allocation - per GPU and per FPGA, resource separation is not enforced. -Use only GPUs and FPGAs allocated to the job! - -One GPU: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=gpu -``` - -Two GPUs on the same node: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=gpu:2 -``` - -Four GPUs on the same node: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=gpu:4 -``` - -All GPUs: - -```console -salloc -A PROJECT-ID -p p03-amd -N 2 --gres=gpu:4 -``` - -One FPGA: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=fpga -``` - -Two FPGAs: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=fpga:2 -``` - -All FPGAs: - -```console -salloc -A PROJECT-ID -p p03-amd -N 2--gres=fpga:2 -``` - -One GPU and one FPGA on the same node: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=gpu,fpga -``` - -Four GPUs and two FPGAs on the same node: - -```console -salloc -A PROJECT-ID -p p03-amd --gres=gpu:4,fpga:2 -``` - -All GPUs and FPGAs: - -```console -salloc -A PROJECT-ID -p p03-amd -N 2 --gres=gpu:4,fpga:2 -``` - -## Partition 04 - Edge Server - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p04-edge -``` - -## Partition 05 - FPGA Synthesis Server - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p05-synt -``` - -## Partition 06 - ARM - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p06-arm -``` - -## Partition 07 - IBM Power - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p07-power -``` - -## Partition 08 - AMD Milan-X - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p08-amd -``` - -## Partition 10 - Intel Sapphire Rapids - -Whole node allocation: - -```console -salloc -A PROJECT-ID -p p10-intel -``` - -## Features - -Nodes have feature tags assigned to them. -Users can select nodes based on the feature tags using --constraint option. - -| Feature | Description | -| ------ | ------ | -| aarch64 | platform | -| x86_64 | platform | -| ppc64le | platform | -| amd | manufacturer | -| intel | manufacturer | -| icelake | processor family | -| broadwell | processor family | -| sapphire_rapids | processor family | -| milan | processor family | -| milan-x | processor family | -| ib | Infiniband | -| gpu | equipped with GPU | -| fpga | equipped with FPGA | -| nvdimm | equipped with NVDIMMs | -| ht | Hyperthreading enabled | -| noht | Hyperthreading disabled | - -``` -$ sinfo -o '%16N %f' -NODELIST AVAIL_FEATURES -p00-arm01 aarch64,cortex-a72 -p01-arm[01-08] aarch64,a64fx,ib -p02-intel01 x86_64,intel,icelake,ib,fpga,bitware,nvdimm,ht -p02-intel02 x86_64,intel,icelake,ib,fpga,bitware,nvdimm,noht -p03-amd02 x86_64,amd,milan,ib,gpu,mi100,fpga,xilinx,noht -p03-amd01 x86_64,amd,milan,ib,gpu,mi100,fpga,xilinx,ht -p04-edge01 x86_64,intel,broadwell,ib,ht -p05-synt01 x86_64,amd,milan,ib,ht -p06-arm[01-02] aarch64,ib -p07-power01 ppc64le,ib -p08-amd01 x86_64,amd,milan-x,ib,ht -p10-intel01 x86_64,intel,sapphire_rapids,ht -``` - -``` -$ salloc -A PROJECT-ID -p p02-intel --constraint noht -``` - -``` -$ scontrol -d show node p02-intel02 | grep ActiveFeatures - ActiveFeatures=x86_64,intel,icelake,ib,fpga,bitware,nvdimm,noht -``` - -## Resources, GRES - -Slurm supports the ability to define and schedule arbitrary resources - Generic RESources (GRES) in Slurm's terminology. We use GRES for scheduling/allocating GPUs and FPGAs. - -<Callout type=warn> - Use only allocated GPUs and FPGAs. Resource separation is not enforced. If you use non-allocated resources, you can observe strange behavior and get into troubles. -</Callout> - -### Node Resources - -Get information about GRES on node. - -``` -$ scontrol -d show node p02-intel01 | grep Gres= - Gres=fpga:bitware_520n_mx:2 -$ scontrol -d show node p02-intel02 | grep Gres= - Gres=fpga:bitware_520n_mx:2 -$ scontrol -d show node p03-amd01 | grep Gres= - Gres=gpu:amd_mi100:4,fpga:xilinx_alveo_u250:2 -$ scontrol -d show node p03-amd02 | grep Gres= - Gres=gpu:amd_mi100:4,fpga:xilinx_alveo_u280:2 -``` - -### Request Resources - -To allocate required resources (GPUs or FPGAs) use the `--gres salloc/srun` option. - -Example: Allocate one FPGA - -``` -$ salloc -A PROJECT-ID -p p03-amd --gres fpga:1 -``` - -### Find Out Allocated Resources - -Information about allocated resources is available in Slurm job details, attributes `JOB_GRES` and `GRES`. - -``` -$ scontrol -d show job $SLURM_JOBID |grep GRES= - JOB_GRES=fpga:xilinx_alveo_u250:1 - Nodes=p03-amd01 CPU_IDs=0-1 Mem=0 GRES=fpga:xilinx_alveo_u250:1(IDX:0) -``` - -IDX in the GRES attribute specifies index/indexes of FPGA(s) (or GPUs) allocated to the job on the node. In the given example - allocated resources are `fpga:xilinx_alveo_u250:1(IDX:0)`, we should use FPGA with index/number 0 on node p03-amd01. - -### Request Specific Resources - -It is possible to allocate specific resources. It is useful for partition p03-amd equipped with FPGAs of different types. - -GRES entry is using format "name[[:type]:count", in the following example name is fpga, type is xilinx_alveo_u280, and count is count 2. - -``` -$ salloc -A PROJECT-ID -p p03-amd --gres=fpga:xilinx_alveo_u280:2 -salloc: Granted job allocation XXX -salloc: Waiting for resource configuration -salloc: Nodes p03-amd02 are ready for job - -$ scontrol -d show job $SLURM_JOBID | grep -i gres - JOB_GRES=fpga:xilinx_alveo_u280:2 - Nodes=p03-amd02 CPU_IDs=0 Mem=0 GRES=fpga:xilinx_alveo_u280(IDX:0-1) - TresPerNode=gres:fpga:xilinx_alveo_u280:2 -``` - -[1]: https://slurm.schedmd.com/ -[2]: https://slurm.schedmd.com/srun.html#SECTION_OUTPUT-ENVIRONMENT-VARIABLES diff --git a/content/docs/cs/meta.json b/content/docs/cs/meta.json deleted file mode 100644 index 09114c3efcdc0dab87374f9acd981be587a25617..0000000000000000000000000000000000000000 --- a/content/docs/cs/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Cs", - "pages": [ - "accessing", - "guides", - "introduction", - "job-scheduling", - "specifications" - ] -} diff --git a/content/docs/cs/specifications.mdx b/content/docs/cs/specifications.mdx deleted file mode 100644 index ef2f43d2f53a145860334632d9ce4aeaeef9996d..0000000000000000000000000000000000000000 --- a/content/docs/cs/specifications.mdx +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: "Complementary Systems Specifications" ---- -Below are the technical specifications of individual Complementary systems. - -## Partition 0 - ARM (Cortex-A72) - -The partition is based on the [ARMv8-A 64-bit][4] nebo architecture. - -- Cortex-A72 - - ARMv8-A 64-bit - - 2x 32 cores @ 2 GHz - - 255 GB memory -- disk capacity 3,7 TB -- 1x Infiniband FDR 56 Gb/s - -## Partition 1 - ARM (A64FX) - -The partition is based on the Armv8.2-A architecture -with SVE extension of instruction set and -consists of 8 compute nodes with the following per-node parameters: - -- 1x Fujitsu A64FX CPU - - Arm v8.2-A ISA CPU with Scalable Vector Extension (SVE) extension - - 48 cores at 2.0 GHz - - 32 GB of HBM2 memory -- 400 GB SSD (m.2 form factor) – mixed used type -- 1x Infiniband HDR100 interface - - connected via 16x PCI-e Gen3 slot to the CPU - -## Partition 2 - Intel (Ice Lake, NVDIMMs) <!--- + Bitware FPGAs) --> - -The partition is based on the Intel Ice Lake x86 architecture. -It contains two servers with Intel NVDIMM memories. - <!--- The key technologies installed are Intel NVDIMM memories. and Intel FPGA accelerators. -The partition contains two servers each with two FPGA accelerators. --> - -Each server has the following parameters: - -- 2x 3rd Gen Xeon Scalable Processors Intel Xeon Gold 6338 CPU - - 32-cores @ 2.00GHz -- 16x 16GB RAM with ECC - - DDR4-3200 -- 1x Infiniband HDR100 interface - - connected to CPU 8x PCI-e Gen4 interface -- 3.2 TB NVMe local storage – mixed use type - -<!--- -2x FPGA accelerators -Bitware [520N-MX][1] ---> - -In addition, the servers has the following parameters: - -- Intel server 1 – low NVDIMM memory server with 2304 GB NVDIMM memory - - 16x 128GB NVDIMM persistent memory modules -- Intel server 2 – high NVDIMM memory server with 8448 GB NVDIMM memory - - 16x 512GB NVDIMM persistent memory modules - -Software installed on the partition: - -FPGA boards support application development using following design flows: - -- OpenCL -- High-Level Synthesis (C/C++) including support for OneAPI -- Verilog and VHDL - -## Partition 3 - AMD (Milan, MI100 GPUs + Xilinx FPGAs) - -The partition is based on two servers equipped with AMD Milan x86 CPUs, -AMD GPUs and Xilinx FPGAs architectures and represents an alternative -to the Intel-based partition's ecosystem. - -Each server has the following parameters: - -- 2x AMD Milan 7513 CPU - - 32 cores @ 2.6 GHz -- 16x 16GB RAM with ECC - - DDR4-3200 -- 4x AMD GPU accelerators MI 100 - - Interconnected with AMD Infinity Fabric™ Link for fast GPU to GPU communication -- 1x 100 GBps Infiniband HDR100 - - connected to CPU via 8x PCI-e Gen4 interface -- 3.2 TB NVMe local storage – mixed use - -In addition: - -- AMD server 1 has 2x FPGA [Xilinx Alveo U250 Data Center Accelerator Card][2] -- AMD server 2 has 2x FPGA [Xilinx Alveo U280 Data Center Accelerator Card][3] - -Software installed on the partition: - -FPGA boards support application development using following design flows: - -- OpenCL -- High-Level Synthesis (C/C++) -- Verilog and VHDL -- developer tools and libraries for AMD GPUs. - -## Partition 4 - Edge Server - -The partition provides overview of the so-called edge computing class of resources -with solutions powerful enough to provide data analytic capabilities (both CPU and GPU) -in a form factor which cannot require a data center to operate. - -The partition consists of one edge computing server with following parameters: - -- 1x x86_64 CPU Intel Xeon D-1587 - - TDP 65 W, - - 16 cores, - - 435 GFlop/s theoretical max performance in double precision -- 1x CUDA programmable GPU NVIDIA Tesla T4 - - TDP 70W - - theoretical performance 8.1 TFlop/s in FP32 -- 128 GB RAM -- 1.92TB SSD storage -- connectivity: - - 2x 10 Gbps Ethernet, - - WiFi 802.11 ac, - - LTE connectivity - -## Partition 5 - FPGA Synthesis Server - -FPGAs design tools usually run for several hours to one day to generate a final bitstream (logic design) of large FPGA chips. These tools are usually sequential, therefore part of the system is a dedicated server for this task. - -This server is used by development tools needed for FPGA boards installed in both Compute partition 2 and 3. - -- AMD EPYC 72F3, 8 cores @ 3.7 GHz nominal frequency - - 8 memory channels with ECC -- 128 GB of DDR4-3200 memory with ECC - - memory is fully populated to maximize memory subsystem performance -- 1x 10Gb Ethernet port used for connection to LAN -- NVMe local storage - - 2x NVMe disks 3.2TB, configured RAID 1 - -## Partition 6 - ARM + CUDA GPGU (Ampere) + DPU - -This partition is based on ARM architecture and is equipped with CUDA programmable GPGPU accelerators -based on Ampere architecture and DPU network processing units. -The partition consists of two nodes with the following per-node parameters: - -- Server Gigabyte G242-P36, Ampere Altra Q80-30 (80c, 3.0GHz) -- 512GB DIMM DDR4, 3200MHz, ECC, CL22 -- 2x Micron 7400 PRO 1920GB NVMe M.2 Non-SED Enterprise SSD -- 2x NVIDIA A30 GPU Accelerator -- 2x NVIDIA BlueField-2 E-Series DPU 25GbE Dual-Port SFP56, PCIe Gen4 x16, 16GB DDR + 64, 200Gb Ethernet -- Mellanox ConnectX-5 EN network interface card, 10/25GbE dual-port SFP28, PCIe3.0 x8 -- Mellanox ConnectX-6 VPI adapter card, 100Gb/s (HDR100, EDR IB and 100GbE), single-port QSFP56 - -## Partition 7 - IBM - -The IBM Power10 server is a single-node partition with the following parameters: - -- Server IBM POWER S1022 -- 2x Power10 12-CORE TYPICAL 2.90 TO 4.0 GHZ (MAX) PO -- 512GB DDIMMS, 3200 MHZ, 8GBIT DDR4 -- 2x ENTERPRISE 1.6 TB SSD PCIE4 NVME U.2 MOD -- 2x ENTERPRISE 6.4 TB SSD PCIE4 NVME U.2 MOD -- PCIE3 LP 2-PORT 25/10GB NIC&ROCE SR/CU A - -## Partition 8 - HPE Proliant - -This partition provides a modern CPU with a very large L3 cache. -The goal is to enable users to develop algorithms and libraries -that will efficiently utilize this technology. -The processor is very efficient, for example, for linear algebra on relatively small matrices. -This is a single-node partition with the following parameters: - -- Server HPE Proliant DL 385 Gen10 Plus v2 CTO -- 2x AMD EPYC 7773X Milan-X, 64 cores, 2.2GHz, 768 MB L3 cache -- 16x HPE 16GB (1x+16GB) x4 DDR4-3200 Registered Smart Memory Kit -- 2x 3.84TB NVMe RI SFF BC U.3ST MV SSD -- BCM 57412 10GbE 2p SFP+ OCP3 Adptr -- HPE IB HDR100/EN 100Gb 1p QSFP56 Adptr1 -- HPE Cray Programming Environment for x86 Systems 2 Seats - -## Partition 9 - Virtual GPU Accelerated Workstation - -This partition provides users with a remote/virtual workstation running MS Windows OS. -It offers rich graphical environment with a focus on 3D OpenGL -or RayTracing-based applications with the smallest possible degradation of user experience. -The partition consists of two nodes with the following per-node parameters: - -- Server HPE Proliant DL 385 Gen10 Plus v2 CTO -- 2x AMD EPYC 7413, 24 cores, 2.55GHz -- 16x HPE 32GB 2Rx4 PC4-3200AA-R Smart Kit -- 2x 3.84TB NVMe RI SFF BC U.3ST MV SSD -- BCM 57412 10GbE 2p SFP+ OCP3 Adptr -- 2x NVIDIA A40 48GB GPU Accelerator - -### Available Software - -The following is the list of software available on partiton 09: - -- Academic VMware Horizon 8 Enterprise Term Edition: 10 Concurrent User Pack for 4 year term license; includes SnS -- 8x NVIDIA RTX Virtual Workstation, per concurrent user, EDU, perpetual license -- 32x NVIDIA RTX Virtual Workstation, per concurrent user, EDU SUMS per year -- 7x Windows Server 2022 Standard - 16 Core License Pack -- 10x Windows Server 2022 - 1 User CAL -- 40x Windows 10/11 Enterprise E3 VDA (Microsoft) per year -- Hardware VMware Horizon management - -## Partition 10 - Sapphire Rapids-HBM Server - -The primary purpose of this server is to evaluate the impact of the HBM memory on the x86 processor -on the performance of the user applications. -This is a new feature previously available only on the GPGPU accelerators -and provided a significant boost to the memory-bound applications. -Users can also compare the impact of the HBM memory with the impact of the large L3 cache -available on the AMD Milan-X processor also available on the complementary systems. -The server is also equipped with DDR5 memory and enables the comparative studies with reference to DDR4 based systems. - -- 2x Intel® Xeon® CPU Max 9468 48 cores base 2.1GHz, max 3.5Ghz -- 16x 16GB DDR5 4800Mhz -- 2x Intel D3 S4520 960GB SATA 6Gb/s -- 1x Supermicro Standard LP 2-port 10GbE RJ45, Broadcom BCM57416 - -## Partition 11 - NVIDIA Grace CPU Superchip - -The [NVIDIA Grace CPU Superchip][6] uses the [NVIDIA® NVLink®-C2C][5] technology to deliver 144 Arm® Neoverse V2 cores and 1TB/s of memory bandwidth. -Runs all NVIDIA software stacks and platforms, including NVIDIA RTX™, NVIDIA HPC SDK, NVIDIA AI, and NVIDIA Omniverse™. - -- Superchip design with up to 144 Arm Neoverse V2 CPU cores with Scalable Vector Extensions (SVE2) -- World’s first LPDDR5X with error-correcting code (ECC) memory, 1TB/s total bandwidth -- 900GB/s coherent interface, 7X faster than PCIe Gen 5 -- NVIDIA Scalable Coherency Fabric with 3.2TB/s of aggregate bisectional bandwidth -- 2X the packaging density of DIMM-based solutions -- 2X the performance per watt of today’s leading CPU -- FP64 Peak of 7.1TFLOPS - -[1]: https://www.bittware.com/fpga/520n-mx/ -[2]: https://www.xilinx.com/products/boards-and-kits/alveo/u250.html#overview -[3]: https://www.xilinx.com/products/boards-and-kits/alveo/u280.html#overview -[4]: https://developer.arm.com/documentation/100095/0003/ -[5]: https://www.nvidia.com/en-us/data-center/nvlink-c2c/ -[6]: https://www.nvidia.com/en-us/data-center/grace-cpu-superchip/ - diff --git a/content/docs/dgx2/accessing.mdx b/content/docs/dgx2/accessing.mdx deleted file mode 100644 index 2fde5b38ab7a958d6130937fdb1ea1df8035ee9d..0000000000000000000000000000000000000000 --- a/content/docs/dgx2/accessing.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "Accessing the DGX-2" ---- -## Before You Access - -<Callout type= warn> - GPUs are single-user devices. GPU memory is not purged between job runs and it can be read (but not written) by any user. Consider the confidentiality of your running jobs. -</Callout> - -## How to Access - -The DGX-2 machine is integrated into [Barbora cluster][3]. -The DGX-2 machine can be accessed from Barbora login nodes `barbora.it4i.cz` through the Barbora scheduler queue qdgx as a compute node cn202. - -## Storage - -There are three shared file systems on the DGX-2 system: HOME, SCRATCH (LSCRATCH), and PROJECT. - -### HOME - -The HOME filesystem is realized as an NFS filesystem. This is a shared home from the [Barbora cluster][1]. - -### SCRATCH - -The SCRATCH is realized on an NVME storage. The SCRATCH filesystem is mounted in the `/scratch` directory. -Accessible capacity is 22TB, shared among all users. - -<Callout type=warn> - Files on the SCRATCH filesystem that are not accessed for more than 60 days will be automatically deleted. -</Callout> - -### PROJECT - -The PROJECT data storage is IT4Innovations' central data storage accessible from all clusters. -For more information on accessing PROJECT, its quotas, etc., see the [PROJECT Data Storage][2] section. - -[1]: ../../barbora/storage/#home-file-system -[2]: ../../storage/project-storage -[3]: ../../barbora/introduction diff --git a/content/docs/dgx2/introduction.mdx b/content/docs/dgx2/introduction.mdx deleted file mode 100644 index f30520d013d60c19875340046f43fccad4ed35c5..0000000000000000000000000000000000000000 --- a/content/docs/dgx2/introduction.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "NVIDIA DGX-2" ---- -The DGX-2 is a very powerful computational node, featuring high end x86_64 processors and 16 NVIDIA V100-SXM3 GPUs. - -| NVIDIA DGX-2 | | -| --- | --- | -| CPUs | 2 x Intel Xeon Platinum | -| GPUs | 16 x NVIDIA Tesla V100 32GB HBM2 | -| System Memory | Up to 1.5 TB DDR4 | -| GPU Memory | 512 GB HBM2 (16 x 32 GB) | -| Storage | 30 TB NVMe, Up to 60 TB | -| Networking | 8 x Infiniband or 8 x 100 GbE | -| Power | 10 kW | -| Size | 350 lbs | -| GPU Throughput | Tensor: 1920 TFLOPs, FP16: 520 TFLOPs, FP32: 260 TFLOPs, FP64: 130 TFLOPs | - -The [DGX-2][a] introduces NVIDIA’s new NVSwitch, enabling 300 GB/s chip-to-chip communication at 12 times the speed of PCIe. - -With NVLink2, it enables 16x NVIDIA V100-SXM3 GPUs in a single system, for a total bandwidth going beyond 14 TB/s. -Featuring pair of Xeon 8168 CPUs, 1.5 TB of memory, and 30 TB of NVMe storage, -we get a system that consumes 10 kW, weighs 163.29 kg, but offers double precision performance in excess of 130TF. - -The DGX-2 is designed to be a powerful server in its own right. -On the storage side, the DGX-2 comes with 30TB of NVMe-based solid state storage. -For clustering or further inter-system communications, it also offers InfiniBand and 100GigE connectivity, up to eight of them. - -Further, the [DGX-2][b] offers a total of ~2 PFLOPs of half precision performance in a single system, when using the tensor cores. - - - -With DGX-2, AlexNET, the network that 'started' the latest machine learning revolution, now takes 18 minutes. - -The DGX-2 is able to complete the training process -for FAIRSEQ – a neural network model for language translation – 10x faster than a DGX-1 system, -bringing it down to less than two days total rather than 15 days. - -The new NVSwitches means that the PCIe lanes of the CPUs can be redirected elsewhere, most notably towards storage and networking connectivity. -The topology of the DGX-2 means that all 16 GPUs are able to pool their memory into a unified memory space, -though with the usual tradeoffs involved if going off-chip. - - - -[a]: https://www.nvidia.com/content/dam/en-zz/es_em/Solutions/Data-Center/dgx-2/nvidia-dgx-2-datasheet.pdf -[b]: https://www.youtube.com/embed/OTOGw0BRqK0 diff --git a/content/docs/dgx2/job_execution.mdx b/content/docs/dgx2/job_execution.mdx deleted file mode 100644 index 8168fa07766242ffef23adc9b381eb445edcc22c..0000000000000000000000000000000000000000 --- a/content/docs/dgx2/job_execution.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: "Resource Allocation and Job Execution" ---- -To run a job, computational resources of DGX-2 must be allocated. - -The DGX-2 machine is integrated to and accessible through Barbora cluster, the queue for the DGX-2 machine is called **qdgx**. - -When allocating computational resources for the job, specify: - -1. your Project ID -1. a queue for your job - **qdgx**; -1. the maximum time allocated to your calculation (default is **4 hour**, maximum is **48 hour**); -1. a jobscript if batch processing is intended. - -Submit the job using the `sbatch` (for batch processing) or `salloc` (for interactive session) command: - -**Example** - -```console -[kru0052@login2.barbora ~]$ salloc -A PROJECT-ID -p qdgx --time=02:00:00 -salloc: Granted job allocation 36631 -salloc: Waiting for resource configuration -salloc: Nodes cn202 are ready for job - -kru0052@cn202:~$ nvidia-smi -Wed Jun 16 07:46:32 2021 -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 465.19.01 Driver Version: 465.19.01 CUDA Version: 11.3 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -|===============================+======================+======================| -| 0 Tesla V100-SXM3... On | 00000000:34:00.0 Off | 0 | -| N/A 32C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 1 Tesla V100-SXM3... On | 00000000:36:00.0 Off | 0 | -| N/A 31C P0 48W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 2 Tesla V100-SXM3... On | 00000000:39:00.0 Off | 0 | -| N/A 35C P0 53W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 3 Tesla V100-SXM3... On | 00000000:3B:00.0 Off | 0 | -| N/A 36C P0 53W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 4 Tesla V100-SXM3... On | 00000000:57:00.0 Off | 0 | -| N/A 29C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 5 Tesla V100-SXM3... On | 00000000:59:00.0 Off | 0 | -| N/A 35C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 6 Tesla V100-SXM3... On | 00000000:5C:00.0 Off | 0 | -| N/A 30C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 7 Tesla V100-SXM3... On | 00000000:5E:00.0 Off | 0 | -| N/A 35C P0 53W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 8 Tesla V100-SXM3... On | 00000000:B7:00.0 Off | 0 | -| N/A 30C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 9 Tesla V100-SXM3... On | 00000000:B9:00.0 Off | 0 | -| N/A 30C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 10 Tesla V100-SXM3... On | 00000000:BC:00.0 Off | 0 | -| N/A 35C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 11 Tesla V100-SXM3... On | 00000000:BE:00.0 Off | 0 | -| N/A 35C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 12 Tesla V100-SXM3... On | 00000000:E0:00.0 Off | 0 | -| N/A 31C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 13 Tesla V100-SXM3... On | 00000000:E2:00.0 Off | 0 | -| N/A 29C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 14 Tesla V100-SXM3... On | 00000000:E5:00.0 Off | 0 | -| N/A 34C P0 51W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -| 15 Tesla V100-SXM3... On | 00000000:E7:00.0 Off | 0 | -| N/A 34C P0 50W / 350W | 0MiB / 32480MiB | 0% Default | -+-------------------------------+----------------------+----------------------+ -kru0052@cn202:~$ exit -``` - -<Callout> - Submit the interactive job using the `salloc` command. -</Callout> - -## Job Execution - -The DGX-2 machine runs only a bare-bone, minimal operating system. Users are expected to run -**[Apptainer/Singularity][1]** containers in order to enrich the environment according to the needs. - -Containers (Docker images) optimized for DGX-2 may be downloaded from -[NVIDIA Gpu Cloud][2]. Select the code of interest and -copy the docker nvcr.io link from the Pull Command section. This link may be directly used -to download the container via Apptainer/Singularity, see the example below: - -### Example - Apptainer/Singularity Run Tensorflow - -```console -[kru0052@login2.barbora ~] $ salloc -A PROJECT-ID -p qdgx --time=02:00:00 -salloc: Granted job allocation 36633 -salloc: Waiting for resource configuration -salloc: Nodes cn202 are ready for job - -kru0052@cn202:~$ singularity shell docker://nvcr.io/nvidia/tensorflow:19.02-py3 -Singularity tensorflow_19.02-py3.sif:~> -Singularity tensorflow_19.02-py3.sif:~> mpiexec --bind-to socket -np 16 python /opt/tensorflow/nvidia-examples/cnn/resnet.py --layers=18 --precision=fp16 --batch_size=512 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -TF 1.13.0-rc0 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -TF 1.13.0-rc0 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -TF 1.13.0-rc0 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -TF 1.13.0-rc0 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -TF 1.13.0-rc0 -PY 3.5.2 (default, Nov 12 2018, 13:43:14) -[GCC 5.4.0 20160609] -... -... -... -2019-03-11 08:30:12.263822: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library libcublas.so.10.0 locally - 1 1.0 338.2 6.999 7.291 2.00000 - 10 10.0 3658.6 5.658 5.950 1.62000 - 20 20.0 25628.6 2.957 3.258 1.24469 - 30 30.0 30815.1 0.177 0.494 0.91877 - 40 40.0 30826.3 0.004 0.330 0.64222 - 50 50.0 30884.3 0.002 0.327 0.41506 - 60 60.0 30888.7 0.001 0.325 0.23728 - 70 70.0 30763.2 0.001 0.324 0.10889 - 80 80.0 30845.5 0.001 0.324 0.02988 - 90 90.0 26350.9 0.001 0.324 0.00025 -kru0052@cn202:~$ exit -``` - -**GPU stat** - -The GPU load can be determined by the `gpustat` utility. - -```console -Every 2,0s: gpustat --color - -dgx Mon Mar 11 09:31:00 2019 -[0] Tesla V100-SXM3-32GB | 47'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[1] Tesla V100-SXM3-32GB | 48'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[2] Tesla V100-SXM3-32GB | 56'C, 97 % | 23660 / 32480 MB | kru0052(23645M) -[3] Tesla V100-SXM3-32GB | 57'C, 97 % | 23660 / 32480 MB | kru0052(23645M) -[4] Tesla V100-SXM3-32GB | 46'C, 97 % | 23660 / 32480 MB | kru0052(23645M) -[5] Tesla V100-SXM3-32GB | 55'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[6] Tesla V100-SXM3-32GB | 45'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[7] Tesla V100-SXM3-32GB | 54'C, 97 % | 23660 / 32480 MB | kru0052(23645M) -[8] Tesla V100-SXM3-32GB | 45'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[9] Tesla V100-SXM3-32GB | 46'C, 95 % | 23660 / 32480 MB | kru0052(23645M) -[10] Tesla V100-SXM3-32GB | 55'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[11] Tesla V100-SXM3-32GB | 56'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[12] Tesla V100-SXM3-32GB | 47'C, 95 % | 23660 / 32480 MB | kru0052(23645M) -[13] Tesla V100-SXM3-32GB | 45'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[14] Tesla V100-SXM3-32GB | 55'C, 96 % | 23660 / 32480 MB | kru0052(23645M) -[15] Tesla V100-SXM3-32GB | 58'C, 95 % | 23660 / 32480 MB | kru0052(23645M) -``` - -[1]: https://docs.it4i.cz/software/tools/singularity/ -[2]: https://ngc.nvidia.com/ diff --git a/content/docs/dgx2/meta.json b/content/docs/dgx2/meta.json deleted file mode 100644 index e477317ca986327f7fada59baec3be7e83abfb6e..0000000000000000000000000000000000000000 --- a/content/docs/dgx2/meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Dgx2", - "pages": [ - "accessing", - "introduction", - "job_execution", - "software" - ] -} diff --git a/content/docs/dgx2/software.mdx b/content/docs/dgx2/software.mdx deleted file mode 100644 index 779c45c154b1004c0af6f3c6e1fd03aeb50c1d15..0000000000000000000000000000000000000000 --- a/content/docs/dgx2/software.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Software Deployment" ---- -Software deployment on DGX-2 is based on containers. NVIDIA provides a wide range of prepared Docker containers with a variety of different software. Users can easily download these containers and use them directly on the DGX-2. - -The catalog of all container images can be found on [NVIDIA site][a]. Supported software includes: - -* TensorFlow -* MATLAB -* GROMACS -* Theano -* Caffe2 -* LAMMPS -* ParaView -* ... - -## Running Containers on DGX-2 - -NVIDIA expects usage of Docker as a containerization tool, but Docker is not a suitable solution in a multiuser environment. For this reason, the [Apptainer/Singularity container][b] solution is used. - -Singularity can be used similarly to Docker, just change the image URL address. For example, original command for Docker `docker run -it nvcr.io/nvidia/theano:18.08` should be changed to `singularity shell docker://nvcr.io/nvidia/theano:18.08`. More about Apptainer/Singularity [here][1]. - -For fast container deployment, all images are cached after first use in the *lscratch* directory. This behavior can be changed by the *SINGULARITY_CACHEDIR* environment variable, but the start time of the container will increase significantly. - -```console -$ ml av Singularity - ----------------------------- /apps/modules/tools ---------------------------- - Singularity/3.3.0 -``` - -## MPI Modules - -```console -$ ml av MPI - ----------------------------- /apps/modules/mpi ---------------------------- - OpenMPI/2.1.5-GCC-6.3.0-2.27 OpenMPI/3.1.4-GCC-6.3.0-2.27 OpenMPI/4.0.0-GCC-6.3.0-2.27 (D) impi/2017.4.239-iccifort-2017.7.259-GCC-6.3.0-2.27 -``` - -## Compiler Modules - -```console -$ ml av gcc - ----------------------------- /apps/modules/compiler ---------------------------- - GCC/6.3.0-2.27 GCCcore/6.3.0 icc/2017.7.259-GCC-6.3.0-2.27 ifort/2017.7.259-GCC-6.3.0-2.27 - -``` - -[1]: ../software/tools/singularity.md -[a]: https://ngc.nvidia.com/catalog/landing -[b]: https://www.sylabs.io/ diff --git a/content/docs/dice.mdx b/content/docs/dice.mdx deleted file mode 100644 index 7bca3f201a56dded9cbb3e3dcb13571016cbbbb6..0000000000000000000000000000000000000000 --- a/content/docs/dice.mdx +++ /dev/null @@ -1,426 +0,0 @@ ---- -title: "What Is DICE Project?" ---- -DICE (Data Infrastructure Capacity for EOSC) is an international project funded by the European Union -that provides cutting-edge data management services and a significant amount of storage resources for the EOSC. -The EOSC (European Open Science Cloud) project provides European researchers, innovators, companies, -and citizens with a federated and open multi-disciplinary environment -where they can publish, find, and re-use data, tools, and services for research, innovation and educational purposes. - -For more information, see the official [DICE project][b] and [EOSC project][q] pages. - -**IT4Innovations participates in DICE. DICE uses the iRODS software** - -The integrated Rule-Oriented Data System (iRODS) is an open source data management software -used by research organizations and government agencies worldwide. -iRODS is released as a production-level distribution aimed at deployment in mission critical environments. -It virtualizes data storage resources, so users can take control of their data, -regardless of where and on what device the data is stored. -As data volumes grow and data services become more complex, -iRODS is serving an increasingly important role in data management. -For more information, see [the official iRODS page][c]. - -## How to Put Your Data to Our Server - -**Prerequisities:** - -First, we need to verify your identity, this is done through the following steps: - -1. Sign in with your organization [B2ACCESS][d]; the page requests a valid personal certificate (e.g. GEANT). - Accounts with "Low" level of assurance are not granted access to IT4I zone. - -1. Confirm your certificate in the browser: - -  - -1. Confirm your certificate in the OS (Windows): - -  - -1. Sign to EUDAT/B2ACCESS: - -  - -1. After successful login to B2Access: - - 1. **For Non IT4I Users** - - Sign in to our [AAI][f] through your B2Access account. - You have to set a new password for iRODS access. - - 1. **For IT4I Users** - - Sign in to our [AAI][f] through your B2Access account and link your B2ACCESS identity with your existing account. - The iRODS password will be the same as your IT4I LDAP password (i.e. code.it4i.cz password). - -  -  -  -  - -1. Contact [support@it4i.cz][a], so we can create your account at our iRODS server. - -1. **Fill this request on [EOSC-MARKETPLACE][h] (recommended)** or at [EUDAT][l], please specify the requested capacity. - -  -  -  - -## Access to iRODS Collection From Karolina - -Access to iRODS Collection requires access to the Karolina cluster (i.e. [IT4I account][4]), -since iRODS clients are provided as a module on Karolina (Barbora is in progress). -The `irodsfs` module loads config file for irodsfs and icommands, too. - -Note that you can change password to iRODS at [aai.it4i.cz][m]. - -### Mounting Your Collection - -```console -ssh some_user@karolina.it4i.cz -ml irodsfs -``` - -Now you can choose between the Fuse client or iCommands: - -#### Fuse - -```console -ssh some_user@karolina.it4i.cz -[some_use@login4.karolina ~]$ ml irodsfs - -irodsfs configuration file has been created at /home/dvo0012/.irods/config.yml -iRODS environment file has been created at /home/dvo0012/.irods/irods_environment.json - -to start irodsfs, run: irodsfs -config ~/.irods/config.yml ~/IRODS -to start iCommands, run: iinit - -For more information, see https://docs.it4i.cz/dice/ -``` - -To mount your iRODS collection to ~/IRODS, run - -```console -[some_user@login4.karolina ~]$ irodsfs -config ~/.irods/config.yml ~/IRODS -time="2022-08-04 08:54:13.222836" level=info msg="Logging to /tmp/irodsfs_cblmq5ab1lsaj31vrv20.log" function=processArguments package=main -Password: -time="2022-08-04 08:54:18.698811" level=info msg="Found FUSE Device. Starting iRODS FUSE Lite." function=parentMain package=main -time="2022-08-04 08:54:18.699080" level=info msg="Running the process in the background mode" function=parentRun package=main -time="2022-08-04 08:54:18.699544" level=info msg="Process id = 27145" function=parentRun package=main -time="2022-08-04 08:54:18.699572" level=info msg="Sending configuration data" function=parentRun package=main -time="2022-08-04 08:54:18.699730" level=info msg="Successfully sent configuration data to background process" function=parentRun package=main -time="2022-08-04 08:54:18.922490" level=info msg="Successfully started background process" function=parentRun package=main -``` - -To unmount it, run - -```console -fusermount -u ~/IRODS -``` - -You can work with Fuse as an ordinary directory (`ls`, `cd`, `cp`, `mv`, etc.). - -#### iCommands - -```console -ssh some_user@karolina.it4i.cz -[some_use@login4.karolina ~]$ ml irodsfs -irodsfs configuration file has been created at /home/dvo0012/.irods/config.yml. - to start irods fs run: irodsfs -config ~/.irods/config.yml ~/IRODS - -iCommands environment file has been created at /home/$USER/.irods/irods_environment.json. - to start iCommands run: iinit - -[some_user@login4.karolina ~]$ iinit -Enter your current PAM password: -``` - -```console -[some_use@login4.karolina ~]$ ils -/IT4I/home/some_user: - test.1 - test.2 - test.3 - test.4 -``` - -Use the command `iput` for upload, `iget` for download, or `ihelp` for help. - -## Access to iRODS Collection From Other Resource - -<Callout> - This guide assumes you are uploading your data from your local PC/VM. -</Callout> - -Use the password from [AAI][f]. - -### You Need a Client to Connect to iRODS Server - -There are many iRODS clients, but we recommend the following: - -- Cyberduck - Windows/Mac, GUI -- Fuse (irodsfs lite) - Linux, CLI -- iCommands - Linux, CLI. - -For access, set PAM passwords at [AAI][f]. - -### Cyberduck - -1. Download [Cyberduck][i]. -2. Download [connection profile][1] for IT4I iRods server. -3. Left double-click this file to open connection. - - - -### Fuse - -<Callout> - This is a Linux client only, basic knowledge of the command line is necessary. -</Callout> - -Fuse allows you to work with your iRODS collection like an ordinary directory. - -```console -cd ~ -wget https://github.com/cyverse/irodsfs/releases/download/v0.7.6/irodsfs_amd64_linux_v0.7.6.tar -tar -xvf ~/irodsfs_amd64_linux_v0.7.6.tar -mkdir ~/IRODS ~/.irods/ && cd "$_" && wget https://docs.it4i.cz/config.yml -wget https://pki.cesnet.cz/_media/certs/chain_geant_ov_rsa_ca_4_full.pem -P ~/.irods/ -``` - -Edit `~/.irods/config.yml` with username from [AAI][f]. - -#### Mounting Your Collection - -```console -[some_user@local_pc ~]$ ./irodsfs -config ~/.irods/config.yml ~/IRODS -time="2022-07-29 09:51:11.720831" level=info msg="Logging to /tmp/irodsfs_cbhp2rucso0ef0s7dtl0.log" function=processArguments package=main -Password: - -time="2022-07-29 09:51:17.691988" level=info msg="Found FUSE Device. Starting iRODS FUSE Lite." function=parentMain package=main -time="2022-07-29 09:51:17.692683" level=info msg="Running the process in the background mode" function=parentRun package=main -time="2022-07-29 09:51:17.693381" level=info msg="Process id = 74772" function=parentRun package=main -time="2022-07-29 09:51:17.693421" level=info msg="Sending configuration data" function=parentRun package=main -time="2022-07-29 09:51:17.693772" level=info msg="Successfully sent configuration data to background process" function=parentRun package=main -time="2022-07-29 09:51:18.008166" level=info msg="Successfully started background process" function=parentRun package=main -``` - -#### Putting Your Data to iRODS - -```console -[some_use@local_pc ~]$ cp test1G.txt ~/IRODS -``` - -It works as ordinary file system - -```console -[some_user@local_pc ~]$ ls -la ~/IRODS -total 0 --rwx------ 1 some_user some_user 1073741824 Nov 4 2021 test1G.txt -``` - -#### Unmounting Your Collection - -To stop/unmount your collection, use: - -```console -[some_user@local_pc ~]$ fusermount -u ~/IRODS -``` - -### iCommands - -<Callout> - This is a Linux client only, basic knowledge of the command line is necessary. -</Callout> - -We recommend Centos7, Ubuntu 20 is optional. - -#### Steps for Ubuntu 20 - -```console -LSB_RELEASE="bionic" -wget -qO - https://packages.irods.org/irods-signing-key.asc | sudo apt-key add - -echo "deb [arch=amd64] https://packages.irods.org/apt/ ${LSB_RELEASE} main" \ -> | sudo tee /etc/apt/sources.list.d/renci-irods.list -deb [arch=amd64] https://packages.irods.org/apt/ bionic main - -sudo apt-get update -apt-cache search irods -wget -c \ - http://security.ubuntu.com/ubuntu/pool/main/p/python-urllib3/python-urllib3_1.22-1ubuntu0.18.04.2_all.deb \ - http://security.ubuntu.com/ubuntu/pool/main/r/requests/python-requests_2.18.4-2ubuntu0.1_all.deb \ - http://security.ubuntu.com/ubuntu/pool/main/o/openssl1.0/libssl1.0.0_1.0.2n-1ubuntu5.10_amd64.deb -sudo apt install \ - ./python-urllib3_1.22-1ubuntu0.18.04.2_all.deb \ - ./python-requests_2.18.4-2ubuntu0.1_all.deb \ - ./libssl1.0.0_1.0.2n-1ubuntu5.6_amd64.deb -sudo rm -rf \ - ./python-urllib3_1.22-1ubuntu0.18.04.2_all.deb \ - ./python-requests_2.18.4-2ubuntu0.1_all.deb \ - ./libssl1.0.0_1.0.2n-1ubuntu5.6_amd64.deb -sudo apt install -y irods-icommands -mkdir ~/.irods/ && cd "$_" && wget https://docs.it4i.cz/irods_environment.json -wget https://pki.cesnet.cz/_media/certs/chain_geant_ov_rsa_ca_4_full.pem -P ~/.irods -sed -i 's,~,'"$HOME"',g' ~/.irods/irods_environment.json -``` - -#### Steps for Centos - -```console -sudo rpm --import https://packages.irods.org/irods-signing-key.asc -sudo wget -qO - https://packages.irods.org/renci-irods.yum.repo | sudo tee /etc/yum.repos.d/renci-irods.yum.repo -sudo yum install epel-release -y -sudo yum install python-psutil python-jsonschema -sudo yum install irods-icommands -mkdir ~/.irods/ && cd "$_" && wget https://docs.it4i.cz/irods_environment.json -wget https://pki.cesnet.cz/_media/certs/chain_geant_ov_rsa_ca_4_full.pem -P ~/.irods -sed -i 's,~,'"$HOME"',g' ~/.irods/irods_environment.json -``` - -Edit ***irods_user_name*** in `~/.irods/irods_environment.json` with the username from [AAI][f]. - -```console -[some_user@local_pc ~]$ pwd -/some_user/.irods - -[some_user@local_pc ~]$ ls -la -total 16 -drwx------. 2 some_user some_user 136 Sep 29 08:53 . -dr-xr-x---. 6 some_user some_user 206 Sep 29 08:53 .. --rw-r--r--. 1 some_user some_user 253 Sep 29 08:14 irods_environment.json -``` - -**How to Start:** - -**step 1:** - -```console -[some_user@local_pc ~]$ iinit -Enter your current PAM password: - -[some_user@local_pc ~]$ ils -/IT4I/home/some_user: - file.jpg -``` - -**How to put your data to iRODS** - -```console -[some_user@local_pc ~]$ iput cesnet.crt -``` - -```console -[some_user@local_pc ~]$ ils -/IT4I/home/some_user: - cesnet.crt -``` - -**How to download data** - -```console -[some_user@local_pc ~]$ iget cesnet.crt -ls -la ~ --rw-r--r--. 1 some_user some_user 1464 Jul 20 13:44 cesnet.crt -``` - -For more commands, use the `ihelp` command. - -## PID Services - -You, as user, may want to index your datasets and allocate some PIDs - Persistent Identifiers for them. We host pid system by hdl-surfsara ([https://it4i-handle.it4i.cz][o]), wich is conected to [https://hdl.handle.net][p], and you are able to create your own PID by calling some of irule. - -### How to Create PID - -Pids are created by calling `irule`, you have to create at your `$HOME` or everewhere you want, -but you have to specify the path correctly. -Rules for pid operations have always `.r suffix`. -It can by done only through `iCommands`. - -Example of a rule for PID creating only: - -```console -user in ~ λ pwd -/home/user - -user in ~ λ ils -/IT4I/home/user: - C- /IT4I/home/dvo0012/Collection_A - -user in ~ λ ls -l | grep pid --rw-r--r-- 1 user user 249 Sep 30 10:55 create_pid.r - -user in ~ λ cat create_pid.r -PID_DO_reg { - EUDATCreatePID(*parent_pid, *source, *ror, *fio, *fixed, *newPID); - writeLine("stdout","PID: *newPID"); -} -INPUT *source="/IT4I/home/user/Collection_A",*parent_pid="None",*ror="None",*fio="None",*fixed="true" -OUTPUT ruleExecOut - -user in ~ λ irule -F create_pid.r -PID: 21.12149/f3b9b1a5-7b4d-4fff-bfb7-826676f6fe14 -``` - -After creation, your PID is searchable worldwide: - - - - -**More info at [www.eudat.eu][n]** - -### Metadata - -For adding metadata to you collection/dataset, you can use imeta from iCommands. - -This is after PID creation: - -```console -user in ~ λ imeta ls -C /IT4I/home/user/Collection_A -AVUs defined for collection /IT4I/home/user/Collection_A: -attribute: EUDAT/FIXED_CONTENT -value: True -units: ----- -attribute: PID -value: 21.12149/f3b9b1a5-7b4d-4fff-bfb7-826676f6fe14 -units: -``` - -For adding any other metadata you can use: - -```console -user in ~ λ imeta add -C /IT4I/home/user/Collection_A EUDAT_B2SHARE_TITLE Some_Title - -user in ~ λ imeta ls -C /IT4I/home/user/Collection_A -AVUs defined for collection /IT4I/home/user/Collection_A: -attribute: EUDAT/FIXED_CONTENT -value: True -units: ----- -attribute: PID -value: 21.12149/f3b9b1a5-7b4d-4fff-bfb7-826676f6fe14 -units: ----- -attribute: EUDAT_B2SHARE_TITLE -value: Some_Title -units: -``` - -[1]: irods.cyberduckprofile -[2]: irods_environment.json -[3]: config.yml -[4]: general/access/account-introduction.md - -[a]: mailto:support@it4i.cz -[b]: https://www.dice-eosc.eu/ -[c]: https://irods.org/ -[d]: https://b2access.eudat.eu/ -[f]: https://aai.it4i.cz/realms/IT4i_IRODS/account/#/ -[h]: https://marketplace.eosc-portal.eu/services/b2safe/offers -[i]: https://cyberduck.io/download/ -[l]: https://www.eudat.eu/contact-support-request?Service=B2SAFE -[m]: https://aai.it4i.cz/ -[n]: https://www.eudat.eu/catalogue/b2handle -[o]: https://it4i-handle.it4i.cz -[p]: https://hdl.handle.net -[q]: https://eosc-portal.eu/ diff --git a/content/docs/einfracz-migration.mdx b/content/docs/einfracz-migration.mdx deleted file mode 100644 index a65d20eceacb4fae279609b973595a369fa937e1..0000000000000000000000000000000000000000 --- a/content/docs/einfracz-migration.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "Migration to e-INFRA CZ" ---- -## Introduction - -IT4Innovations is a part of [e-INFRA CZ][1] - strategic research infrastructure of the Czech Republic, which provides capacities and resources for the transmission, storage, and processing of scientific and research data. In January 2022, IT4I has begun the process of integration of its services. - -As a part of the process, a joint e-INFRA CZ user base has been established. This included a migration of eligible IT4I accounts. - -## Who Has Been Affected - -The migration affects all accounts of users affiliated with an academic organizations in the Czech Republic who also have an OPEN-XX-XX project. Affected users have received an email with information about changes in personal data processing. - -## Who Has Not Been Affected - -Commercial users, training accounts, suppliers, and service accounts were **not** affected by the migration. - -## Process - -During the process, additional steps have been required for successful migration. - -This may have included: - -1. e-INFRA CZ registration, if one does not already exist. -2. e-INFRA CZ password reset, if one does not already exist. - -## Steps After Migration - -After the migration, you must use your **e-INFRA CZ credentials** to access all IT4I services as well as [e-INFRA CZ services][5]. - -Successfully migrated accounts tied to e-INFRA CZ can be self-managed at [e-INFRA CZ User profile][4]. - -<Callout> - We recommend [verifying your SSH keys][6] for cluster access. -</Callout> - -## Troubleshooting - -If you have a problem with your account migrated to e-INFRA CZ user base, contact the [CESNET support][7]. - -If you have questions or a problem with IT4I account (i.e. account not eligible for migration), contact the [IT4I support][2]. - -[1]: https://www.e-infra.cz/en -[2]: mailto:support@it4i.cz -[3]: https://www.cesnet.cz/?lang=en -[4]: https://profile.e-infra.cz/ -[5]: https://www.e-infra.cz/en/services -[6]: https://profile.e-infra.cz/profile/settings/sshKeys -[7]: mailto:support@cesnet.cz diff --git a/content/docs/environment-and-modules.mdx b/content/docs/environment-and-modules.mdx deleted file mode 100644 index 486fb516f64aad0ddc03044f3a4bc1010fead535..0000000000000000000000000000000000000000 --- a/content/docs/environment-and-modules.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Environment and Modules" ---- -## Shells on Clusters - -The table shows which shells are available on the IT4Innovations clusters. - -Note that bash is the only supported shell. - -| Cluster Name | bash | tcsh | zsh | ksh | dash | -| --------------- | ---- | ---- | --- | --- | ---- | -| Karolina | yes | yes | yes | yes | yes | -| Barbora | yes | yes | yes | yes | no | -| DGX-2 | yes | no | no | no | no | - -<Callout> - Bash is the default shell. Should you need a different shell, contact [support\[at\]it4i.cz][3]. -</Callout> - -## Environment Customization - -After logging in, you may want to configure the environment. Write your preferred path definitions, aliases, functions, and module loads in the .bashrc file - -```console -# ./bashrc - -# users compilation path -export MODULEPATH=${MODULEPATH}:/home/$USER/.local/easybuild/modules/all - -# User specific aliases and functions -alias sq='squeue --me' - -# load default intel compilator !!! is not recommended !!! -ml intel - -# Display information to standard output - only in interactive ssh session -if [ -n "$SSH_TTY" ] -then - ml # Display loaded modules -fi -``` - -<Callout> - Do not run commands outputting to standard output (echo, module list, etc.) in .bashrc for non-interactive SSH sessions. It breaks the fundamental functionality (SCP) of your account. Take care for SSH session interactivity for such commands as stated in the previous example. -</Callout> - -### Application Modules - -In order to configure your shell for running a particular application on clusters, we use a module package interface. - -Application modules on clusters are built using [EasyBuild][1]. The modules are divided into the following groups: - -``` - base: Default module class - bio: Bioinformatics, biology and biomedical - cae: Computer Aided Engineering (incl. CFD) - chem: Chemistry, Computational Chemistry and Quantum Chemistry - compiler: Compilers - data: Data management & processing tools - debugger: Debuggers - devel: Development tools - geo: Earth Sciences - ide: Integrated Development Environments (e.g. editors) - lang: Languages and programming aids - lib: General purpose libraries - math: High-level mathematical software - mpi: MPI stacks - numlib: Numerical Libraries - perf: Performance tools - phys: Physics and physical systems simulations - system: System utilities (e.g. highly depending on system OS and hardware) - toolchain: EasyBuild toolchains - tools: General purpose tools - vis: Visualization, plotting, documentation and typesetting - OS: singularity image - python: python packages -``` - -<Callout> - The modules set up the application paths, library paths and environment variables for running a particular application. -</Callout> - -The modules may be loaded, unloaded, and switched according to momentary needs. For details, see [lmod][2]. - -[1]: software/tools/easybuild.md -[2]: software/modules/lmod.md -[3]: mailto:support@it4i.cz diff --git a/content/docs/general/access/account-introduction.mdx b/content/docs/general/access/account-introduction.mdx deleted file mode 100644 index 0564f4dcce18a774f1732ecb85894f5c47fdaf5f..0000000000000000000000000000000000000000 --- a/content/docs/general/access/account-introduction.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Introduction" ---- -This section provides basic information on how to gain access to IT4Innovations Information systems and project membership. - -## Account Types - -There are two types of accounts at IT4Innovations: - -* [**e-INFRA CZ Account**][1] - intended for all persons affiliated with an academic institution from the Czech Republic ([eduID.cz][a]). - -* [**IT4I Account**][2] - intended for all persons who are not eligible for an e-INFRA CZ account. - -Once you create an account, you can use it only for communication with IT4I support and accessing the SCS information system. -If you want to access IT4I clusters, your account must also be **assigned to a project**. - -For more information, see the section: - -* [**Get Project Membership**][3] - if you want to become a collaborator on a project, or - -* [**Get Project**][4] - if you want to become a project owner. - -[1]: ./einfracz-account.md -[2]: ../obtaining-login-credentials/obtaining-login-credentials.md -[3]: ../access/project-access.md -[4]: ../applying-for-resources.md - -[a]: https://www.eduid.cz/ diff --git a/content/docs/general/access/einfracz-account.mdx b/content/docs/general/access/einfracz-account.mdx deleted file mode 100644 index 9888312a769944ad228871f48de1e6e39d7702fc..0000000000000000000000000000000000000000 --- a/content/docs/general/access/einfracz-account.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "e-INFRA CZ Account" ---- -[e-INFRA CZ][1] is a unique research and development e-infrastructure in the Czech Republic, -which provides capacities and resources for the transmission, storage and processing of scientific and research data. -IT4Innovations has become a member of e-INFRA CZ on January 2022. - -<Callout type=warn> - Only persons affiliated with an academic institution from the Czech Republic ([eduID.cz][6]) are eligible for an e-INFRA CZ account. -</Callout> - -## Request e-INFRA CZ Account - -1. Request an account: - 1. Go to [https://signup.e-infra.cz/fed/registrar/?vo=IT4Innovations][2] - 1. Select a member academic institution you are affiliated with. - 1. Fill out the e-INFRA CZ Account information (username, password and ssh key(s)). - - Your account should be created in a few minutes after submitting the request. - Once your e-INFRA CZ account is created, it is propagated into IT4I systems - and can be used to access [SCS portal][3] and [Request Tracker][4]. - -1. Provide additional information via [IT4I support][a] or email [support\[at\]it4i.cz][b] (**required**, note that without this information, you cannot use IT4I resources): - 1. **Full name** - 1. **Gender** - 1. **Citizenship** - 1. **Country of residence** - 1. **Organization/affiliation** - 1. **Organization/affiliation country** - 1. **Organization/affiliation type** (university, company, R&D institution, private/public sector (hospital, police), academy of sciences, etc.) - 1. **Job title** (student, PhD student, researcher, research assistant, employee, etc.) - -Continue to apply for a project or project membership to access clusters through the [SCS portal][3]. - -## Logging Into IT4I Services - -The table below shows how different IT4I services are accessed: - -| Services | Access | -| -------- | ------- | -| Clusters | SSH key | -| IS, RT, web, VPN | e-INFRA CZ login | -| Profile<br>Change password<br>Change SSH key | Academic institution's credentials<br>e-INFRA CZ / eduID | - -You can change you profile settings at any time. - -[1]: https://www.e-infra.cz/en -[2]: https://signup.e-infra.cz/fed/registrar/?vo=IT4Innovations -[3]: https://scs.it4i.cz/ -[4]: https://support.it4i.cz/ -[5]: ../../management/einfracz-profile.md -[6]: https://www.eduid.cz/ - -[a]: https://support.it4i.cz/rt/ -[b]: mailto:support@it4i.cz diff --git a/content/docs/general/access/meta.json b/content/docs/general/access/meta.json deleted file mode 100644 index 5244d6e881651a24d19254b398a6bf93d410c354..0000000000000000000000000000000000000000 --- a/content/docs/general/access/meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "title": "Access", - "pages": [ - "account-introduction", - "einfracz-account", - "project-access" - ] -} diff --git a/content/docs/general/access/project-access.mdx b/content/docs/general/access/project-access.mdx deleted file mode 100644 index 1adca13aedd0b8aaa27a9a5483ecb8e680ff0910..0000000000000000000000000000000000000000 --- a/content/docs/general/access/project-access.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Get Project Membership" ---- -<Callout> - You need to be named as a collaborator by a Primary Investigator (PI) in order to access and use the clusters. -</Callout> - -## Authorization by Web - -This is a preferred method if you have an IT4I or e-INFRA CZ account. - -Log in to the [IT4I SCS portal][a] and go to the **Authorization Requests** section. Here you can submit your requests for becoming a project member. You will have to wait until the project PI authorizes your request. - -## Authorization by Email - -An alternative way to become a project member is on request sent via [email by the project PI][1]. - -[1]: ../../applying-for-resources/#authorization-by-email-an-alternative-approach - -[a]: https://scs.it4i.cz/ diff --git a/content/docs/general/accessing-the-clusters/graphical-user-interface/meta.json b/content/docs/general/accessing-the-clusters/graphical-user-interface/meta.json deleted file mode 100644 index 57f649ec5f2de51f1c8d052afc4edd9659605d87..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/graphical-user-interface/meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Graphical-user-interface", - "pages": [ - "ood", - "vnc", - "x-window-system", - "xorg" - ] -} diff --git a/content/docs/general/accessing-the-clusters/graphical-user-interface/ood.mdx b/content/docs/general/accessing-the-clusters/graphical-user-interface/ood.mdx deleted file mode 100644 index 1eb3a3c789496bedc56f0d82886d7cd7b6d9adde..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/graphical-user-interface/ood.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Open OnDemand" ---- -[Open OnDemand][1] is an intuitive, innovative, and interactive interface to remote computing resources. -It allows users to access our services from any device and web browser, -resulting in faster and more efficient use of supercomputing resources. - -For more information, see the Open OnDemand [documentation][2]. - -## Access Open OnDemand - -To access the OOD service, you must be connected to [IT4I VPN][a]. -Then go to [https://ood-karolina.it4i.cz/][3] for Karolina -or [https://ood-barbora.it4i.cz/][4] for Barbora and enter your e-INFRA CZ or IT4I credentials. - -From the top menu bar, you can manage your files and jobs, access the cluster's shell -and launch interactive apps on login nodes. - -## OOD Apps on IT4I Clusters - -<Callout> - Barbora OOD offers Mate and XFCE Desktops on login node only. Other applications listed below are exclusive to Karolina OOD. -</Callout> - -* Desktops - * Karolina Login Mate - * Karolina Login XFCE - * Gnome Desktop -* GUIs - * Ansys - * Blender - * ParaView - * TorchStudio -* Servers - * Code Server - * Jupyter (+IJulia) - * MATLAB - * TensorBoard -* Simulation - * Code Aster - -Depending on a selected application, you can set up various properties; -e.g. partition, number of nodes, tasks per node reservation, etc. - -For `qgpu` partitions, you can select the number of GPUs. - - - -## Job Composer Tutorial - -Under *Jobs > Job Composer*, you can create jobs from several sources. -A simple tutorial will guide you through the process. -To restart the tutorial, click *Help* in the upper right corner. - -[1]: https://openondemand.org/ -[2]: https://osc.github.io/ood-documentation/latest/ -[3]: https://ood-karolina.it4i.cz/ -[4]: https://ood-barbora.it4i.cz/ - -[a]: ../vpn-access.md diff --git a/content/docs/general/accessing-the-clusters/graphical-user-interface/vnc.mdx b/content/docs/general/accessing-the-clusters/graphical-user-interface/vnc.mdx deleted file mode 100644 index 34577b5b998da5cd89c7c79b28a5f89664090bef..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/graphical-user-interface/vnc.mdx +++ /dev/null @@ -1,284 +0,0 @@ ---- -title: "VNC" ---- -Virtual Network Computing (VNC) is a graphical desktop-sharing system that uses the Remote Frame Buffer protocol (RFB) to remotely control another computer. It transmits the keyboard and mouse events from one computer to another, relaying the graphical screen updates back in the other direction, over a network. - -VNC-based connections are usually faster (require less network bandwidth) than [X11][1] applications forwarded directly through SSH. - -The recommended clients are [TightVNC][b] or [TigerVNC][c] (free, open source, available for almost any platform). - -## Create VNC Server Password - -<Callout> - VNC server password should be set before the first login. Use a strong password. -</Callout> - -```console -$ vncpasswd -Password: -Verify: -``` - -## Start VNC Server - -<Callout> - To access VNC, a remote VNC Server must be started first and a tunnel using SSH port forwarding must be established. -</Callout> - -[See below][2] the details on SSH tunnels. - -Start by **choosing your display number**. -To choose a free one, you should check currently occupied display numbers - list them using the command: - -```console -$ ps aux | grep Xvnc | sed -rn 's/(\s) .*Xvnc (\:[0-9]+) .*/\1 \2/p' -username :79 -username :60 -..... -``` - -As you can see above, displays ":79" and ":60" are already occupied. -Generally, you can choose display number freely, *except these occupied numbers*. -Also remember that display number should be lower than or equal to 99. -Based on this requirement, we have chosen the display number 61, as seen in the examples below. - -<Callout> - Your situation may be different so the choice of your number may differ, as well. **Choose and use your own display number accordingly!** -</Callout> - -Start your remote VNC server on the chosen display number (61): - -```console -$ vncserver :61 -geometry 1600x900 -depth 16 - -New 'login2:1 (username)' desktop is login2:1 - -Starting applications specified in /home/username/.vnc/xstartup -Log file is /home/username/.vnc/login2:1.log -``` - -Check whether the VNC server is running on the chosen display number (61): - -```console -$ vncserver -list - -TigerVNC server sessions: - -X DISPLAY # PROCESS ID -:61 18437 -``` - -Another way to check it: - -```console -$ ps aux | grep Xvnc | sed -rn 's/(\s) .*Xvnc (\:[0-9]+) .*/\1 \2/p' - -username :61 -username :102 -``` - -<Callout> - The VNC server runs on port 59xx, where xx is the display number. To get your port number, simply add 5900 + display number, in our example 5900 + 61 = 5961. Another example for display number 102 is calculation of TCP port 5900 + 102 = 6002, but note that TCP ports above 6000 are often used by X11. **Calculate your own port number and use it instead of 5961 from examples below**. -</Callout> - -To access the remote VNC server you have to create a tunnel between the login node using TCP port 5961 and your local machine using a free TCP port (for simplicity the very same) in next step. See examples for [Linux/Mac OS][2] and [Windows][3]. - -<Callout> - The tunnel must point to the same login node where you launched the VNC server, e.g. login2. If you use just cluster-name.it4i.cz, the tunnel might point to a different node due to DNS round robin. -</Callout> - -## Linux/Mac OS Example of Creating a Tunnel - -On your local machine, create the tunnel: - -```console -$ ssh -TN -f username@login2.cluster-name.it4i.cz -L 5961:localhost:5961 -``` - -Issue the following command to check the tunnel is established (note the PID 2022 in the last column, it is required for closing the tunnel): - -```console -$ netstat -natp | grep 5961 -(Not all processes could be identified, non-owned process info - will not be shown, you would have to be root to see it all.) -tcp 0 0 127.0.0.1:5961 0.0.0.0:* LISTEN 2022/ssh -tcp6 0 0 ::1:5961 :::* LISTEN 2022/ssh -``` - -Or on Mac OS use this command: - -```console -$ lsof -n -i4TCP:5961 | grep LISTEN -ssh 75890 sta545 7u IPv4 0xfb062b5c15a56a3b 0t0 TCP 127.0.0.1:5961 (LISTEN) -``` - -Connect with the VNC client: - -```console -$ vncviewer 127.0.0.1:5961 -``` - -In this example, we connect to remote VNC server on port 5961, via the SSH tunnel. The connection is encrypted and secured. The VNC server listening on port 5961 provides screen of 1600x900 pixels. - -You have to close the SSH tunnel which is still running in the background after you finish the work. Use the following command (PID 2022 in this case, see the netstat command above): - -```console -kill 2022 -``` - -<Callout> - You can watch the instruction video on how to make a VNC connection between a local Ubuntu desktop and the IT4I cluster [here][e]. -</Callout> - -## Windows Example of Creating a Tunnel - -Start the VNC server using the `vncserver` command described above. - -Search for the localhost and port number (in this case 127.0.0.1:5961): - -```console -$ netstat -tanp | grep Xvnc -(Not all processes could be identified, non-owned process info - will not be shown, you would have to be root to see it all.) -tcp 0 0 127.0.0.1:5961 0.0.0.0:* LISTEN 24031/Xvnc -``` - -### PuTTY - -On the PuTTY Configuration screen, go to _Connection -> SSH -> Tunnels_ to set up the tunnel. - -Fill the _Source port_ and _Destination_ fields. **Do not forget to click the _Add_ button**. - - - -### WSL (Bash on Windows) - -[Windows Subsystem for Linux][d] is another way to run Linux software in a Windows environment. - -At your machine, create the tunnel: - -```console -$ ssh username@login2.cluster-name.it4i.cz -L 5961:localhost:5961 -``` - -## Example of Starting VNC Client - -Run the VNC client of your choice, select the VNC server 127.0.0.1, port 5961 and connect using the VNC password. - -### TigerVNC Viewer - - - -In this example, we connect to remote the VNC server on port 5961, via the SSH tunnel, using the TigerVNC viewer. The connection is encrypted and secured. The VNC server listening on port 5961 provides a screen of 1600x900 pixels. - -### TightVNC Viewer - -Use your VNC password to log using the TightVNC Viewer and start a Gnome Session on the login node. - - - -## Gnome Session - -After the successful login, you should see the following screen: - - - -### Disable Your Gnome Session Screensaver - -Open the Screensaver preferences dialog: - - - -Uncheck both options below the slider: - - - -### Kill Screensaver if Locked Screen - -If the screen gets locked, you have to kill the screensaver. Do not forget to disable the screensaver then. - -```console -$ ps aux | grep screen -username 1503 0.0 0.0 103244 892 pts/4 S+ 14:37 0:00 grep screen -username 24316 0.0 0.0 270564 3528 ? Ss 14:12 0:00 gnome-screensaver - -[username@login2 .vnc]$ kill 24316 -``` - -## Kill VNC Server After Finished Work - -You should kill your VNC server using the command: - -```console -$ vncserver -kill :61 -Killing Xvnc process ID 7074 -Xvnc process ID 7074 already killed -``` - -or: - -```console -$ pkill vnc -``` - -<Callout> - Also, do not forget to terminate the SSH tunnel, if it was used. For details, see the end of [this section][2]. -</Callout> - -## GUI Applications on Compute Nodes Over VNC - -The very same methods as described above may be used to run the GUI applications on compute nodes. However, for maximum performance, follow these steps: - -Open a Terminal (_Applications -> System Tools -> Terminal_). Run all the following commands in the terminal. - - - -Allow incoming X11 graphics from the compute nodes at the login node: - -Get an interactive session on a compute node (for more detailed info [look here][4]). Forward X11 system using `--x11` option: - -```console -$ salloc -A PROJECT_ID -p qcpu --x11 -``` - -Test that the DISPLAY redirection into your VNC session works, by running an X11 application (e.g. XTerm, Intel Advisor, etc.) on the assigned compute node: - -```console -$ xterm -``` - -The example described above: - - - -### GUI Over VNC and SSH - -For a [better performance][1] an SSH connection can be used. - -Open two Terminals (_Applications -> System Tools -> Terminal_) as described before. - -Get an interactive session on a compute node (for more detailed info [look here][4]). Forward X11 system using `--x11` option: - -```console -$ salloc -A PROJECT_ID -p qcpu --x11 -``` - -In the second terminal connect to the assigned node and run the X11 application - -```console -$ ssh -X node_name.barbora.it4i.cz -$ xterm -``` - -The example described above: - - -[b]: http://www.tightvnc.com -[c]: http://sourceforge.net/apps/mediawiki/tigervnc/index.php?title=Main_Page -[d]: http://docs.microsoft.com/en-us/windows/wsl -[e]: https://www.youtube.com/watch?v=b9Ez9UN2uL0 - -[1]: x-window-system.md -[2]: #linuxmac-os-example-of-creating-a-tunnel -[3]: #windows-example-of-creating-a-tunnel -[4]: ../../job-submission-and-execution.md diff --git a/content/docs/general/accessing-the-clusters/graphical-user-interface/x-window-system.mdx b/content/docs/general/accessing-the-clusters/graphical-user-interface/x-window-system.mdx deleted file mode 100644 index 92c6e805b8bc38569375d9aaa360bebf9346177f..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/graphical-user-interface/x-window-system.mdx +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "X Window System" ---- -The X Window system is a principal way to get GUI access to the clusters. The **X Window System** (commonly known as **X11**, based on its current major version being 11, or shortened to simply **X**, and sometimes informally **X-Windows**) is a computer software system and network protocol that provides a basis for graphical user interfaces (GUIs) and rich input device capability for networked computers. - -<Callout> - The X display forwarding must be activated and the X server running on client side -</Callout> - -## X Display - -### Linux Example - -In order to display the GUI of various software tools, you need to enable the X display forwarding. On Linux and Mac, log in using the `-X` option in the SSH client: - -```console - local $ ssh -X username@cluster-name.it4i.cz -``` - -### PuTTY on Windows - -On Windows, use the PuTTY client to enable X11 forwarding. In PuTTY menu, go to _Connection > SSH > X11_ and check the _Enable X11 forwarding_ checkbox before logging in. Then log in as usual. - - - -### WSL (Bash on Windows) - -To enable the X display forwarding, log in using the `-X` option in the SSH client: - -```console - local $ ssh -X username@cluster-name.it4i.cz -``` - -<Callout> - If you are getting the "cannot open display" error message, try to export the DISPLAY variable, before attempting to log in: -</Callout> - -```console - local $ export DISPLAY=localhost:0.0 -``` - -## X Server - -In order to display the GUI of various software tools, you need a running X server on your desktop computer. For Linux users, no action is required as the X server is the default GUI environment on most Linux distributions. Mac and Windows users need to install and run the X server on their workstations. - -### X Server on OS X - -Mac OS users need to install [XQuartz server][d]. - -### WSL (Bash on Windows) - -To run Linux GuI on WSL, download, for example, [VcXsrv][a]. - -1. After installation, run XLaunch and during the initial setup, check the `Disable access control`. - - <Callout> - Save the configuration and launch VcXsrv using the `config.xlaunch` file, so you won't have to check the option on every run. - </Callout> - -1. Allow VcXsrv in your firewall to communicate on private and public networks. - -1. Set the `DISPLAY` environment variable, using the following command: - - ```console - export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" - ``` - - <Callout> - Include the command at the end of the `/etc/bash.bashrc`, so you don't have to run it every time you run WSL. - </Callout> - -1. Test the configuration by running `echo $DISPLAY`: - - ```code - user@nb-user:/$ echo $DISPLAY - 172.26.240.1:0 - ``` - -### X Server on Windows - -There is a variety of X servers available for the Windows environment. The commercial Xwin32 is very stable and feature-rich. The Cygwin environment provides fully featured open-source XWin X server. For simplicity, we recommend the open-source X server by the [Xming project][e]. For stability and full features, we recommend the [XWin][f] X server by Cygwin - -| How to use Xwin | How to use Xming | -|--- | --- | -| [Install Cygwin][g]. Find and execute XWin.exe to start the X server on Windows desktop computer. | Use Xlaunch to configure Xming. Run Xming to start the X server on a Windows desktop computer. | - -## Running GUI Enabled Applications - -<Callout> - Make sure that X forwarding is activated and the X server is running. -</Callout> - -Then launch the application as usual. Use the `&` to run the application in background: - -```console -$ ml intel (idb and gvim not installed yet) -$ gvim & -``` - -```console -$ xterm -``` - -In this example, we activate the Intel programing environment tools and then start the graphical gvim editor. - -## GUI Applications on Compute Nodes - -Allocate the compute nodes using the `--x11` option on the `salloc` command: - -```console -$ salloc -A PROJECT-ID -q qcpu_exp --x11 -``` - -In this example, we allocate one node via qcpu_exp queue, interactively. We request X11 forwarding with the `--x11` option. It will be possible to run the GUI enabled applications directly on the first compute node. - -For **better performance**, log on the allocated compute node via SSH, using the `-X` option. - -```console -$ ssh -X cn245 -``` - -In this example, we log on the cn245 compute node, with the X11 forwarding enabled. - -## Gnome GUI Environment - -The Gnome 2.28 GUI environment is available on the clusters. We recommend using a separate X server window for displaying the Gnome environment. - -### Gnome on Linux and OS X - -To run the remote Gnome session in a window on a Linux/OS X computer, you need to install Xephyr. Ubuntu package is -xserver-xephyr, on OS X it is part of [XQuartz][i]. First, launch Xephyr on local machine: - -```console -local $ Xephyr -ac -screen 1024x768 -br -reset -terminate :1 & -``` - -This will open a new X window of size 1024x768 at DISPLAY :1. Next, connect via SSH to the cluster with the `DISPLAY` environment variable set and launch a gnome-session: - -```console -local $ DISPLAY=:1.0 ssh -XC yourname@cluster-name.it4i.cz -i ~/.ssh/path_to_your_key -... cluster-name MOTD... -yourname@login1.cluster-namen.it4i.cz $ gnome-session & -``` - -On older systems where Xephyr is not available, you may also try Xnest instead of Xephyr. Another option is to launch a new X server in a separate console via: - -```console -xinit /usr/bin/ssh -XT -i .ssh/path_to_your_key yourname@cluster-namen.it4i.cz gnome-session -- :1 vt12 -``` - -However, this method does not seem to work with recent Linux distributions and you will need to manually source -/etc/profile to properly set environment variables for Slurm. - -### Gnome on Windows - -Use XLaunch to start the Xming server or run the XWin.exe. Select the "One window" mode. - -Log in to the cluster using [PuTTY][2] or [Bash on Windows][3]. On the cluster, run the gnome-session command. - -```console -$ gnome-session & -``` - -This way, we run a remote gnome session on the cluster, displaying it in the local X server. - -Use System-Log Out to close the gnome-session. - -[1]: #if-no-able-to-forward-x11-using-putty-to-cygwinx -[2]: #putty-on-windows -[3]: #wsl-bash-on-windows - -[a]: https://sourceforge.net/projects/vcxsrv/ -[d]: https://www.xquartz.org -[e]: http://sourceforge.net/projects/xming/ -[f]: http://x.cygwin.com/ -[g]: http://x.cygwin.com/ -[i]: http://xquartz.macosforge.org/landing/ diff --git a/content/docs/general/accessing-the-clusters/graphical-user-interface/xorg.mdx b/content/docs/general/accessing-the-clusters/graphical-user-interface/xorg.mdx deleted file mode 100644 index 6ac7129891fa14e2532ca558ce7bb1e84f745f6a..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/graphical-user-interface/xorg.mdx +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: "Xorg" ---- -## Introduction - -<Callout> - Available only for Karolina accelerated nodes acn[01-72] and vizualization servers viz[1-2] -</Callout> - -Some applications (e.g. Paraview, Ensight, Blender, Ovito) require not only visualization but also computational resources such as multiple cores or multiple graphics accelerators. For the processing of demanding tasks, more operating memory and more memory on the graphics card are also required. These requirements are met by all accelerated nodes on the Karolina cluster, which are equipped with eight graphics cards with 40GB GPU memory and 1TB CPU memory. To run properly, it is required to have the Xorg server running and the VirtualGL environment installed. - -## Xorg - -[Xorg][a] is a free and open source implementation of the X Window System imaging server maintained by the X.Org Foundation. Client-side implementations of the protocol are available, for example, in the form of Xlib and XCB. While Xorg usually supports 2D hardware acceleration, 3D hardware acceleration is often missing. With hardware 3D acceleration, 3D rendering uses the graphics processor on the graphics card instead of taking up valuable CPU resources when rendering 3D images. It is also referred to as hardware acceleration instead of software acceleration because without this 3D acceleration, the processor is forced to draw everything itself using the [Mesa][c] software rendering libraries, which takes up quite a bit of computing power. There is a VirtualGL package that solves these problems. - -## VirtualGL - -[VirtualGL][b] is an open source software package that redirects 3D rendering commands from Linux OpenGL applications to 3D accelerator hardware in a dedicated server and sends the rendered output to a client located elsewhere on the network. On the server side, VirtualGL consists of a library that handles the redirection and a wrapper that instructs applications to use the library. Clients can connect to the server either using a remote X11 connection or using an X11 proxy such as a VNC server. In the case of an X11 connection, some VirtualGL software is also required on the client side to receive the rendered graphical output separately from the X11 stream. In the case of VNC connections, no specific client-side software is needed other than the VNC client itself. VirtualGL works seamlessly with [headless][d] NVIDIA GPUs (Ampere, Tesla). - -## Running Paraview With GUI and Interactive Job on Karolina - -1. Run [VNC environment][1] - -1. Run terminal in VNC session: - - ```console - [loginX.karolina]$ gnome-terminal - ``` - -1. Run interactive job in gnome terminal - - ```console - [loginX.karolina]$ salloc --A PROJECT-ID -q qgpu --x11 --comment use:xorg=true - ``` - -1. Run Xorg server - - ```console - [acnX.karolina]$ Xorg :0 & - ``` - -1. Load VirtualGL: - - ```console - [acnX.karolina]$ ml VirtualGL - ``` - -1. Find number of DISPLAY: - - ```console - [acnX.karolina]$ echo $DISPLAY - localhost:XX.0 (for ex. localhost:50.0) - ``` - -1. Load ParaView: - - ```console - [acnX.karolina]$ ml ParaView - ``` - -1. Run ParaView: - - ```console - [acnX.karolina]$ DISPLAY=:XX vglrun paraview - ``` - -<Callout> - It is not necessary to run Xorg from the command line on the visualization servers viz[1-2]. Xorg runs without interruption and is started when the visualization server boots.<br> Another option is to use [vglclient][2] for visualization server. -</Callout> - -## Running Blender (Eevee) on the Background Without GUI and Without Interactive Job on Karolina - -1. Download and extract Blender and Eevee scene: - - ```console - [loginX.karolina]$ wget https://ftp.nluug.nl/pub/graphics/blender/release/Blender2.93/blender-2.93.6-linux-x64.tar.xz ; tar -xvf blender-2.93.6-linux-x64.tar.xz ; wget https://download.blender.org/demo/eevee/mr_elephant/mr_elephant.blend - ``` - -1. Create a running script: - - ```console - [loginX.karolina]$ echo 'Xorg :0 &' > run_eevee.sh ; echo 'cd' $PWD >> run_eevee.sh ; echo 'DISPLAY=:0 ./blender-2.93.6-linux-x64/blender --factory-startup --enable-autoexec -noaudio --background ./mr_elephant.blend --render-output ./#### --render-frame 0' >> run_eevee.sh ; chmod +x run_eevee.sh - ``` - -1. Run job from terminal: - - ```console - [loginX.karolina]$ sbatch -A PROJECT-ID -q qcpu --comment use:xorg=true ./run_eevee.sh - ``` - -[1]: ./vnc.md -[2]: ../../../software/viz/vgl.md - -[a]: https://www.x.org/wiki/ -[b]: https://en.wikipedia.org/wiki/VirtualGL -[c]: https://docs.mesa3d.org/index.html -[d]: https://virtualgl.org/Documentation/HeadlessNV diff --git a/content/docs/general/accessing-the-clusters/meta.json b/content/docs/general/accessing-the-clusters/meta.json deleted file mode 100644 index f80d79ff0617531be54a564225fe1293a0fcc308..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Accessing-the-clusters", - "pages": [ - "graphical-user-interface", - "shell-access-and-data-transfer", - "tmux", - "vpn-access" - ] -} diff --git a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/meta.json b/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/meta.json deleted file mode 100644 index 1af06ec3aa327cc10f2671a1dcf7e7cb461414f9..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "title": "Shell-access-and-data-transfer", - "pages": [ - "putty", - "ssh-key-management", - "ssh-keys" - ] -} diff --git a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/putty.mdx b/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/putty.mdx deleted file mode 100644 index eb580c90c5efe6fb333702c1995a9348cd3f39d8..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/putty.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "PuTTY (Windows)" ---- -## Windows PuTTY Installer - -We recommend you to download "**A Windows installer for everything except PuTTYtel**" with **Pageant** (SSH authentication agent) and **PuTTYgen** (PuTTY key generator) which is available [here][a]. - -<Callout> - "Pageant" is optional. - - "Change Password for Existing Private Key" is optional. -</Callout> - -## PuTTY - How to Connect to the IT4Innovations Cluster - -* Run PuTTY -* Enter Host name and Save session fields with login address and browse Connection - SSH - Auth menu. The _Host Name_ input may be in the format **"username@clustername.it4i.cz"** so you do not have to type your login each time. In this example, replace the word `cluster` in the `cluster.it4i.cz` address with the name of the cluster to which you want to connect. - - - -* Category - Connection - SSH - Auth: - Select Attempt authentication using Pageant. - Select Allow agent forwarding. - Browse and select your private key file. - - - -* Return to Session page and Save selected configuration with _Save_ button. - - - -* Now you can log in using _Open_ button. - - - -* Enter your username if the _Host Name_ input is not in the format "username@cluster.it4i.cz". -* Enter passphrase for selected private key file if Pageant **SSH authentication agent is not used.** - -## Another PuTTY Settings - -* Category - Windows - Translation - Remote character set and select **UTF-8**. -* Category - Terminal - Features and select **Disable application keypad mode** (enable numpad) -* Save your configuration in the Session - Basic options for your PuTTY section with the _Save_ button. - -## Pageant SSH Agent - -Pageant holds your private key in memory without needing to retype a passphrase on every login. - -* Run Pageant. -* On Pageant Key List press _Add key_ and select your private key (id_rsa.ppk). -* Enter your passphrase. -* Now you have your private key in memory without needing to retype a passphrase on every login. - - - -## PuTTY Key Generator - -PuTTYgen is the PuTTY key generator. You can load in an existing private key and change your passphrase or generate a new public/private key pair. - -### Change Password for Existing Private Key - -You can change the password of your SSH key with "PuTTY Key Generator". Make sure to back up the key. - -* Load your private key file with _Load_ button. -* Enter your current passphrase. -* Change key passphrase. -* Confirm key passphrase. -* Save your private key with the _Save private key_ button. - - - -### Generate a New Public/Private Key - -You can generate an additional public/private key pair and insert public key into authorized_keys file for authentication with your own private key. - -* Start with _Generate_ button. - - - -* Generate some randomness. - - - -* Wait. - - - -* Enter a comment for your key using the 'username@organization.example.com' format. - Enter a key passphrase, confirm it and save your new private key in the _ppk_ format. - - - -* Save the public key with the _Save public key_ button. - You can copy public key out of the â€Public key for pasting into the authorized_keys file’ box. - - - -* Export the private key in the OpenSSH format "id_rsa" using Conversion - Export OpenSSH key - - - -## Managing Your SSH Key - -To manage your SSH key for authentication to clusters, see the [SSH Key Management][3] section. - -[1]: ./ssh-key-management.md - -[1]: #putty -[2]: ssh-keys.md#how-to-add-your-own-key -[3]: ./ssh-key-management.md - -[a]: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html diff --git a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-key-management.mdx b/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-key-management.mdx deleted file mode 100644 index 259d319802fa70b0a6448f4a005eb2dd893c8340..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-key-management.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "SSH" ---- -Secure Shell (SSH) is a cryptographic network protocol for operating network services securely over an unsecured network. -SSH uses public-private key pair for authentication, allowing users to log in without having to specify a password. The public key is placed on all computers that must allow access to the owner of the matching private key (the private key must be kept **secret**). - -## Private Key - -<Callout> - The path to a private key is usually /home/username/.ssh/ -</Callout> - -A private key file in the `id_rsa` or `*.ppk` format is present locally on local side and used for example in the Pageant SSH agent (for Windows users). The private key should always be kept in a safe place. - -### Example of RSA Private Key Format - -```console - -----BEGIN RSA PRIVATE KEY----- - MIIEpAIBAAKCAQEAqbo7jokygnBpG2wYa5NB45ns6+UKTNLMLHF0BO3zmRtKEElE - aGqXfbYwvXlcuRb2d9/Y5dVpCZHV0kbY3NhtVOcEIe+1ROaiU9BEsUAhMNEvgiLV - gSql4QvRO4BWPlM8+WAWXDp3oeoBh8glXyuh9teb8yq98fv1r1peYGRrW3/s4V+q - O1SQ0XY2T7rWCYRLIP6rTMXArTI35v3WU513mn7nm1fJ7oN0QgVH5b0W9V1Kyc4l - 9vILHeMXxvz+i/5jTEfLOJpiRGYZYcaYrE4dIiHPl3IlbV7hlkK23Xb1US8QJr5G - ADxp1VTkHjY+mKagEfxl1hQIb42JLHhKMEGqNQIDAQABAoIBAQCkypPuxZjL+vai - UGa5dAWiRZ46P2yrwHPKpvEdpCdDPbLAc1K/CtdBkHZsUPxNHVV6eFWweW99giIY - Av+mFWC58X8asBHQ7xkmxW0cqAZRzpkRAl9IBS9/fKjO28Fgy/p+suOi8oWbKIgJ - 3LMkX0nnT9oz1AkOfTNC6Tv+3SE7eTj1RPcMjur4W1Cd1N3EljLszdVk4tLxlXBS - yl9NzVnJJbJR4t01l45VfFECgYEAno1WJSB/SwdZvS9GkfhvmZd3r4vyV9Bmo3dn - XZAh8HRW13imOnpklDR4FRe98D9A7V3yh9h60Co4oAUd6N+Oc68/qnv/8O9efA+M - /neI9ANYFo8F0+yFCp4Duj7zPV3aWlN/pd8TNzLqecqh10uZNMy8rAjCxybeZjWd - DyhgywXhAoGBAN3BCazNefYpLbpBQzwes+f2oStvwOYKDqySWsYVXeVgUI+OWTVZ - eZ26Y86E8MQO+q0TIxpwou+TEaUgOSqCX40Q37rGSl9K+rjnboJBYNCmwVp9bfyj - kCLL/3g57nTSqhgHNa1xwemePvgNdn6FZteA8sXiCg5ZzaISqWAffek5AoGBAMPw - V/vwQ96C8E3l1cH5cUbmBCCcfXM2GLv74bb1V3SvCiAKgOrZ8gEgUiQ0+TfcbAbe - 7MM20vRNQjaLTBpai/BTbmqM1Q+r1KNjq8k5bfTdAoGANgzlNM9omM10rd9WagL5 - yuJcal/03p048mtB4OI4Xr5ZJISHze8fK4jQ5veUT9Vu2Fy/w6QMsuRf+qWeCXR5 - RPC2H0JzkS+2uZp8BOHk1iDPqbxWXJE9I57CxBV9C/tfzo2IhtOOcuJ4LY+sw+y/ - ocKpJbdLTWrTLdqLHwicdn8OxeWot1mOukyK2l0UeDkY6H5pYPtHTpAZvRBd7ETL - Zs2RP3KFFvho6aIDGrY0wee740/jWotx7fbxxKwPyDRsbH3+1Wx/eX2RND4OGdkH - gejJEzpk/7y/P/hCad7bSDdHZwO+Z03HIRC0E8yQz+JYatrqckaRCtd7cXryTmTR - FbvLJmECgYBDpfno2CzcFJCTdNBZFi34oJRiDb+HdESXepk58PcNcgK3R8PXf+au - OqDBtZIuFv9U1WAg0gzGwt/0Y9u2c8m0nXziUS6AePxy5sBHs7g9C9WeZRz/nCWK - +cHIm7XOwBEzDKz5f9eBqRGipm0skDZNKl8X/5QMTT5K3Eci2n+lTw== - -----END RSA PRIVATE KEY----- -``` - -### Example of Ed25519 Private Key Format - -```console -PuTTY-User-Key-File-3: ssh-ed25519 -Encryption: aes256-cbc -Comment: eddsa-key-20240910 -Public-Lines: 2 -AAAAC3NzaC1lZDI1NTE5AAAAIBKNwqaWU260wueN00nBGRwIqeOedRedtS0T7QVn -h0i2 -Key-Derivation: Argon2id -Argon2-Memory: 8192 -Argon2-Passes: 21 -Argon2-Parallelism: 1 -Argon2-Salt: bb64fc32b368aa16d6e8159c8d921f63 -Private-Lines: 1 -+7StvvEmCMchEy1tUyIMLfGTZBk7dgGUpJEJzNl82qmNZD1TmQOqNmCRiK84P/TL -Private-MAC: dc3f83cef42026a2038f28e96f87367d762e72265621d82e2fe124634ec3c905 -``` - -## Public Key - -A public key file in the `*.pub` format is present on the remote side and allows an access to the owner of the matching private key. - -### Example of RSA Public Key Format - -```console -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpujuOiTKCcGkbbBhrk0Hjmezr5QpM0swscXQE7fOZG0oQSURoapd9tjC9eVy5FvZ339jl1WkJkdXSRtjc2G1U5wQh77VE5qJT0ESxQCEw0S+CItWBKqXhC9E7gFY+UyP5YBZcOneh6gGHyCVfK6H215vzKr3x+/WvWl5gZGtbf+zhX6o4RJDRdjZPutYJhEsg/qtMxcCtMjfm/dZTnXeafuebV8nug3RCBUflvRb1XUrJuiX28gsd4xfG/P6L/mNMR8s4kmJEZhlhxpj8Th0iIc+XciVtXuGWQrbddcVRLxAmvkYAPGnVVOQeNj69pqAR/GXaFAhvjYkseEowQao1 username@organization.example.com -``` - -### Example of Ed25519 Public Key Format - -```console ----- BEGIN SSH2 PUBLIC KEY ---- -Comment: "eddsa-key-20240910" -AAAAC3NzaC1lZDI1NTE5AAAAIBKNwqaWU260wueN00nBGRwIqeOedRedtS0T7QVn -h0i2 ----- END SSH2 PUBLIC KEY ---- -``` - -## SSH Key Management - -You can manage your own SSH key for authentication to clusters: - -* [e-INFRA CZ account][3] -* [IT4I account][4] - -[1]: ./ssh-keys.md -[2]: ./putty.md -[3]: ../../management/einfracz-profile.md -[4]: ../../management/it4i-profile.md diff --git a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-keys.mdx b/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-keys.mdx deleted file mode 100644 index 98b6d533b41612617f04f877f0627ca69151c79d..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/shell-access-and-data-transfer/ssh-keys.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "OpenSSH Keys (UNIX)" ---- -## Creating Your Own Key - -To generate a new keypair of your public and private key, use the `ssh-keygen` tool: - -```console -local $ ssh-keygen -t ed25519 -C username@organization.example.com' -f additional_key -``` - -<Callout> - Enter a **strong** **passphrase** for securing your private key. -</Callout> - -By default, your private key is saved to the `id_rsa` file in the `.ssh` directory -and your public key is saved to the `id_rsa.pub` file. - -## Adding SSH Key to Linux System SSH Agent - -1. Check if SSH Agent is running: - - ``` - eval "$(ssh-agent -s)" - ``` - -1. Add the key to SSH Agent: - - ``` - ssh-add ~/.ssh/name_of_your_ssh_key_file - ``` - -1. Verify the key Added to SSH Agent: - - ``` - ssh-add -l - ``` - -## Managing Your SSH Key - -To manage your SSH key for authentication to clusters, see the [SSH Key Management][1] section. - -[1]: ./ssh-key-management.md diff --git a/content/docs/general/accessing-the-clusters/tmux.mdx b/content/docs/general/accessing-the-clusters/tmux.mdx deleted file mode 100644 index 70918da9d5b174e0d051fb4a757ff2294103d6e7..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/tmux.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Tmux" ---- -[Tmux][1] is an open-source terminal multiplexer which allows multiple terminal sessions to be accessed simultaneously in a single window. Tmux allows you to switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal. - -Note that [GNU Screen][2] is not supported, but if you prefer it, you can install it in your `/home` folder: - -```console -wget https://ftp.gnu.org/gnu/screen/screen-4.9.0.tar.gz -tar xf screen-4.9.0.tar.gz && rm screen-4.9.0.tar.gz -cd screen-4.9.0 - -./autogen.sh -./configure --prefix=$HOME/.local/screen -make -make install - -mkdir $HOME/.local/screen/etc -cp etc/etcscreenrc $HOME/.local/screen/etc/screenrc - -echo "export PATH=\$HOME/.local/screen/bin:\$PATH" >> $HOME/.bashrc - -cd ../ && rm -rf screen-4.9.0 -``` - -[1]: https://github.com/tmux/tmux/wiki -[2]: https://www.gnu.org/software/screen/ diff --git a/content/docs/general/accessing-the-clusters/vpn-access.mdx b/content/docs/general/accessing-the-clusters/vpn-access.mdx deleted file mode 100644 index bb0c30b7540469d56843ab13356d0239aaf8a1b0..0000000000000000000000000000000000000000 --- a/content/docs/general/accessing-the-clusters/vpn-access.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "VPN Access" ---- -## Accessing IT4Innovations Internal Resources via VPN - -To access IT4Innovations' resources and licenses, it is necessary to connect to its local network via VPN. IT4Innovations uses the FortiClient VPN software. For the list of supported operating systems, see the [FortiClient Administration Guide][a]. - -## VPN Client Download - -* Windows: Download the FortiClient app from the [official page][g] (Microsoft Store app is not recommended). -* Mac: Download the FortiClient VPN app from the [Apple Store][d]. -* Linux: Download the [FortiClient][e] or [OpenFortiVPN][f] app. - -## Working With Windows/Mac VPN Client - -Before the first login, you must configure the VPN. In the New VPN Connection section, provide the name of your VPN connection and the following settings: - -Name | Value -:-------------------|:------------------ -VPN | SSL-VPN -Remote Gateway | reconnect.it4i.cz -Port | 443 -Client Certificate | None - -Optionally, you can describe the VPN connection and select Save Login under Authentication. - -<Callout> - If you are member of a partner organization, we may ask you to use so called realm in your VPN connection. In the Remote Gateway field, include the realm path after the IP address or hostname. For example, for a realm `excellent`, the field would read as follows `reconnect.it4i.cz:443/excellent`. -</Callout> - - - -Save the settings, enter your login credentials and click Connect. - - - -## Linux Client - -Connection will work with following settings: - -Name | Value -:------------|:---------------------- -VPN-Server | reconnect.it4i.cz -VPN-Port | 443 -Set-Routes | Enabled -Set-DNS | Enabled -DNS Servers | 10.5.8.11, 10.5.8.22 - -Linux VPN clients need to run under root. -OpenFortiGUI uses sudo by default; be sure that your user is allowed to use sudo. - -[1]: ../../general/obtaining-login-credentials/obtaining-login-credentials.md#login-credentials -[2]: ../../general/access/einfracz-account.md - -[a]: http://docs.fortinet.com/document/forticlient/latest/administration-guide/646779/installation-requirements -[c]: https://github.com/theinvisible/openfortigui -[d]: https://apps.apple.com/cz/app/forticlient-vpn/id1475674905?l=cs -[e]: https://www.fortinet.com/support/product-downloads/linux -[f]: https://github.com/adrienverge/openfortivpn -[g]: https://www.fortinet.com/support/product-downloads#vpn diff --git a/content/docs/general/applying-for-resources.mdx b/content/docs/general/applying-for-resources.mdx deleted file mode 100644 index a5f5c9ba01514ae97190e9004c2f614b6eb8f83e..0000000000000000000000000000000000000000 --- a/content/docs/general/applying-for-resources.mdx +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "Get Project" ---- -The computational resources of IT4I are allocated by the Allocation Committee via several [allocation mechanisms][a] to a project investigated by a Primary Investigator. By allocating the computational resources, the Allocation Committee is authorizing the PI to access and use the clusters. The PI may decide to authorize a number of their collaborators to access and use the clusters to consume the resources allocated to their Project. These collaborators will be associated to the Project. The Figure below is depicting the authorization chain: - - - -**Allocation Mechanisms:** - -* Academic researchers may apply via Open Access Competitions. -* Commercial and non-commercial institutions may also apply via the Directors Discretion. - -In all cases, IT4Innovations’ access mechanisms are aimed at distributing computational resources while taking into account the development and application of supercomputing methods and their benefits and usefulness for society. The applicants are expected to submit a proposal. In the proposal, the applicants **apply for a particular amount of core-hours** of computational resources. The requested core-hours should be substantiated by scientific excellence of the proposal, its computational maturity and expected impacts. The allocation decision is based on the scientific, technical, and economic evaluation of the proposal. - -## Becoming Primary Investigator - -Once you create an account, log in to the [IT4I SCS portal][e] and apply for a project. -You will be informed by IT4I about the Allocation Committee decision. -Once approved by the Allocation Committee, you become the Primary Investigator (PI) for the project -and are authorized to use the clusters and any allocated resources as well as authorize collaborators for your project. - -### Authorize Collaborators for Your Project - -As a PI, you can approve or deny users' requests to join your project. There are two methods of authorizing collaborators: - -#### Authorization by Web - -This is a preferred method if you have an IT4I or e-INFRA CZ account. - -Log in to the [IT4I SCS portal][e] using your credentials and go to the **Authorization Requests** section. -Here you can authorize collaborators for your project. - -#### Authorization by Email (An Alternative Approach) - -In order to authorize a Collaborator to utilize the allocated resources, the PI should contact the [IT4I support][f] (email: [support\[at\]it4i.cz][g]) and provide the following information: - -1. Identify their project by project ID. -1. Provide a list of people, including themself, who are authorized to use the resources allocated to the project. The list must include the full name, email and affiliation. If collaborators' login access already exists in the IT4I systems, provide their usernames as well. -1. Include "Authorization to IT4Innovations" into the subject line. - -<Callout type=warn> - Should the above information be provided by email, the email **must be** digitally signed. Read more on [digital signatures][2]. -</Callout> - -Example (except the subject line which must be in English, you may use Czech or Slovak language for communication with us): - -```console -Subject: Authorization to IT4Innovations - -Dear support, - -Please include my collaborators to project OPEN-0-0. - -John Smith, john.smith@myemail.com, Department of Chemistry, MIT, US -Jonas Johansson, jjohansson@otheremail.se, Department of Physics, RIT, Sweden -Luisa Fibonacci, lf@emailitalia.it, Department of Mathematics, National Research Council, Italy - -Thank you, -PI -(Digitally signed) -``` - -<Callout> - Web-based email interfaces cannot be used for secure communication; external application, such as Thunderbird or Outlook must be used. This way, your new credentials will be visible only in applications that have access to your certificate. -</Callout> - -[1]: obtaining-login-credentials/obtaining-login-credentials.md -[2]: https://docs.it4i.cz/general/obtaining-login-credentials/obtaining-login-credentials/#certificates-for-digital-signatures - -[a]: https://www.it4i.cz/en/for-users/computing-resources-allocation -[b]: http://www.it4i.cz/open-access-competition/?lang=en&lang=en -[c]: http://www.it4i.cz/obtaining-computational-resources-through-directors-discretion/?lang=en&lang=en -[d]: https://prace-ri.eu/hpc-access/deci-access/deci-access-information-for-applicants/ -[e]: https://scs.it4i.cz -[f]: https://support.it4i.cz/rt/ -[g]: mailto:support@it4i.cz diff --git a/content/docs/general/aup.mdx b/content/docs/general/aup.mdx deleted file mode 100644 index 40f4da8473e80a12f8aa4e33b7ebe75134b682be..0000000000000000000000000000000000000000 --- a/content/docs/general/aup.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Acceptable Use Policy" ---- -{ type=application/pdf style="min-height:100vh;width:100%" } - diff --git a/content/docs/general/barbora-partitions.mdx b/content/docs/general/barbora-partitions.mdx deleted file mode 100644 index fb5093af57120e7e18ccd333b3468a5a8d647b79..0000000000000000000000000000000000000000 --- a/content/docs/general/barbora-partitions.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Barbora Partitions" ---- -<Callout type=warn> - Active [project membership][1] is required to run jobs. -</Callout> - -Below is the list of partitions available on the Barbora cluster: - -| Partition | Project resources | Nodes | Min ncpus | Priority | Authorization | Walltime (def/max) | -| ---------------- | -------------------- | -------------------------- | --------- | -------- | ------------- | ------------------ | -| **qcpu** | > 0 | 190 | 36 | 2 | no | 24 / 48h | -| **qcpu_biz** | > 0 | 190 | 36 | 3 | no | 24 / 48h | -| **qcpu_exp** | < 150% of allocation | 16 | 36 | 4 | no | 1 / 1h | -| **qcpu_free** | < 150% of allocation | 124<br>max 4 per job | 36 | 1 | no | 12 / 18h | -| **qcpu_long** | > 0 | 60<br>max 20 per job | 36 | 2 | no | 72 / 144h | -| **qcpu_preempt** | active Barbora<br>CPU alloc. | 190<br>max 4 per job | 36 | 0 | no | 12 / 12h | -| **qgpu** | > 0 | 8 | 24 | 2 | yes | 24 / 48h | -| **qgpu_biz** | > 0 | 8 | 24 | 3 | yes | 24 / 48h | -| **qgpu_exp** | < 150% of allocation | 4<br>max 1 per job | 24 | 4 | no | 1 / 1h | -| **qgpu_free** | < 150% of allocation | 5<br>max 2 per job | 24 | 1 | no | 12 / 18h | -| **qgpu_preempt** | active Barbora<br>GPU alloc. | 4<br>max 2 per job | 24 | 0 | no | 12 / 12h | -| **qdgx** | > 0 | cn202 | 96 | 2 | yes | 4 / 48h | -| **qviz** | > 0 | 2 with NVIDIA Quadro P6000 | 4 | 2 | no | 1 / 8h | -| **qfat** | > 0 | 1 fat node | 128 | 2 | yes | 24 / 48h | - -[1]: access/project-access.md diff --git a/content/docs/general/capacity-computing.mdx b/content/docs/general/capacity-computing.mdx deleted file mode 100644 index a4666065a06514a62c9ff34e291587011e97217f..0000000000000000000000000000000000000000 --- a/content/docs/general/capacity-computing.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Capacity Computing" ---- -## Introduction - -In many cases, it is useful to submit a huge (>100) number of computational jobs into the Slurm queue system. -A huge number of (small) jobs is one of the most effective ways to execute embarrassingly parallel calculations, -achieving the best runtime, throughput, and computer utilization. - -However, executing a huge number of jobs via the Slurm queue may strain the system. This strain may -result in slow response to commands, inefficient scheduling, and overall degradation of performance -and user experience for all users. - -[//]: # (For this reason, the number of jobs is **limited to 100 jobs per user, 4,000 jobs and subjobs per user, 1,500 subjobs per job array**.) - -<Callout> - Follow one of the procedures below, in case you wish to schedule more than 100 jobs at a time. -</Callout> - -You can use [HyperQueue][1] when running a huge number of jobs. HyperQueue can help efficiently -load balance a large number of jobs amongst available computing nodes. - -[1]: hyperqueue.md diff --git a/content/docs/general/energy.mdx b/content/docs/general/energy.mdx deleted file mode 100644 index ac8f9bf93c800d8d2a5d96d93f59f3e01e1180c9..0000000000000000000000000000000000000000 --- a/content/docs/general/energy.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Energy Saving" ---- -IT4Innovations has implemented a set of energy saving measures on the supercomputing clusters. The measures are selected to minimize the performance impact and achieve significant cost, energy, and carbon footprint reduction effect. - -The energy saving measures are effective as of **1.2.2023**. - -## Karolina - -### Measures - -The CPU core and GPU streaming multiprocessors frequency limit is implemented for the Karolina supercomputer: - -|Measure | Value | -|---------------------------------------------------------|---------| -|Compute nodes **cn[001-720]**<br> CPU core frequency limit | 2.100 GHz | -|Accelerated compute nodes **acn[001-72]**<br> CPU core frequency limit | 2.600 GHz | -|Accelerated compute nodes **acn[001-72]**<br> GPU SMs frequency limit | 1.290 GHz | - -### Performance Impact - -The performance impact depends on the [arithmetic intensity][1] of the executed workload. -The [arithmetic intensity][2] is a measure of floating-point operations (FLOPs) performed by a given code (or code section) relative to the amount of memory accesses (Bytes) that are required to support those operations. It is defined as a FLOP per Byte ratio (F/B).Arithmetic intensity is a characteristic of the computational algorithm. - -In general, the processor frequency [capping][3] has low performance impact for memory bound computations (arithmetic intensity below the [ridge point][2]). For processor bound computations (arithmetic intensity above the [ridge point][2]), the impact is proportional to the frequency reduction. - -On Karolina, runtime increase **up to 16%** is [observed][4] for arithmeticaly intensive CPU workloads and **up to 10%** for intensive GPU workloads. **No slowdown** is [observed][4] for memory bound workloads. - -### Energy Efficiency - -The energy efficiency in floating point operations per energy unit is increased by **up to 30%** for both the CPU and GPU workloads. The efficiency depends on the arithmetic intensity, however energy savings are always achieved. - -## Barbora - -None implemented yet. - -## NVIDIA DGX-2 - -None implemented yet. - -## Complementary Systems - -None implemented yet. - -[1]: https://en.wikipedia.org/wiki/Roofline_model -[2]: https://dl.acm.org/doi/10.1145/1498765.1498785 -[3]: https://slovnik.seznam.cz/preklad/anglicky_cesky/capping -[4]: Energy_saving_Karolina.pdf diff --git a/content/docs/general/feedback.mdx b/content/docs/general/feedback.mdx deleted file mode 100644 index db358edfe71e4ddcf6f995f6cc20e78c34033e91..0000000000000000000000000000000000000000 --- a/content/docs/general/feedback.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Satisfaction and Feedback" ---- -IT4Innovations National Supercomputing Center is interested in [user satisfaction and feedback][1]. It allows us to prioritize and focus on the most pressing issues. With the help of user feedback, we strive to provide smooth and productive environment, where computational tasks may be solved without distraction or annoyance. - -## Feedback Form - -Please provide us with feedback regarding your satisfaction with our services using [the online form][1]. Set the values and comment on the individual aspects of our services. - -We prefer you enter [**new inputs 3 times a year**][1]. - -You may view your [feedback history][2] any time. -You are welcome to modify your most recent input. - -The form inquires about: - -- Resource allocation and access -- Computing environment -- Added value services - -You may set the satisfaction score on a **scale of 1 to 5** as well as leave **text comments**. -The score is interpreted as follows: - -|Value | Interpretation | -|-----|---| -| 1-2 | Values below 3 indicate a level of dissatisfaction; improvements or other actions are desirable. The values are interpreted as a measure of how deep the dissatisfaction is.| -| 3 | Value 3 indicates a degree of satisfaction. Users are reasonably happy with the environment and services and do not require changes, although there still might be room for improvements. | -| 4-5 | Values above 3 indicate a level of exceptional appreciation and satisfaction; the values are interpreted as a measure of how rewarding the experience is. | - -## Feedback Automation - -In order to obtain ample feedback data without forcing our users -to spend efforts in filling out the feedback form, we implement automatic data collection. - -The automation works as follows: -If the last feedback entry is older than 4 months, a new feedback entry is created as a copy of the last entry. -The new entry is modified in this way: - -- score values greater than 3 are decremented by one; -- score values lower than 3 are incremented by one; -- score values equal to 3 are preserved; -- text fields are set blank. - -Once a new feedback is created, users are notified by email and invited to [modify the feedback entry][2] as they see fit. - -**Rationale:** Feedback automation takes away some effort from a group of moderately satisfied users, -while prompting the users to express satisfaction/dissatisfaction. -We assume that moderately satisfied users (satisfaction value 3) do not require changes to the environment -and tend to remain moderately satisfied in time. -Further, we assume that satisfied users (values 4-5) develop in time towards moderately satisfied (value 3) -by getting accustomed to the provided standards. -The dissatisfied users (values 1-2) also develop towards moderately satisfied due to -gradual improvements implemented by the IT4I. - -## Request Tracker Feedback - -Please use the [user satisfaction and feedback][1] form to provide your overall view. -For acute, pressing issues and immediate contact, reach out for support via the [Request tracker portal][3] or [support\[at\]it4i.cz][4] email. - -Express your satisfaction with the solution of an individual [Request tracker][3] ticket by selecting **Feedback** menu on the ticket form. - -## Evaluation - -The user feedback is evaluated 4 times a year, in the end of March, June, September, and December. -We consider the text comments, as well as evaluate the score average, distribution and trends. -This is done in summary as well as per individual category. - -[1]: https://scs.it4i.cz/feedbacks/new -[2]: https://scs.it4i.cz/feedbacks/ -[3]: https://support.it4i.cz/rt -[4]: mailto:support@it4i.cz diff --git a/content/docs/general/hyperqueue.mdx b/content/docs/general/hyperqueue.mdx deleted file mode 100644 index 95841cfa31a880cacafd1f514883df77bead5281..0000000000000000000000000000000000000000 --- a/content/docs/general/hyperqueue.mdx +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "HyperQueue" ---- -HyperQueue lets you build a computation plan consisting of a large amount of tasks and then execute it transparently over a system like SLURM/PBS. -It dynamically groups tasks into Slurm jobs and distributes them to fully utilize allocated nodes. -You thus do not have to manually aggregate your tasks into Slurm jobs. - -Find more about HyperQueue in its [documentation][a]. - - - -## Features - -* **Transparent task execution on top of a Slurm/PBS cluster** - - * Automatic task distribution amongst jobs, nodes, and cores - * Automatic submission of PBS/Slurm jobs - -* **Dynamic load balancing across jobs** - - * Work-stealing scheduler - * NUMA-aware, core planning, task priorities, task arrays - * Nodes and tasks may be added/removed on the fly - -* **Scalable** - - * Low overhead per task (~100ÎĽs) - * Handles hundreds of nodes and millions of tasks - * Output streaming avoids creating many files on network filesystems - -* **Easy deployment** - - * Single binary, no installation, depends only on *libc* - * No elevated privileges required - -## Installation - -* On Barbora and Karolina, you can simply load the HyperQueue module: - - ```console - $ ml HyperQueue - ``` - -* If you want to install/compile HyperQueue manually, follow the steps on the [official webpage][b]. - -## Usage - -### Starting the Server - -To use HyperQueue, you first have to start the HyperQueue server. It is a long-lived process that -is supposed to be running on a login node. You can start it with the following command: - -```console -$ hq server start -``` - -### Submitting Computation - -Once the HyperQueue server is running, you can submit jobs into it. Here are a few examples of job submissions. -You can find more information in the [documentation][1]. - -* Submit a simple job (command `echo 'Hello world'` in this case) - - ```console - $ hq submit echo 'Hello world' - ``` - -* Submit a job with 10000 tasks - - ```console - $ hq submit --array 1-10000 my-script.sh - ``` - -Once you start some jobs, you can observe their status using the following commands: - -```console -# Display status of a single job -$ hq job <job-id> - -# Display status of all jobs -$ hq jobs -``` - -<Callout type=warn> - Before the jobs can start executing, you have to provide HyperQueue with some computational resources. -</Callout> - -### Providing Computational Resources - -Before HyperQueue can execute your jobs, it needs to have access to some computational resources. -You can provide these by starting HyperQueue *workers* which connect to the server and execute your jobs. -The workers should run on computing nodes, therefore they should be started inside Slurm jobs. - -There are two ways of providing computational resources. - -* **Allocate Slurm jobs automatically** - - HyperQueue can automatically submit Slurm jobs with workers on your behalf. This system is called - [automatic allocation][c]. After the server is started, you can add a new automatic allocation - queue using the `hq alloc add` command: - - ```console - $ hq alloc add slurm -- -A<PROJECT-ID> -p qcpu_exp - ``` - - After you run this command, HQ will automatically start submitting Slurm jobs on your behalf - once some HQ jobs are submitted. - -* **Manually start Slurm jobs with HQ workers** - - With the following command, you can submit a Slurm job that will start a single HQ worker which - will connect to a running HQ server. - - ```console - $ salloc <salloc-params> -- /bin/bash -l -c "$(which hq) worker start" - ``` - -<Callout> - For debugging purposes, you can also start the worker e.g. on a login node, simply by running - `$ hq worker start`. Do not use such worker for any long-running computations though! -</Callout> - -## Architecture - -Here you can see the architecture of HyperQueue. -The user submits jobs into the server which schedules them onto a set of workers running on compute nodes. - - - -[1]: https://it4innovations.github.io/hyperqueue/stable/jobs/jobs/ - -[a]: https://it4innovations.github.io/hyperqueue/stable/ -[b]: https://it4innovations.github.io/hyperqueue/stable/installation/ -[c]: https://it4innovations.github.io/hyperqueue/stable/deployment/allocation/ diff --git a/content/docs/general/job-arrays.mdx b/content/docs/general/job-arrays.mdx deleted file mode 100644 index ae79310231ebd615ce222f6accae340bfc166b4d..0000000000000000000000000000000000000000 --- a/content/docs/general/job-arrays.mdx +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: "Job Arrays" ---- -<Callout type=warn> - This page has not been updated yet. The page does not reflect the transition from PBS to Slurm. -A job array is a compact representation of many jobs called subjobs. Subjobs share the same job script, and have the same values for all attributes and resources, with the following exceptions: - -* each subjob has a unique index, $PBS_ARRAY_INDEX -* job Identifiers of subjobs only differ by their indices -* the state of subjobs can differ (R, Q, etc.) -</Callout> - -All subjobs within a job array have the same scheduling priority and schedule as independent jobs. An entire job array is submitted through a single `qsub` command and may be managed by `qdel`, `qalter`, `qhold`, `qrls`, and `qsig` commands as a single job. - -## Shared Jobscript - -All subjobs in a job array use the very same single jobscript. Each subjob runs its own instance of the jobscript. The instances execute different work controlled by the `$PBS_ARRAY_INDEX` variable. - -Example: - -Assume we have 900 input files with the name of each beginning with "file" (e.g. file001, ..., file900). Assume we would like to use each of these input files with myprog.x program executable, each as a separate job. - -First, we create a tasklist file (or subjobs list), listing all tasks (subjobs) - all input files in our example: - -```console -$ find . -name 'file*' > tasklist -``` - -Then we create a jobscript: - -```bash -#!/bin/bash -#PBS -A OPEN-00-00 -#PBS -q qprod -#PBS -l select=1,walltime=02:00:00 - -# change to scratch directory -SCRDIR=/scratch/project/${PBS_ACCOUNT,,}/${USER}/${PBS_JOBID} -mkdir -p $SCRDIR -cd $SCRDIR || exit - -# get individual tasks from tasklist with index from PBS JOB ARRAY -TASK=$(sed -n "${PBS_ARRAY_INDEX}p" $PBS_O_WORKDIR/tasklist) - -# copy input file and executable to scratch -cp $PBS_O_WORKDIR/$TASK input -cp $PBS_O_WORKDIR/myprog.x . - -# execute the calculation -./myprog.x < input > output - -# copy output file to submit directory -cp output $PBS_O_WORKDIR/$TASK.out -``` - -In this example, the submit directory contains the 900 input files, the myprog.x executable, and the jobscript file. As an input for each run, we take the filename of the input file from the created tasklist file. We copy the input file to the local scratch memory `/lscratch/$PBS_JOBID`, execute the myprog.x and copy the output file back to the submit directory, under the `$TASK.out` name. The myprog.x executable runs on one node only and must use threads to run in parallel. Be aware, that if the myprog.x **is not multithreaded**, then all the **jobs are run as single-thread programs in a sequential manner**. Due to the allocation of the whole node, the accounted time is equal to the usage of the whole node, while using only 1/16 of the node. - -If running a huge number of parallel multicore (in means of multinode multithread, e.g. MPI enabled) jobs is needed, then a job array approach should be used. The main difference, as compared to the previous examples using one node, is that the local scratch memory should not be used (as it is not shared between nodes) and MPI or other techniques for parallel multinode processing has to be used properly. - -## Submiting Job Array - -To submit the job array, use the `qsub -J` command. The 900 jobs of the [example above][3] may be submitted like this: - -```console -$ qsub -N JOBNAME -J 1-900 jobscript -506493[].isrv5 -``` - -In this example, we submit a job array of 900 subjobs. Each subjob will run on one full node and is assumed to take less than 2 hours (note the #PBS directives in the beginning of the jobscript file, do not forget to set your valid PROJECT_ID and desired queue). - -Sometimes for testing purposes, you may need to submit a one-element only array. This is not allowed by PBSPro, but there is a workaround: - -```console -$ qsub -N JOBNAME -J 9-10:2 jobscript -``` - -This will only choose the lower index (9 in this example) for submitting/running your job. - -## Managing Job Array - -Check status of the job array using the `qstat` command. - -```console -$ qstat -a 12345[].dm2 - -dm2: - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -12345[].dm2 user2 qprod xx 13516 1 16 -- 00:50 B 00:02 -``` - -When the status is B, it means that some subjobs are already running. -Check the status of the first 100 subjobs using the `qstat` command. - -```console -$ qstat -a 12345[1-100].dm2 - -dm2: - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -12345[1].dm2 user2 qprod xx 13516 1 16 -- 00:50 R 00:02 -12345[2].dm2 user2 qprod xx 13516 1 16 -- 00:50 R 00:02 -12345[3].dm2 user2 qprod xx 13516 1 16 -- 00:50 R 00:01 -12345[4].dm2 user2 qprod xx 13516 1 16 -- 00:50 Q -- - . . . . . . . . . . . - , . . . . . . . . . . -12345[100].dm2 user2 qprod xx 13516 1 16 -- 00:50 Q -- -``` - -Delete the entire job array. Running subjobs will be killed, queueing subjobs will be deleted. - -```console -$ qdel 12345[].dm2 -``` - -Deleting large job arrays may take a while. -Display status information for all user's jobs, job arrays, and subjobs. - -```console -$ qstat -u $USER -t -``` - -Display status information for all user's subjobs. - -```console -$ qstat -u $USER -tJ -``` - -For more information on job arrays, see the [PBSPro Users guide][1]. - -## Examples - -Download the examples in [capacity.zip][2], illustrating the above listed ways to run a huge number of jobs. We recommend trying out the examples before using this for running production jobs. - -Unzip the archive in an empty directory on cluster and follow the instructions in the README file- - -```console -$ unzip capacity.zip -$ cat README -``` - -[1]: ../pbspro.md -[2]: capacity.zip -[3]: #shared-jobscript diff --git a/content/docs/general/job-priority.mdx b/content/docs/general/job-priority.mdx deleted file mode 100644 index a6f12cfc5369e170504582f9709a503d56e6f153..0000000000000000000000000000000000000000 --- a/content/docs/general/job-priority.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Job Scheduling" ---- -## Job Priority - -The scheduler gives each job a priority and then uses this job priority to select which job(s) to run. - -Job priority is determined by these job properties (in order of importance): - -1. queue priority -1. fair-share priority -1. job age/eligible time - -### Queue Priority - -Queue priority is the priority of the queue in which the job is waiting prior to execution. - -Queue priority has the biggest impact on job priority. The priority of jobs in higher priority queues is always greater than the priority of jobs in lower priority queues. Other properties of jobs used for determining the job priority (fair-share priority, eligible time) cannot compete with queue priority. - -Queue priorities can be seen [here][a]. - -### Fair-Share Priority - -Fair-share priority is calculated based on recent usage of resources. Fair-share priority is calculated per project, i.e. all members of a project share the same fair-share priority. Projects with higher recent usage have a lower fair-share priority than projects with lower or no recent usage. - -Fair-share priority is used for ranking jobs with equal queue priority. - -Usage decays, halving at intervals of 7 days. - -### Job Age/Eligible Time - -The job age factor represents the length of time a job has been sitting in the queue and eligible to run. - -Job age has the least impact on priority. - -### Formula - -Job priority is calculated as: - ----8<--- "job_sort_formula.md" - -### Job Backfilling - -The scheduler uses job backfilling. - -Backfilling means fitting smaller jobs around the higher-priority jobs that the scheduler is going to run next, in such a way that the higher-priority jobs are not delayed. Backfilling allows us to keep resources from becoming idle when the top job (the job with the highest priority) cannot run. - -The scheduler makes a list of jobs to run in order of priority. The scheduler looks for smaller jobs that can fit into the usage gaps around the highest-priority jobs in the list. The scheduler looks in the prioritized list of jobs and chooses the highest-priority smaller jobs that fit. Filler jobs are run only if they will not delay the start time of top jobs. - -This means that jobs with lower priority can be run before jobs with higher priority. - -<Callout> - It is **very beneficial to specify the timelimit** when submitting jobs. -<Callout> - -Specifying more accurate timelimit enables better scheduling, better times, and better resource usage. Jobs with suitable (small) timelimit can be backfilled - and overtake job(s) with a higher priority. - ----8<--- "mathjax.md" - -## Technical Details - -Priorities are set using Slurm's [Multifactor Priority Plugin][1]. Current settings are as follows: - -``` -$ grep ^Priority /etc/slurm/slurm.conf -PriorityFlags=DEPTH_OBLIVIOUS -PriorityType=priority/multifactor -PriorityDecayHalfLife=7-0 -PriorityMaxAge=14-0 -PriorityWeightAge=100000 -PriorityWeightFairshare=10000000 -PriorityWeightPartition=1000000000 -``` - -## Inspecting Job Priority - -One can inspect job priority using `sprio` command. Job priority is in the field PRIORITY and it is comprised of PARTITION, FAIRSHARE and AGE priorities. - -``` -$ sprio -l -j 894782 - JOBID PARTITION USER ACCOUNT PRIORITY SITE AGE ASSOC FAIRSHARE JOBSIZE PARTITION QOSNAME QOS NICE TRES - 894782 qgpu user1 service 300026688 0 17 0 26671 0 300000000 normal 0 0 -``` - -[1]: https://slurm.schedmd.com/priority_multifactor.html - -[a]: https://extranet.it4i.cz/rsweb/karolina/queues diff --git a/content/docs/general/job-submission-and-execution.mdx b/content/docs/general/job-submission-and-execution.mdx deleted file mode 100644 index 0b2ece24a5fd4ed81ac4cf351af5729392cab585..0000000000000000000000000000000000000000 --- a/content/docs/general/job-submission-and-execution.mdx +++ /dev/null @@ -1,364 +0,0 @@ ---- -title: "Job Submission and Execution" ---- -<Callout type=warn> - Don't use the `#SBATCH --exclusive` parameter as it is already included in the SLURM configuration.<br><br> - Use the `#SBATCH --mem=` parameter **on `qfat` only**. On `cpu_` queues, whole nodes are allocated. - Accelerated nodes (`gpu_` queues) are divided each into eight parts with corresponding memory. -</Callout> - -## Introduction - -[Slurm][1] workload manager is used to allocate and access Karolina's, Barbora's and Complementary systems' resources. - -A `man` page exists for all Slurm commands, as well as the `--help` command option, -which provides a brief summary of options. -Slurm [documentation][c] and [man pages][d] are also available online. - -## Getting Partition Information - -Display partitions/queues on system: - -```console -$ sinfo -s -PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST -qcpu* up 2-00:00:00 1/191/0/192 cn[1-192] -qcpu_biz up 2-00:00:00 1/191/0/192 cn[1-192] -qcpu_exp up 1:00:00 1/191/0/192 cn[1-192] -qcpu_free up 18:00:00 1/191/0/192 cn[1-192] -qcpu_long up 6-00:00:00 1/191/0/192 cn[1-192] -qcpu_preempt up 12:00:00 1/191/0/192 cn[1-192] -qgpu up 2-00:00:00 0/8/0/8 cn[193-200] -qgpu_biz up 2-00:00:00 0/8/0/8 cn[193-200] -qgpu_exp up 1:00:00 0/8/0/8 cn[193-200] -qgpu_free up 18:00:00 0/8/0/8 cn[193-200] -qgpu_preempt up 12:00:00 0/8/0/8 cn[193-200] -qfat up 2-00:00:00 0/1/0/1 cn201 -qdgx up 2-00:00:00 0/1/0/1 cn202 -qviz up 8:00:00 0/2/0/2 vizserv[1-2] -``` - -`NODES(A/I/O/T)` column summarizes node count per state, where the `A/I/O/T` stands for `allocated/idle/other/total`. -Example output is from Barbora cluster. - -Graphical representation of clusters' usage, partitions, nodes, and jobs could be found - -* for Karolina at [https://extranet.it4i.cz/rsweb/karolina][5] -* for Barbora at [https://extranet.it4i.cz/rsweb/barbora][4] -* for Complementary Systems at [https://extranet.it4i.cz/rsweb/compsys][6] - -On Karolina cluster - -* all cpu queues/partitions provide full node allocation, whole nodes are allocated to job -* other queues/partitions (gpu, fat, viz) provide partial node allocation - -See [Karolina Slurm Specifics][7] for details. - -On Barbora cluster, all queues/partitions provide full node allocation, whole nodes are allocated to job. - -On Complementary systems, only some queues/partitions provide full node allocation, -see [Complementary systems documentation][2] for details. - -## Running Interactive Jobs - -Sometimes you may want to run your job interactively, for example for debugging, -running your commands one by one from the command line. - -Run interactive job - queue `qcpu_exp`, one node by default, one task by default: - -```console -$ salloc -A PROJECT-ID -p qcpu_exp -``` - -Run interactive job on four nodes, 128 tasks per node (Karolina cluster, CPU partition recommended value based on node core count), -two hours time limit: - -```console -$ salloc -A PROJECT-ID -p qcpu -N 4 --ntasks-per-node 128 -t 2:00:00 -``` - -Run interactive job, with X11 forwarding: - -```console -$ salloc -A PROJECT-ID -p qcpu_exp --x11 -``` - -To finish the interactive job, use the Ctrl+D (`^D`) control sequence. - -<Callout type=warn> - Do not use `srun` for initiating interactive jobs, subsequent `srun`, `mpirun` invocations would block forever. -</Callout> - -## Running Batch Jobs - -Batch jobs is the standard way of running jobs and utilizing HPC clusters. - -### Job Script - -Create example job script called script.sh with the following content: - -```shell -#!/usr/bin/bash -#SBATCH --job-name MyJobName -#SBATCH --account PROJECT-ID -#SBATCH --partition qcpu -#SBATCH --nodes 4 -#SBATCH --ntasks-per-node 128 -#SBATCH --time 12:00:00 - -ml purge -ml OpenMPI/4.1.4-GCC-11.3.0 - -srun hostname | sort | uniq -c -``` - -Script will: - -* use bash shell interpreter -* use `MyJobName` as job name -* use project `PROJECT-ID` for job access and accounting -* use partition/queue `qcpu` -* use `4` nodes -* use `128` tasks per node - value used by MPI -* set job time limit to `12` hours - -* load appropriate module -* run command, `srun` serves as Slurm's native way of executing MPI-enabled applications, `hostname` is used in the example just for sake of simplicity - -<Callout> - Use `#SBATCH --exclude=<node_name_list>` directive to exclude specific nodes from your job, e.g.: `#SBATCH --exclude=cn001,cn002,cn003`. -</Callout> - -Submit directory will be used as working directory for submitted job, -so there is no need to change directory in the job script. -Alternatively you can specify job working directory using the sbatch `--chdir` (or shortly `-D`) option. - -### Srun Over mpirun - -While `mpirun` can be used to run parallel jobs on our Slurm-managed clusters, we recommend using `srun` for better integration with Slurm's scheduling and resource management. `srun` ensures more efficient job execution and resource control by leveraging Slurm’s features directly, and it simplifies the process by reducing the need for additional configurations often required with `mpirun`. - -### Job Submit - -Submit batch job: - -```console -$ cd my_work_dir -$ sbatch script.sh -``` - -A path to `script.sh` (relative or absolute) should be given -if the job script is in a different location than the job working directory. - -By default, job output is stored in a file called `slurm-JOBID.out` and contains both job standard output and error output. -This can be changed using the sbatch options `--output` (shortly `-o`) and `--error` (shortly `-e`). - -Example output of the job: - -```shell - 128 cn017.karolina.it4i.cz - 128 cn018.karolina.it4i.cz - 128 cn019.karolina.it4i.cz - 128 cn020.karolina.it4i.cz -``` - -### Job Environment Variables - -Slurm provides useful information to the job via environment variables. -Environment variables are available on all nodes allocated to job when accessed via Slurm supported means (`srun`, compatible `mpirun`). - -See all Slurm variables - -``` -$ set | grep ^SLURM -``` - -Commonly used variables are: - -| variable name | description | example | -| ------ | ------ | ------ | -| SLURM_JOB_ID | job id of the executing job| 593 | -| SLURM_JOB_NODELIST | nodes allocated to the job | cn[101-102] | -| SLURM_JOB_NUM_NODES | number of nodes allocated to the job | 2 | -| SLURM_STEP_NODELIST | nodes allocated to the job step | cn101 | -| SLURM_STEP_NUM_NODES | number of nodes allocated to the job step | 1 | -| SLURM_JOB_PARTITION | name of the partition | qcpu | -| SLURM_SUBMIT_DIR | submit directory | /scratch/project/open-xx-yy/work | - -See relevant [Slurm documentation][3] for details. - -Get job nodelist: - -``` -$ echo $SLURM_JOB_NODELIST -cn[101-102] -``` - -Expand nodelist to list of nodes: - -``` -$ scontrol show hostnames -cn101 -cn102 -``` - -## Job Management - -### Getting Job Information - -Show all jobs on system: - -```console -$ squeue -``` - -Show my jobs: - -```console -$ squeue --me - JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) - 104 qcpu interact user R 1:48 2 cn[101-102] -``` - -Show job details for a specific job: - -```console -$ scontrol show job JOBID -``` - -Show job details for executing job from job session: - -```console -$ scontrol show job $SLURM_JOBID -``` - -Show my jobs using a long output format which includes time limit: - -```console -$ squeue --me -l -``` - -Show my jobs in running state: - -```console -$ squeue --me -t running -``` - -Show my jobs in pending state: - -```console -$ squeue --me -t pending -``` - -Show jobs for a given project: - -```console -$ squeue -A PROJECT-ID -``` - -### Job States - -The most common job states are (in alphabetical order): - -| Code | Job State | Explanation | -| :--: | :------------ | :------------------------------------------------------------------------------------------------------------- | -| CA | CANCELLED | Job was explicitly cancelled by the user or system administrator. The job may or may not have been initiated. | -| CD | COMPLETED | Job has terminated all processes on all nodes with an exit code of zero. | -| CG | COMPLETING | Job is in the process of completing. Some processes on some nodes may still be active. | -| F | FAILED | Job terminated with non-zero exit code or other failure condition. | -| NF | NODE_FAIL | Job terminated due to failure of one or more allocated nodes. | -| OOM | OUT_OF_MEMORY | Job experienced out of memory error. | -| PD | PENDING | Job is awaiting resource allocation. | -| PR | PREEMPTED | Job terminated due to preemption. | -| R | RUNNING | Job currently has an allocation. | -| RQ | REQUEUED | Completing job is being requeued. | -| SI | SIGNALING | Job is being signaled. | -| TO | TIMEOUT | Job terminated upon reaching its time limit. | - -### Modifying Jobs - -In general: - -``` -$ scontrol update JobId=JOBID ATTR=VALUE -``` - -Modify job's time limit: - -``` -$ scontrol update JobId=JOBID timelimit=4:00:00 -``` - -Set/modify job's comment: - -``` -$ scontrol update JobId=JOBID Comment='The best job ever' -``` - -### Deleting Jobs - -Delete a job by job ID: - -``` -$ scancel JOBID -``` - -Delete all my jobs: - -``` -$ scancel --me -``` - -Delete all my jobs in interactive mode, confirming every action: - -``` -$ scancel --me -i -``` - -Delete all my running jobs: - -``` -$ scancel --me -t running -``` - -Delete all my pending jobs: - -``` -$ scancel --me -t pending -``` - -Delete all my pending jobs for a project PROJECT-ID: - -``` -$ scancel --me -t pending -A PROJECT-ID -``` - -## Troubleshooting - -### Invalid Account - -`sbatch: error: Batch job submission failed: Invalid account or account/partition combination specified` - -Possible causes: - -* Invalid account (i.e. project) was specified in job submission. -* User does not have access to given account/project. -* Given account/project does not have access to given partition. -* Access to given partition was retracted due to the project's allocation exhaustion. - -[1]: https://slurm.schedmd.com/ -[2]: /cs/job-scheduling/#partitions -[3]: https://slurm.schedmd.com/srun.html#SECTION_OUTPUT-ENVIRONMENT-VARIABLES -[4]: https://extranet.it4i.cz/rsweb/barbora -[5]: https://extranet.it4i.cz/rsweb/karolina -[6]: https://extranet.it4i.cz/rsweb/compsys -[7]: /general/karolina-slurm - -[a]: https://slurm.schedmd.com/ -[b]: http://slurmlearning.deic.dk/ -[c]: https://slurm.schedmd.com/documentation.html -[d]: https://slurm.schedmd.com/man_index.html -[e]: https://slurm.schedmd.com/sinfo.html -[f]: https://slurm.schedmd.com/squeue.html -[g]: https://slurm.schedmd.com/scancel.html -[h]: https://slurm.schedmd.com/scontrol.html -[i]: https://slurm.schedmd.com/job_array.html diff --git a/content/docs/general/karolina-mpi.mdx b/content/docs/general/karolina-mpi.mdx deleted file mode 100644 index bb10541ebf5a89d0b8c37c276a29d67b13f0978b..0000000000000000000000000000000000000000 --- a/content/docs/general/karolina-mpi.mdx +++ /dev/null @@ -1,434 +0,0 @@ ---- -title: "Parallel Runs Setting on Karolina" ---- -<Callout type=warn> - This page has not been updated yet. The page does not reflect the transition from PBS to Slurm. -Important aspect of each parallel application is correct placement of MPI processes -or threads to available hardware resources. -Since incorrect settings can cause significant degradation of performance, -all users should be familiar with basic principles explained below. -</Callout> - -At the beginning, a basic [hardware overview][1] is provided, -since it influences settings of `mpirun` command. -Then placement is explained for major MPI implementations [Intel MPI][2] and [OpenMPI][3]. -The last section describes an appropriate placement for [memory bound][4] and [compute bound][5] applications. - -## Hardware Overview - -[Karolina][6] contains several types of nodes. -This documentation contains description of basic hardware structure of universal and accelerated nodes. -More technical details can be found in [this presentation][a]. - -### Universal Nodes - -- 720 x 2 x AMD 7H12, 64 cores, 2,6 GHz - -<table> - <tr> - <td rowspan="8">universal<br/>node</td> - <td rowspan="4">socket 0<br/> AMD 7H12</td> - <td>NUMA 0</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 1</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 2</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 3</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td rowspan="4">socket 1<br/> AMD 7H12</td> - <td>NUMA 4</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 5</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 6</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> - <tr> - <td>NUMA 7</td> - <td>2 x ch DDR4-3200</td> - <td>4 x 16MB L3</td> - <td>16 cores (4 cores / L3)</td> - </tr> -</table> - -### Accelerated Nodes - -- 72 x 2 x AMD 7763, 64 cores, 2,45 GHz -- 72 x 8 x NVIDIA A100 GPU - -<table> - <tr> - <td rowspan="8">accelerated<br/>node</td> - <td rowspan="4">socket 0<br/> AMD 7763</td> - <td>NUMA 0</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td></td> - </tr> - <tr> - <td>NUMA 1</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td>2 x A100 </td> - </tr> - <tr> - <td>NUMA 2</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td></td> - </tr> - <tr> - <td>NUMA 3</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td>2 x A100 </td> - </tr> - <tr> - <td rowspan="4">socket 1<br/> AMD 7763</td> - <td>NUMA 4</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td></td> - </tr> - <tr> - <td>NUMA 5</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td>2 x A100 </td> - </tr> - <tr> - <td>NUMA 6</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td></td> - </tr> - <tr> - <td>NUMA 7</td> - <td>2 x ch DDR4-3200</td> - <td>2 x 32MB L3</td> - <td>16 cores (8 cores / L3)</td> - <td>2 x A100 </td> - </tr> -</table> - -## Assigning Processes / Threads to Particular Hardware - -When an application is started, the operating system maps MPI processes and threads to particular cores. -This mapping is not fixed as the system is allowed to move your application to other cores. -Inappropriate mapping or frequent moving can lead to significant degradation -of performance of your application. -Hence, a user should: - -- set **mapping** according to their application needs; -- **pin** the application to particular hardware resources. - -Settings can be described by environment variables that are briefly described on [HPC wiki][b]. -However, the mapping and pining is highly non-portable. -It is dependent on a particular system and used MPI library. -The following sections describe settings for the Karolina cluster. - -The number of MPI processes per node should be set by PBS via the [`qsub`][7] command. -Mapping and pinning are set for [Intel MPI](#intel-mpi) and [Open MPI](#open-mpi) differently. - -## Open MPI - -In the case of Open MPI, mapping can be set by the parameter `--map-by`. -Pinning can be set by the parameter `--bind-to`. -The list of all available options can be found [here](https://www-lb.open-mpi.org/doc/v4.1/man1/mpirun.1.php#sect6). - -The most relevant options are: - -- bind-to: core, l3cache, numa, socket -- map-by: core, l3cache, numa, socket, slot - -Mapping and pinning to, for example, L3 cache can be set by the `mpirun` command in the following way: - -``` -mpirun -n 32 --map-by l3cache --bind-to l3cache ./app -``` - -Both parameters can be also set by environment variables: - -``` -export OMPI_MCA_rmaps_base_mapping_policy=l3cache -export OMPI_MCA_hwloc_base_binding_policy=l3cache -mpirun -n 32 ./app -``` - -## Intel MPI - -In the case of Intel MPI, mapping and pinning can be set by environment variables -that are described [on Intel's Developer Reference][c]. -The most important variable is `I_MPI_PIN_DOMAIN`. -It denotes the number of cores allocated for each MPI process -and specifies both mapping and pinning. - -Default setting is `I_MPI_PIN_DOMAIN=auto:compact`. -It computes the number of cores allocated to each MPI process -from the number of available cores and requested number of MPI processes -(total cores / requested MPI processes). -It is usually the optimal settings and majority applications can be run -with the simple `mpirun -n N ./app` command, where `N` denotes the number of MPI processes. - -### Examples of Placement to Different Hardware - -Let us have a job allocated by the following `qsub`: - -```console -qsub -lselect=2,nprocs=128,mpiprocs=4,ompthreads=4 -``` - -Then the following table shows placement of `app` started -with 8 MPI processes on the universal node for various mapping and pining: - -<table style="text-align: center"> - <tr> - <th style="text-align: center" colspan="2">Open MPI</th> - <th style="text-align: center">Intel MPI</th> - <th style="text-align: center">node</th> - <th style="text-align: center" colspan="4">0</th> - <th style="text-align: center" colspan="4">1</th> - </tr> - <tr> - <th style="text-align: center">map-by</th> - <th style="text-align: center">bind-to</th> - <th style="text-align: center">I_MPI_PIN_DOMAIN</th> - <th style="text-align: center">rank</th> - <th style="text-align: center">0</th> - <th style="text-align: center">1</th> - <th style="text-align: center">2</th> - <th style="text-align: center">3</th> - <th style="text-align: center">4</th> - <th style="text-align: center">5</th> - <th style="text-align: center">6</th> - <th style="text-align: center">7</th> - </tr> - <tr> - <td rowspan="3">socket</td> - <td rowspan="3">socket</td> - <td rowspan="3">socket</td> - <td>socket</td> - <td>0</td> - <td>1</td> - <td>0</td> - <td>1</td> - <td>0</td> - <td>1</td> - <td>0</td> - <td>1</td> - </tr> - <tr> - <td>numa</td> - <td>0-3</td> - <td>4-7</td> - <td>0-3</td> - <td>4-7</td> - <td>0-3</td> - <td>4-7</td> - <td>0-3</td> - <td>4-7</td> - </tr> - <tr> - <td>cores</td> - <td>0-63</td> - <td>64-127</td> - <td>0-63</td> - <td>64-127</td> - <td>0-63</td> - <td>64-127</td> - <td>0-63</td> - <td>64-127</td> - </tr> - <tr> - <td rowspan="3">numa</td> - <td rowspan="3">numa</td> - <td rowspan="3">numa</td> - <td>socket</td> - <td colspan="4">0</td> - <td colspan="4">0</td> - </tr> - <tr> - <td>numa</td> - <td>0</td> - <td>1</td> - <td>2</td> - <td>3</td> - <td>0</td> - <td>1</td> - <td>2</td> - <td>3</td> - </tr> - <tr> - <td>cores</td> - <td>0-15</td> - <td>16-31</td> - <td>32-47</td> - <td>48-63</td> - <td>0-15</td> - <td>16-31</td> - <td>32-47</td> - <td>48-63</td> - </tr> - <tr> - <td rowspan="3">l3cache</td> - <td rowspan="3">l3cache</td> - <td rowspan="3"><s>cache3</s></td> - <td>socket</td> - <td colspan="4">0</td> - <td colspan="4">0</td> - </tr> - <tr> - <td>numa</td> - <td colspan="4">0</td> - <td colspan="4">0</td> - </tr> - <tr> - <td>cores</td> - <td>0-3</td> - <td>4-7</td> - <td>8-11</td> - <td>12-15</td> - <td>0-3</td> - <td>4-7</td> - <td>8-11</td> - <td>12-15</td> - </tr> - <tr> - <td rowspan="3">slot:pe=32</td> - <td rowspan="3">core</td> - <td rowspan="3">32</td> - <td>socket</td> - <td colspan="2">0</td> - <td colspan="2">1</td> - <td colspan="2">0</td> - <td colspan="2">1</td> - </tr> - <tr> - <td>numa</td> - <td>0-1</td> - <td>2-3</td> - <td>4-5</td> - <td>6-7</td> - <td>0-1</td> - <td>2-3</td> - <td>4-5</td> - <td>6-7</td> - </tr> - <tr> - <td>cores</td> - <td>0-31</td> - <td>32-63</td> - <td>64-95</td> - <td>96-127</td> - <td>0-31</td> - <td>32-63</td> - <td>64-95</td> - <td>96-127</td> - </tr> -</table> - -We can see from the above table that mapping starts from the first node. -When the first node is fully occupied -(according to the number of MPI processes per node specified by `qsub`), -mapping continues to the second node, etc. - -We note that in the case of `--map-by numa` and `--map-by l3cache`, -the application is not spawned across whole node. -For utilization of a whole node, more MPI processes per node should be used. -In addition, `I_MPI_PIN_DOMAIN=cache3` maps processes incorrectly. - -The last mapping (`--map-by slot:pe=32` or `I_MPI_PIN_DOMAIN=32`) is the most general one. -In this way, a user can directly specify the number of cores for each MPI process -independently to a hardware specification. - -## Memory Bound Applications - -The performance of memory bound applications is dependent on throughput to the memory. -Hence, it is optimal to use the number of cores equal to the number of memory channels; -i.e., 16 cores per node (see the tables with the hardware description at the top of this document). -Running your memory bound application on more than 16 cores can cause lower performance. - -Two MPI processes to each NUMA domain must be assigned in order to fully utilize bandwidth to the memory. -It can be achieved by the following commands (for a single node): - -- Intel MPI: `mpirun -n 16 ./app` -- Open MPI: `mpirun -n 16 --map-by slot:pe=8 ./app` - -Intel MPI automatically puts MPI processes to each 8th core. -In the case of Open MPI, parameter `--map-by` must be used. -Required mapping can be achieved, for example by `--map-by slot:pe=8` -that maps MPI processes to each 8-th core (in the same way as Intel MPI). -This mapping also assures that each MPI process will be assigned to different L3 cache. - -## Compute Bound Applications - -For compute bound applications it is optimal to use as much cores as possible; i.e. 128 cores per node. -The following command can be used: - -- Intel MPI: `mpirun -n 128 ./app` -- Open MPI: `mpirun -n 128 --map-by core --bind-to core ./app` - -Pinning assures that operating system does not migrate MPI processes among cores. - -## Finding Optimal Setting for Your Application - -Sometimes it is not clear what the best settings for your application is. -In that case, you should test your application with a different number of MPI processes. -A good practice is to test your application with 16-128 MPI per node -and measure the time required to finish the computation. - -With Intel MPI, it is enough to start your application with a required number of MPI processes. -For Open MPI, you can specify mapping in the following way: - -``` -mpirun -n 16 --map-by slot:pe=8 --bind-to core ./app -mpirun -n 32 --map-by slot:pe=4 --bind-to core ./app -mpirun -n 64 --map-by slot:pe=2 --bind-to core ./app -mpirun -n 128 --map-by core --bind-to core ./app -``` - -[1]: #hardware-overview -[2]: #intel-mpi -[3]: #open-mpi -[4]: #memory-bound-applications -[5]: #compute-bound-applications -[6]: ../karolina/introduction.md -[7]: job-submission-and-execution.md - -[a]: https://events.it4i.cz/event/123/attachments/417/1578/Technical%20features%20and%20the%20use%20of%20Karolina%20GPU%20accelerated%20partition.pdf -[b]: https://hpc-wiki.info/hpc/Binding/Pinning -[c]: https://www.intel.com/content/www/us/en/develop/documentation/mpi-developer-reference-linux/top/environment-variable-reference.html diff --git a/content/docs/general/karolina-partitions.mdx b/content/docs/general/karolina-partitions.mdx deleted file mode 100644 index 69549b89314433121bac3c92fe7170cc8715140e..0000000000000000000000000000000000000000 --- a/content/docs/general/karolina-partitions.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Karolina Partitions" ---- -<Callout type=warn> - Active [project membership][1] is required to run jobs. -<Callout> - -Below is the list of partitions available on the Karolina cluster: - -| Partition | Project resources | Nodes | Min ncpus | Priority | Authorization | Walltime (def/max) | -| ---------------- | -------------------- | --------------------------------------------------------- | ----------- | -------- | ------------- | ------------------ | -| **qcpu** | > 0 | 720 | 128 | 2 | no | 24 / 48h | -| **qcpu_biz** | > 0 | 720 | 128 | 3 | no | 24 / 48h | -| **qcpu_exp** | < 150% of allocation | 720<br>max 2 per user | 128 | 4 | no | 1 / 1h | -| **qcpu_free** | < 150% of allocation | 720<br>max 4 per job | 128 | 1 | no | 12 / 18h | -| **qcpu_long** | > 0 | 200<br>max 20 per job, only non-accelerated nodes allowed | 128 | 2 | no | 72 / 144h | -| **qcpu_preempt** | active Karolina<br> CPU alloc. | 720<br>max 4 per job | 128 | 0 | no | 12 / 12h | -| **qgpu** | > 0 | 72<br>max 16 per job | 16<br>1 gpu | 3 | yes | 24 / 48h | -| **qgpu_big** | > 0 | 72<br>max 64 per job | 128 | 2 | yes | 12 / 12h | -| **qgpu_biz** | > 0 | 72<br>max 16 per job | 128 | 4 | yes | 24 / 48h | -| **qgpu_exp** | < 150% of allocation | 4<br>max 1 per job | 16<br>1 gpu | 5 | no | 1 / 1h | -| **qgpu_free** | < 150% of allocation | 46<br>max 2 per job | 16<br>1 gpu | 1 | no | 12 / 18h | -| **qgpu_preempt** | active Karolina<br> GPU alloc. | 72<br>max 2 per job | 16<br>1 gpu | 0 | no | 12 / 12h | -| **qviz** | > 0 | 2 with NVIDIA® Quadro RTX™ 6000 | 8 | 2 | no | 1 / 8h | -| **qfat** | > 0 | 1 (sdf1) | 24 | 2 | yes | 24 / 48h | - -[1]: access/project-access.md diff --git a/content/docs/general/karolina-slurm.mdx b/content/docs/general/karolina-slurm.mdx deleted file mode 100644 index 31558b3deb32d5f858a44f59b51f416ec8067a7c..0000000000000000000000000000000000000000 --- a/content/docs/general/karolina-slurm.mdx +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: "Karolina - Job Submission and Execution" ---- -## Introduction - -[Slurm][1] workload manager is used to allocate and access Karolina cluster's resources. -This page describes Karolina cluster's specific Slurm settings and usage. -General information about Slurm usage at IT4Innovations can be found at [Slurm Job Submission and Execution][2]. - -## Partition Information - -Partitions/queues on the system: - -```console -$ sinfo -s -PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST -qcpu* up 2-00:00:00 1/717/0/718 cn[001-718] -qcpu_biz up 2-00:00:00 1/717/0/718 cn[001-718] -qcpu_exp up 1:00:00 1/719/0/720 cn[001-720] -qcpu_free up 18:00:00 1/717/0/718 cn[001-718] -qcpu_long up 6-00:00:00 1/717/0/718 cn[001-718] -qcpu_preempt up 12:00:00 1/717/0/718 cn[001-718] -qgpu up 2-00:00:00 0/70/0/70 acn[01-70] -qgpu_big up 12:00:00 71/1/0/72 acn[01-72] -qgpu_biz up 2-00:00:00 0/70/0/70 acn[01-70] -qgpu_exp up 1:00:00 0/72/0/72 acn[01-72] -qgpu_free up 18:00:00 0/70/0/70 acn[01-70] -qgpu_preempt up 12:00:00 0/70/0/70 acn[01-70] -qfat up 2-00:00:00 0/1/0/1 sdf1 -qviz up 8:00:00 0/2/0/2 viz[1-2] -``` - -For more information about Karolina's queues, see [this page][8]. - -Graphical representation of cluster usage, partitions, nodes, and jobs could be found -at [https://extranet.it4i.cz/rsweb/karolina][3] - -On Karolina cluster - -* all CPU queues/partitions provide full node allocation, whole nodes (all node resources) are allocated to a job. -* other queues/partitions (gpu, fat, viz) provide partial node allocation. Jobs' resources (cpu, mem) are separated and dedicated for job. - -<Callout> - Division of nodes means that if two users allocate a portion of the same node, they can see each other's running processes. - If this solution is inconvenient for you, consider allocating a whole node. -</Callout> - -## Using CPU Queues - -Access [standard compute nodes][4]. -Whole nodes are allocated. Use the `--nodes` option to specify the number of requested nodes. -There is no need to specify the number of cores and memory size. - -```console -#!/usr/bin/bash -#SBATCH --job-name MyJobName -#SBATCH --account PROJECT-ID -#SBATCH --partition qcpu -#SBATCH --time 12:00:00 -#SBATCH --nodes 8 -... -``` - -## Using GPU Queues - -<Callout type=warn> - Because we are still in the process of fine-tuning and setting optimal parameters for SLURM, - we have temporarily limited the maximum number of nodes per job on `qgpu` and `qgpu_biz` to **16**. -</Callout> - -Access [GPU accelerated nodes][5]. -Every GPU accelerated node is divided into eight parts, each part contains one GPU, 16 CPU cores and corresponding memory. -By default, only one part, i.e. 1/8 of the node - one GPU and corresponding CPU cores and memory, is allocated. -There is no need to specify the number of cores and memory size, on the contrary, it is undesirable. -There are employed some restrictions which aim to provide fair division and efficient use of node resources. - -```console -#!/usr/bin/bash -#SBATCH --job-name MyJobName -#SBATCH --account PROJECT-ID -#SBATCH --partition qgpu -#SBATCH --time 12:00:00 -... -``` - -To allocate more GPUs use `--gpus` option. -The default behavior is to allocate enough nodes to satisfy the requested resources as expressed by `--gpus` option and without delaying the initiation of the job. - -The following code requests four GPUs; scheduler can allocate from one up to four nodes depending on the actual cluster state (i.e. GPU availability) to fulfil the request. - -```console -#SBATCH --gpus 4 -``` - -The following code requests 16 GPUs; scheduler can allocate from two up to sixteen nodes depending on the actual cluster state (i.e. GPU availability) to fulfil the request. - -```console -#SBATCH --gpus 16 -``` - -To allocate GPUs within one node you have to specify the `--nodes` option. - -The following code requests four GPUs on exactly one node - -```console -#SBATCH --gpus 4 -#SBATCH --nodes 1 -``` - -The following code requests 16 GPUs on exactly two nodes. - -```console -#SBATCH --gpus 16 -#SBATCH --nodes 2 -``` - -Alternatively, you can use the `--gpus-per-node` option. -Only value 8 is allowed for multi-node allocation to prevent fragmenting nodes. - -The following code requests 16 GPUs on exactly two nodes. - -```console -#SBATCH --gpus-per-node 8 -#SBATCH --nodes 2 -``` - -## Using Fat Queue - -Access [data analytics aka fat node][6]. -Fat node is divided into 32 parts, each part contains one socket/processor (24 cores) and corresponding memory. -By default, only one part, i.e. 1/32 of the node - one processor and corresponding memory, is allocated. - -To allocate requested memory use the `--mem` option. -Corresponding CPUs will be allocated. -Fat node has about 22.5TB of memory available for jobs. - -```console -#!/usr/bin/bash -#SBATCH --job-name MyJobName -#SBATCH --account PROJECT-ID -#SBATCH --partition qfat -#SBATCH --time 2:00:00 -#SBATCH --mem 6TB -... -``` - -You can also specify CPU-oriented options (like `--cpus-per-task`), then appropriate memory will be allocated to the job. - -To allocate a whole fat node, use the `--exclusive` option - -```console -#SBATCH --exclusive -``` - -## Using Viz Queue - -Access [visualization nodes][7]. -Every visualization node is divided into eight parts. -By default, only one part, i.e. 1/8 of the node, is allocated. - -```console -$ salloc -A PROJECT-ID -p qviz -``` - -To allocate a whole visualisation node, use the `--exclusive` option - -```console -$ salloc -A PROJECT-ID -p qviz --exclusive -``` - -[1]: https://slurm.schedmd.com/ -[2]: /general/slurm-job-submission-and-execution -[3]: https://extranet.it4i.cz/rsweb/karolina -[4]: /karolina/compute-nodes/#compute-nodes-without-accelerators -[5]: /karolina/compute-nodes/#compute-nodes-with-a-gpu-accelerator -[6]: /karolina/compute-nodes/#data-analytics-compute-node -[7]: /karolina/visualization/ -[8]: ./karolina-partitions.md diff --git a/content/docs/general/management/einfracz-profile.mdx b/content/docs/general/management/einfracz-profile.mdx deleted file mode 100644 index d858e12068d637b87ab2569907bc9ec4fd9fbc21..0000000000000000000000000000000000000000 --- a/content/docs/general/management/einfracz-profile.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Change e-INFRA CZ Profile Settings" ---- -To change the settings of your e-INFRA CZ profile go to:<br>[https://profile.e-infra.cz/][1] - -## Change Password - -To change your e-INFRA CZ account password, go to:<br>[https://profile.e-infra.cz/profile/settings/passwordReset][2] - -## Change SSH Key - -To change SSH key(s) associated with your e-INFRA CZ account, go to:<br>[https://profile.e-infra.cz/profile/settings/sshKeys][3] - -[1]: https://profile.e-infra.cz/profile -[2]: https://profile.e-infra.cz/profile/settings/passwordReset -[3]: https://profile.e-infra.cz/profile/settings/sshKeys diff --git a/content/docs/general/management/it4i-profile.mdx b/content/docs/general/management/it4i-profile.mdx deleted file mode 100644 index 9b3f33fd125c5e86a475a7412250f89cec9d9d6b..0000000000000000000000000000000000000000 --- a/content/docs/general/management/it4i-profile.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Change IT4I Account Settings" ---- -## Change Password - -To change your IT4I account password, go to:<br>[https://extranet.it4i.cz/ssp/][2] - -## Change SSH Key - -To change SSH key(s) associated with your IT4I account, go to:<br>[https://extranet.it4i.cz/ssp/?action=changesshkey][3] - -[1]: https://scs.it4i.cz/ -[2]: https://extranet.it4i.cz/ssp/ -[3]: https://extranet.it4i.cz/ssp/?action=changesshkey diff --git a/content/docs/general/management/meta.json b/content/docs/general/management/meta.json deleted file mode 100644 index af7f90ded4b76577662e39a5840f8883e19cb91b..0000000000000000000000000000000000000000 --- a/content/docs/general/management/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Management", - "pages": [ - "einfracz-profile", - "it4i-profile" - ] -} diff --git a/content/docs/general/meta.json b/content/docs/general/meta.json deleted file mode 100644 index f5b1282973186d3a23c69c4f4cf712039bd13064..0000000000000000000000000000000000000000 --- a/content/docs/general/meta.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "title": "General", - "pages": [ - "access", - "accessing-the-clusters", - "applying-for-resources", - "aup", - "barbora-partitions", - "capacity-computing", - "energy", - "feedback", - "hyperqueue", - "job-arrays", - "job-priority", - "job-submission-and-execution", - "karolina-mpi", - "karolina-partitions", - "karolina-slurm", - "management", - "obtaining-login-credentials", - "pbs-job-submission-and-execution", - "resource-accounting", - "resource_allocation_and_job_execution", - "resources-allocation-policy", - "services-access", - "shell-and-data-access", - "slurm-batch-examples", - "slurm-job-submission-and-execution", - "support", - "tools" - ] -} diff --git a/content/docs/general/obtaining-login-credentials/certificates-faq.mdx b/content/docs/general/obtaining-login-credentials/certificates-faq.mdx deleted file mode 100644 index c69d552c8be6c79dbbfe304f912950737146e143..0000000000000000000000000000000000000000 --- a/content/docs/general/obtaining-login-credentials/certificates-faq.mdx +++ /dev/null @@ -1,176 +0,0 @@ ---- -title: "Certificates FAQ" ---- -FAQ about certificates in general. - -## Q: What Are Certificates? - -IT4Innovations employs X.509 certificates for secure communication (e.g. credentials exchange) and for grid services related to PRACE, as they present a single method of authentication for all PRACE services, where only one password is required. - -There are different kinds of certificates, each with a different scope of use. We mention here: - -* User (Private) certificates -* Certificate Authority (CA) certificates -* Host certificates -* Service certificates - -However, users only need to manage User and CA certificates. Note that your user certificate is protected by an associated private key, and this **private key must never be disclosed**. - -## Q: Which X.509 Certificates Are Recognized by IT4Innovations? - -See the [Certificates for Digital Signatures][1] section. - -## Q: How Do I Get a User Certificate That Can Be Used With IT4Innovations? - -To get a certificate, you must make a request to your local, IGTF approved Certificate Authority (CA). Then, you must usually visit, in person, your nearest Registration Authority (RA) to verify your affiliation and identity (photo identification is required). Usually, you will then be emailed details on how to retrieve your certificate, although procedures can vary between CAs. If you are in Europe, you can locate [your trusted CA][a]. - -In some countries, certificates can also be retrieved using the TERENA Certificate Service, see the FAQ below for the link. - -## Q: Does IT4Innovations Support Short Lived Certificates (SLCS)? - -Yes, if the CA which provides this service is also a member of IGTF. - -## Q: Does IT4Innovations Support the TERENA Certificate Service? - - Yes, IT4Innovations supports TERENA eScience personal certificates. For more information, visit [TCS - Trusted Certificate Service][b], where you can also find if your organization/country can use this service. - -## Q: What Format Should My Certificate Take? - -User Certificates come in many formats, the three most common being the ’PKCS12’, ’PEM’, and JKS formats. - -The PKCS12 (often abbreviated to ’p12’) format stores your user certificate, along with your associated private key, in a single file. This form of your certificate is typically employed by web browsers, mail clients, and grid services like UNICORE, DART, gsissh-term, and Globus toolkit (GSI-SSH, GridFTP, and GRAM5). - -The PEM format (`*`.pem) stores your user certificate and your associated private key in two separate files. This form of your certificate can be used by PRACE’s gsissh-term and with the grid related services like Globus toolkit (GSI-SSH, GridFTP, and GRAM5). - -To convert your Certificate from PEM to p12 formats and _vice versa_, IT4Innovations recommends using the OpenSSL tool (see the [separate FAQ entry][2]). - -JKS is the Java KeyStore and may contain both your personal certificate with your private key and a list of your trusted CA certificates. This form of your certificate can be used by grid services like DART and UNICORE6. - -To convert your certificate from p12 to JKS, IT4Innovations recommends using the keytool utility (see the [separate FAQ entry][3]). - -## Q: What Are CA Certificates? - -Certification Authority (CA) certificates are used to verify the link between your user certificate and the issuing authority. They are also used to verify the link between the host certificate of an IT4Innovations server and the CA that issued the certificate. In essence, they establish a chain of trust between you and the target server. Thus, for some grid services, users must have a copy of all the CA certificates. - -To assist users, SURFsara (a member of PRACE) provides a complete and up-to-date bundle of all the CA certificates that any PRACE user (or IT4Innovations grid services user) will require. Bundle of certificates, in either p12, PEM, or JKS formats, are [available here][c]. - -It is worth noting that gsissh-term and DART automatically update their CA certificates from this SURFsara website. In other cases, if you receive a warning that a server’s certificate cannot be validated (not trusted), update your CA certificates via the SURFsara website. If this fails, contact the IT4Innovations helpdesk. - -Lastly, if you need the CA certificates for a personal Globus 5 installation, you can install the CA certificates from a MyProxy server with the following command: - -```console - myproxy-get-trustroots -s myproxy-prace.lrz.de -``` - -If you run this command as `root`, it will install the certificates into /etc/grid-security/certificates. Otherwise, the certificates will be installed into $HOME/.globus/certificates. For Globus, you can download the globuscerts.tar.gz packet [available here][c]. - -## Q: What Is a DN and How Do I Find Mine? - -DN stands for Distinguished Name and is a part of your user certificate. IT4Innovations needs to know your DN to enable your account to use the grid services. You may use OpenSSL (see [below][2]) to determine your DN or, if your browser contains your user certificate, you can extract your DN from your browser. - -For Internet Explorer users, the DN is referred to as the "subject" of your certificate. ToolsInternet OptionsContentCertificatesViewDetailsSubject. - -For users running Firefox under Windows, the DN is referred to as the "subject" of your certificate. ToolsOptionsAdvancedEncryptionView Certificates. Highlight your name and then click ViewDetailsSubject. - -## Q: How Do I Use the Openssl Tool? - -The following examples are for Unix/Linux operating systems only. - -To convert from PEM to p12, enter the following command: - -```console - openssl pkcs12 -export -in usercert.pem -inkey userkey.pem -out - username.p12 -``` - -To convert from p12 to PEM, type the following _four_ commands: - -```console - openssl pkcs12 -in username.p12 -out usercert.pem -clcerts -nokeys - openssl pkcs12 -in username.p12 -out userkey.pem -nocerts - chmod 444 usercert.pem - chmod 400 userkey.pem -``` - -To check your Distinguished Name (DN), enter the following command: - -```console - openssl x509 -in usercert.pem -noout -subject -nameopt - RFC2253 -``` - -To check your certificate (e.g. DN, validity, issuer, public key algorithm, etc.), enter the following command: - -```console - openssl x509 -in usercert.pem -text -noout -``` - -To download OpenSSL if not pre-installed, see [here][d]. On Macintosh Mac OS X computers, OpenSSL is already pre-installed and can be used immediately. - -## Q: How Do I Create and Then Manage a Keystore? - -IT4innovations recommends the Java-based keytool utility to create and manage keystores, which themselves are stores of keys and certificates. For example if you want to convert your pkcs12 formatted key pair into a Java keystore you can use the following command: - -```console - keytool -importkeystore -srckeystore $my_p12_cert -destkeystore - $my_keystore -srcstoretype pkcs12 -deststoretype jks -alias - $my_nickname -destalias $my_nickname -``` - -where `$my_p12_cert` is the name of your p12 (pkcs12) certificate, `$my_keystore` is the name that you give to your new java keystore and `$my_nickname` is the alias name that the p12 certificate was given and is also used for the new keystore. - -You can also import CA certificates into your Java keystore with the tool, for exmaple: - -```console - keytool -import -trustcacerts -alias $mydomain -file $mydomain.crt -keystore $my_keystore -``` - -where `$mydomain.crt` is the certificate of a trusted signing authority (CA) and `$mydomain` is the alias name that you give to the entry. - -More information on the tool can be found [here][e]. - -## Q: How Do I Use My Certificate to Access Different Grid Services? - -Most grid services require the use of your certificate; however, the format of your certificate depends on the grid Service you wish to employ. - -If employing the PRACE version of GSISSH-term (also a Java Web Start Application), you may use either the PEM or p12 formats. Note that this service automatically installs up-to-date PRACE CA certificates. - -If the grid service is UNICORE, then you bind your certificate, in either the p12 format or JKS, to UNICORE during the installation of the client on your local machine. - -If the grid service is a part of Globus (e.g. GSI-SSH, GriFTP, or GRAM5), the certificates can be in either p12 or PEM format and must reside in the "$HOME/.globus" directory for Linux and Mac users or %HOMEPATH%.globus for Windows users. (Windows users will have to use the DOS command `cmd` to create a directory which starts with a ’.’). Further, user certificates should be named either "usercred.p12" or "usercert.pem" and "userkey.pem", and the CA certificates must be kept in a pre-specified directory as follows. For Linux and Mac users, this directory is either $HOME/.globus/certificates or /etc/grid-security/certificates. For Windows users, this directory is %HOMEPATH%.globuscertificates. (If you are using GSISSH-Term from prace-ri.eu, you do not have to create the .globus directory nor install CA certificates to use this tool alone). - -## Q: How Do I Manually Import My Certificate Into My Browser? - -In Firefox, you can import your certificate by first choosing the "Preferences" window. For Windows, this is ToolsOptions. For Linux, this is EditPreferences. For Mac, this is FirefoxPreferences. Then choose the "Advanced" button, followed by the "Encryption" tab. Then choose the "Certificates" panel, select the "Select one automatically" option if you have only one certificate, or "Ask me every time" if you have more than one. Then, click on the "View Certificates" button to open the "Certificate Manager" window. You can then select the "Your Certificates" tab and click on the "Import" button. Then locate the PKCS12 (.p12) certificate you wish to import and employ its associated password. - -If you are a Safari user, then simply open the "Keychain Access" application and follow "FileImport items". - -If you are an Internet Explorer user, click Start > Settings > Control Panel and then double-click on Internet. On the Content tab, click Personal and then click Import. Type your password in the Password field. You may be prompted multiple times for your password. In the "Certificate File To Import" box, type the filename of the certificate you wish to import, and then click OK. Click Close, and then click OK. - -## Q: What Is a Proxy Certificate? - -A proxy certificate is a short-lived certificate, which may be employed by UNICORE and the Globus services. The proxy certificate consists of a new user certificate and a newly generated proxy private key. This proxy typically has a rather short lifetime (normally 12 hours) and often allows only a limited delegation of rights. Its default location for Unix/Linux, is /tmp/x509_u_uid_ but can be set via the `$X509_USER_PROXY` environment variable. - -## Q: What Is the MyProxy Service? - -[MyProxy Service][g] can be employed by gsissh-term and Globus tools and is an online repository that allows users to store long-lived proxy certificates remotely, which can then be retrieved for later use. Each proxy is protected by a password provided by the user at the time of storage. This is beneficial to Globus users, as they do not have to carry their private keys and certificates when travelling; nor do users have to install private keys and certificates on possibly insecure computers. - -## Q: Someone May Have Copied or Had Access to the Private Key of My Certificate Either in a Separate File or in the Browser. What Should I Do? - -Please ask the Certificate Authority that issued your certificate to revoke this certificate and to supply you with a new one. In addition, report this to IT4Innovations by contacting [the support team][h]. - -## Q: My Certificate Expired. What Should I Do? - -In order to still be able to communicate with us, make a request for a new certificate to your CA. There is no need to explicitly send us any information about your new certificate if a new one has the same Distinguished Name (DN) as the old one. - -[1]: obtaining-login-credentials.md#certificates-for-digital-signatures -[2]: #q-how-do-i-use-the-openssl-tool -[3]: #q-how-do-i-create-and-then-manage-a-keystore - -[a]: https://www.eugridpma.org/members/worldmap/ -[b]: https://tcs-escience-portal.terena.org/ -[c]: https://winnetou.surfsara.nl/prace/certs/ -[d]: https://www.openssl.org/source/ -[e]: http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html -[g]: http://grid.ncsa.illinois.edu/myproxy/ -[h]: https://support.it4i.cz/rt diff --git a/content/docs/general/obtaining-login-credentials/meta.json b/content/docs/general/obtaining-login-credentials/meta.json deleted file mode 100644 index 90b45a1d5ceb737b43de26bc260303e6ef95fada..0000000000000000000000000000000000000000 --- a/content/docs/general/obtaining-login-credentials/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Obtaining-login-credentials", - "pages": [ - "certificates-faq", - "obtaining-login-credentials" - ] -} diff --git a/content/docs/general/obtaining-login-credentials/obtaining-login-credentials.mdx b/content/docs/general/obtaining-login-credentials/obtaining-login-credentials.mdx deleted file mode 100644 index 9824cd9ae3a83e69fcff7bc932fc01e8ea77abce..0000000000000000000000000000000000000000 --- a/content/docs/general/obtaining-login-credentials/obtaining-login-credentials.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "IT4I Account" ---- -<Callout type=warn> - If you are affiliated with an academic institution from the Czech Republic ([eduID.cz][u]), create an [e-INFRA CZ account][8], instead. -</Callout> - -If you are not eligible for an e-INFRA CZ account, contact the [IT4I support][a] (email: [support\[at\]it4i.cz][b]) and provide the following information: - -1. Personal information (**required**, note that without this information, you cannot use IT4I resources): - 1. **Full name** - 1. **Gender** - 1. **Citizenship** - 1. **Country of residence** - 1. **Organization/affiliation** - 1. **Organization/affiliation country** - 1. **Organization/affiliation type** (university, company, R&D institution, private/public sector (hospital, police), academy of sciences, etc.) - 1. **Job title** (student, PhD student, researcher, research assistant, employee, etc.) -1. Statement that you have read and accepted the [Acceptable use policy document][c] (AUP) -1. Attach the AUP file -1. Your preferred username (length is limited between 4 and 7 letters)<br>The preferred username must associate with your first and last name or be otherwise derived from it. Note that the system will automatically add the `it4i-` prefix to your username. -1. Public part of your SSH key<br>If you don't provide it in the ticket, you must [add it manually][s] after your account is created. -1. All information above should be provided by email that is **digitally signed by a CA authority**. Read more on [digital signatures][4] below. If you do not have such a digital signature, you can choose an [Alternative way to personal certificate][3]. - -Example (except the subject line, which must be in English, you may use Czech or Slovak language for communication with us): - -```console -Subject: Access to IT4Innovations - -Dear support, - -Please open the user account for me and attach the account to OPEN-0-0 -Personal information: John Smith, USA, Department of Chemistry, MIT, MA, US -I have read and accept the Acceptable use policy document (attached) - -Preferred username: johnsm - -Thank you, -John Smith -(Digitally signed) -``` - -You will receive your personal login credentials in an encrypted email. The login credentials include: - -1. username -1. system password - -The clusters are accessed by the [private key][5] and username. Username and password are used for login to the [information systems][d]. - -## Certificates for Digital Signatures - -We accept personal certificates issued by any widely respected certification authority (CA). This includes certificates by CAs organized in [International Grid Trust Federation][f], its European branch [EUGridPMA][g] and its member organizations, e.g. the [CESNET certification authority][h]. The Czech _"Qualified certificate" (KvalifikovanĂ˝ certifikát)_ provided by [PostSignum][i] or [I.CA][j], which is used in electronic contact with Czech authorities, is accepted as well. **In general, we accept certificates issued by any trusted CA that ensures unambiguous identification of the user.** - -Certificate generation process for academic purposes, utilizing the CESNET certification authority, is well described here: - -* [How to generate a personal TCS certificate in Mozilla Firefox ESR web browser.][k] (in Czech) - -<Callout> - The certificate file can be installed into your email client. Web-based email interfaces cannot be used for secure communication, external application, such as Thunderbird or Outlook must be used. This way, your new credentials will be visible only in applications that have access to your certificate. -<Callout> - -If you are not able to obtain the certificate from any of the respected certification authorities, follow the Alternative Way below. - -FAQ about certificates can be found here: [Certificates FAQ][7]. - -## Alternative Way to Personal Certificate - -<Callout type=warn> - Choose this alternative **only** if you cannot obtain your certificate in a standard way. - Note that in this case **you must attach a scan of your photo ID** (personal ID, passport, or driver's license) when applying for login credentials. -</Callout> - -An alternative to personal certificate is an S/MIME certificate allowing secure email communication, -e.g. providing sensitive information such as ID scan or user login/password. - -The following example is for Actalis free S/MIME certificate, but you can choose your preferred CA. - -1. Go to the [Actalis Free Email Certificate][l] request form. -1. Follow the instructions: fill out the form, accept the terms and conditions, and submit the request. -1. You will receive an email with the certificate. -1. Import the certificate to one of the supported email clients. -1. Attach a scan of photo ID (personal ID, passport, or driver license) to your email request for IT4I account. - -<Callout> - Web-based email interfaces cannot be used for secure communication; external application, such as Thunderbird or Outlook must be used. This way, your new credentials will be visible only in applications that have access to your certificate. -</Callout> - -[1]: ./obtaining-login-credentials.md#certificates-for-digital-signatures -[2]: #authorization-by-web -[3]: #alternative-way-to-personal-certificate -[4]: #certificates-for-digital-signatures -[5]: ../accessing-the-clusters/shell-access-and-data-transfer/ssh-keys.md -[6]: ../accessing-the-clusters/shell-access-and-data-transfer/putty.md#putty-key-generator -[7]: ../obtaining-login-credentials/certificates-faq.md -[8]: ../access/einfracz-account.md -[10]: ../access/project-access.md - -[a]: https://support.it4i.cz/rt/ -[b]: mailto:support@it4i.cz -[c]: https://docs.it4i.cz/general/aup/ -[d]: http://support.it4i.cz/ -[e]: https://scs.it4i.cz -[f]: http://www.igtf.net/ -[g]: https://www.eugridpma.org -[h]: https://tcs.cesnet.cz -[i]: http://www.postsignum.cz/ -[j]: http://www.ica.cz/Kvalifikovany-certifikat.aspx -[k]: http://idoc.vsb.cz/xwiki/wiki/infra/view/uzivatel/moz-cert-gen -[l]: https://extrassl.actalis.it/portal/uapub/freemail?lang=en -[r]: https://www.it4i.cz/computing-resources-allocation/?lang=en -[s]: https://extranet.it4i.cz/ssp/?action=changesshkey -[u]: https://www.eduid.cz/ diff --git a/content/docs/general/pbs-job-submission-and-execution.mdx b/content/docs/general/pbs-job-submission-and-execution.mdx deleted file mode 100644 index d2c3b52aca43be4164f91eeeacb417b7e2b1cc03..0000000000000000000000000000000000000000 --- a/content/docs/general/pbs-job-submission-and-execution.mdx +++ /dev/null @@ -1,475 +0,0 @@ ---- -title: "Job Submission and Execution" ---- -<Callout type=warn> - This page has not been updated yet. The page does not reflect the transition from PBS to Slurm. -<\Callout> - -## Job Submission - -When allocating computational resources for the job, specify: - -1. a suitable queue for your job (the default is qprod) -1. the number of computational nodes (required) -1. the number of cores per node (not required) -1. the maximum wall time allocated to your calculation, note that jobs exceeding the maximum wall time will be killed -1. your Project ID -1. a Jobscript or interactive switch - -Submit the job using the `qsub` command: - -```console -$ qsub -A Project_ID -q queue -l select=x:ncpus=y,walltime=[[hh:]mm:]ss[.ms] jobscript -``` - -The `qsub` command submits the job to the queue, i.e. it creates a request to the PBS Job manager for allocation of specified resources. The resources will be allocated when available, subject to the above described policies and constraints. **After the resources are allocated, the jobscript or interactive shell is executed on the first of the allocated nodes.** - -<Callout> - `ncpus=y` is usually not required, because the smallest allocation unit is an entire node. The exception are corner cases for `qviz` and `qfat` on Karolina. -</Callout> - -### Job Submission Examples - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=64,walltime=03:00:00 ./myjob -``` - -In this example, we allocate 64 nodes, 36 cores per node, for 3 hours. We allocate these resources via the `qprod` queue, consumed resources will be accounted to the project identified by Project ID `OPEN-0-0`. The jobscript `myjob` will be executed on the first node in the allocation. - -```console -$ qsub -q qexp -l select=4 -I -``` - -In this example, we allocate 4 nodes, 36 cores per node, for 1 hour. We allocate these resources via the `qexp` queue. The resources will be available interactively. - -```console -$ qsub -A OPEN-0-0 -q qnvidia -l select=10 ./myjob -``` - -In this example, we allocate 10 NVIDIA accelerated nodes, 24 cores per node, for 24 hours. We allocate these resources via the `qnvidia` queue. The jobscript `myjob` will be executed on the first node in the allocation. - -```console -$ qsub -A OPEN-0-0 -q qfree -l select=10 ./myjob -``` - -In this example, we allocate 10 nodes, 24 cores per node, for 12 hours. We allocate these resources via the `qfree` queue. It is not required that the project `OPEN-0-0` has any available resources left. Consumed resources are still accounted for. The jobscript `myjob` will be executed on the first node in the allocation. - -All `qsub` options may be [saved directly into the jobscript][1]. In such cases, it is not necessary to specify any options for `qsub`. - -```console -$ qsub ./myjob -``` - -By default, the PBS batch system sends an email only when the job is aborted. Disabling mail events completely can be done as follows: - -```console -$ qsub -m n -``` - -#### Dependency Job Submission - -To submit dependent jobs in sequence, use the `depend` function of `qsub`. - -First submit the first job in a standard manner: - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=64,walltime=02:00:00 ./firstjob -123456[].isrv1 -``` - -Then submit the second job using the `depend` function: - -```console -$ qsub -W depend=afterok:123456 ./secondjob -``` - -Both jobs will be queued, but the second job won't start until the first job has finished successfully. - -Below is the list of arguments that can be used with `-W depend=dependency:jobid`: - -| Argument | Description | -| ----------- | --------------------------------------------------------------- | -| after | This job is scheduled after `jobid` begins execution. | -| afterok | This job is scheduled after `jobid` finishes successfully. | -| afternotok | This job is scheduled after `jobid` finishes unsucessfully. | -| afterany | This job is scheduled after `jobid` finishes in any state. | -| before | This job must begin execution before `jobid` is scheduled. | -| beforeok | This job must finish successfully before `jobid` begins. | -| beforenotok | This job must finish unsuccessfully before `jobid` begins. | -| beforeany | This job must finish in any state before `jobid` begins. | - -### Useful Tricks - -All `qsub` options may be [saved directly into the jobscript][1]. In such a case, no options to `qsub` are needed. - -```console -$ qsub ./myjob -``` - -By default, the PBS batch system sends an email only when the job is aborted. Disabling mail events completely can be done like this: - -```console -$ qsub -m n -``` - -<!--- NOT IMPLEMENTED ON KAROLINA YET - -## Advanced Job Placement - -### Salomon - Placement by Network Location - -The network location of allocated nodes in the [InfiniBand network][3] influences efficiency of network communication between nodes of job. Nodes on the same InfiniBand switch communicate faster with lower latency than distant nodes. To improve communication efficiency of jobs, PBS scheduler on Salomon is configured to allocate nodes (from currently available resources), which are as close as possible in the network topology. - -For communication intensive jobs, it is possible to set stricter requirement - to require nodes directly connected to the same InfiniBand switch or to require nodes located in the same dimension group of the InfiniBand network. - -### Salomon - Placement by InfiniBand Switch - -Nodes directly connected to the same InfiniBand switch can communicate most efficiently. Using the same switch prevents hops in the network and provides for unbiased, most efficient network communication. There are 9 nodes directly connected to every InfiniBand switch. - -<Callout> - We recommend allocating compute nodes of a single switch when the best possible computational network performance is required to run job efficiently. -</Callout> - -Nodes directly connected to the one InfiniBand switch can be allocated using node grouping on the PBS resource attribute `switch`. - -In this example, we request all 9 nodes directly connected to the same switch using node grouping placement. - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=9 -l place=group=switch ./myjob -``` - ---> - -## Advanced Job Handling - -### Selecting Turbo Boost Off - -<Callout> - For Barbora only. -</Callout> - -Intel Turbo Boost Technology is on by default. We strongly recommend keeping the default. - -If necessary (such as in the case of benchmarking), you can disable Turbo for all nodes of the job by using the PBS resource attribute `cpu_turbo_boost`: - -```console -$ qsub -A OPEN-0-0 -q qprod -l select=4 -l cpu_turbo_boost=0 -I -``` - -More information about the Intel Turbo Boost can be found in the TurboBoost section - -### Advanced Examples - -In the following example, we select an allocation for benchmarking a very special and demanding MPI program. We request Turbo off, and 2 full chassis of compute nodes (nodes sharing the same IB switches) for 30 minutes: - -```console -$ qsub -A OPEN-0-0 -q qprod - -l select=18:ibswitch=isw10:mpiprocs=1:ompthreads=16+18:ibswitch=isw20:mpiprocs=16:ompthreads=1 - -l cpu_turbo_boost=0,walltime=00:30:00 - -N Benchmark ./mybenchmark -``` - -The MPI processes will be distributed differently on the nodes connected to the two switches. On the isw10 nodes, we will run 1 MPI process per node with 16 threads per process, on isw20 nodes we will run 16 plain MPI processes. - -Although this example is somewhat artificial, it demonstrates the flexibility of the qsub command options. - -## Job Management - -<Callout> - Check the status of your jobs using the `qstat` and `check-pbs-jobs` commands -</Callout> - -```console -$ qstat -a -$ qstat -a -u username -$ qstat -an -u username -$ qstat -f 12345.srv11 -``` - -Example: - -```console -$ qstat -a - -srv11: - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -16287.srv11 user1 qlong job1 6183 4 64 -- 144:0 R 38:25 -16468.srv11 user1 qlong job2 8060 4 64 -- 144:0 R 17:44 -16547.srv11 user2 qprod job3x 13516 2 32 -- 48:00 R 00:58 -``` - -In this example user1 and user2 are running jobs named `job1`, `job2`, and `job3x`. `job1` and `job2` are using 4 nodes, 128 cores per node each. `job1` has already run for 38 hours and 25 minutes, and `job2` for 17 hours 44 minutes. So `job1`, for example, has already consumed `64 x 38.41 = 2,458.6` core-hours. `job3x` has already consumed `32 x 0.96 = 30.93` core-hours. These consumed core-hours will be [converted to node-hours][10] and accounted for on the respective project accounts, regardless of whether the allocated cores were actually used for computations. - -The following commands allow you to check the status of your jobs using the `check-pbs-jobs` command, check for the presence of user's PBS jobs' processes on execution hosts, display load and processes, display job standard and error output, and continuously display (`tail -f`) job standard or error output. - -```console -$ check-pbs-jobs --check-all -$ check-pbs-jobs --print-load --print-processes -$ check-pbs-jobs --print-job-out --print-job-err -$ check-pbs-jobs --jobid JOBID --check-all --print-all -$ check-pbs-jobs --jobid JOBID --tailf-job-out -``` - -Examples: - -```console -$ check-pbs-jobs --check-all -JOB 35141.dm2, session_id 71995, user user2, nodes cn164,cn165 -Check session id: OK -Check processes -cn164: OK -cn165: No process -``` - -In this example we see that job `35141.dm2` is not currently running any processes on the allocated node cn165, which may indicate an execution error: - -```console -$ check-pbs-jobs --print-load --print-processes -JOB 35141.dm2, session_id 71995, user user2, nodes cn164,cn165 -Print load -cn164: LOAD: 16.01, 16.01, 16.00 -cn165: LOAD: 0.01, 0.00, 0.01 -Print processes - %CPU CMD -cn164: 0.0 -bash -cn164: 0.0 /bin/bash /var/spool/PBS/mom_priv/jobs/35141.dm2.SC -cn164: 99.7 run-task -... -``` - -In this example, we see that job `35141.dm2` is currently running a process run-task on node `cn164`, using one thread only, while node `cn165` is empty, which may indicate an execution error. - -```console -$ check-pbs-jobs --jobid 35141.dm2 --print-job-out -JOB 35141.dm2, session_id 71995, user user2, nodes cn164,cn165 -Print job standard output: -======================== Job start ========================== -Started at : Fri Aug 30 02:47:53 CEST 2013 -Script name : script -Run loop 1 -Run loop 2 -Run loop 3 -``` - -In this example, we see the actual output (some iteration loops) of the job `35141.dm2`. - -<Callout> - Manage your queued or running jobs, using the `qhold`, `qrls`, `qdel`, `qsig`, or `qalter` commands -</Callout> - -You may release your allocation at any time, using the `qdel` command - -```console -$ qdel 12345.srv11 -``` - -You may kill a running job by force, using the `qsig` command - -```console -$ qsig -s 9 12345.srv11 -``` - -Learn more by reading the PBS man page - -```console -$ man pbs_professional -``` - -## Job Execution - -### Jobscript - -<Callout> - Prepare the jobscript to run batch jobs in the PBS queue system -</Callout> - -The Jobscript is a user made script controlling a sequence of commands for executing the calculation. It is often written in bash, though other scripts may be used as well. The jobscript is supplied to the PBS `qsub` command as an argument, and is executed by the PBS Professional workload manager. - -<Callout> - The jobscript or interactive shell is executed on first of the allocated nodes. -</Callout> - -```console -$ qsub -q qexp -l select=4 -N Name0 ./myjob -$ qstat -n -u username - -srv11: - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -15209.srv11 username qexp Name0 5530 4 128 -- 01:00 R 00:00 - cn17/0*32+cn108/0*32+cn109/0*32+cn110/0*32 -``` - -In this example, the nodes `cn17`, `cn108`, `cn109`, and `cn110` were allocated for 1 hour via the qexp queue. The `myjob` jobscript will be executed on the node `cn17`, while the nodes `cn108`, `cn109`, and `cn110` are available for use as well. - -The jobscript or interactive shell is by default executed in the `/home` directory: - -```console -$ qsub -q qexp -l select=4 -I -qsub: waiting for job 15210.srv11 to start -qsub: job 15210.srv11 ready - -$ pwd -/home/username -``` - -In this example, 4 nodes were allocated interactively for 1 hour via the `qexp` queue. The interactive shell is executed in the `/home` directory. - -<Callout> - All nodes within the allocation may be accessed via SSH. Unallocated nodes are not accessible to the user. -</Callout> - -The allocated nodes are accessible via SSH from login nodes. The nodes may access each other via SSH as well. - -Calculations on allocated nodes may be executed remotely via the MPI, SSH, pdsh, or clush. You may find out which nodes belong to the allocation by reading the `$PBS_NODEFILE` file - -```console -$ qsub -q qexp -l select=4 -I -qsub: waiting for job 15210.srv11 to start -qsub: job 15210.srv11 ready - -$ pwd -/home/username - -$ sort -u $PBS_NODEFILE -cn17.bullx -cn108.bullx -cn109.bullx -cn110.bullx - -$ pdsh -w cn17,cn[108-110] hostname -cn17: cn17 -cn108: cn108 -cn109: cn109 -cn110: cn110 -``` - -In this example, the hostname program is executed via `pdsh` from the interactive shell. The execution runs on all four allocated nodes. The same result would be achieved if the `pdsh` were called from any of the allocated nodes or from the login nodes. - -### Example Jobscript for MPI Calculation - -<Callout> - Production jobs must use the /scratch directory for I/O -</Callout> - -The recommended way to run production jobs is to change to the `/scratch` directory early in the jobscript, copy all inputs to `/scratch`, execute the calculations, and copy outputs to the `/home` directory. - -```bash -#!/bin/bash - -cd $PBS_O_WORKDIR - -SCRDIR=/scratch/project/open-00-00/${USER}/myjob -mkdir -p $SCRDIR - -# change to scratch directory, exit on failure -cd $SCRDIR || exit - -# copy input file to scratch -cp $PBS_O_WORKDIR/input . -cp $PBS_O_WORKDIR/mympiprog.x . - -# load the MPI module -# (Always specify the module's name and version in your script; -# for the reason, see https://docs.it4i.cz/software/modules/lmod/#loading-modules.) -ml OpenMPI/4.1.1-GCC-10.2.0-Java-1.8.0_221 - -# execute the calculation -mpirun -pernode ./mympiprog.x - -# copy output file to home -cp output $PBS_O_WORKDIR/. - -#exit -exit -``` - -In this example, a directory in `/home` holds the input file input and the `mympiprog.x` executable. We create the `myjob` directory on the `/scratch` filesystem, copy input and executable files from the `/home` directory where the `qsub` was invoked (`$PBS_O_WORKDIR`) to `/scratch`, execute the MPI program `mympiprog.x` and copy the output file back to the `/home` directory. `mympiprog.x` is executed as one process per node, on all allocated nodes. - -<Callout> - Consider preloading inputs and executables onto [shared scratch][6] memory before the calculation starts. -</Callout> - -In some cases, it may be impractical to copy the inputs to the `/scratch` memory and the outputs to the `/home` directory. This is especially true when very large input and output files are expected, or when the files should be reused by a subsequent calculation. In such cases, it is the users' responsibility to preload the input files on the shared `/scratch` memory before the job submission, and retrieve the outputs manually after all calculations are finished. - -<Callout> - Store the `qsub` options within the jobscript. Use the `mpiprocs` and `ompthreads` qsub options to control the MPI job execution. -</Callout> - -### Example Jobscript for MPI Calculation With Preloaded Inputs - -Example jobscript for an MPI job with preloaded inputs and executables, options for `qsub` are stored within the script: - -```bash -#!/bin/bash -#PBS -q qprod -#PBS -N MYJOB -#PBS -l select=100:mpiprocs=1:ompthreads=16 -#PBS -A OPEN-00-00 - -# job is run using project resources; here ${PBS_ACCOUNT,,} translates to "open-00-00" -SCRDIR=/scratch/project/${PBS_ACCOUNT,,}/${USER}/myjob - -# change to scratch directory, exit on failure -cd $SCRDIR || exit - -# load the MPI module -# (Always specify the module's name and version in your script; -# for the reason, see https://docs.it4i.cz/software/modules/lmod/#loading-modules.) -ml OpenMPI/4.1.1-GCC-10.2.0-Java-1.8.0_221 - -# execute the calculation -mpirun ./mympiprog.x - -#exit -exit -``` - -In this example, input and executable files are assumed to be preloaded manually in the `/scratch/project/open-00-00/$USER/myjob` directory. Because we used the `qprod` queue, we had to specify which project's resources we want to use, and our `PBS_ACCOUNT` variable will be set accordingly (OPEN-00-00). `${PBS_ACCOUNT,,}` uses one of the bash's built-in functions to translate it into lower case. - -Note the `mpiprocs` and `ompthreads` qsub options controlling the behavior of the MPI execution. `mympiprog.x` is executed as one process per node, on all 100 allocated nodes. If `mympiprog.x` implements OpenMP threads, it will run 16 threads per node. - -### Example Jobscript for Single Node Calculation - -<Callout> - The local scratch directory is often useful for single node jobs. Local scratch memory will be deleted immediately after the job ends. -</Callout> - -Example jobscript for single node calculation, using [local scratch][6] memory on the node: - -```bash -#!/bin/bash - -# change to local scratch directory -cd /lscratch/$PBS_JOBID || exit - -# copy input file to scratch -cp $PBS_O_WORKDIR/input . -cp $PBS_O_WORKDIR/myprog.x . - -# execute the calculation -./myprog.x - -# copy output file to home -cp output $PBS_O_WORKDIR/. - -#exit -exit -``` - -In this example, a directory in `/home` holds the input file input and the executable `myprog.x`. We copy input and executable files from the `/home` directory where the `qsub` was invoked (`$PBS_O_WORKDIR`) to the local `/scratch` memory `/lscratch/$PBS_JOBID`, execute `myprog.x` and copy the output file back to the `/home directory`. `myprog.x` runs on one node only and may use threads. - -### Other Jobscript Examples - -Further jobscript examples may be found in the software section and the [Capacity computing][9] section. - -[1]: #example-jobscript-for-mpi-calculation-with-preloaded-inputs -[2]: resources-allocation-policy.md -[3]: ../salomon/network.md -[5]: ../salomon/7d-enhanced-hypercube.md -[6]: ../salomon/storage.md -[9]: capacity-computing.md -[10]: resources-allocation-policy.md#resource-accounting-policy diff --git a/content/docs/general/resource-accounting.mdx b/content/docs/general/resource-accounting.mdx deleted file mode 100644 index af290c68984e4044da7eb9bd922cccf2339eb9d0..0000000000000000000000000000000000000000 --- a/content/docs/general/resource-accounting.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "Resource Accounting Policy" ---- -Starting with the 24<sup>th</sup> open access grant competition, -the accounting policy has been changed from [normalized core hours (NCH)][2a] to **node-hours (NH)**. -This means that it is now required to apply for node hours of the specific cluster and node type: - -1. [Barbora CPU][3a] -1. [Barbora GPU][4a] -1. [Barbora FAT][5a] -1. [DGX-2][6a] -1. [Karolina CPU][7a] -1. [Karolina GPU][8a] -1. [Karolina FAT][9a] - -The accounting runs whenever the nodes are allocated via the Slurm workload manager (the `sbatch`, `salloc` command), -regardless of whether the nodes are actually used for any calculation. -The same rule applies for unspent [reservations][10a]. - -## Resource Accounting Formula - -| Resources | NH Consumed | -| ------------------------------- | ---------------------------- | -| Barbora All types, Karolina CPU | allocated nodes \* time | -| Karolina GPU | allocated gpus \* time / 8 | -| Karolina FAT | allocated cpus \* time / 768 | -| Karolina VIZ | allocated cpus \* time / 64 | - -time: duration of the Slurm job in hours - -<Callout type=warn> - Minimal granularity of all Barbora's partitions and Karolina's CPU partition is 1 node. - This means that if you request, for example, 32 cores on Karolina's CPU partition, - your job will still consume 1 NH \* time. - - All other Karolina's partitions (GPU, FAT, VIZ) provide partial node allocation; - i.e.: if you request 4 GPUs on Karolina, you will consume only 0.5 NH \* time. -</Callout> - -[1a]: job-submission-and-execution.md -[2a]: #normalized-core-hours-nch -[3a]: ../../barbora/compute-nodes/#compute-nodes-without-accelerators -[4a]: ../../barbora/compute-nodes/#compute-nodes-with-a-gpu-accelerator -[5a]: ../../barbora/compute-nodes/#fat-compute-node -[6a]: ../../dgx2/introduction/ -[7a]: ../../karolina/compute-nodes/#compute-nodes-without-accelerators -[8a]: ../../karolina/compute-nodes/#compute-nodes-with-a-gpu-accelerator -[9a]: ../../karolina/compute-nodes/#data-analytics-compute-node -[10a]: resource_allocation_and_job_execution.md#resource-reservation diff --git a/content/docs/general/resource_allocation_and_job_execution.mdx b/content/docs/general/resource_allocation_and_job_execution.mdx deleted file mode 100644 index 5e4cabdc3d558addec0836c3047c95a20da65a8b..0000000000000000000000000000000000000000 --- a/content/docs/general/resource_allocation_and_job_execution.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "How to Run Jobs" ---- -## Job Submission and Execution - -To run a [job][1], computational resources for this particular job must be allocated. This is done via the [Slurm][a] job workload manager software, which distributes workloads across the supercomputer. - -The `sbatch` or `salloc` command creates a request to the Slurm job manager for allocation of specified resources. -The resources will be allocated when available, subject to allocation policies and constraints. -**After the resources are allocated, the jobscript or interactive shell is executed on first of the allocated nodes.** - -Read more on the [Job Submission and Execution][5] page. - -## Resource Allocation Policy - -Resources are allocated to the job in a fair-share fashion, subject to constraints set by the queue and resources available to the Project. [The Fair-share][3] ensures that individual users may consume approximately equal amount of resources per week. The resources are accessible via queues for queueing the jobs. The queues provide prioritized and exclusive access to the computational resources. - -<Callout> - See the queue status for [Karolina][d] or [Barbora][e]. -</Callout> - -Read more on the [Resource Allocation Policy][4] page. - -## Resource Reservation - -You can request a reservation of a specific number, range, or type of computational resources at [support@it4i.cz][c]. -Note that unspent reserved node-hours count towards the total computational resources used. - -[1]: ../index.md#terminology-frequently-used-on-these-pages -[2]: https://slurm.schedmd.com/documentation.html -[3]: job-priority.md#fair-share-priority -[4]: resources-allocation-policy.md -[5]: job-submission-and-execution.md - -[a]: https://slurm.schedmd.com/ -[b]: https://slurm.schedmd.com/documentation.html -[c]: mailto:support@it4i.cz -[d]: https://extranet.it4i.cz/rsweb/karolina/queues -[e]: https://extranet.it4i.cz/rsweb/barbora/queues diff --git a/content/docs/general/resources-allocation-policy.mdx b/content/docs/general/resources-allocation-policy.mdx deleted file mode 100644 index 1bc9e851056e45c57e8e2357b69ed352ada92520..0000000000000000000000000000000000000000 --- a/content/docs/general/resources-allocation-policy.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Resource Allocation Policy" ---- -## Job Queue Policies - -Resources are allocated to jobs in a fair-share fashion, -subject to constraints set by the queue and the resources available to the project. -The fair-share system ensures that individual users may consume approximately equal amounts of resources per week. -Detailed information can be found in the [Job scheduling][1] section. - -Resources are accessible via several queues for queueing the jobs. -Queues provide prioritized and exclusive access to the computational resources. - -Computational resources are subject to [accounting policy][7]. - -<Callout type=warn> - Queues are divided based on a resource type: `qcpu_` for non-accelerated nodes and `qgpu_` for accelerated nodes. <br><br> - EuroHPC queues are no longer available. If you are an EuroHPC user, use standard queues based on allocated/required type of resources. -</Callout> - -### Queues - -| <div style="width:86px">Queue</div>| Description | -| -------------------------------- | ----------- | -| `qcpu` | Production queue for non-accelerated nodes intended for standard production runs. Requires an active project with nonzero remaining resources. Full nodes are allocated. Identical to `qprod`. | -| `qgpu` | Dedicated queue for accessing the NVIDIA accelerated nodes. Requires an active project with nonzero remaining resources. It utilizes 8x NVIDIA A100 with 320GB HBM2 memory per node. The PI needs to explicitly ask support for authorization to enter the queue for all users associated with their project. **On Karolina, you can allocate 1/8 of the node - 1 GPU and 16 cores**. For more information, see [Karolina qgpu allocation][4]. | -| `qgpu_big` | Intended for big jobs (>16 nodes), queue priority is lower than production queue prority, **priority is temporarily increased every even weekend**. | -| `qcpu_biz`<br>`qgpu_biz` | Commercial queues, slightly higher priority. | -| `qcpu_exp`<br>`qgpu_exp` | Express queues for testing and running very small jobs. There are 2 nodes always reserved (w/o accelerators), max 8 nodes available per user. The nodes may be allocated on a per core basis. It is configured to run one job and accept five jobs in a queue per user. | -| `qcpu_free`<br>`qgpu_free` | Intended for utilization of free resources, after a project exhausted all its allocated resources. Note that the queue is **not free of charge**. [Normal accounting][2] applies. (Does not apply to DD projects by default. DD projects have to request for permission after exhaustion of computational resources.). Consumed resources will be accounted to the Project. Access to the queue is removed if consumed resources exceed 150% of the allocation. Full nodes are allocated. | -| `qcpu_long` | Queues for long production runs. Require an active project with nonzero remaining resources. Only 200 nodes without acceleration may be accessed. Full nodes are allocated. | -| `qcpu_preempt`<br>`qgpu_preempt` | Free queues with the lowest priority (LP). The queues require a project with allocation of the respective resource type. There is no limit on resource overdraft. Jobs are killed if other jobs with a higher priority (HP) request the nodes and there are no other nodes available. LP jobs are automatically re-queued once HP jobs finish, so **make sure your jobs are re-runnable**. | -| `qdgx` | Queue for DGX-2, accessible from Barbora. | -| `qfat` | Queue for fat node, PI must request authorization to enter the queue for all users associated to their project. | -| `qviz` | Visualization queue Intended for pre-/post-processing using OpenGL accelerated graphics. Each user gets 8 cores of a CPU allocated (approx. 64 GB of RAM and 1/8 of the GPU capacity (default "chunk")). If more GPU power or RAM is required, it is recommended to allocate more chunks (with 8 cores each) up to one whole node per user. This is currently also the maximum allowed allocation per one user. One hour of work is allocated by default, the user may ask for 2 hours maximum. | - -See the following subsections for the list of queues: - -* [Karolina queues][5] -* [Barbora queues][6] - -## Queue Notes - -The job time limit defaults to **half the maximum time**, see the table above. -Longer time limits can be [set manually, see examples][3]. - -Jobs that exceed the reserved time limit get killed automatically. -The time limit can be changed for queuing jobs (state Q) using the `scontrol modify job` command, -however it cannot be changed for a running job. - -## Queue Status - -<Callout> - Check the status of jobs, queues and compute nodes [here][c]. -</Callout> - - - -Display the queue status: - -```console -$ sinfo -s -``` - -The Slurm allocation overview may also be obtained using the `rsslurm` command: - -```console -$ rsslurm -Usage: rsslurm [options] - -Options: - --version show program's version number and exit - -h, --help show this help message and exit - --get-server-details Print server - --get-queues Print queues - --get-queues-details Print queues details - --get-reservations Print reservations - --get-reservations-details - Print reservations details - ... - .. - . -``` - ----8<--- "mathjax.md" - -[1]: job-priority.md -[2]: #resource-accounting-policy -[3]: job-submission-and-execution.md -[4]: karolina-slurm.md -[5]: ./karolina-partitions.md -[6]: ./barbora-partitions.md -[7]: ./resource-accounting.md - -[a]: https://support.it4i.cz/rt/ -[c]: https://extranet.it4i.cz/rsweb diff --git a/content/docs/general/services-access.mdx b/content/docs/general/services-access.mdx deleted file mode 100644 index 3f6016fbe433f970d65f09e765b676bcfc69c2ca..0000000000000000000000000000000000000000 --- a/content/docs/general/services-access.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Access to IT4I Services" ---- -Once you have created an e-INFRA CZ or an IT4I account, you can access the following IT4I services: - -## IT4Innovations Information System (SCS IS) - -SCS IS is a system where users can apply for a project membership and primary investigators can apply for a project -or manage their projects (e.g. accept/deny users' requests to become project members). -You can also submit a feedback on support services, etc. SCS IS is available on [https://scs.it4i.cz/][1]. - -## Request Tracker (RT) - -If you have a question or need help, you can contact our support on [https://support.it4i.cz/][2]. -Please note that first response to a new ticket may take up to 24 hours. - -## Cluster Usage Overview - -For information about the current clusters usage, go to [https://extranet.it4i.cz/rsweb][3]. -You can switch between the clusters by clicking on its name in the upper right corner. -You can filter your search by clicking on the respective keywords. - -[1]: https://scs.it4i.cz/ -[2]: https://support.it4i.cz/ -[3]: https://extranet.it4i.cz/rsweb diff --git a/content/docs/general/shell-and-data-access.mdx b/content/docs/general/shell-and-data-access.mdx deleted file mode 100644 index ca394d8d8e36a5c5f14d70077fadee05e16197b7..0000000000000000000000000000000000000000 --- a/content/docs/general/shell-and-data-access.mdx +++ /dev/null @@ -1,376 +0,0 @@ ---- -title: "Accessing the Clusters" ---- -## Shell Access - -All IT4Innovations clusters are accessed by the SSH protocol via login nodes at the address **cluster-name.it4i.cz**. The login nodes may be addressed specifically, by prepending the loginX node name to the address. - -<Callout> - Projects from the **EUROHPC** workgroup can only access the **Karolina** cluster. -</Callout> - -<Callout> - We accept only RSA or ED25519 keys for logging into our systems. -</Callout> - -### Karolina Cluster - -| Login address | Port | Protocol | Login node | -| ------------------------------- | ---- | -------- | ----------------------------------------- | -| karolina.it4i.cz | 22 | SSH | round-robin DNS record for login{1,2,3,4} | -| login{1,2,3,4}.karolina.it4i.cz | 22 | SSH | login{1,2,3,4} | - -### Barbora Cluster - -| Login address | Port | Protocol | Login node | -| ----------------------------- | ---- | -------- | ------------------------------------- | -| barbora.it4i.cz | 22 | SSH | round-robin DNS record for login{1,2} | -| login{1,2}.barbora.it4i.cz | 22 | SSH | login{1,2} | - -## Authentication - -Authentication is available by [private key][1] only. Verify SSH fingerprints during the first logon: - -### Karolina - -**Fingerprints** - -Fingerprints are identical for all login nodes. - -```console -# login{1,2,3,4}:22 SSH-2.0-OpenSSH_7.4 -2048 MD5:41:3a:40:32:da:08:77:51:79:04:af:53:e4:57:d0:7c (RSA) -2048 SHA256:Ip37d/bE6XwtWf3KnWA+sqA+zRGSFlf5vXai0v3MBmo (RSA) -256 MD5:e9:b6:8e:7d:f8:c6:8f:42:34:10:71:02:14:a6:7c:22 (ED25519) -256 SHA256:zKEtQMi2KRsxzzgo/sHcog+NFZqQ9tIyvJ7BVxOfzgI (ED25519) -``` - -**Public Keys \ Known Hosts** - -Public Keys \ Known Hosts are identical for all login nodes. - -```console -login1,login1.karolina.it4i.cz,login1.karolina,karolina.it4i.cz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9Cp8/a3F7eOPQvH4+HjC778XvYgRXWmCEOQnE3clPcKw15iIat3bvKc8ckYLudAzomipWy4VYdDI2OnEXay5ba8HqdREJO31qNBtW1AXgydCfPnkeuUZS4WVlAWM+HDlK6caB8KlvHoarCnNj2jvuYsMbARgGEq3vrk3xW4uiGpS6Y/uGVBBwMFWFaINbmXUrU1ysv/ZD1VpH4eHykkD9+8xivhhZtcz5Z2T7ZnIib4/m9zZZvjKs4ejOo58cKXGYVl27kLkfyOzU3cirYNQOrGqllN/52fATfrXKMcQor9onsbTkNNjMgPFZkddufxTrUaS7EM6xYsj8xrPJ2RaN -login1,login1.karolina.it4i.cz,login1.karolina,karolina.it4i.cz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkIdDODkUYRgMy1h6g/UtH34RnDCQkwwiJZFB0eEu1c -login2,login2.karolina.it4i.cz,login2.karolina,karolina.it4i.cz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9Cp8/a3F7eOPQvH4+HjC778XvYgRXWmCEOQnE3clPcKw15iIat3bvKc8ckYLudAzomipWy4VYdDI2OnEXay5ba8HqdREJO31qNBtW1AXgydCfPnkeuUZS4WVlAWM+HDlK6caB8KlvHoarCnNj2jvuYsMbARgGEq3vrk3xW4uiGpS6Y/uGVBBwMFWFaINbmXUrU1ysv/ZD1VpH4eHykkD9+8xivhhZtcz5Z2T7ZnIib4/m9zZZvjKs4ejOo58cKXGYVl27kLkfyOzU3cirYNQOrGqllN/52fATfrXKMcQor9onsbTkNNjMgPFZkddufxTrUaS7EM6xYsj8xrPJ2RaN -login2,login2.karolina.it4i.cz,login2.karolina,karolina.it4i.cz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkIdDODkUYRgMy1h6g/UtH34RnDCQkwwiJZFB0eEu1c -login3,login3.karolina.it4i.cz,login3.karolina,karolina.it4i.cz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9Cp8/a3F7eOPQvH4+HjC778XvYgRXWmCEOQnE3clPcKw15iIat3bvKc8ckYLudAzomipWy4VYdDI2OnEXay5ba8HqdREJO31qNBtW1AXgydCfPnkeuUZS4WVlAWM+HDlK6caB8KlvHoarCnNj2jvuYsMbARgGEq3vrk3xW4uiGpS6Y/uGVBBwMFWFaINbmXUrU1ysv/ZD1VpH4eHykkD9+8xivhhZtcz5Z2T7ZnIib4/m9zZZvjKs4ejOo58cKXGYVl27kLkfyOzU3cirYNQOrGqllN/52fATfrXKMcQor9onsbTkNNjMgPFZkddufxTrUaS7EM6xYsj8xrPJ2RaN -login3,login3.karolina.it4i.cz,login3.karolina,karolina.it4i.cz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkIdDODkUYRgMy1h6g/UtH34RnDCQkwwiJZFB0eEu1c -login4,login4.karolina.it4i.cz,login4.karolina,karolina.it4i.cz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9Cp8/a3F7eOPQvH4+HjC778XvYgRXWmCEOQnE3clPcKw15iIat3bvKc8ckYLudAzomipWy4VYdDI2OnEXay5ba8HqdREJO31qNBtW1AXgydCfPnkeuUZS4WVlAWM+HDlK6caB8KlvHoarCnNj2jvuYsMbARgGEq3vrk3xW4uiGpS6Y/uGVBBwMFWFaINbmXUrU1ysv/ZD1VpH4eHykkD9+8xivhhZtcz5Z2T7ZnIib4/m9zZZvjKs4ejOo58cKXGYVl27kLkfyOzU3cirYNQOrGqllN/52fATfrXKMcQor9onsbTkNNjMgPFZkddufxTrUaS7EM6xYsj8xrPJ2RaN -login4,login4.karolina.it4i.cz,login4.karolina,karolina.it4i.cz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkIdDODkUYRgMy1h6g/UtH34RnDCQkwwiJZFB0eEu1c - -``` - -### Barbora - -**Fingerprints** - -```console -md5: -39:55:e2:b9:2a:a2:c4:9e:b1:8e:f0:f7:b1:66:a8:73 (RSA) -40:67:03:26:d3:6c:a0:7f:0a:df:0e:e7:a0:52:cc:4e (ED25519) - -sha256: -TO5szOJf0bG7TWVLO3WABUpGKkP7nBm/RLyHmpoNpro (RSA) -ZQzFTJVDdZa3I0ics9ME2qz4v5a3QzXugvyVioaH6tI (ED25519) -``` - -**Public Keys \ Known Hosts** - -```console -barbora.it4i.cz, ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHUHvIrv7VUcGIcfsrcBjYfHpFBst8uhtJqfiYckfbeMRIdaodfjTO0pIXvd5wx+61a0C14zy1pdhvx6ykT5lwYkkn8l2tf+LRd6qN0alq/s+NGDJKpWGvdAGD3mM9AO1RmUPt+Vfg4VePQUZMu2PXZQu2C4TFFbaH2yiyCFlKz/Md9q+7NM+9U86uf3uLFbBu8mzkk2z3jyDGR6pjmpYTAiV/goUGpHgsW8Qx4GUdCreObQ6GUfPVOPvYaTlfXfteD9HluB7gwCWaUi5hevHhc+kK4xj61v64mGBOPmCobnAlr2RYQv6cDn7PHgI2mE7ZwRsZkNyMXqGr1S2JK2M64K53ZfF70aGrW/muHlFrYVFaJg6s1f7K/Xqu21wjwwvnJ8CcP7lUjASqhfSn9OBzEI38KMMo5Qon9p108wvqSKP2QnEdrdv1QOsBPtOZMNRMfEVpw6xVvyPka0X6gxzGfEc9nn3nOok35Fbvoo3G0P8RmOeDJLqDjUOggOs0Gwk= -barbora.it4i.cz, ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOmUm4btn7OC0QLIT3xekKTTdg5ziby8WdxccEczEeE1 -``` - -<Callout> - Barbora has identical SSH fingerprints on all login nodes. -</Callout> - -### Private Key Authentication: - -On **Linux** or **Mac**, use: - -```console -local $ ssh -i /path/to/id_rsa username@cluster-name.it4i.cz -``` - -If you see a warning message **UNPROTECTED PRIVATE KEY FILE!**, use this command to set lower permissions to the private key file: - -```console -local $ chmod 600 /path/to/id_rsa -``` - -On **Windows**, use the [PuTTY SSH client][2]. - -After logging in, you will see the command prompt with the name of the cluster and the message of the day. - -<Callout> - The environment is **not** shared between login nodes, except for shared filesystems. -</Callout> - -## Data Transfer - -### Serial Transfer - -Data in and out of the system may be transferred by SCP and SFTP protocols. - -| Cluster | Port | Protocol | -| -------- | ---- | --------- | -| Karolina | 22 | SCP, SFTP | -| Barbora | 22 | SCP | - -Authentication is by [private key][1] only. - -On Linux or Mac, use an SCP or SFTP client to transfer data to the cluster: - -```console -local $ scp -i /path/to/id_rsa my-local-file username@cluster-name.it4i.cz:directory/file -``` - -```console -local $ scp -i /path/to/id_rsa -r my-local-dir username@cluster-name.it4i.cz:directory -``` - -or - -```console -local $ sftp -o IdentityFile=/path/to/id_rsa username@cluster-name.it4i.cz -``` - -You may request the **aes256-gcm@openssh.com cipher** for more efficient ssh based transfer: - -```console -local $ scp -c aes256-gcm@openssh.com -i /path/to/id_rsa -r my-local-dir username@cluster-name.it4i.cz:directory -``` - -The -c argument may be used with ssh, scp and sftp, and is also applicable to sshfs and rsync below. - -A very convenient way to transfer files in and out of the cluster is via the fuse filesystem [SSHFS][b]. - -```console -local $ sshfs -o IdentityFile=/path/to/id_rsa username@cluster-name.it4i.cz:. mountpoint -``` - -Using SSHFS, the user's home directory will be mounted on your local computer, just like an external disk. - -Learn more about SSH, SCP, and SSHFS by reading the manpages: - -```console -local $ man ssh -local $ man scp -local $ man sshfs -``` - -The rsync client uses ssh to establish connection. - -```console -local $ rsync my-local-file -``` - -```console -local $ rsync -r my-local-dir username@cluster-name.it4i.cz:directory -``` - -### Parallel Transfer - -<Callout> - The data transfer speed is limited by the single TCP stream and single-core ssh encryption speed to about **250 MB/s** (750 MB/s in case of aes256-gcm@openssh.com cipher) - Run **multiple** streams for unlimited transfers -</Callout> - -#### Many Files - -Parallel execution of multiple rsync processes utilizes multiple cores to accelerate encryption and multiple tcp streams for enhanced bandwidth. -First, set up ssh-agent single sign on: - -```console -local $ eval `ssh-agent` -local $ ssh-add -Enter passphrase for /home/user/.ssh/id_rsa: -``` - -Then run multiple rsync instances in parallel, f.x.: - -```console -local $ cd my-local-dir -local $ ls | xargs -n 2 -P 4 /bin/bash -c 'rsync "$@" username@cluster-name.it4i.cz:mydir' sh -``` - -The **-n** argument detemines the number of files to transfer in one rsync call. Set according to file size and count (large for many small files). -The **-P** argument determines number of parallel rsync processes. Set to number of cores on your local machine. - -Alternatively, use [HyperQueue][11]. First get [HyperQueue binary][e], then run: - -```console -local $ hq server start & -local $ hq worker start & -local $ find my-local-dir -type f | xargs -n 2 > jobfile -local $ hq submit --log=/dev/null --progress --each-line jobfile \ - bash -c 'rsync -R $HQ_ENTRY username@cluster-name.it4i.cz:mydir' -``` - -Again, the **-n** argument detemines the number of files to transfer in one rsync call. Set according to file size and count (large for many small files). - -#### Single Very Large File - -To transfer single very large file efficienty, we need to transfer many blocks of the file in parallel, utilizing multiple cores to accelerate ssh encryption and multiple tcp streams for enhanced bandwidth. - -First, set up ssh-agent single sign on as [described above][10]. -Second, start the [HyperQueue server and HyperQueue worker][f]: - -```console -local $ hq server start & -local $ hq worker start & -``` - -Once set up, run the hqtransfer script listed below: - -```console -local $ ./hqtransfer mybigfile username@cluster-name.it4i.cz outputpath/outputfile -``` - -The hqtransfer script: - -```console -#!/bin/bash -#Read input -if [ -z $1 ]; then echo Usage: $0 'input_file ssh_destination [output_path/output_file]'; exit; fi -INFILE=$1 - -if [ -z $2 ]; then echo Usage: $0 'input_file ssh_destination [output_path/output_file]'; exit; fi -DEST=$2 - -OUTFILE=$INFILE -if [ ! -z $3 ]; then OUTFILE=$3; fi - -#Calculate transfer blocks -SIZE=$(($(stat --printf %s $INFILE)/1024/1024/1024)) -echo Transfering $(($SIZE+1)) x 1GB blocks - -#Execute -hq submit --log=/dev/null --progress --array 0-$SIZE /bin/bash -c \ - "dd if=$INFILE bs=1G count=1 skip=\$HQ_TASK_ID | \ - ssh -c aes256-gcm@openssh.com $DEST \ - dd of=$OUTFILE bs=1G conv=notrunc seek=\$HQ_TASK_ID" - -exit -``` - -Copy-paste the script into `hqtransfer` file and set executable flags: - -```console -local $ chmod u+x hqtransfer -``` - -The `hqtransfer` script is ready for use. - -### Data Transfer From Windows Clients - -On Windows, use the [WinSCP client][c] to transfer data. The [win-sshfs client][d] provides a way to mount the cluster filesystems directly as an external disc. - -## Connection Restrictions - -Outgoing connections from cluster login nodes to the outside world are restricted to the following ports: - -| Port | Protocol | -| ---- | -------- | -| 22 | SSH | -| 80 | HTTP | -| 443 | HTTPS | -| 873 | Rsync | - -<Callout> - Use **SSH port forwarding** and proxy servers to connect from cluster to all other remote ports. -</Callout> - -Outgoing connections from cluster compute nodes are restricted to the internal network. Direct connections from compute nodes to the outside world are cut. - -| Service | IP/Port | -| ---------------- | ------------------ | -| TCP/22, TCP | port 1024-65535 | -| e-INFRA CZ Cloud | 195.113.243.0/24 | -| IT4I Cloud | 195.113.175.128/26 | - -## Port Forwarding - -### Port Forwarding From Login Nodes - -<Callout> - Port forwarding allows an application running on cluster to connect to arbitrary remote hosts and ports. -</Callout> - -It works by tunneling the connection from cluster back to the user's workstations and forwarding from the workstation to the remote host. - -Select an unused port on the cluster login node (for example 6000) and establish the port forwarding: - -```console -$ ssh -R 6000:remote.host.com:1234 cluster-name.it4i.cz -``` - -In this example, we establish port forwarding between port 6000 on the cluster and port 1234 on the `remote.host.com`. By accessing `localhost:6000` on the cluster, an application will see the response of `remote.host.com:1234`. The traffic will run via the user's local workstation. - -Port forwarding may be done **using PuTTY** as well. On the PuTTY Configuration screen, load your cluster configuration first. Then go to *Connection > SSH > Tunnels* to set up the port forwarding. Click the _Remote_ radio button. Insert 6000 to the _Source port_ textbox. Insert `remote.host.com:1234`. Click _Add_, then _Open_. - -Port forwarding may be established directly to the remote host. However, this requires that the user has an SSH access to `remote.host.com`. - -```console -$ ssh -L 6000:localhost:1234 remote.host.com -``` - -<Callout> - Port number 6000 is chosen as an example only. Pick any free port. -</Callout> - -### Port Forwarding From Compute Nodes - -Remote port forwarding from compute nodes allows applications running on the compute nodes to access hosts outside the cluster. - -First, establish the remote port forwarding from the login node, as [described above][5]. - -Second, invoke port forwarding from the compute node to the login node. Insert the following line into your jobscript or interactive shell: - -```console -$ ssh -TN -f -L 6000:localhost:6000 login1 -``` - -In this example, we assume that port forwarding from `login1:6000` to `remote.host.com:1234` has been established beforehand. By accessing `localhost:6000`, an application running on a compute node will see the response of `remote.host.com:1234`. - -### Using Proxy Servers - -Port forwarding is static; each single port is mapped to a particular port on a remote host. Connection to another remote host requires a new forward. - -<Callout> - Applications with inbuilt proxy support experience unlimited access to remote hosts via a single proxy server. -</Callout> - -To establish a local proxy server on your workstation, install and run the SOCKS proxy server software. On Linux, SSHD demon provides the functionality. To establish the SOCKS proxy server listening on port 1080 run: - -```console -local $ ssh -D 1080 localhost -``` - -On Windows, install and run the free, open source Sock Puppet server. - -Once the proxy server is running, establish the SSH port forwarding from cluster to the proxy server, port 1080, exactly as [described above][5]: - -```console -local $ ssh -R 6000:localhost:1080 cluster-name.it4i.cz -``` - -Now, configure the applications proxy settings to `localhost:6000`. Use port forwarding to access the [proxy server from compute nodes][9], as well. - -[1]: ../general/accessing-the-clusters/shell-access-and-data-transfer/ssh-key-management.md -[2]: ../general/accessing-the-clusters/shell-access-and-data-transfer/putty.md -[5]: #port-forwarding-from-login-nodes -[6]: ../general/accessing-the-clusters/graphical-user-interface/x-window-system.md -[7]: ../general/accessing-the-clusters/graphical-user-interface/vnc.md -[8]: ../general/accessing-the-clusters/vpn-access.md -[9]: #port-forwarding-from-compute-nodes -[10]: #many-files -[11]: ../general/hyperqueue.md - -[b]: http://linux.die.net/man/1/sshfs -[c]: http://winscp.net/eng/download.php -[d]: http://code.google.com/p/win-sshfs/ -[e]: https://github.com/It4innovations/hyperqueue/releases/latest -[f]: https://it4innovations.github.io/hyperqueue/stable/cheatsheet/ diff --git a/content/docs/general/slurm-batch-examples.mdx b/content/docs/general/slurm-batch-examples.mdx deleted file mode 100644 index 15fffc77087b4faa49ef778a8de60b8e44eea063..0000000000000000000000000000000000000000 --- a/content/docs/general/slurm-batch-examples.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Slurm Batch Jobs Examples" ---- -Below is an excerpt from the [2024 e-INFRA CZ conference][1] -describing best practices for Slurm batch calculations and data managing, including examples, by Ondrej Meca. - -{ type=application/pdf style="min-height:100vh;width:100%" } - -[1]: https://www.e-infra.cz/en/e-infra-cz-conference \ No newline at end of file diff --git a/content/docs/general/slurm-job-submission-and-execution.mdx b/content/docs/general/slurm-job-submission-and-execution.mdx deleted file mode 100644 index 0b2ece24a5fd4ed81ac4cf351af5729392cab585..0000000000000000000000000000000000000000 --- a/content/docs/general/slurm-job-submission-and-execution.mdx +++ /dev/null @@ -1,364 +0,0 @@ ---- -title: "Job Submission and Execution" ---- -<Callout type=warn> - Don't use the `#SBATCH --exclusive` parameter as it is already included in the SLURM configuration.<br><br> - Use the `#SBATCH --mem=` parameter **on `qfat` only**. On `cpu_` queues, whole nodes are allocated. - Accelerated nodes (`gpu_` queues) are divided each into eight parts with corresponding memory. -</Callout> - -## Introduction - -[Slurm][1] workload manager is used to allocate and access Karolina's, Barbora's and Complementary systems' resources. - -A `man` page exists for all Slurm commands, as well as the `--help` command option, -which provides a brief summary of options. -Slurm [documentation][c] and [man pages][d] are also available online. - -## Getting Partition Information - -Display partitions/queues on system: - -```console -$ sinfo -s -PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST -qcpu* up 2-00:00:00 1/191/0/192 cn[1-192] -qcpu_biz up 2-00:00:00 1/191/0/192 cn[1-192] -qcpu_exp up 1:00:00 1/191/0/192 cn[1-192] -qcpu_free up 18:00:00 1/191/0/192 cn[1-192] -qcpu_long up 6-00:00:00 1/191/0/192 cn[1-192] -qcpu_preempt up 12:00:00 1/191/0/192 cn[1-192] -qgpu up 2-00:00:00 0/8/0/8 cn[193-200] -qgpu_biz up 2-00:00:00 0/8/0/8 cn[193-200] -qgpu_exp up 1:00:00 0/8/0/8 cn[193-200] -qgpu_free up 18:00:00 0/8/0/8 cn[193-200] -qgpu_preempt up 12:00:00 0/8/0/8 cn[193-200] -qfat up 2-00:00:00 0/1/0/1 cn201 -qdgx up 2-00:00:00 0/1/0/1 cn202 -qviz up 8:00:00 0/2/0/2 vizserv[1-2] -``` - -`NODES(A/I/O/T)` column summarizes node count per state, where the `A/I/O/T` stands for `allocated/idle/other/total`. -Example output is from Barbora cluster. - -Graphical representation of clusters' usage, partitions, nodes, and jobs could be found - -* for Karolina at [https://extranet.it4i.cz/rsweb/karolina][5] -* for Barbora at [https://extranet.it4i.cz/rsweb/barbora][4] -* for Complementary Systems at [https://extranet.it4i.cz/rsweb/compsys][6] - -On Karolina cluster - -* all cpu queues/partitions provide full node allocation, whole nodes are allocated to job -* other queues/partitions (gpu, fat, viz) provide partial node allocation - -See [Karolina Slurm Specifics][7] for details. - -On Barbora cluster, all queues/partitions provide full node allocation, whole nodes are allocated to job. - -On Complementary systems, only some queues/partitions provide full node allocation, -see [Complementary systems documentation][2] for details. - -## Running Interactive Jobs - -Sometimes you may want to run your job interactively, for example for debugging, -running your commands one by one from the command line. - -Run interactive job - queue `qcpu_exp`, one node by default, one task by default: - -```console -$ salloc -A PROJECT-ID -p qcpu_exp -``` - -Run interactive job on four nodes, 128 tasks per node (Karolina cluster, CPU partition recommended value based on node core count), -two hours time limit: - -```console -$ salloc -A PROJECT-ID -p qcpu -N 4 --ntasks-per-node 128 -t 2:00:00 -``` - -Run interactive job, with X11 forwarding: - -```console -$ salloc -A PROJECT-ID -p qcpu_exp --x11 -``` - -To finish the interactive job, use the Ctrl+D (`^D`) control sequence. - -<Callout type=warn> - Do not use `srun` for initiating interactive jobs, subsequent `srun`, `mpirun` invocations would block forever. -</Callout> - -## Running Batch Jobs - -Batch jobs is the standard way of running jobs and utilizing HPC clusters. - -### Job Script - -Create example job script called script.sh with the following content: - -```shell -#!/usr/bin/bash -#SBATCH --job-name MyJobName -#SBATCH --account PROJECT-ID -#SBATCH --partition qcpu -#SBATCH --nodes 4 -#SBATCH --ntasks-per-node 128 -#SBATCH --time 12:00:00 - -ml purge -ml OpenMPI/4.1.4-GCC-11.3.0 - -srun hostname | sort | uniq -c -``` - -Script will: - -* use bash shell interpreter -* use `MyJobName` as job name -* use project `PROJECT-ID` for job access and accounting -* use partition/queue `qcpu` -* use `4` nodes -* use `128` tasks per node - value used by MPI -* set job time limit to `12` hours - -* load appropriate module -* run command, `srun` serves as Slurm's native way of executing MPI-enabled applications, `hostname` is used in the example just for sake of simplicity - -<Callout> - Use `#SBATCH --exclude=<node_name_list>` directive to exclude specific nodes from your job, e.g.: `#SBATCH --exclude=cn001,cn002,cn003`. -</Callout> - -Submit directory will be used as working directory for submitted job, -so there is no need to change directory in the job script. -Alternatively you can specify job working directory using the sbatch `--chdir` (or shortly `-D`) option. - -### Srun Over mpirun - -While `mpirun` can be used to run parallel jobs on our Slurm-managed clusters, we recommend using `srun` for better integration with Slurm's scheduling and resource management. `srun` ensures more efficient job execution and resource control by leveraging Slurm’s features directly, and it simplifies the process by reducing the need for additional configurations often required with `mpirun`. - -### Job Submit - -Submit batch job: - -```console -$ cd my_work_dir -$ sbatch script.sh -``` - -A path to `script.sh` (relative or absolute) should be given -if the job script is in a different location than the job working directory. - -By default, job output is stored in a file called `slurm-JOBID.out` and contains both job standard output and error output. -This can be changed using the sbatch options `--output` (shortly `-o`) and `--error` (shortly `-e`). - -Example output of the job: - -```shell - 128 cn017.karolina.it4i.cz - 128 cn018.karolina.it4i.cz - 128 cn019.karolina.it4i.cz - 128 cn020.karolina.it4i.cz -``` - -### Job Environment Variables - -Slurm provides useful information to the job via environment variables. -Environment variables are available on all nodes allocated to job when accessed via Slurm supported means (`srun`, compatible `mpirun`). - -See all Slurm variables - -``` -$ set | grep ^SLURM -``` - -Commonly used variables are: - -| variable name | description | example | -| ------ | ------ | ------ | -| SLURM_JOB_ID | job id of the executing job| 593 | -| SLURM_JOB_NODELIST | nodes allocated to the job | cn[101-102] | -| SLURM_JOB_NUM_NODES | number of nodes allocated to the job | 2 | -| SLURM_STEP_NODELIST | nodes allocated to the job step | cn101 | -| SLURM_STEP_NUM_NODES | number of nodes allocated to the job step | 1 | -| SLURM_JOB_PARTITION | name of the partition | qcpu | -| SLURM_SUBMIT_DIR | submit directory | /scratch/project/open-xx-yy/work | - -See relevant [Slurm documentation][3] for details. - -Get job nodelist: - -``` -$ echo $SLURM_JOB_NODELIST -cn[101-102] -``` - -Expand nodelist to list of nodes: - -``` -$ scontrol show hostnames -cn101 -cn102 -``` - -## Job Management - -### Getting Job Information - -Show all jobs on system: - -```console -$ squeue -``` - -Show my jobs: - -```console -$ squeue --me - JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) - 104 qcpu interact user R 1:48 2 cn[101-102] -``` - -Show job details for a specific job: - -```console -$ scontrol show job JOBID -``` - -Show job details for executing job from job session: - -```console -$ scontrol show job $SLURM_JOBID -``` - -Show my jobs using a long output format which includes time limit: - -```console -$ squeue --me -l -``` - -Show my jobs in running state: - -```console -$ squeue --me -t running -``` - -Show my jobs in pending state: - -```console -$ squeue --me -t pending -``` - -Show jobs for a given project: - -```console -$ squeue -A PROJECT-ID -``` - -### Job States - -The most common job states are (in alphabetical order): - -| Code | Job State | Explanation | -| :--: | :------------ | :------------------------------------------------------------------------------------------------------------- | -| CA | CANCELLED | Job was explicitly cancelled by the user or system administrator. The job may or may not have been initiated. | -| CD | COMPLETED | Job has terminated all processes on all nodes with an exit code of zero. | -| CG | COMPLETING | Job is in the process of completing. Some processes on some nodes may still be active. | -| F | FAILED | Job terminated with non-zero exit code or other failure condition. | -| NF | NODE_FAIL | Job terminated due to failure of one or more allocated nodes. | -| OOM | OUT_OF_MEMORY | Job experienced out of memory error. | -| PD | PENDING | Job is awaiting resource allocation. | -| PR | PREEMPTED | Job terminated due to preemption. | -| R | RUNNING | Job currently has an allocation. | -| RQ | REQUEUED | Completing job is being requeued. | -| SI | SIGNALING | Job is being signaled. | -| TO | TIMEOUT | Job terminated upon reaching its time limit. | - -### Modifying Jobs - -In general: - -``` -$ scontrol update JobId=JOBID ATTR=VALUE -``` - -Modify job's time limit: - -``` -$ scontrol update JobId=JOBID timelimit=4:00:00 -``` - -Set/modify job's comment: - -``` -$ scontrol update JobId=JOBID Comment='The best job ever' -``` - -### Deleting Jobs - -Delete a job by job ID: - -``` -$ scancel JOBID -``` - -Delete all my jobs: - -``` -$ scancel --me -``` - -Delete all my jobs in interactive mode, confirming every action: - -``` -$ scancel --me -i -``` - -Delete all my running jobs: - -``` -$ scancel --me -t running -``` - -Delete all my pending jobs: - -``` -$ scancel --me -t pending -``` - -Delete all my pending jobs for a project PROJECT-ID: - -``` -$ scancel --me -t pending -A PROJECT-ID -``` - -## Troubleshooting - -### Invalid Account - -`sbatch: error: Batch job submission failed: Invalid account or account/partition combination specified` - -Possible causes: - -* Invalid account (i.e. project) was specified in job submission. -* User does not have access to given account/project. -* Given account/project does not have access to given partition. -* Access to given partition was retracted due to the project's allocation exhaustion. - -[1]: https://slurm.schedmd.com/ -[2]: /cs/job-scheduling/#partitions -[3]: https://slurm.schedmd.com/srun.html#SECTION_OUTPUT-ENVIRONMENT-VARIABLES -[4]: https://extranet.it4i.cz/rsweb/barbora -[5]: https://extranet.it4i.cz/rsweb/karolina -[6]: https://extranet.it4i.cz/rsweb/compsys -[7]: /general/karolina-slurm - -[a]: https://slurm.schedmd.com/ -[b]: http://slurmlearning.deic.dk/ -[c]: https://slurm.schedmd.com/documentation.html -[d]: https://slurm.schedmd.com/man_index.html -[e]: https://slurm.schedmd.com/sinfo.html -[f]: https://slurm.schedmd.com/squeue.html -[g]: https://slurm.schedmd.com/scancel.html -[h]: https://slurm.schedmd.com/scontrol.html -[i]: https://slurm.schedmd.com/job_array.html diff --git a/content/docs/general/support.mdx b/content/docs/general/support.mdx deleted file mode 100644 index 8e3049e2d14f405940ed3752785acd23222075ae..0000000000000000000000000000000000000000 --- a/content/docs/general/support.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Getting Help and Support" ---- -Contact [support\[at\]it4i.cz][a] or use the [support][b] portal for help and support regarding the cluster technology at IT4Innovations. -For communication, use the **Czech**, **Slovak**, or **English** language. -Follow the status of your request to IT4Innovations [here][b]. -The IT4Innovations support team will use best efforts to resolve requests within thirty days. - -[a]: mailto:support@it4i.cz -[b]: http://support.it4i.cz/rt diff --git a/content/docs/general/tools/cicd.mdx b/content/docs/general/tools/cicd.mdx deleted file mode 100644 index 30f964ba6fc6922a57a665597f58005e91ea84f4..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/cicd.mdx +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "CI/CD" ---- -## Introduction - -Continuous Integration (CI) is the practice of automatically executing a compilation script and set of test cases to ensure that the integrated codebase is in a workable state. The integration is often followed by Continuous Benchmarking (CB) to evaluate the impact of the code change on the application performance and Continuous Deployment (CD) to distribute a new version of the developed code. - -IT4I offers its users a possibility to set up CI for their projects and to execute their dedicated CI jobs directly in computational nodes of the production HPC clusters (Karolina, Barbora) and Complementary systems. The Complementary systems gives a possibility to run the tests on emerging, non-traditional, and highly specialized hardware architectures. It consists of computational nodes built on Intel Sapphire Rapids + HBM, NVIDIA Grace CPU, IBM Power10, A64FX, and many more. - -Besides that, there is also a possibility to execute CI jobs in a customizable virtual environment (Docker containers). This allows to test the code in a clean build environment. It also makes dependency management more straight-forward since all dependencies for building the project can be put in the Docker image, from which the corresponding containers are created. - -## CI Infrastructure Deployed at IT4I - -IT4Innovations maintains a GitLab server (code.it4i.cz), which has built-in support for CI/CD. It provides a set of GitLab runners, which is an application that executes jobs specified in the project CI pipelines, consisting of jobs and stages. Grouping jobs together in collections is called stages. Stages run in sequence, while all jobs in a stage can run in parallel. - -Detailed documentation about GitLab CI/CD is available [here][1]. - -### Karolina, Barbora, and Complementary Systems - -For all the users, a unified solution is provided to let them execute their CI jobs at Karolina, Barbora, and Complementary systems without the need to create their own project runners. For each of the HPC clusters, a GitLab instance runner has been deployed. The runners are running in the login nodes and are visible to all the projects of the IT4I GitLab server. These runners are shared by all users. - -These runners are using **Jacamar CI driver** – an HPC-focused open-source CI/CD driver for GitLab runners. It allows a GitLab runner to interact directly with a job scheduler of a given cluster. One of the main benefits this driver provides is a downscoping mechanism. It ensures that every command within each CI job is executed as the user who triggers the CI pipeline to which the job belongs. - -For more information about the Jacamar CI driver, please visit [the official documentation][2]. - -The execution of CI pipelines works as follows. First, a user in the IT4I GitLab server triggers a CI pipeline (for example, by making push to a repository, etc.). Then, the jobs, which the pipeline consists of, are sent to the corresponding runner, running in the login node. Lastly, for every CI job, the runner clones the repository (or just fetches changes to an already cloned one, if there are any), restores [cache][3], downloads [artifacts][4] (if specified), and submits the job as a Slurm job to the corresponding HPC cluster using the `sbatch` command. After each execution of a job, the runner reports the results back to the server, creates cache, and uploads artifacts (if specified). - -<img src="../../../img/it4i-ci.svg" title="IT4I CI" width="750"> - -<Callout> - The GitLab runners at Karolina and Barbora are able to submit (as a Slurm job) and execute 32 CI jobs concurrently, while the runner at Complementary systems can submit 16 jobs concurrently at most. Jobs above this limit are postponed in submission to respective slurm queue until a previous job has finished. -</Callout> - -### Virtual Environment (Docker Containers) - -There are also 5 GitLab instance runners with Docker executor configured, which have been deployed in the local virtual infrastructure (each runs in a dedicated virtual machine). The runners use Docker Engine to execute each job in a separate and isolated container created from the image specified beforehand. These runners are also visible to all the projects of the IT4I GitLab server. - -Detailed information about the Docker executor and its workflow (the execution of CI pipelines) can be found [here][5]. - -In addition, these runners have distributed caching enabled. This feature uses pre-configured object storage server and allows to share the [cache][3] between subsequent CI jobs (of the same project) executed on multiple runners (2 or more of the 5 deployed). Refer to [Caching in GitLab CI/CD][6] for information about cache and how cache is different from artifacts. - -## How to Set Up Continuous Integration for Your Project - -To begin with, a CI pipeline of a project must be defined in a YAML file. The most common name of this file is `.gitlab-ci.yml` and it should be located in the repository top level. For detailed information, see [tutorial][7] on how to create your first pipeline. Additionally, [CI/CD YAML syntax reference][8] lists all possible keywords, that can be specified in the definition of CI/CD pipelines and jobs. - -<Callout> - The default maximum time that a CI job can run for before it times out is 1 hour. This can be changed in [project's CI/CD settings][9]. When jobs exceed the specified timeout, they are marked as failed. Pending jobs are dropped after 24 hours of inactivity. -</Callout> - -### Execution of CI Pipelines at the HPC Clusters - -Every CI job in the project CI pipeline, intended to be submitted as a Slurm job to one of the HPC clusters, must have the 3 following keywords specified in its definition. - -* `id_tokens`, in which `SITE_ID_TOKEN` must be defined with `aud` set to the URL of IT4I GitLab server. - -```yaml -id_tokens: - SITE_ID_TOKEN: - aud: https://code.it4i.cz/ -``` - -* `tags`, by which the appropriate runner for the CI job is selected. There are exactly 3 tags that must be specified in the `tags` clause of the CI job. Two of these are `it4i` and `slurmjob`. The third one represents name of the target cluster. It can be `karolina`, `barbora`, or `compsys`. - -```yaml -tags: - - it4i - - karolina/barbora/compsys - - slurmjob -``` - -* `variables`, where the `SCHEDULER_PARAMETERS` variable must be specified. This variable should contain all the arguments that the developer wants to pass to the `sbatch` command during the submission of the CI job - project, queue, partition, etc. There are also arguments, which are specified by the Jacamar CI driver automatically. Those are `--wait`, `--job-name`, and `--output`. - -```yaml -variables: - SCHEDULER_PARAMETERS: "-A ... –p ... -N ..." -``` - -Optionally, a custom build directory can also be specified. The deployed GitLab runners are configured to store all files and directories for the CI job in the home directory of the user, who triggers the associated CI pipeline (the repository is also cloned there in a unique subpath). This behavior can be changed by specifying the `CUSTOM_CI_BUILDS_DIR` variable in the `variables` clause of the CI job. - -```yaml -variables: - SCHEDULER_PARAMETERS: ... - CUSTOM_CI_BUILDS_DIR: /path/to/custom/build/dir/ -``` - -A GitLab repository with examples of CI jobs can be found [here][10]. - -### Execution of CI Pipelines in Docker Containers - -Every CI job in the project CI pipeline, intended to be executed by one of the 5 runners with Docker executor configured, must have the 2 following keywords specified in its definition. - -* `image`, where the name of the Docker image must be specified. Image requirements are listed [here][11]. See also [the description][12] in CI/CD YAML syntax reference for information about all possible name formats. The runners are configured to pull the images from [Docker Hub][13]. - -```yaml -image: <image-name-in-one-of-the-accepted-formats> - -# or - -image: - name: <image-name-in-one-of-the-accepted-formats> -``` - -* `tags`, by which one of the 5 runners is selected (the selection is done automatically). There are exactly 2 tags that must be specified in the `tags` clause of the CI job. Those are `centos7` and `docker`. - -```yaml -tags: - - centos7 - - docker -``` - -[1]: https://docs.gitlab.com/ee/topics/build_your_application.html -[2]: https://ecp-ci.gitlab.io/docs/admin/jacamar/introduction.html -[3]: https://docs.gitlab.com/ee/ci/yaml/#cache -[4]: https://docs.gitlab.com/ee/ci/yaml/#artifacts -[5]: https://docs.gitlab.com/runner/executors/docker.html -[6]: https://docs.gitlab.com/ee/ci/caching/index.html -[7]: https://docs.gitlab.com/ee/ci/quick_start/ -[8]: https://docs.gitlab.com/ee/ci/yaml/index.html -[9]: https://docs.gitlab.com/ee/ci/pipelines/settings.html#set-a-limit-for-how-long-jobs-can-run -[10]: https://code.it4i.cz/nie0056/it4i-cicd-example -[11]: https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#image-requirements -[12]: https://docs.gitlab.com/ee/ci/yaml/index.html#image -[13]: https://hub.docker.com/ diff --git a/content/docs/general/tools/codeit4i.mdx b/content/docs/general/tools/codeit4i.mdx deleted file mode 100644 index dbd532e93689a003384b430f12a9a5ae292f49f3..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/codeit4i.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Code.it4i.cz" ---- -[code.it4i.cz][1] is a GitLab server maintained by IT4Innovations. -It is available for all IT4I users and can be accessed via LDAP login credentials. - -It offers various tools including: - -## Project Management - -Collaborate with teammates using built-in code review tools. -Control, track, and manage different versions of your project. -Manage access and permission rights for different roles within your project. -Report, track, and manage bugs and feature requests within your projects. -Maintain project-specific documentation directly within GitLab. - -For more detailed information see the [GitLab documentation][2]. - -## Continuous Integration / Continuous Deployment - -Automatically execute compilation scripts and test cases -and distribute new versions of your code. -See the [CI/CD section][a] for more information. - -## IT4I Documentation - -Participate on improving and expanding our documentation to help other users. - -[1]: https://code.it4i.cz/ -[2]: https://docs.gitlab.com/ - -[a]: cicd.md diff --git a/content/docs/general/tools/meta.json b/content/docs/general/tools/meta.json deleted file mode 100644 index ce51e1598868ab81008fd96131f240148f76007a..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Tools", - "pages": [ - "cicd", - "codeit4i", - "opencode", - "portal-clients", - "tools-list" - ] -} diff --git a/content/docs/general/tools/opencode.mdx b/content/docs/general/tools/opencode.mdx deleted file mode 100644 index 7680d2a7f0255882c2f9f1e7cfdb0b694adabc93..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/opencode.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Opencode" ---- -[Opencode][b] is a GitLab-based page for projects on which IT4Innovations participates. - -## Who Can Access Opencode - -IT4Innovations account is not required, it is possible to access through [B2ACCESS][a]. - -## Sign in Through B2ACCESS - -First, we need to verify your identity: - -1. Sign in with your organization B2ACCESS; the page requests a valid personal certificate (e.g. GEANT). - Accounts with "Low" level of assurance are not granted access to IT4I zone. - -2. Confirm your certificate in the browser: - -  - -3. Confirm your certificate in the OS (Windows): - -  - -4. Sign to EUDAT/B2ACCESS: - -  - - - If you aren't affiliated with any university, try log in with Social account. If you aren't able to sign in through an IDP, It might be a result of an internal policy of your employer. - - - If you don't have, or refuse to use, any of the above-mentioned accounts, you can create an account in B2ACCESS. - -  -  -  - -[a]: https://b2access.eudat.eu/ -[b]: https://opencode.it4i.eu diff --git a/content/docs/general/tools/portal-clients.mdx b/content/docs/general/tools/portal-clients.mdx deleted file mode 100644 index fda30f67798777e1afbf6d7a092eb7b7a07020ca..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/portal-clients.mdx +++ /dev/null @@ -1,297 +0,0 @@ ---- -title: "IT4I Portal Clients" ---- -it4i-portal-clients provides simple user-friendly shell interface -to call [IT4I API](https://docs.it4i.cz/apiv1/) requests and display their respond. - -<Callout type=warn> - Python 2.7 is required. -</Callout> - -Limits are placed on the number of requests you may make to [IT4I API](https://docs.it4i.cz/apiv1/). -Rate limit can be changed without any warning at any time, but the default is **6 requests per minute**. -Exceeding the limit will lead to your IP address being temporarily blocked from making further requests. -The block will automatically be lifted by waiting an hour. - -## List of Available Utilities - -* [it4icheckaccess](#it4icheckaccess) - Shows if IT4I account and/or related project has the access to specified cluster and queue. -* [it4idedicatedtime](#it4idedicatedtime) - Shows IT4I dedicated time. -* [it4ifree](#it4ifree) - Shows some basic information from IT4I Slurm accounting. -* [it4ifsusage](#it4ifsusage) - Shows filesystem usage of IT4I cluster storage systems. -* [it4iuserfsusage](#it4iuserfsusage) - Shows user filesystem usage of IT4I cluster storage systems. -* [it4projectifsusage](#it4iprojectfsusage) - Shows project filesystem usage of IT4I cluster storage systems. -* [it4imotd](#it4imotd) - Shows IT4I messages of the day into formatted text or HTML page (using TAL / Zope Page Template). - -## Installation/Upgrading - -```bash -pip install --upgrade it4i.portal.clients -``` - -## Sample Configuration File main.cfg - -```bash -[main] - -# IT4I API -api_url = https://scs.it4i.cz/api/v1/ -it4ifreetoken = <your_token> -``` - -Username is taken from OS, therefore the script has to be run under the same user login name as you use to log into clusters. - -* System-wide config file path: ```/usr/local/etc/it4i-portal-clients/main.cfg``` -* Local user's config file path: ```~/.it4ifree``` - -## it4icheckaccess - -### Help of IT4ICHECKACCESS - -```console -$ it4icheckaccess -h -usage: it4icheckaccess [-h] -l LOGIN -c CLUSTER -q QUEUE [-p PROJECT] - -The command shows if an IT4I account and/or related project has the access to -specified cluster and queue. Return exit code 99 if access is not granted. - -optional arguments: - -h, --help show this help message and exit - -l LOGIN, --login LOGIN - user login - -c CLUSTER, --cluster CLUSTER - cluster name - -q QUEUE, --queue QUEUE - queue - -p PROJECT, --project PROJECT - project id -``` - -### Example of IT4ICHECKACCESS - -```console -$ it4icheckaccess -l xxx0123 -c barbora -q qcpu_exp -p DD-12-345 -OK Access granted for regular queue. -``` - -## it4idedicatedtime - -### Help of IT4IDEDICATEDTIME - -```console -$ it4idedicatedtime -h -usage: it4idedicatedtime [-h] [-m {active,planned}] - [-c {barbora,karolina}] - -The command shows IT4I dedicated time. By default all planned and active -outages of all clusters are displayed. Return exit code 99 if there is no -outage, otherwise return 0. - -optional arguments: - -h, --help show this help message and exit - -m {active,planned}, --message {active,planned} - select type of dedicated time. Planned contains also - active - -c {barbora,karolina}, --cluster {barbora,karolina} - select cluster -``` - -### Example of IT4IDEDICATEDTIME - -```console -$ it4idedicatedtime -Cluster Start End Last update ---------- ------------------- ------------------- ------------------- -barbora 2024-03-19 08:00:00 2024-03-19 09:30:00 2024-03-08 08:24:33 -karolina 2024-03-19 08:00:00 2024-03-19 09:30:00 2024-03-08 08:23:40 -``` - -## it4ifree - -### Help of IT4IFREE - -```console -$ it4ifree -h -usage: it4ifree [-h] [-p] [-a] - -The command shows some basic information from IT4I SLURM accounting. The -data is related to the current user and to all projects in which user -participates. - -optional arguments: - -h, --help show this help message and exit - -p, --percent - show values in percentage. Projects with unlimited resources are not displayed - -a, --all Show all resources include inactive and future ones. - - -Columns of "Projects I am participating in": - PID: Project ID/account string. - Type: Standard or multiyear project. - Days left: Days till the given project expires. - Total: Core-hours allocated to the given project. - Used: Sum of core-hours used by all project members. - My: Core-hours used by the current user only. - Free: Core-hours that haven't yet been utilized. - -Columns of "Projects I am Primarily Investigating" (if present): - PID: Project ID/account string. - Type: Standard or multiyear project. - Login: Project member's login name. - Used: Project member's used core-hours. -``` - -### Example of IT4IFREE - -```console -$ it4ifree - -Projects I am participating in -============================== -PID Resource type Days left Total Used By me Free ----------- --------------- ------------- -------- -------- -------- -------- -OPEN-XX-XX Karolina GPU 249 42 0 0 42 - Barbora CPU 249 42 5 5 37 - Legacy NCH 249 100 0 0 100 - - -Projects I am Primarily Investigating -===================================== -PID Resource type Login Usage ----------- -------------- ------- -------- -OPEN-XX-XX Barbora CPU user1 3 - Barbora CPU user2 2 - Karolina GPU N/A 0 - Legacy NCH N/A 0 - - -Legend -====== -N/A = No one used this resource yet -Legacy Normalized core hours are in NCH -Everything else is in Node Hours -``` - -## it4ifsusage - -### Help of IT4IFSUSAGE - -```console -$ it4ifsusage -h -usage: it4ifsusage [-h] - -The command shows filesystem usage of IT4I cluster storage systems - -optional arguments: - -h, --help show this help message and exit -``` - -### Example of IT4IFSUSAGE - -```console -$ it4ifsusage -Quota Type Cluster / PID File System Space used Space limit Entries used Entries limit Last update -------------- --------------- ------------- ------------ ------------- -------------- --------------- ------------------- -User barbora /home 2.9 GB 25.0 GB 183 500,000 2024-03-22 16:50:10 -User karolina /home 3.0 MB 25.0 GB 150 500,000 2024-03-22 17:00:07 -User barbora /scratch 0 Bytes 10.0 TB 0 10,000,000 2024-03-22 16:50:28 -User karolina /scratch 0 Bytes 0 Bytes 0 0 2024-03-22 17:00:43 -Project service proj3 1.5 TB 1.0 TB 169,933 198,000 2024-03-22 17:00:02 -``` - -## it4iuserfsusage - -### Help of IT4IUSERFSUSAGE - -```console -$ it4iuserfsusage -h -usage: it4iuserfsusage [-h] [-c {all,barbora, karolina}] - -The command shows user filesystem usage of IT4I cluster storage systems - -optional arguments: - -h, --help show this help message and exit -``` - -### Example of IT4IUSERFSUSAGE - -```console -$ it4iuserfsusage -Cluster File System Space used Space limit Entries used Entries limit Last update ---------------- ------------- ------------ ------------- -------------- --------------- ------------------- -barbora /home 2.9 GB 25.0 GB 183 500,000 2024-03-22 16:50:10 -karolina /home 3.0 MB 25.0 GB 150 500,000 2024-03-22 17:00:07 -barbora /scratch 0 Bytes 10.0 TB 0 10,000,000 2024-03-22 16:50:28 -karolina /scratch 0 Bytes 0 Bytes 0 0 2024-03-22 17:00:43 -``` - -## it4iprojectfsusage - -### Help of IT4IPROJECTFSUSAGE - -```console -$ it4iprojectfsusage -h -usage: it4iprojectfsusage [-h] [-p {PID, all}] - -The command shows project filesystem usage of IT4I cluster storage systems - -optional arguments: - -h, --help show this help message and exit -``` - -### Example of IT4IPROJECTFSUSAGE - -```console -$ it4iprojectfsusage -PID File System Space used Space limit Entries used Entries limit Last update ---------------- ------------- ------------ ------------- -------------- --------------- ------------------- -service proj3 3.1 GB 1.0 TB 5 100,000 2024-03-22 17:00:02 -it4i-x-y proj1 3.1 TB 2.0 TB 5 100,000 2024-03-22 17:00:02 -dd-13-5 proj3 2 GB 3.0 TB 5 100,000 2024-03-22 17:00:02 -projectx proj2 150 TB 4.0 TB 5 100,000 2024-03-22 17:00:02 -``` - -## it4imotd - -### Help of IT4IMOTD - -```console -$ it4imotd -h -usage: it4imotd [-h] [-t TEMPLATE] [-w WIDTH] [-c] - -The command shows IT4I messages of the day into formatted text or HTML page. - -optional arguments: - -h, --help show this help message and exit - -t TEMPLATE, --template TEMPLATE - path to TAL / Zope Page Template, output will be - formatted into HTML page - -w WIDTH, --width WIDTH - maximum line width (intended for text rendering, - default of 78 columns) - -c, --cron sleep from 10 up to 60 seconds prior to any actions - -m {TYPE}, --message {TYPE} - select type of messages - supported types: - all, - public-service-announcement, - service-recovered-up, - critical-service-down, - service-hard-down, - auxiliary-service-down, - planned-outage, - service-degraded, - important, - notice. -``` - -### Example of IT4IMOTD - -```console -$ it4imotd - - Message of the Day (DD/MM/YYYY) - (YYYY-MM-DD hh:mm:ss) - -More on https://... -``` diff --git a/content/docs/general/tools/tools-list.mdx b/content/docs/general/tools/tools-list.mdx deleted file mode 100644 index 941b0aaf77f7ed2f4fc4a09f2dcb39c9c71af965..0000000000000000000000000000000000000000 --- a/content/docs/general/tools/tools-list.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "IT4I Data Sharing Tools" ---- -Below is the list of tools with description available at IT4 Innovations. - -| Hostname | VPN | Access | Domain | Function | Technology | Target Group | License | -| ----------------------- | --- | -------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| adasoffice.vsb.cz | no | | vsb.cz | Data sharing<br>Project work<br>\- Tasks<br>\- Milestones<br>\- Chat<br>Calendar<br>CRM<br>Collaborative writing | onlyoffice | Adas only, to shut down | 110/150 - Counts for 30 days from file open;<br>returns to pool if not used in 30 days.<br>50ks/1000E | -| internal.office.it4i.cz | no | ldap vsb | it4i.cz | Data sharing<br>Project work<br>\- Tasks<br>\- Milestones<br>\- Chat<br>Calendar<br>CRM<br>Collaborative writing | onlyoffice | Private projects | 110/150 - Counts for 30 days from file open;<br>returns to pool if not used in 30 days.<br>50ks/1000E | -| events.it4i.cz | | local account | it4i.cz | Events management<br>Schedules & programs<br>Evaluation & feedback<br>Participants registration | indico | IT4I | | -| code.it4i.cz | no | ldap it4i | it4i.cz | Versions management<br>Project management<br>CI/CD<br>Tasks<br>Documentation | gitlab | IT4I users | free | -| gitlab.it4i.cz | yes | ldap it4i | it4i.cz | Versions management<br>Project management<br>CI/CD<br>Tasks<br>Documentation | gitlab | IT4I | free | -| opencode.it4i.eu | no | ldap vsb<br>b2access<br>MyAccessID | it4i.eu | Versions management<br>Project management<br>CI/CD<br>Tasks<br>Documentation | gitlab | Lexis, OWS, Partners | free | -| openmm.it4i.eu | no | redirecting to opencode:<br>ldap vsb<br>b2access<br>MyAccessID | it4i.eu | Chat channels<br>Data sharing<br>Integration<br>Direct messages | gitlab | Lexis, OWS, Partners | free | -| sharing.office.it4i.cz | no | SSO<br>ldap vsb<br>MyAccessID | it4i.cz | Data sharing<br>Project work<br>\- Tasks<br>\- Milestones<br>\- Chat<br>Calendar<br>CRM<br>Collaborative writing | onlyoffice | Partners outside VSB | 110/150 - Counts for 30 days from file open;<br>returns to pool if not used in 30 days.<br>50ks/1000E | -| ext-folder.it4i.cz | no | ldap vsb<br>ldap it4i<br>MyAccessID | vsb.cz | Data sharing<br>draw.io<br>Forms | nextcloud | IT4I,<br>VSB users,<br>Partners outside VSB | free | diff --git a/content/docs/index.mdx b/content/docs/index.mdx deleted file mode 100644 index 2a3d4950e0a267bbc7a958412e817c762d217d05..0000000000000000000000000000000000000000 --- a/content/docs/index.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Documentation" ---- -Welcome to the IT4Innovations documentation. -The IT4Innovations National Supercomputing Center operates the [Karolina][1] and [Barbora][2] supercomputers. -The supercomputers are available to the academic community within the Czech Republic and Europe, and the industrial community worldwide. -The purpose of these pages is to provide comprehensive documentation of the hardware, software, and usage of the computers. - -## How to Read the Documentation - -1. Select the subject of interest from the left column or use the Search tool in the upper right corner. -1. Scan for all the notes and reminders on the page. -1. If more information is needed, read the details and **look for examples** illustrating the concepts. - -## Required Proficiency - -<Callout> - Basic proficiency in Linux environments is required. -</Callout> - -In order to use the system for your calculations, you need basic proficiency in Linux environments. -To gain this proficiency, we recommend you read the [introduction to Linux][a] operating system environments, -and install a Linux distribution on your personal computer. -For example, the [CentOS][b] distribution is similar to systems on the clusters at IT4Innovations and it is easy to install and use, -but any Linux distribution would do. - -<Callout> - Learn how to parallelize your code. -</Callout> - -In many cases, you will run your own code on the cluster. -In order to fully exploit the cluster, you will need to carefully consider how to utilize all the cores available on the node -and how to use multiple nodes at the same time. -You need to **parallelize** your code. -Proficiency in MPI, OpenMP, CUDA, UPC, or GPI2 programming may be gained via [training provided by IT4Innovations][c]. - -## Terminology Frequently Used on These Pages - -* **node:** a computer, interconnected via a network to other computers – Computational nodes are powerful computers, designed for, and dedicated to executing demanding scientific computations. -* **core:** a processor core, a unit of processor, executing computations -* **node-hour:** a metric of computer utilization, [see definition][3]. -* **job:** a calculation running on the supercomputer – the job allocates and utilizes the resources of the supercomputer for certain time. -* **HPC:** High Performance Computing -* **HPC (computational) resources:** nodehours, storage capacity, software licenses -* **code:** a program -* **primary investigator (PI):** a person responsible for execution of computational project and utilization of computational resources allocated to that project -* **collaborator:** a person participating in the execution of a computational project and utilization of computational resources allocated to that project -* **project:** a computational project under investigation by the PI – the project is identified by the project ID. Computational resources are allocated and charged per project. -* **jobscript:** a script to be executed by the Slurm workload manager - -## Conventions - -In this documentation, you will find a number of examples. -We use the following conventions: - -Cluster command prompt: - -```console -$ -``` - -Your local Linux host command prompt: - -```console -local $ -``` - -## Errors - -Although we have taken every care to ensure the accuracy of the content, mistakes do happen. -If you find an inconsistency or error, please report it by visiting [support][d], creating a new ticket, and entering the details. -By doing so, you can save other readers from frustration and help us improve. - -[1]: karolina/introduction.md -[2]: barbora/introduction.md -[3]: general/resources-allocation-policy.md#resource-accounting-policy - -[a]: http://www.tldp.org/LDP/intro-linux/html/ -[b]: http://www.centos.org/ -[c]: https://www.it4i.cz/en/education/training-activities -[d]: http://support.it4i.cz/rt diff --git a/content/docs/job-features.mdx b/content/docs/job-features.mdx deleted file mode 100644 index fdcdcc9447abda35cc143c3f0109400d33afcf34..0000000000000000000000000000000000000000 --- a/content/docs/job-features.mdx +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: "Job Features" ---- -Special features installed/configured on the fly on allocated nodes, features are requested in Slurm job using specially formatted comments. - -```console -$ salloc... --comment "use:feature=req" -``` - -or - -``` -SBATCH --comment "use:feature=req" -``` - -or for multiple features - -```console -$ salloc ... --comment "use:feature1=req1 use:feature2=req2 ..." -``` - -where `feature` is a feature name and `req` is a requested value (`true`, `version string`, etc.) - -## Xorg - -[Xorg][2] is a free and open source implementation of the X Window System imaging server maintained by the X.Org Foundation. Xorg is available only for Karolina accelerated nodes Acn[01-72]. - -```console -$ salloc ... --comment "use:xorg=True" -``` - -## VTune Support - -Load the VTune kernel modules. - -```console -$ salloc ... --comment "use:vtune=version_string" -``` - -`version_string` is VTune version e.g. 2019_update4 - -## Global RAM Disk - -<Callout type=warn> - The feature has not been implemented on Slurm yet. -<Callout> - -The Global RAM disk deploys BeeGFS On Demand parallel filesystem, -using local (i.e. allocated nodes') RAM disks as a storage backend. - -The Global RAM disk is mounted at `/mnt/global_ramdisk`. - -```console -$ salloc ... --comment "use:global_ramdisk=true" -``` - - - -### Example - -```console -$ sbatch -A PROJECT-ID -p qcpu --nodes 4 --comment="use:global_ramdisk=true" ./jobscript -``` - -This command submits a 4-node job in the `qcpu` queue; -once running, a RAM disk shared across the 4 nodes will be created. -The RAM disk will be accessible at `/mnt/global_ramdisk` -and files written to this RAM disk will be visible on all 4 nodes. - -The file system is private to a job and shared among the nodes, -created when the job starts and deleted at the job's end. - -<Callout type=warn> - The Global RAM disk will be deleted immediately after the calculation end. - Users should take care to save the output data from within the jobscript. -</Callout> - -The files on the Global RAM disk will be equally striped across all the nodes, using 512k stripe size. -Check the Global RAM disk status: - -```console -$ beegfs-df -p /mnt/global_ramdisk -$ beegfs-ctl --mount=/mnt/global_ramdisk --getentryinfo /mnt/global_ramdisk -``` - -Use Global RAM disk in case you need very large RAM disk space. -The Global RAM disk allows for high performance sharing of data among compute nodes within a job. - -<Callout type=warn> - Use of Global RAM disk file system is at the expense of operational memory. -</Callout> - -| Global RAM disk | | -| ------------------ | --------------------------------------------------------------------------| -| Mountpoint | /mnt/global_ramdisk | -| Accesspoint | /mnt/global_ramdisk | -| Capacity | Barbora (Nx180)GB | -| User quota | none | - -N = number of compute nodes in the job. - -<Callout type=warn> - Available on Barbora nodes only. -</Callout> - -## MSR-SAFE Support - -Load a kernel module that allows saving/restoring values of MSR registers. -Uses [LLNL MSR-SAFE][a]. - -```console -$ salloc ... --comment "use:msr=version_string" -``` - -`version_string` is MSR-SAFE version e.g. 1.4.0 - -<Callout type=error> - Hazardous, it causes CPU frequency disruption. -</Callout> - -<Callout type=warn> - Available on Barbora nodes only. -</Callout> - -## HDEEM Support - -Load the HDEEM software stack. The [High Definition Energy Efficiency Monitoring][b] (HDEEM) library is a software interface used to measure power consumption of HPC clusters with bullx blades. - -```console -$ salloc ... --comment "use:hdeem=version_string" -``` - -`version_string` is HDEEM version e.g. 2.2.8-1 - -<Callout type=warn> - Available on Barbora nodes only. -</Callout> - -## NVMe Over Fabrics File System - -<Callout type=warn> - The feature has not been implemented on Slurm yet. -</Callout> - -Attach a volume from an NVMe storage and mount it as a file-system. File-system is mounted on /mnt/nvmeof (on the first node of the job). -Barbora cluster provides two NVMeoF storage nodes equipped with NVMe disks. Each storage node contains seven 1.6TB NVMe disks and provides net aggregated capacity of 10.18TiB. Storage space is provided using the NVMe over Fabrics protocol; RDMA network i.e. InfiniBand is used for data transfers. - -```console -$ salloc ... --comment "use:nvmeof=size" -``` - -`size` is a size of the requested volume, size conventions are used, e.g. 10t - -Create a shared file-system on the attached NVMe file-system and make it available on all nodes of the job. Append `:shared` to the size specification, shared file-system is mounted on /mnt/nvmeof-shared. - -```console -$ salloc ... --comment "use:nvmeof=size:shared" -``` - -For example: - -```console -$ salloc ... --comment "use:nvmeof=10t:shared" -``` - -<Callout type=warn> - Available on Barbora nodes only. -</Callout> - -## Smart Burst Buffer - -<Callout type=warn> - The feature has not been implemented on Slurm yet. -</Callout> - -Accelerate SCRATCH storage using the Smart Burst Buffer (SBB) technology. A specific Burst Buffer process is launched and Burst Buffer resources (CPUs, memory, flash storage) are allocated on an SBB storage node for acceleration (I/O caching) of SCRATCH data operations. The SBB profile file `/lscratch/$SLURM_JOB_ID/sbb.sh` is created on the first allocated node of job. For SCRATCH acceleration, the SBB profile file has to be sourced into the shell environment - provided environment variables have to be defined in the process environment. Modified data is written asynchronously to a backend (Lustre) filesystem, writes might be proceeded after job termination. - -Barbora cluster provides two SBB storage nodes equipped with NVMe disks. Each storage node contains ten 3.2TB NVMe disks and provides net aggregated capacity of 29.1TiB. Acceleration uses RDMA network i.e. InfiniBand is used for data transfers. - -```console -$ salloc ... --comment "use:sbb=spec: -``` - -`spec` specifies amount of resources requested for Burst Buffer (CPUs, memory, flash storage), available values are small, medium, and large - -Loading SBB profile: - -```console -$ source /lscratch/$SLURM_JOB_ID/sbb.sh -``` - -<Callout type=warn> - Available on Barbora nodes only. -</Callout> - -[1]: software/tools/virtualization.md#tap-interconnect -[2]: general/accessing-the-clusters/graphical-user-interface/xorg.md - -[a]: https://software.llnl.gov/news/2019/04/29/msrsafe-1.3.0/ -[b]: https://tu-dresden.de/zih/forschung/projekte/hdeem diff --git a/content/docs/karolina/compute-nodes.mdx b/content/docs/karolina/compute-nodes.mdx deleted file mode 100644 index 5bb323f2c6dd8b3bffd9782b64aa35c0fd72ab59..0000000000000000000000000000000000000000 --- a/content/docs/karolina/compute-nodes.mdx +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: "Compute Nodes" ---- -Karolina is a cluster of x86-64 AMD- and Intel-based nodes built with the HPE technology. The cluster contains four types of compute nodes. - -## Compute Nodes Without Accelerators - -Standard compute nodes without accelerators (such as GPUs or FPGAs) are based on the x86 CPU architecture and provide quick accessibility for the users and their existing codes. - -* 720 nodes -* 92,160 cores in total -* 2x AMD EPYC™ 7H12, 64-core, 2.6 GHz processors per node -* 256 GB DDR4 3200MT/s of physical memory per node -* 5,324.8 GFLOP/s per compute node -* 1x 100 Gb/s IB port -* Cn[001-720] - - - -## Compute Nodes With a GPU Accelerator - -Accelerated compute nodes deliver most of the compute power usable for HPC as well as excellent performance in HPDA and AI workloads, especially in the learning phase of Deep Neural Networks. - -* 72 nodes -* 9,216 cores in total -* 2x AMD EPYC™ 7763, 64-core, 2.45 GHz processors per node -* 1024 GB DDR4 3200MT/s of physical memory per node -* 8x GPU accelerator NVIDIA A100 per node, 320GB HBM2 memory per node -* 5,017.6 GFLOP/s per compute node -* 4x 200 Gb/s IB port -* Acn[01-72] - - - -## Data Analytics Compute Node - -Data analytics compute node is oriented on supporting huge memory jobs by implementing a NUMA SMP system with large cache coherent memory. - -* 1x HPE Superdome Flex server -* 768 cores in total -* 32x Intel® Xeon® Platinum, 24-core, 2.9 GHz, 205W -* 24 TB DDR4 2993MT/s of physical memory per node -* 2x 200 Gb/s IB port -* 71.2704 TFLOP/s -* Sdf1 - - - -## Cloud Compute Node - -Cloud compute nodes support both the research and operation of the Infrastructure/HPC as a Service. It is intended for provision and operation of cloud technologies like OpenStack and Kubernetes. - -* 36 nodes -* 4,608 cores in total -* 2x AMD EPYC™ 7H12, 64-core, 2.6 GHz processors per node -* 256 GB DDR4 3200MT/s of physical memory per node -* HPE ProLiant XL225n Gen10 Plus servers -* 5,324.8 GFLOP/s per compute node -* 2x 10 Gb/s Ethernet -* 1x 100 Gb/s IB port -* CLn[01-36] - -## Compute Node Summary - -| Node type | Count | Range | Memory | Cores | -| ---------------------------- | ----- | ------------ | ------- | -------------- | -| Nodes without an accelerator | 720 | Cn[001-720] | 256 GB | 128 @ 2.6 GHz | -| Nodes with a GPU accelerator | 72 | Acn[01-72] | 1024 GB | 128 @ 2.45 GHz | -| Data analytics nodes | 1 | Sdf1 | 24 TB | 768 @ 2.9 GHz | -| Cloud partiton | 36 | CLn[01-36] | 256 GB | 128 @ 2.6 GHz | | - -## Processor Architecture - -Karolina is equipped with AMD EPYC™ 7H12 (nodes without accelerators, Cloud partiton), AMD EPYC™ 7763 (nodes with accelerators), and Intel Cascade Lake Xeon-SC 8268 (Data analytics partition). - -### AMD [Epyc™ 7H12][d] - -EPYC™ 7H12 is a 64-bit 64-core x86 server microprocessor designed and introduced by AMD in late 2019. This multi-chip processor, which is based on the Zen 2 microarchitecture, incorporates logic fabricated TSMC 7 nm process and I/O fabricated on GlobalFoundries 14 nm process. The 7H12 has a TDP of 280 W with a base frequency of 2.6 GHz and a boost frequency of up to 3.3 GHz. This processor supports up to two-way SMP and up to 4 TiB of eight channels DDR4-3200 memory per socket. - -* **Family**: EPYC™ -* **Cores**: 64 -* **Threads**: 128 -* **L1I Cache**: 2 MiB, 64x32 KiB, 8-way set associative -* **L1D Cache**: 2 MiB, 64x32 KiB, 8-way set associative -* **L2 Cache**: 32 MiB, 64x512 KiB, 8-way set associative, write-back -* **L3 Cache**: 256 MiB, 16x16 MiB -* **Instructions**: x86-16, x86-32, x86-64, MMX, EMMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX, AVX2, AES, CLMUL, RdRanD, FMA3, F16C, ABM, BMI1, BMI2, AMD-Vi, AMD-V, SHA, ADX, Real, Protected, SMM, FPU, NX, SMT, SME, TSME, SEV, SenseMI, Boost2 -* **Frequency**: 2.6 GHz -* **Max turbo**: 3.3 GHz -* **Process**: 7 nm, 14 nm -* **TDP**: 280 W - -### AMD [Epyc™ 7763][e] - -EPYC 7763 is a 64-bit 64-core x86 server microprocessor designed and introduced by AMD in March 2021. This multi-chip processor, which is based on the Zen 3 microarchitecture, incorporates eight Core Complex Dies fabricated on a TSMC advanced 7 nm process and a large I/O die manufactured by GlobalFoundries. The 7763 has a TDP of 280 W with a base frequency of 2.45 GHz and a boost frequency of up to 3.5 GHz. This processor supports up to two-way SMP and up to 4 TiB of eight channel DDR4-3200 memory per socket. - -* **Family**: EPYC™ -* **Cores**: 64 -* **Threads**: 128 -* **L1I Cache**: 2 MiB, 64x32 KiB, 8-way set associative, write-back -* **L1D Cache**: 2 MiB, 64x32 KiB, 8-way set associative, write-back -* **L2 Cache**: 32 MiB, 64x512 KiB, 8-way set associative, write-back -* **L3 Cache**: 256 MiB, 8x32 MiB, 16-way set associative, write-back -* **Instructions**: x86-16, x86-32, x86-64, MMX, EMMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX, AVX2, AES, CLMUL, RdRanD, FMA3, F16C, ABM, BMI1, BMI2, AMD-Vi, AMD-V, SHA, ADX, Real, Protected, SMM, FPU, NX, SMT, SME, TSME, SEV, SenseMI -* **Frequency**: 2.45 GHz -* **Max turbo**: 3.5 GHz -* **Process**: 7 nm -* **TDP**: 280 W - -### Intel [Skylake Platinum 8268][f] - -Xeon Platinum 8268 is a 64-bit 24-core x86 high-performance server microprocessor introduced by Intel in early 2019. The Platinum 8268 is based on the Cascade Lake microarchitecture and is manufactured on a 14 nm process. This chip supports 8-way multiprocessing, sports 2 AVX-512 FMA units as well as three Ultra Path Interconnect links. This microprocessor supports up 1 TiB of hexa-channel DDR4-2933 memory, operates at 2.9 GHz with a TDP of 205 W and features a turbo boost frequency of up to 3.9 GHz. - -* **Family**: Xeon Platinum -* **Cores**: 24 -* **Threads**: 48 -* **L1I Cache**: 768 KiB, 24x32 KiB, 8-way set associative -* **L1D Cache**: 768 KiB, 24x32 KiB, 8-way set associative, write-back -* **L2 Cache**: 24 MiB, 24x1 MiB, 16-way set associative, write-back -* **L3 Cache**: 35.75 MiB, 26x1.375 MiB, 11-way set associative, write-back -* **Instructions**: x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA3, F16C, BMI, BMI2, VT-x, VT-d, TXT, TSX, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVE, SGX, MPX, AVX-512 -* **Frequency**: 2.9 GHz -* **Max turbo**: 3.9 GHz -* **Process**: 14 nm -* **TDP**: 205 W - -## GPU Accelerator - -Karolina is equipped with an [NVIDIA A100][g] accelerator. - -|NVIDIA A100|| -| --- | --- | -| GPU Architecture | NVIDIA Ampere | -| NVIDIA Tensor| Cores: 432 | -| NVIDIA CUDA® Cores | 6912 | -| Double-Precision Performance | 9.7 TFLOP/s | -| Single-Precision Performance | 19.5 TFLOP/s | -| Tensor Performance | 312 TFLOP/s | -| GPU Memory | 40 GB HBM2 | -| Memory Bandwidth | 1555 GB/sec | -| ECC | Yes | -| Interconnect Bandwidth | 600 GB/sec | -| System Interface | NVIDIA NVLink | -| Form Factor | SXM4 | (sxm 8?) -| Max Power Consumption | 400 W | -| Thermal Solution | Passive | -| Compute APIs | CUDA, DirectCompute,OpenCLTM, OpenACC | (?) - -[c]: https://en.wikichip.org/wiki/x86/avx512vnni -[d]: https://en.wikichip.org/wiki/amd/epyc/7h12 -[e]: https://en.wikichip.org/wiki/amd/epyc/7763 -[f]: https://en.wikichip.org/wiki/intel/xeon_platinum/8268 -[g]: https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/a100/pdf/a100-80gb-datasheet-update-nvidia-us-1521051-r2-web.pdf diff --git a/content/docs/karolina/hardware-overview.mdx b/content/docs/karolina/hardware-overview.mdx deleted file mode 100644 index 92def247bf9244a7076e0b1615c049dc588296c6..0000000000000000000000000000000000000000 --- a/content/docs/karolina/hardware-overview.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Hardware Overview" ---- -Karolina consists of 829 computational nodes of which 720 are universal compute nodes (**Cn[001-720]**), 72 are NVIDIA A100 accelerated nodes (**Acn[01-72]**), 1 is a data analytics node (**Sdf1**), and 36 are cloud partitions (**CLn[01-36]**). Each node is a powerful x86-64 computer, equipped with 128/768 cores (64-core AMD EPYC™ 7H12 / 64-core AMD EPYC™ 7763 / 24-core Intel Xeon-SC 8268) and at least 256 GB of RAM. - -[User access][5] to Karolina is provided by four login nodes **login[1-4]**. The nodes are interlinked through high speed InfiniBand and Ethernet networks. - -The Accelerated nodes, Data analytics node, and Cloud nodes are available [upon request][a] from a PI. For more information about accessing the nodes, see also the [Resources Allocation Policy][2] section. - -For more technical information, see the [Compute Nodes][1] section. - -The parameters are summarized in the following tables: - -| **In general** | | -| ------------------------------------------- | ---------------------------------------------- | -| Primary purpose | High Performance Computing | -| Architecture of compute nodes | x86-64 | -| Operating system | Linux | -| **Compute nodes** | | -| Total | 829 | -| Processor cores | 128/768 (2x64 cores/32x24 cores) | -| RAM | min. 256 GB | -| Local disk drive | no | -| Compute network | InfiniBand HDR | -| Universal compute node | 720, Cn[001-720] | -| Accelerated compute nodes | 72, Acn[01-72] | -| Data analytics compute nodes | 1, Sdf1 | -| Cloud compute nodes | 36, CLn[01-36] | -| **In total** | | -| Total theoretical peak performance (Rpeak) | 15.7 PFLOP/s | -| Total amount of RAM | 313 TB | - -| Node | Processor | Memory | Accelerator | -| ------------------------ | --------------------------------------- | ------ | ---------------------------- | -| Universal compute node | 2 x AMD Zen 2 EPYC™ 7H12, 2.6 GHz | 256 GB | - | -| Accelerated compute node | 2 x AMD Zen 3 EPYC™ 7763, 2.45 GHz | 1024 GB | 8 x NVIDIA A100 (40 GB HBM2) | -| Data analytics node | 32 x Intel Xeon-SC 8268, 2.9 GHz | 24 TB | - | -| Cloud compute node | 2 x AMD Zen 2 EPYC™ 7H12, 2.6 GHz | 256 GB | - | - -[1]: compute-nodes.md -[2]: ../general/resources-allocation-policy.md -[3]: network.md -[4]: storage.md -[5]: ../general/shell-and-data-access.md -[6]: visualization.md - -[a]: https://support.it4i.cz/rt diff --git a/content/docs/karolina/introduction.mdx b/content/docs/karolina/introduction.mdx deleted file mode 100644 index 394af33a777b4dde56dff7f5027fc590f71ca4b6..0000000000000000000000000000000000000000 --- a/content/docs/karolina/introduction.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Introduction" ---- -Karolina is the latest and most powerful supercomputer cluster built for IT4Innovations in Q2 of 2021. The Karolina cluster consists of 829 compute nodes, totaling 106,752 compute cores with 313 TB RAM, giving over 15.7 PFLOP/s theoretical peak performance. - -Nodes are interconnected through a fully non-blocking fat-tree InfiniBand network, and are equipped with AMD Zen 2, Zen 3, and Intel Cascade Lake architecture processors. Seventy two nodes are also equipped with NVIDIA A100 accelerators. Read more in [Hardware Overview][1]. - -The cluster runs with an operating system compatible with the Red Hat [Linux family][a]. We have installed a wide range of software packages targeted at different scientific domains. These packages are accessible via the [modules environment][2]. - -The user data shared file system and job data shared file-system are available to users. - -The [Slurm][b] workload manager provides [computing resources allocations and job execution][3]. - -Read more on how to [apply for resources][4], [obtain login credentials][5] and [access the cluster][6]. - -[1]: hardware-overview.md -[2]: ../environment-and-modules.md -[3]: ../general/job-submission-and-execution.md -[4]: ../general/applying-for-resources.md -[5]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[6]: ../general/shell-and-data-access.md - -[a]: http://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg -[b]: https://slurm.schedmd.com/ diff --git a/content/docs/karolina/meta.json b/content/docs/karolina/meta.json deleted file mode 100644 index aa403d164cddaeaf6d54f56c6285a5bc6cb76e6a..0000000000000000000000000000000000000000 --- a/content/docs/karolina/meta.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "Karolina", - "pages": [ - "compute-nodes", - "hardware-overview", - "introduction", - "network", - "storage", - "visualization" - ] -} diff --git a/content/docs/karolina/network.mdx b/content/docs/karolina/network.mdx deleted file mode 100644 index d90d068548127b3fe61590d249e044b4a8d78151..0000000000000000000000000000000000000000 --- a/content/docs/karolina/network.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Network" ---- -All of the compute and login nodes of Karolina are interconnected through an [InfiniBand][a] HDR 200Gbps network and a gigabit ethernet network. - -The compute network is configured as a non-blocking Fat Tree which consists of 60 x 40-ports Mellanox Quantum™ HDR switches (40 Leaf HDR switches and 20 Spine HDR switches). - -<br>*For a higher resolution, open the image in a new browser tab.* - -Compute nodes and the service infrastructure is connected by the HDR100 technology that allows one 200Gbps HDR port (aggregation 4x 50Gbps) divided into 2 HDR100 ports with 100Gbps (2x 50Gbps) bandwidth. The cabling between the L1 and L2 layer is realized by HDR cabling, connecting the end devices is realized by so called Y or splitter cable (1x HDR200 - 2x HDR100). - -**The compute network has the following parameters** - -* 100Gbps -* Latencies less than 10 microseconds (0.6ÎĽs end-to-end, <90ns switch hop) -* Adaptive routing support -* MPI communication support -* IP protocol support (IPoIB) -* Support for SCRATCH Data Storage and NVMe over Fabric Data Storage. - -## Mellanox Quantum™ QM8790 40-Ports Switch - -[Mellanox][b] provides the world’s smartest switch, enabling in-network computing through the Co-Design Scalable Hierarchical Aggregation and Reduction Protocol (SHARP)™ technology. -QM8790 has the highest fabric performance available in the market with up to 16Tb/s of non-blocking bandwidth with sub-130ns port-to-port latency. - -**Performance** - -* 40 x HDR200 200Gb/s ports in a 1U switch -* 80 x HDR100 100Gb/s ports (using splitter cables) -* 16Tb/s aggregate switch throughput -* Sub-130ns switch latency – Optimized design - -**Optimized Design** - -* 1+1 redundant & hot-swappable power -* N+1 redundant & hot-swappable fans -* 80 gold+ and energy star certified power supplies - -**Advanced Design** - -* Adaptive routing -* Congestion control -* Collective offloads (Mellanox SHARP™ technology) -* VL mapping (VL2VL) - -[a]: http://en.wikipedia.org/wiki/InfiniBand -[b]: https://network.nvidia.com/files/doc-2020/pb-qm8790.pdf diff --git a/content/docs/karolina/storage.mdx b/content/docs/karolina/storage.mdx deleted file mode 100644 index e48f38d1b8f4140e7dca102fd6cb8bdc30fc8e13..0000000000000000000000000000000000000000 --- a/content/docs/karolina/storage.mdx +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: "Storage" ---- -Karolina cluster provides two main shared filesystems, [HOME filesystem][1] and [SCRATCH filesystem][2], and has access to IT4Innovations' central PROJECT storage, as well. All login and compute nodes may access the same data on shared file systems. Compute nodes are also equipped with local (non-shared) scratch, RAM disk, and TMP file systems. - -## Archiving - -Shared filesystems should not be used as a backup for large amount of data or long-term data storage. The academic staff and students of research institutions in the Czech Republic can use the [CESNET storage][6] service, which is available via SSHFS. - -### HOME File System - -The HOME filesystem is an HA cluster of two active-passive NFS servers. This filesystem contains users' home directories `/home/username`. Accessible capacity is 31 TB, shared among all users. Individual users are restricted by filesystem usage quotas, set to 25 GB per user. Should 25 GB prove insufficient, contact [support][d], the quota may be increased upon request. - -<Callout> - The HOME filesystem is intended for preparation, evaluation, processing and storage of data generated by active projects. -</Callout> - -The files on HOME filesystem will not be deleted until the end of the [user's lifecycle][4]. - -The filesystem is backed up, so that it can be restored in case of a catastrophic failure resulting in significant data loss. However, this backup is not intended to restore old versions of user data or to restore deleted files. - -| HOME filesystem | | -| -------------------- | ------------------------------ | -| Mountpoint | /home/username | -| Capacity | 31 TB | -| Throughput | 1.93 GB/s write, 3.1 GB/s read | -| User space quota | 25 GB | -| User inodes quota | 500 k | -| Protocol | NFS | - - Configuration of the storage: - -**2x NFS server HPE ProLiant DL325 Gen10 Plus** - -* 1x AMD EPYC 7302P (3.0GHz/16-core/155W) -* 8x 16GB (1x16GB) Dual Rank x8 DDR4-3200 CAS-22-22-22 -* 2x 240GB SATA 6G Read Intensive SFF (2.5in) SC SSD – (HW RAID1) -* 1x Smart Array E208i-a SR Gen10 (No Cache) 12G SAS Modular LH Controller -* 1x HPE SN1100Q 16Gb Dual Port Fibre Channel Host Bus Adapter -* 1x Intel I350-T4 Ethernet 1Gb 4-port BASE-T OCP3 Adapter -* ILO5 -* 1x InfiniBand HDR100/Ethernet 100Gb 2-port QSFP56 PCIe4 x16 MCX653106A-ECAT Adapter -* 2x 500W Flex Slot Platinum Hot Plug Low Halogen Power Supply Kit -* OS: Red Hat Enterprise Linux Server - -**1x Storage array HPE MSA 2060 16Gb Fibre Channel SFF Storage** - -* 1x Base MSA 2060 SFF Storage Drive Enclosure -* 22x MSA 1.92TB SAS 12G SFF (2.5in) M2 SSD -* 1x MSA 16Gb Short Wave Fibre Channel SFP+ 4-pack Transceiver -* Dual-controller, 4x 16Gb FC host interface -* LAN connectivity 2x 1Gb/s -* Redundant, hot-swap power supplies - -### SCRATCH File System - -The SCRATCH filesystem is realized as a parallel Lustre filesystem. It is accessible via the Infiniband network and is available from all login and compute nodes. Extended ACLs are provided on the Lustre filesystems for sharing data with other users using fine-grained control. For basic information about Lustre, see the [Understanding the Lustre Filesystems][7] subsection of the Barbora's storage documentation. - -The SCRATCH filesystem is mounted in the `/scratch/project/PROJECT_ID` directory created automatically with the `PROJECT_ID` project. Accessible capacity is 1000 TB, shared among all users. Users are restricted by PROJECT quotas set to 20 TB. The purpose of this quota is to prevent runaway programs from filling the entire filesystem and deny service to other users. Should 20 TB prove insufficient, contact [support][d], the quota may be increased upon request. - -To find out current SCRATCH quotas, use: - -```code -[usr0123@login1.karolina ~]$ getent group OPEN-XX-XX -open-xx-xx:*:1234:user1,...,usern - -[usr0123@login1.karolina ~]$ lfs quota -p 1234 /scratch/ -Disk quotas for prj 1234 (pid 1234): -Filesystem kbytes quota limit grace files quota limit grace -/scratch/ 14356700796 0 19531250000 - 82841 0 20000000 - -``` - -<Callout> - The Scratch filesystem is intended for temporary scratch data generated during the calculation as well as for high-performance access to input and output files. All I/O intensive jobs must use the SCRATCH filesystem as their working directory. - - Users are advised to save the necessary data from the SCRATCH filesystem to HOME filesystem after the calculations and clean up the scratch files. -</Callout> - -<Callout type=warn> - Files on the SCRATCH filesystem that are **not accessed for more than 90 days** will be automatically **deleted**. -</Callout> - -| SCRATCH filesystem | | -| -------------------- | ---------------------------------- | -| Mountpoint | /scratch | -| Capacity | 1361 TB | -| Throughput | 730.9 GB/s write, 1198.3 GB/s read | -| PROJECT quota | 20 TB | -| PROJECT inodes quota | 20 M | -| Default stripe size | 1 MB | -| Default stripe count | 1 | -| Protocol | Lustre | - -Configuration of the storage: - -**1x SMU - ClusterStor 2U/24 System Management Unit Storage Controller** - -* 5x Cray ClusterStor 1.6TB NVMe x4 Lanes Mixed Use SFF (2.5in) U.2 with Carrier -* 2x Cray ClusterStor InfiniBand HDR/Ethernet 200Gb 1-port QSFP PCIe4 Adapter (Mellanox ConnectX-6) - -**1x MDU - ClusterStor 2U/24 Metadata Unit Storage Controller** - -* 24x Cray ClusterStor 1.6TB NVMe x4 Lanes Mixed Use SFF (2.5in) U.2 with Carrier -* 2x Cray ClusterStor InfiniBand HDR/Ethernet 200Gb 1-port QSFP PCIe4 Adapter (Mellanox ConnectX-6) - -**24x SSU-F - ClusterStor 2U24 Scalable Storage Unit Flash Storage Controller** - -* 24x Cray ClusterStor 3.2TB NVMe x4 Lanes Mixed Use SFF (2.5in) U.2 with Carrier -* 4x Cray ClusterStor InfiniBand HDR/Ethernet 200Gb 1-port QSFP PCIe4 Adapter (Mellanox ConnectX-6) - -**2x LMN - Aruba 6300M 48-port 1GbE** - -* Aruba X371 12VDC 250W 100-240VAC Power-to-Port Power Supply - -### PROJECT File System - -The PROJECT data storage is a central storage for projects' and users' data at IT4Innovations that is accessible from all clusters. -For more information, see the [PROJECT Data Storage][9] section. - -### Disk Usage and Quota Commands - -For more information about disk usage and user quotas, see the Barbora's [storage section][8]. - -### Extended ACLs - -Extended ACLs provide another security mechanism beside the standard POSIX ACLs, which are defined by three entries (for owner/group/others). Extended ACLs have more than the three basic entries. In addition, they also contain a mask entry and may contain any number of named user and named group entries. - -ACLs on a Lustre file system work exactly like ACLs on any Linux file system. They are manipulated with the standard tools in the standard manner. - -For more information, see the [Access Control List][10] section of the documentation. - -## Local Filesystems - -### TMP - -Each node is equipped with a local `/tmp` directory of few GB capacity. The `/tmp` directory should be used to work with small temporary files. Old files in the `/tmp` directory are automatically purged. - -## Summary - -| Mountpoint | Usage | Protocol | Net Capacity | Throughput | Limitations | Access | Services | | -| ---------- | ------------------------- | -------- | -------------- | ---------- | ----------- | ----------------------- | --------------------------- | ------ | -| /home | home directory | NFS | 31 TB | 1.93 GB/s write, 3.1 GB/s read | Quota 25 GB | Compute and login nodes | backed up | | -| /scratch | cluster shared jobs' data | Lustre | 1361 TB | 730.9 GB/s write, 1198.3 GB/s read | Quota 20 TB| Compute and login nodes | files older 90 days removed | | -| /tmp | local temporary files | local | ------ | ------- | none | Compute / login nodes | auto | purged | - -[1]: #home-file-system -[2]: #scratch-file-system -[4]: ../general/obtaining-login-credentials/obtaining-login-credentials.md -[5]: #project-file-system -[6]: ../storage/cesnet-storage.md -[7]: ../barbora/storage.md#understanding-the-lustre-filesystems -[8]: ../barbora/storage.md#disk-usage-and-quota-commands -[9]: ../storage/project-storage.md -[10]: ../storage/standard-file-acl.md - -[a]: http://www.nas.nasa.gov -[b]: http://www.nas.nasa.gov/hecc/support/kb/Lustre_Basics_224.html#striping -[c]: http://doc.lustre.org/lustre_manual.xhtml#managingstripingfreespace -[d]: https://support.it4i.cz/rt -[e]: http://man7.org/linux/man-pages/man1/nfs4_setfacl.1.html -[l]: http://man7.org/linux/man-pages/man1/nfs4_getfacl.1.html diff --git a/content/docs/karolina/visualization.mdx b/content/docs/karolina/visualization.mdx deleted file mode 100644 index 4c0f42375bef57a8acc5f46ff3bbda92dee4b276..0000000000000000000000000000000000000000 --- a/content/docs/karolina/visualization.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Visualization Servers" ---- -Karolina includes two nodes for remote visualization with [VirtualGL 2][3] and TurboVNC 2. - -* 64 cores in total -* 2x AMD EPYC™ 7452 32-core, 2.35 GHz processors per node -* 256GiB DDR4 RAM, 3200MT/s, ECC of physical memory per node (12x 16 GB) -* HPE ProLiant DL385 Gen10 Plus servers -* 2406.4 GFLOP/s per compute node -* NVIDIA Quadro RTX 6000 card with OpenGL support -* 2x 100 Gb/s Ethernet and 1x 1 Gb/s Ethernet -* 1x HDR 200 Gb/s IB port -* 2x SSD 480 GB in RAID1 - - - -## NVIDIA® Quadro RTX™ 6000 - -* GPU Memory: 24 GB GDDR6 -* Memory Interface: 384-bit -* Memory Bandwidth: Up to 672 GB/s -* NVIDIA® CUDA® Cores: 4,608 -* NVIDIA® Tensor Cores: 576 -* NVIDIA® RT Cores: 72 -* System Interface: PCI Express 3.0 x16 -* Max Power Consumption: 295 W -* Thermal Solution: Active -* Form Factor: 111 mm W x 267 mm L, Dual Slot, Full Height -* Display Connectors: 4x DP 1.4 + DVI-D DL -* Graphics APIs: Shader Model 5.1, OpenGL 4.6, DirectX 12.0, Vulkan 1.1, -* Compute APIs: CUDA, DirectCompute, OpenCL™ -* Floating-Point Performance-Single Precision: 16.3 TFLOP/s, Peak -* Tensor Performance: 130.5 TFLOP/s - - - -## Resource Allocation Policy - -| queue | active project | project resources | nodes | min ncpus | priority | authorization | walltime | -| ----- | -------------- | ----------------- | --------------------------------- | --------- | -------- | ------------- | -------- | -| qviz | yes | none required | 2 (with NVIDIA® Quadro RTX™ 6000) | 8 | 150 | no | 1h/8h | - -## References - -* [Graphical User Interface][1] -* [VPN Access][2] - -[1]: ../general/shell-and-data-access.md#graphical-user-interface -[2]: ../general/shell-and-data-access.md#vpn-access -[3]: ../software/viz/vgl.md diff --git a/content/docs/lumi/about.mdx b/content/docs/lumi/about.mdx deleted file mode 100644 index dd8aba07576ff60143fceb393c462f86dba9f63f..0000000000000000000000000000000000000000 --- a/content/docs/lumi/about.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "About LUMI" ---- -The European High-Performance Computing Joint Undertaking (EuroHPC JU) is pooling European resources -to develop top-of-the-range exascale supercomputers for processing big data, -based on competitive European technology. - -One of the pan-European pre-exascale supercomputers, [LUMI][1], is located in CSC’s data center in Kajaani, Finland. - -The supercomputer is hosted by the Large Unified Modern Infrastructure consortium. -The LUMI consortium countries are Finland, Belgium, the Czech Republic, -Denmark, Estonia, Iceland, Norway, Poland, Sweden, and Switzerland. - -LUMI is one of the world’s best-known scientific instruments for the lifespan of 2021–2027. - -## LUMI AI - -LUMI can assist users in migrating their machine learning applications from smaller-scale computing environments to LUMI. -For more information, see the [LUMI AI][c] subsection. - -## LUMI Software - -For the list of software modules installed on LUMI, -as well as direct links to documentation for some of the most used modules, -see the [LUMI Software][a] subsection. - -## LUMI Support - -LUMI offers general support, Czech national support, events, and training. -For more information, see the [LUMI Support][b] subsection. - -## Technical Reference - -For more information about how to access the LUMI supercomputer, -see the [official documentation][2]. - -[1]: https://lumi-supercomputer.eu/ -[2]: https://docs.lumi-supercomputer.eu/ - -[a]: software.md -[b]: support.md -[c]: lumiai.md \ No newline at end of file diff --git a/content/docs/lumi/lumiai.mdx b/content/docs/lumi/lumiai.mdx deleted file mode 100644 index 3773d7b77e32c7f0f07c5133c864fcd2569da0fb..0000000000000000000000000000000000000000 --- a/content/docs/lumi/lumiai.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "LUMI AI" ---- -LUMI can assist users in migrating their machine learning applications from smaller-scale computing environments to LUMI. - -## LUMI AI Guide - -The guide is available at [LUMI GitHub][1] page. -Note that the project is still work in progress and changes are made constantly. - -## Requirements - -Before proceeding, please ensure you meet the following prerequisites: - -* A basic understanding of machine learning concepts and Python programming. This guide will focus primarily on aspects specific to training models on LUMI. -* An active user account on LUMI and familiarity with its basic operations. -* If you wish to run the included examples, you need to be part of a project with GPU hours on LUMI. - -## Examples - -For examples visit [LUMI AI workshop][2]. - -[1]: https://github.com/Lumi-supercomputer/LUMI-AI-Guide/blob/main/README.md -[2]: https://github.com/Lumi-supercomputer/Getting_Started_with_AI_workshop \ No newline at end of file diff --git a/content/docs/lumi/meta.json b/content/docs/lumi/meta.json deleted file mode 100644 index cbf44ca7b580edcea8262f39b7a2bc77391fd8f9..0000000000000000000000000000000000000000 --- a/content/docs/lumi/meta.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "Lumi", - "pages": [ - "about", - "lumiai", - "openfoam", - "pytorch", - "software", - "support" - ] -} diff --git a/content/docs/lumi/openfoam.mdx b/content/docs/lumi/openfoam.mdx deleted file mode 100644 index f66397835d3398b32ccc9a715d13ffe8237a56e5..0000000000000000000000000000000000000000 --- a/content/docs/lumi/openfoam.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "OpenFoam" ---- -OpenFOAM is a free, open source CFD software package. -OpenFOAM has an extensive range of features to solve anything -from complex fluid flows involving chemical reactions, turbulence and heat transfer, to solid dynamics and electromagnetics. - -## CSC Installed Software Collection - -- [https://docs.lumi-supercomputer.eu/software/local/csc/][2] -- [https://docs.csc.fi/apps/openfoam/][3] - -## Install 32bit/64bit - -<Callout type=warn> - There is a very small quota for maximum number of files on LUMI: - projappl (100K), scratch (2.0M), flash (1.0M) - check: `lumi-quota`. -</Callout> - -``` -#!/bin/bash - -SCRATCH="/pfs/lustre..." - -cd $SCRATCH -mkdir -p openfoam -cd openfoam - -export EBU_USER_PREFIX=$PWD/easybuild/lumi-c-23.09 -module load LUMI/23.09 partition/container EasyBuild-user - -#32bit - use eb file from this repository -#eb OpenFOAM-v2312-cpeGNU-23.09.eb -r - -#64bit - use eb file from this repository -eb eb/OpenFOAM-v2312-64bit-cpeGNU-23.09.eb -r -``` - -## Run 32bit/64bit - -``` -#!/bin/bash - -SCRATCH="/pfs/lustre..." - -cd $SCRATCH/openfoam - -export EBU_USER_PREFIX=$PWD/easybuild/lumi-c-23.09 -module load LUMI/23.09 partition/container EasyBuild-user -ml OpenFOAM/v2312-cpeGNU-23.09-64bit - -#32bit -#source $EBROOTOPENFOAM/etc/bashrc WM_COMPILER=Cray WM_MPLIB=CRAY-MPICH - -#64bit -source $EBROOTOPENFOAM/etc/bashrc WM_COMPILER=Cray WM_MPLIB=CRAY-MPICH WM_LABEL_SIZE=64 - -OPENFOAM_PROJECT="/pfs/lustre..." -cd $OPENFOAM_PROJECT - -srun -n 1 blockMesh -srun -n 1 decomposePar - -srun -n $SLURM_NTASKS snappyHexMesh -overwrite -parallel | tee log.snappy -srun -n $SLURM_NTASKS createPatch -overwrite -parallel | tee log.createPatch -srun -n $SLURM_NTASKS transformPoints -scale '(0.01 0.01 0.01)' -parallel | tee log.transformPoint -srun -n $SLURM_NTASKS renumberMesh -overwrite -parallel | tee log.renum -srun -n $SLURM_NTASKS pimpleFoam -parallel | tee log.pimpleFoam1 -``` - -## License - -OpenFOAM is the free, open source CFD software developed primarily by OpenCFD Ltd since 2004. -OpenCFD Ltd, owner of the OpenFOAM Trademark, is a wholly owned subsidiary of ESI Group. - -ESI-OpenCFD produces the OpenFOAM® open source CFD toolbox and distributes freely -via [https://www.openfoam.com/][1]. OpenCFD Ltd was established in 2004 to coincide with -the release of its OpenFOAM software under general public license. - -OpenFOAM is distributed under the GPL v3 license. - -## References - -- Homepage: [http://www.openfoam.com/][1] - -[1]: https://www.openfoam.com/ -[2]: https://docs.lumi-supercomputer.eu/software/local/csc/ -[3]: https://docs.csc.fi/apps/openfoam/ diff --git a/content/docs/lumi/pytorch.mdx b/content/docs/lumi/pytorch.mdx deleted file mode 100644 index 3507621f6c08e73fde8078a583a833e0fbd7e75f..0000000000000000000000000000000000000000 --- a/content/docs/lumi/pytorch.mdx +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: "PyTorch" ---- -## PyTorch Highlight - -* Official page: [https://pytorch.org/][1] -* Code: [https://github.com/pytorch/pytorch][2] -* Python-based framework for machine learning - * Auto-differentiation on tensor types -* Official LUMI page: [https://lumi-supercomputer.github.io/LUMI-EasyBuild-docs/p/PyTorch/][3] - * **Warning:** be careful where the SIF image is installed or copied ($HOME is not recommended for quota reasons). For EasyBuild you must specify the installation path: `export EBU_USER_PREFIX=/project/project_XXXX/EasyBuild`. - -## CSC Installed Software Collection - -* [https://docs.csc.fi/support/tutorials/ml-multi/][8] -* [https://docs.lumi-supercomputer.eu/software/local/csc/][9] -* [https://docs.csc.fi/apps/pytorch/][10] - -## PyTorch Install - -### Base Environment - -```console -module purge -module load CrayEnv -module load PrgEnv-cray/8.3.3 -module load craype-accel-amd-gfx90a -module load cray-python - -# Default ROCm – more recent versions are preferable (e.g. ROCm 5.6.0) -module load rocm/5.2.3.lua -``` - -### Scripts - -* natively - * [01-install-direct-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/01-install-direct-torch1.13.1-rocm5.2.3.sh) - * [01-install-direct-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/01-install-direct-torch2.1.2-rocm5.5.3.sh) -* virtual env - * [02-install-venv-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/02-install-venv-torch1.13.1-rocm5.2.3.sh) - * [02-install-venv-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/02-install-venv-torch2.1.2-rocm5.5.3.sh) -* conda env - * [03-install-conda-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/03-install-conda-torch1.13.1-rocm5.2.3.sh) - * [03-install-conda-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/03-install-conda-torch2.1.2-rocm5.5.3.sh) - * from source: [04-install-source-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/04-install-source-torch1.13.1-rocm5.2.3.sh) -* containers (singularity) - * [05-install-container-torch2.0.1-rocm5.5.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/05-install-container-torch2.0.1-rocm5.5.1.sh) - * [05-install-container-torch2.1.0-rocm5.6.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/install/05-install-container-torch2.1.0-rocm5.6.1.sh) - -## PyTorch Tests - -### Run Interactive Job on Single Node - -```console -salloc -A project_XXX --partition=standard-g -N 1 -n 1 --gpus 8 -t 01:00:00 -``` - -### Scripts - -* natively - * [01-simple-test-direct-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/01-simple-test-direct-torch1.13.1-rocm5.2.3.sh) - * [01-simple-test-direct-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/01-simple-test-direct-torch2.1.2-rocm5.5.3.sh) -* virtual env - * [02-simple-test-venv-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/02-simple-test-venv-torch1.13.1-rocm5.2.3.sh) - * [02-simple-test-venv-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/02-simple-test-venv-torch2.1.2-rocm5.5.3.sh) -* conda env - * [03-simple-test-conda-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/03-simple-test-conda-torch1.13.1-rocm5.2.3.sh) - * [03-simple-test-conda-torch2.1.2-rocm5.5.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/03-simple-test-conda-torch2.1.2-rocm5.5.3.sh) - * from source: [04-simple-test-source-torch1.13.1-rocm5.2.3.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/04-simple-test-source-torch1.13.1-rocm5.2.3.sh) -* containers (singularity) - * [05-simple-test-container-torch2.0.1-rocm5.5.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/05-simple-test-container-torch2.0.1-rocm5.5.1.sh) - * [05-simple-test-container-torch2.1.0-rocm5.6.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/05-simple-test-container-torch2.1.0-rocm5.6.1.sh) - -### Run Interactive Job on Multiple Nodes - -``` -salloc -A project_XXX --partition=standard-g -N 2 -n 16 --gpus 16 -t 01:00:00 -``` - -### Scripts - -* containers (singularity) - * [07-mnist-distributed-learning-container-torch2.0.1-rocm5.5.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/07-mnist-distributed-learning-container-torch2.0.1-rocm5.5.1.sh) - * [07-mnist-distributed-learning-container-torch2.1.0-rocm5.6.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/07-mnist-distributed-learning-container-torch2.1.0-rocm5.6.1.sh) - * [08-cnn-distributed-container-torch2.0.1-rocm5.5.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/08-cnn-distributed-container-torch2.0.1-rocm5.5.1.sh) - * [08-cnn-distributed-container-torch2.1.0-rocm5.6.1.sh](https://code.it4i.cz/lumi-g/pytorch/-/blob/main/scripts/tests/08-cnn-distributed-container-torch2.1.0-rocm5.6.1.sh) - -## Tips - -### Official Containers - -``` -ls -la /appl/local/containers/easybuild-sif-images/ -``` - -### Unofficial Versions of ROCM - -``` -module use /pfs/lustrep2/projappl/project_462000125/samantao-public/mymodules -ml rocm/5.4.3 -ml rocm/5.6.0 -``` - -### Unofficial Containers - -``` -ls -la /pfs/lustrep2/projappl/project_462000125/samantao-public/containers/ -``` - -### Installing Python Modules in Containers - -```console -#!/bin/bash - -wd=$(pwd) -SIF=/pfs/lustrep2/projappl/project_462000125/samantao-public/containers/lumi-pytorch-rocm-5.6.1-python-3.10-pytorch-v2.1.0-dockerhash-aa8dbea5e0e4.sif - -rm -rf $wd/setup-me.sh -cat > $wd/setup-me.sh << EOF -#!/bin/bash -e - -\$WITH_CONDA -pip3 install scipy h5py tqdm -EOF -chmod +x $wd/setup-me.sh - -mkdir -p $wd/pip_install - -srun -n 1 --gpus 8 singularity exec \ --B /var/spool/slurmd:/var/spool/slurmd \ --B /opt/cray:/opt/cray \ --B /usr/lib64/libcxi.so.1:/usr/lib64/libcxi.so.1 \ --B $wd:/workdir \ --B $wd/pip_install:$HOME/.local/lib \ -$SIF /workdir/setup-me.sh - -# Add the path of pip_install to singularity-exec in run.sh: -# -B $wd/pip_install:$HOME/.local/lib \ -``` - -### Controlling Device Visibility - -* `HIP_VISIBLE_DEVICES=0,1,2,3 python -c 'import torch; print(torch.cuda.device_count())'` -* `ROCR_VISIBLE_DEVICES=0,1,2,3 python -c 'import torch; print(torch.cuda.device_count())'` -* SLURM sets `ROCR_VISIBLE_DEVICES` -* Implications of both ways of setting visibility – blit kernels and/or DMA - -### RCCL - -* The problem – on startup we can see: - * `NCCL error in: /pfs/lustrep2/projappl/project_462000125/samantao/pytorchexample/pytorch/torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1269, unhandled system error, NCCL version 2.12.12` -* Checking error origin: - * `export NCCL_DEBUG=INFO` - * `NCCL INFO NET/Socket : Using [0]nmn0:10.120.116.65<0> [1]hsn0:10.253.6.67<0> [2]hsn1:10.253.6.68<0>[3]hsn2:10.253.2.12<0> [4]hsn3:10.253.2.11<0>` - * `NCCL INFO /long_pathname_so_that_rpms_can_package_the_debug_info/data/driver/rccl/src/init.cc:1292` -* The fix: - * `export NCCL_SOCKET_IFNAME=hsn0,hsn1,hsn2,hsn3` - -### RCCL AWS-CXI Plugin - -* RCCL relies on runtime plugin-ins to connect with some transport layers - * Libfabric – provider for Slingshot -* Hipified plugin adapted from AWS OpenFabrics support available -* [https://github.com/ROCmSoftwarePlatform/aws-ofi-rccl][7] -* 3-4x faster collectives -* Plugin needs to be pointed at by the loading environment - -```console -module use /pfs/lustrep2/projappl/project_462000125/samantao-public/mymodules -module load aws-ofi-rccl/rocm-5.2.3.lua -# Or -export LD_LIBRARY_PATH=/pfs/lustrep2/projappl/project_462000125/samantao-public/apps-rocm-5.2.3/aws-ofirccl -# (will detect librccl-net.so) -``` - -* Verify the plugin is detected - -```console -export NCCL_DEBUG=INFO -export NCCL_DEBUG_SUBSYS=INIT -# and search the logs for: -# [0] NCCL INFO NET/OFI Using aws-ofi-rccl 1.4.0 -``` - -### amdgpu.ids Issue - -[https://github.com/pytorch/builder/issues/1410][4] - -## References - -* Samuel Antao (AMD), LUMI Courses - * [https://lumi-supercomputer.github.io/LUMI-training-materials/4day-20230530/extra_4_10_Best_Practices_GPU_Optimization/][5] - * [https://lumi-supercomputer.github.io/LUMI-training-materials/4day-20231003/extra_4_10_Best_Practices_GPU_Optimization/][6] - -* Multi-GPU and multi-node machine learning by CSC - * [https://docs.csc.fi/support/tutorials/ml-multi/][11] - -[1]: https://pytorch.org/ -[2]: https://github.com/pytorch/pytorch -[3]: https://lumi-supercomputer.github.io/LUMI-EasyBuild-docs/p/PyTorch/ -[4]: https://github.com/pytorch/builder/issues/1410 -[5]: https://lumi-supercomputer.github.io/LUMI-training-materials/4day-20230530/extra_4_10_Best_Practices_GPU_Optimization/ -[6]: https://lumi-supercomputer.github.io/LUMI-training-materials/4day-20231003/extra_4_10_Best_Practices_GPU_Optimization/ -[7]: https://github.com/ROCmSoftwarePlatform/aws-ofi-rccl -[8]: https://docs.csc.fi/support/tutorials/ml-multi -[9]: https://docs.lumi-supercomputer.eu/software/local/csc/ -[10]: https://docs.csc.fi/apps/pytorch/ -[11]: https://docs.csc.fi/support/tutorials/ml-multi/ diff --git a/content/docs/lumi/software.mdx b/content/docs/lumi/software.mdx deleted file mode 100644 index 91967cb4d4dc398b2bee3f250808120ad53d3646..0000000000000000000000000000000000000000 --- a/content/docs/lumi/software.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "LUMI Software" ---- -Below are links to LUMI guides for selected [LUMI Software modules][1]: - -## PyTorch - -[PyTorch][8] is an optimized tensor library for deep learning using GPUs and CPUs. - -### Comprehensive Guide on PyTorch - -See the [PyTorch][a] subsection for guides on how to install PyTorch and run interactive jobs. - -### How to Run PyTorch on Lumi-G AMD GPU Accelerators - -Link to LUMI guide on how to run PyTorch on LUMI GPUs: - -[https://docs.lumi-supercomputer.eu/software/packages/pytorch/][2] - -## How to Run Gromacs on Lumi-G AMD GPU Accelerators - -Gromacs is a very efficient engine to perform molecular dynamics simulations -and energy minimizations particularly for proteins. -However, it can also be used to model polymers, membranes and e.g. coarse grained systems. -It also comes with plenty of analysis scripts. - -[https://docs.csc.fi/apps/gromacs/#example-batch-script-for-lumi-full-gpu-node][3] - -## AMD Infinity Hub - -The AMD Infinity Hub contains a collection of advanced software containers and deployment guides for HPC and AI applications, -including code built recipes for code customization. - -[https://www.amd.com/fr/developer/resources/infinity-hub.html][4] - -## GPU-Accelerated Applications With AMD INSTINCT™ Accelerators Enabled by AMD ROCm™ - -The AMD Infinity Hub contains a collection of advanced software containers -and deployment guides for HPC and AI applications, -enabling researchers, scientists, and engineers to speed up their time to science. - -[https://www.amd.com/system/files/documents/gpu-accelerated-applications-catalog.pdf][5] - -## CSC Installed Software - -The link below contains a list of codes enabled by CSC -and available for all, including PyTorch, TensorFlow, JAX, GROMACS, and others. - -[https://docs.lumi-supercomputer.eu/software/local/csc/][6] - -## Installation of SW via Conda - -Conda is an open-source, cross-platform,language-agnostic package manager and environment management system. - -[https://docs.lumi-supercomputer.eu/software/installing/container-wrapper/][7] - -[1]: https://lumi-supercomputer.github.io/LUMI-EasyBuild-docs/ -[2]: https://docs.lumi-supercomputer.eu/software/packages/pytorch/ -[3]: https://docs.csc.fi/apps/gromacs/#example-batch-script-for-lumi-full-gpu-node -[4]: https://www.amd.com/fr/developer/resources/infinity-hub.html -[5]: https://www.amd.com/system/files/documents/gpu-accelerated-applications-catalog.pdf -[6]: https://docs.lumi-supercomputer.eu/software/local/csc/ -[7]: https://docs.lumi-supercomputer.eu/software/installing/container-wrapper/ -[8]: https://pytorch.org/docs/stable/index.html - -[a]: pytorch.md diff --git a/content/docs/lumi/support.mdx b/content/docs/lumi/support.mdx deleted file mode 100644 index 896636b7c6098e8e35f29998f2f4adb9d6b5fd19..0000000000000000000000000000000000000000 --- a/content/docs/lumi/support.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "LUMI Support" ---- -You can use the [LUMI support portal][5] for help and support regarding the cluster and SW technology at LUMI. - -Czech national support for LUMI is provided by Jan Vicherek (contact: [support\[at\]it4i.cz][a]). - -Additionally, LUMI organizes number of events and training, the list of which can be found at: - -[https://lumi-supercomputer.eu/events/][1] - -## LUMI User Coffee Breaks - -These are LUMI User Support Team’s online meetings -which you can join even if you are not yet LUMI user. - -[https://lumi-supercomputer.eu/lumi-user-coffee-breaks/][2] - -You can submit questions for the session using HedgeDoc. - -Zoom link for the meeting can be found at: - -[https://www.lumi-supercomputer.eu/events/usercoffeebreaks/][3] - -## Overview - -The overview of LUMI's events and trainings can be found at: - -[https://lumi-supercomputer.github.io/LUMI-training-materials/][4] - -[1]: https://lumi-supercomputer.eu/events/ -[2]: https://lumi-supercomputer.eu/lumi-user-coffee-breaks/ -[3]: https://www.lumi-supercomputer.eu/events/usercoffeebreaks/ -[4]: https://lumi-supercomputer.github.io/LUMI-training-materials/ -[5]: https://lumi-supercomputer.eu/user-support/need-help/ - -[a]: mailto:support@it4i.cz diff --git a/content/docs/meta.json b/content/docs/meta.json deleted file mode 100644 index 688d7dec05d81114e6854f2fc55e488502f4ba10..0000000000000000000000000000000000000000 --- a/content/docs/meta.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "title": "Docs", - "pages": [ - "anselm", - "apiv1", - "archive", - "barbora", - "cloud", - "cs", - "dgx2", - "dice", - "einfracz-migration", - "environment-and-modules", - "general", - "index", - "job-features", - "karolina", - "lumi", - "prace", - "salomon", - "software", - "src", - "storage" - ] -} diff --git a/content/docs/prace.mdx b/content/docs/prace.mdx deleted file mode 100644 index 3c4dc79f0b9ffbd335934cb1da8cbe5b608210a6..0000000000000000000000000000000000000000 --- a/content/docs/prace.mdx +++ /dev/null @@ -1,303 +0,0 @@ ---- -title: "PRACE User Support" ---- -## Introduction - -PRACE users coming to the TIER-1 systems offered through the DECI calls are, in general, treated as standard users, so most of the general documentation applies to them as well. This section shows the main differences for quicker orientation, but often uses references to the original documentation. PRACE users who do not undergo the full procedure (including signing the IT4I AuP on top of the PRACE AuP) will not have a password and thus an access to some services intended for regular users. However, even with the limited access, they should be able to use the TIER-1 system as intended. If the same level of access is required, see the [Obtaining Login Credentials][1] section. - -All general [PRACE User Documentation][a] should be read before continuing reading the local documentation here. - -## Help and Support - -If you need any information, request support, or want to install additional software, use PRACE Helpdesk. - -Information about the local services are provided in the [introduction of general user documentation Salomon][2] and [introduction of general user documentation Barbora][3]. Keep in mind, that standard PRACE accounts don't have a password to access the web interface of the local (IT4Innovations) request tracker and thus a new ticket should be created by sending an email to support[at]it4i.cz. - -## Obtaining Login Credentials - -In general, PRACE users already have a PRACE account set up through their HOMESITE (institution from their country) as a result of a rewarded PRACE project proposal. This includes signed PRACE AuP, generated and registered certificates, etc. - -If there is a special need, a PRACE user can get a standard (local) account at IT4Innovations. To get an account on a cluster, the user needs to obtain the login credentials. The procedure is the same as for general users of the cluster, see the corresponding [section of the general documentation here][1]. - -## Accessing the Cluster - -### Access With GSI-SSH - -For all PRACE users, the method for interactive access (login) and data transfer based on grid services from Globus Toolkit (GSI SSH and GridFTP) is supported. - -The user will need a valid certificate and to be present in the PRACE LDAP (contact your HOME SITE or the Primary Investigator of your project for LDAP account creation). - -For more information, see [PRACE FAQ][b] - -Before you start using any of the services, do not forget to create a proxy certificate from your certificate: - -```console -$ grid-proxy-init -``` - -To check whether your proxy certificate is still valid (12 hours by default), use: - -```console -$ grid-proxy-info -``` - -To access the cluster, several login nodes running the GSI SSH service are available. The service is available from public Internet as well as from the internal PRACE network (accessible only from other PRACE partners). - -#### Access From PRACE Network: - -It is recommended to use the single DNS name **name-cluster**-prace.it4i.cz which is distributed between the four login nodes. If needed, the user can log in directly to one of the login nodes. The addresses are: - -Salomon cluster: - -| Login address | Port | Protocol | Login node | -| ---------------------------- | ---- | -------- | -------------------------------- | -| salomon-prace.it4i.cz | 2222 | gsissh | login1, login2, login3 or login4 | -| login1-prace.salomon.it4i.cz | 2222 | gsissh | login1 | -| login2-prace.salomon.it4i.cz | 2222 | gsissh | login2 | -| login3-prace.salomon.it4i.cz | 2222 | gsissh | login3 | -| login4-prace.salomon.it4i.cz | 2222 | gsissh | login4 | - -```console -$ gsissh -p 2222 salomon-prace.it4i.cz -``` - -When logging from other PRACE system, the prace_service script can be used: - -```console -$ gsissh `prace_service -i -s salomon` -``` - -#### Access From Public Internet: - -It is recommended to use the single DNS name **name-cluster**.it4i.cz which is distributed between the four login nodes. If needed, the user can login directly to one of the login nodes. The addresses are: - -Salomon cluster: - -| Login address | Port | Protocol | Login node | -| ---------------------------- | ---- | -------- | -------------------------------- | -| salomon.it4i.cz | 2222 | gsissh | login1, login2, login3 or login4 | -| login1.salomon.it4i.cz | 2222 | gsissh | login1 | -| login2-prace.salomon.it4i.cz | 2222 | gsissh | login2 | -| login3-prace.salomon.it4i.cz | 2222 | gsissh | login3 | -| login4-prace.salomon.it4i.cz | 2222 | gsissh | login4 | - -```console -$ gsissh -p 2222 salomon.it4i.cz -``` - -When logging from other PRACE system, the prace_service script can be used: - -```console -$ gsissh `prace_service -e -s salomon` -``` - -Although the preferred and recommended file transfer mechanism is [using GridFTP][5], the GSI SSH implementation also supports SCP, so for small files transfer, gsiscp can be used: - -```console -$ gsiscp -P 2222 _LOCAL_PATH_TO_YOUR_FILE_ salomon.it4i.cz:_SALOMON_PATH_TO_YOUR_FILE_ -$ gsiscp -P 2222 salomon.it4i.cz:_SALOMON_PATH_TO_YOUR_FILE_ _LOCAL_PATH_TO_YOUR_FILE_ -$ gsiscp -P 2222 _LOCAL_PATH_TO_YOUR_FILE_ salomon-prace.it4i.cz:_SALOMON_PATH_TO_YOUR_FILE_ -$ gsiscp -P 2222 salomon-prace.it4i.cz:_SALOMON_PATH_TO_YOUR_FILE_ _LOCAL_PATH_TO_YOUR_FILE_ -``` - -### Access to X11 Applications (VNC) - -If the user needs to run X11 based graphical application and does not have a X11 server, the applications can be run using VNC service. If the user is using a regular SSH based access, see this [section in general documentation][6]. - -If the user uses a GSI SSH based access, then the procedure is similar to the [SSH based access][6], only the port forwarding must be done using GSI SSH: - -```console -$ gsissh -p 2222 salomon.it4i.cz -L 5961:localhost:5961 -``` - -### Access With SSH - -After they successfully obtain the login credentials for the local IT4Innovations account, the PRACE users can access the cluster as regular users using SSH. For more information, see this [section in general documentation][9]. - -## File Transfers - -PRACE users can use the same transfer mechanisms as regular users (if they have undergone the full registration procedure). For more information, see the [Accessing the Clusters][9] section. - -Apart from the standard mechanisms, for PRACE users to transfer data to/from the Salomon cluster, a GridFTP server running the Globus Toolkit GridFTP service is available. The service is available from public Internet as well as from the internal PRACE network (accessible only from other PRACE partners). - -There is one control server and three backend servers for striping and/or backup in case one of them would fail. - -### Access From PRACE Network - -Salomon cluster: - -| Login address | Port | Node role | -| ----------------------------- | ---- | --------------------------- | -| gridftp-prace.salomon.it4i.cz | 2812 | Front end /control server | -| lgw1-prace.salomon.it4i.cz | 2813 | Backend / data mover server | -| lgw2-prace.salomon.it4i.cz | 2813 | Backend / data mover server | -| lgw3-prace.salomon.it4i.cz | 2813 | Backend / data mover server | - -Copy files **to** Salomon by running the following commands on your local machine: - -```console -$ globus-url-copy file://_LOCAL_PATH_TO_YOUR_FILE_ gsiftp://gridftp-prace.salomon.it4i.cz:2812/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ -``` - -Or by using prace_service script: - -```console -$ globus-url-copy file://_LOCAL_PATH_TO_YOUR_FILE_ gsiftp://`prace_service -i -f salomon`/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ -``` - -Copy files **from** Salomon: - -```console -$ globus-url-copy gsiftp://gridftp-prace.salomon.it4i.cz:2812/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ file://_LOCAL_PATH_TO_YOUR_FILE_ -``` - -Or by using the prace_service script: - -```console -$ globus-url-copy gsiftp://`prace_service -i -f salomon`/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ file://_LOCAL_PATH_TO_YOUR_FILE_ -``` - -### Access From Public Internet - -Salomon cluster: - -| Login address | Port | Node role | -| ----------------------- | ---- | --------------------------- | -| gridftp.salomon.it4i.cz | 2812 | Front end /control server | -| lgw1.salomon.it4i.cz | 2813 | Backend / data mover server | -| lgw2.salomon.it4i.cz | 2813 | Backend / data mover server | -| lgw3.salomon.it4i.cz | 2813 | Backend / data mover server | - -Copy files **to** Salomon by running the following commands on your local machine: - -```console -$ globus-url-copy file://_LOCAL_PATH_TO_YOUR_FILE_ gsiftp://gridftp.salomon.it4i.cz:2812/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ -``` - -Or by using the prace_service script: - -```console -$ globus-url-copy file://_LOCAL_PATH_TO_YOUR_FILE_ gsiftp://`prace_service -e -f salomon`/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ -``` - -Copy files **from** Salomon: - -```console -$ globus-url-copy gsiftp://gridftp.salomon.it4i.cz:2812/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ file://_LOCAL_PATH_TO_YOUR_FILE_ -``` - -Or by using the prace_service script: - -```console -$ globus-url-copy gsiftp://`prace_service -e -f salomon`/home/prace/_YOUR_ACCOUNT_ON_SALOMON_/_PATH_TO_YOUR_FILE_ file://_LOCAL_PATH_TO_YOUR_FILE_ -``` - -Generally, both shared file systems are available through GridFTP: - -| File system mount point | Filesystem | Comment | -| ----------------------- | ---------- | -------------------------------------------------------------- | -| /home | Lustre | Default HOME directories of users in format /home/prace/login/ | -| /scratch | Lustre | Shared SCRATCH mounted on the whole cluster | - -More information about the shared file systems on Salomon is available [here][10]. - -<Callout> - The `prace` directory is used for PRACE users on the SCRATCH file system. -</Callout> - -Salomon cluster /scratch: - -| Data type | Default path | -| ---------------------------- | ------------------------------- | -| large project files | /scratch/work/user/prace/login/ | -| large scratch/temporary data | /scratch/temp/ | - -## Usage of the Cluster - -There are some limitations for PRACE users when using the cluster. By default, PRACE users are not allowed to access special queues in the PBS Pro to have high priority or exclusive access to some special equipment like accelerated nodes and high memory (fat) nodes. There may also be restrictions on obtaining a working license for the commercial software installed on the cluster, mostly because of the license agreement or because of insufficient amount of licenses. - -For production runs, always use scratch file systems. The available file systems on Salomon is described [here][10]. - -### Software, Modules and PRACE Common Production Environment - -All system-wide installed software on the cluster is made available to the users via the modules. For more information about the environment and modules usage, see the [Environment and Modules][12] section. - -PRACE users can use the "prace" module for PRACE Common Production Environment. - -```console -$ ml prace -``` - -### Resource Allocation and Job Execution - -For general information about the resource allocation, job queuing, and job execution, see [Resources Allocation Policy][13]. - -For PRACE users, the default production run queue is "qprod", the same queue as for the national users of IT4I. Previously the "qprace" was the default queue for PRACE users, but since it gradually became identical with the "qprod" queue, it has been retired. For legacy reasons, the "qprace" queue is enabled on systems where it was the default one, but is not available on current and future systems. PRACE users can also use two other queues "qexp" and "qfree". - -Salomon: - -| queue | Active project | Project resources | Nodes | priority | authorization | walltime | -| ---------------------------------- | -------------- | ----------------- | -------------------------- | -------- | ------------- | --------- | -| **qexp** Express queue | no | none required | 32 nodes, max 8 per user | 150 | no | 1 / 1 h | -| **qprod** Production queue | yes | >0 | 1006 nodes, max 86 per job | 0 | no | 24 / 48 h | -| **qfree** Free resource queue | yes | none required | 752 nodes, max 86 per job | -1024 | no | 12 / 12 h | -| **qprace** Legacy production queue | yes | >0 | 1006 nodes, max 86 per job | 0 | no | 24 / 48 h | - -### Accounting & Quota - -The resources that are currently subject to accounting are the core hours. The core hours are accounted on the wall clock basis. The accounting runs whenever the computational cores are allocated or blocked via the PBS Pro workload manager (the qsub command), regardless of whether the cores are actually used for any calculation. See the [example in the general documentation][13]. - -PRACE users should check their project accounting using the PRACE Accounting Tool (DART). - -Users who have undergone the full local registration procedure (including signing the IT4Innovations Acceptable Use Policy) and who have received a local password may check at any time, how many core-hours they and their projects have consumed using the command "it4ifree". Note that you need to know your user password to use the command and that the displayed core hours are "system core hours" which differ from PRACE "standardized core hours". - -<Callout> - The **it4ifree** command is a part of it4i.portal.clients package, [located here][pypi]. -</Callout> - -```console -$ it4ifree - -Projects I am participating in -============================== -PID Days left Total Used WCHs Used NCHs WCHs by me NCHs by me Free ----------- ----------- ------- ----------- ----------- ------------ ------------ ------- -OPEN-XX-XX 323 0 5169947 5169947 50001 50001 1292555 - - -Projects I am Primarily Investigating -===================================== -PID Login Used WCHs Used NCHs ----------- ---------- ----------- ----------- -OPEN-XX-XX user1 376670 376670 - user2 4793277 4793277 - -Legend -====== -WCH = Wall-clock Core Hour -NCH = Normalized Core Hour -``` - -By default, a file system quota is applied. To check the current status of the quota (separate for HOME and SCRATCH), use: - -```console -$ quota -$ lfs quota -u USER_LOGIN /scratch -``` - -If the quota is insufficient, contact the [support][15] and request an increase. - -[1]: general/obtaining-login-credentials/obtaining-login-credentials.md -[2]: salomon/introduction.md -[3]: barbora/introduction.md -[5]: #file-transfers -[6]: general/accessing-the-clusters/graphical-user-interface/x-window-system.md -[9]: general/shell-and-data-access.md -[10]: salomon/storage.md -[12]: environment-and-modules.md -[13]: general/resources-allocation-policy.md -[15]: #help-and-support - -[a]: https://prace-ri.eu/training-support/ -[b]: https://prace-ri.eu/about/faqs/ -[pypi]: https://pypi.python.org/pypi/it4i.portal.clients diff --git a/content/docs/salomon/7d-enhanced-hypercube.mdx b/content/docs/salomon/7d-enhanced-hypercube.mdx deleted file mode 100644 index 5ba3b1cf3c071345de03277413287e3361cfbe93..0000000000000000000000000000000000000000 --- a/content/docs/salomon/7d-enhanced-hypercube.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "7D Enhanced Hypercube" ---- - - -| Node type | Count | Short name | Long name | Rack | -| ------------------------------------ | ----- | ---------------- | ------------------------ | ----- | -| M-Cell compute nodes w/o accelerator | 576 | cns1 -cns576 | r1i0n0 - r4i7n17 | 1-4 | -| compute nodes MIC accelerated | 432 | cns577 - cns1008 | r21u01n577 - r37u31n1008 | 21-38 | - -## IB Topology - - diff --git a/content/docs/salomon/compute-nodes.mdx b/content/docs/salomon/compute-nodes.mdx deleted file mode 100644 index be6e8821c045bde028e70af85a51cc465e6b8874..0000000000000000000000000000000000000000 --- a/content/docs/salomon/compute-nodes.mdx +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: "Compute Nodes" ---- -## Nodes Configuration - -Salomon is cluster of x86-64 Intel-based nodes. The cluster contains two types of compute nodes of the same processor type and memory size. -Compute nodes with MIC accelerator **contain two Intel Xeon Phi 7120P accelerators.** - -[More about][1] schematic representation of the Salomon cluster compute nodes IB topology. - -### Compute Nodes Without Accelerator - -* codename "grafton" -* 576 nodes -* 13 824 cores in total -* two Intel Xeon E5-2680v3, 12-core, 2.5 GHz processors per node -* 128 GB of physical memory per node - - - -### Compute Nodes With MIC Accelerator - -* codename "perrin" -* 432 nodes -* 10 368 cores in total -* two Intel Xeon E5-2680v3, 12-core, 2.5 GHz processors per node -* 128 GB of physical memory per node -* MIC accelerator 2 x Intel Xeon Phi 7120P per node, 61-cores, 16 GB per accelerator - - - - - -### Uv 2000 - -* codename "UV2000" -* 1 node -* 112 cores in total -* 14 x Intel Xeon E5-4627v2, 8-core, 3.3 GHz processors, in 14 NUMA nodes -* 3328 GB of physical memory per node -* 1 x NVIDIA GM200 (GeForce GTX TITAN X), 12 GB RAM - - - -### Compute Nodes Summary - -| Node type | Count | Memory | Cores | -| -------------------------- | ----- | ----------------- | ----------------------------------- | -| Nodes without accelerator | 576 | 128 GB | 24 @ 2.5GHz | -| Nodes with MIC accelerator | 432 | 128 GB, MIC 32GB | 24 @ 2.5GHz, MIC 61 @ 1.238 GHz | -| UV2000 SMP node | 1 | 3328GB | 112 @ 3.3GHz | - -## Processor Architecture - -Salomon is equipped with Intel Xeon processors Intel Xeon E5-2680v3. Processors support Advanced Vector Extensions 2.0 (AVX2) 256-bit instruction set. - -### Intel Xeon E5-2680v3 Processor - -* 12-core -* speed: 2.5 GHz, up to 3.3 GHz using Turbo Boost Technology -* peak performance: 40 GFLOP/s per core @ 2.5 GHz -* caches: - * Intel® Smart Cache: 30 MB -* memory bandwidth at the level of the processor: 68 GB/s - -### MIC Accelerator Intel Xeon Phi 7120P Processor - -* 61-core -* speed: 1.238 - GHz, up to 1.333 GHz using Turbo Boost Technology -* peak performance: 18.4 GFLOP/s per core -* caches: - * L2: 30.5 MB -* memory bandwidth at the level of the processor: 352 GB/s - -## Memory Architecture - -Memory is equally distributed across all CPUs and cores for optimal performance. Memory is composed of memory modules of the same size and evenly distributed across all memory controllers and memory channels. - -### Compute Node Without Accelerator - -* 2 sockets -* Memory Controllers are integrated into processors. - * 8 DDR4 DIMMs per node - * 4 DDR4 DIMMs per CPU - * 1 DDR4 DIMMs per channel -* Populated memory: 8 x 16 GB DDR4 DIMM >2133 MHz - -### Compute Node With MIC Accelerator - -2 sockets -Memory Controllers are integrated into processors. - -* 8 DDR4 DIMMs per node -* 4 DDR4 DIMMs per CPU -* 1 DDR4 DIMMs per channel - -Populated memory: 8 x 16 GB DDR4 DIMM 2133 MHz -MIC Accelerator Intel Xeon Phi 7120P Processor - -* 2 sockets -* Memory Controllers are connected via an - Interprocessor Network (IPN) ring. - * 16 GDDR5 DIMMs per node - * 8 GDDR5 DIMMs per CPU - * 2 GDDR5 DIMMs per channel - -[1]: ib-single-plane-topology.md diff --git a/content/docs/salomon/hardware-overview.mdx b/content/docs/salomon/hardware-overview.mdx deleted file mode 100644 index 689886824f1eb217f827afbc4f7e75feb61ef131..0000000000000000000000000000000000000000 --- a/content/docs/salomon/hardware-overview.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Hardware Overview" ---- -## Introduction - -The Salomon cluster consists of 1008 computational nodes of which 576 are regular compute nodes and 432 accelerated nodes. Each node is a powerful x86-64 computer equipped with 24 cores (two twelve-core Intel Xeon processors) and 128 GB RAM. The nodes are interlinked by high speed InfiniBand and Ethernet networks. All nodes share 0.5 PB /home NFS disk storage to store the user files. Users may use a DDN Lustre shared storage with capacity of 1.69 PB which is available for the scratch project data. User access to the Salomon cluster is provided by four login nodes. - -[More about][1] schematic representation of the Salomon cluster compute nodes IB topology. - - - -The parameters are summarized in the following tables: - -## General Information - -| **In general** | | -| ------------------------------------------- | ------------------------------------------- | -| Primary purpose | High Performance Computing | -| Architecture of compute nodes | x86-64 | -| Operating system | CentOS 7.x Linux | -| [**Compute nodes**][2] | | -| Totally | 1008 | -| Processor | 2 x Intel Xeon E5-2680v3, 2.5 GHz, 12 cores | -| RAM | 128GB, 5.3 GB per core, DDR4@2133 MHz | -| Local disk drive | no | -| Compute network / Topology | InfiniBand FDR56 / 7D Enhanced hypercube | -| w/o accelerator | 576 | -| MIC accelerated | 432 | -| **In total** | | -| Total theoretical peak performance (Rpeak) | 2011 TFLOP/s | -| Total amount of RAM | 129.024 TB | - -## Compute Nodes - -| Node | Count | Processor | Cores | Memory | Accelerator | -| --------------- | ----- | --------------------------------- | ----- | ------ | --------------------------------------------- | -| w/o accelerator | 576 | 2 x Intel Xeon E5-2680v3, 2.5 GHz | 24 | 128 GB | - | -| MIC accelerated | 432 | 2 x Intel Xeon E5-2680v3, 2.5 GHz | 24 | 128 GB | 2 x Intel Xeon Phi 7120P, 61 cores, 16 GB RAM | - -For more details, refer to the [Compute nodes][2] section. - -## Remote Visualization Nodes - -For remote visualization, two nodes with NICE DCV software are available each configured: - -| Node | Count | Processor | Cores | Memory | GPU Accelerator | -| ------------- | ----- | --------------------------------- | ----- | ------ | ----------------------------- | -| visualization | 2 | 2 x Intel Xeon E5-2695v3, 2.3 GHz | 28 | 512 GB | NVIDIA QUADRO K5000, 4 GB RAM | - -## SGI Uv 2000 - -For large memory computations, a special SMP/NUMA SGI UV 2000 server is available: - -| Node | Count | Processor | Cores | Memory | Extra HW | -| ------ | ----- | ------------------------------------------- | ----- | --------------------- | ------------------------------------------------------------------------ | -| UV2000 | 1 | 14 x Intel Xeon E5-4627v2, 3.3 GHz, 8 cores | 112 | 3328 GB DDR3@1866 MHz | 2 x 400GB local SSD, 1x NVIDIA GM200 (GeForce GTX TITAN X), 12 GB RAM | - - - -[1]: ib-single-plane-topology.md -[2]: compute-nodes.md diff --git a/content/docs/salomon/ib-single-plane-topology.mdx b/content/docs/salomon/ib-single-plane-topology.mdx deleted file mode 100644 index 0ce946535d31f4db32d3666299701ccecac6d364..0000000000000000000000000000000000000000 --- a/content/docs/salomon/ib-single-plane-topology.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "IB Single-Plane Topology" ---- -A complete M-Cell assembly consists of four compute racks. Each rack contains 4 physical IRUs - Independent rack units. Using one dual socket node per one blade slot leads to 8 logical IRUs. Each rack contains 4 x 2 SGI ICE X IB Premium Blades. - -The SGI ICE X IB Premium Blade provides the first level of interconnection via dual 36-port Mellanox FDR InfiniBand ASIC switch with connections as follows: - -* 9 ports from each switch chip connect to the unified backplane, to connect the 18 compute node slots -* 3 ports on each chip provide connectivity between the chips -* 24 ports from each switch chip connect to the external bulkhead, for a total of 48 - -## IB Single-Plane Topology - ICEX M-Cell - -Each color in each physical IRU represents one dual-switch ASIC switch. - -[IB single-plane topology - ICEX Mcell.pdf][1] - - - -## IB Single-Plane Topology - Accelerated Nodes - -Each of the 3 inter-connected D racks is equivalent to one half of the M-Cell rack. 18 x D rack with MIC accelerated nodes [r21-r38] are equivalent to 3 M-Cell racks as shown in the [7D Enhanced Hypercube][2] diagram. - -As shown in a diagram [IB Topology][3] - -* Racks 21, 22, 23, 24, 25, 26 are equivalent to one M-Cell rack. -* Racks 27, 28, 29, 30, 31, 32 are equivalent to one M-Cell rack. -* Racks 33, 34, 35, 36, 37, 38 are equivalent to one M-Cell rack. - -[IB single-plane topology - Accelerated nodes.pdf][4] - - - -[1]: ../src/IB_single-plane_topology_-_ICEX_Mcell.pdf -[2]: 7d-enhanced-hypercube.md -[3]: 7d-enhanced-hypercube.md#ib-topology) -[4]: ../src/IB_single-plane_topology_-_Accelerated_nodes.pdf diff --git a/content/docs/salomon/introduction.mdx b/content/docs/salomon/introduction.mdx deleted file mode 100644 index 485f7494c5a6ad1844540562d9c0eabb2f9b30bd..0000000000000000000000000000000000000000 --- a/content/docs/salomon/introduction.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Introduction" ---- -Welcome to Salomon supercomputer cluster. The Salomon cluster consists of 1009 compute nodes, totaling 24192 compute cores with 129 TB RAM and giving over 2 PFLOP/s theoretical peak performance. Each node is a powerful x86-64 computer equipped with 24 cores and at least 128 GB RAM. Nodes are interconnected through a 7D Enhanced hypercube InfiniBand network and are equipped with Intel Xeon E5-2680v3 processors. The Salomon cluster consists of 576 nodes without accelerators and 432 nodes equipped with Intel Xeon Phi MIC accelerators. Read more in [Hardware Overview][1]. - -The cluster runs with a [CentOS Linux][a] operating system, which is compatible with the Red Hat [Linux family][b]. - -## Water-Cooled Compute Nodes With MIC Accelerators - - - - - -## Tape Library T950B - - - - - -[1]: hardware-overview.md - -[a]: http://www.bull.com/bullx-logiciels/systeme-exploitation.html -[b]: http://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg diff --git a/content/docs/salomon/meta.json b/content/docs/salomon/meta.json deleted file mode 100644 index c493f1ba023b7cd180214fe856149473182f204e..0000000000000000000000000000000000000000 --- a/content/docs/salomon/meta.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": "Salomon", - "pages": [ - "7d-enhanced-hypercube", - "compute-nodes", - "hardware-overview", - "ib-single-plane-topology", - "introduction", - "network", - "software", - "storage", - "visualization" - ] -} diff --git a/content/docs/salomon/network.mdx b/content/docs/salomon/network.mdx deleted file mode 100644 index 88fe79524debaa3057a0160aeb340b5393788967..0000000000000000000000000000000000000000 --- a/content/docs/salomon/network.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Network" ---- -All compute and login nodes of Salomon are interconnected by the 7D Enhanced hypercube [InfiniBand][a] network and by the Gigabit [Ethernet][b] network. Only the [InfiniBand][c] network may be used to transfer user data. - -## InfiniBand Network - -All compute and login nodes of Salomon are interconnected by the 7D Enhanced hypercube [Infiniband][a] network (56 Gbps). The network topology is a [7D Enhanced hypercube][1]. - -Read more about schematic representation of the Salomon cluster [IB single-plain topology][2] ([hypercube dimension][1]). - -The compute nodes may be accessed via the Infiniband network using the ib0 network interface, in the address range 10.17.0.0 (mask 255.255.224.0). The MPI may be used to establish a native Infiniband connection among the nodes. - -The network provides **2170MB/s** transfer rates via the TCP connection (single stream) and up to **3600MB/s** via the native Infiniband protocol. - -## Example - -```console -$ qsub -q qexp -l select=4:ncpus=16 -N Name0 ./myjob -$ qstat -n -u username - Req'd Req'd Elap -Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time ---------------- -------- -- |---|---| ------ --- --- ------ ----- - ----- -15209.isrv5 username qexp Name0 5530 4 96 -- 01:00 R 00:00 - r4i1n0/0*24+r4i1n1/0*24+r4i1n2/0*24+r4i1n3/0*24 -``` - -In this example, we access the node r4i1n0 by Infiniband network via the ib0 interface. - -```console -$ ssh 10.17.35.19 -``` - -In this example, we get -information of the Infiniband network. - -```console -$ ifconfig -.... -inet addr:10.17.35.19.... -.... - -$ ip addr show ib0 - -.... -inet 10.17.35.19.... -.... -``` - -[1]: 7d-enhanced-hypercube.md -[2]: ib-single-plane-topology.md - -[a]: http://en.wikipedia.org/wiki/InfiniBand -[b]: http://en.wikipedia.org/wiki/Ethernet -[c]: http://en.wikipedia.org/wiki/InfiniBand diff --git a/content/docs/salomon/software/meta.json b/content/docs/salomon/software/meta.json deleted file mode 100644 index 0924f1e6865af32d1e0dd28c085df1db832169bd..0000000000000000000000000000000000000000 --- a/content/docs/salomon/software/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Software", - "pages": [ - "numerical-libraries" - ] -} diff --git a/content/docs/salomon/software/numerical-libraries/Clp.mdx b/content/docs/salomon/software/numerical-libraries/Clp.mdx deleted file mode 100644 index 8926e82a6be252fa893ac1860ca8ccd1a431b948..0000000000000000000000000000000000000000 --- a/content/docs/salomon/software/numerical-libraries/Clp.mdx +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "CLP" ---- -## Introduction - -Clp (Coin-or linear programming) is an open-source linear programming solver written in C++. It is primarily meant to be used as a callable library, but a basic, stand-alone executable version is also available. - -Clp ([projects.coin-or.org/Clp][1]) is a part of the COIN-OR (The Computational Infrastracture for Operations Research) project ([projects.coin-or.org/][2]). - -## Modules - -Clp, version 1.16.10 is available on Salomon via module Clp: - -```console -$ ml Clp -``` - -The module sets up environment variables required for linking and running applications using Clp. This particular command loads the default module Clp/1.16.10-intel-2017a, Intel module intel/2017a and other related modules. - -## Compiling and Linking - -<Callout> - Link with -lClp -</Callout> - -Load the Clp module. Link using -lClp switch to link your code against Clp. - -```console -$ ml Clp -$ icc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lClp -``` - -## Example - -An example of Clp enabled application follows. In this example, the library solves linear programming problem loaded from file. - -```cpp -#include "coin/ClpSimplex.hpp" - -int main (int argc, const char *argv[]) -{ - ClpSimplex model; - int status; - if (argc<2) - status=model.readMps("/apps/all/Clp/1.16.10-intel-2017a/lib/p0033.mps"); - else - status=model.readMps(argv[1]); - if (!status) { - model.primal(); - } - return 0; -} -``` - -### Load Modules and Compile: - -```console -ml Clp -icc lp.c -o lp.x -Wl,-rpath=$LIBRARY_PATH -lClp -``` - -In this example, the lp.c code is compiled using the Intel compiler and linked with Clp. To run the code, the Intel module has to be loaded. - -[1]: https://projects.coin-or.org/Clp -[2]: https://projects.coin-or.org/ diff --git a/content/docs/salomon/software/numerical-libraries/meta.json b/content/docs/salomon/software/numerical-libraries/meta.json deleted file mode 100644 index 3cde8032817e868dc5339a16e23e35fc6b3e20ba..0000000000000000000000000000000000000000 --- a/content/docs/salomon/software/numerical-libraries/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Numerical-libraries", - "pages": [ - "Clp" - ] -} diff --git a/content/docs/salomon/storage.mdx b/content/docs/salomon/storage.mdx deleted file mode 100644 index 803a7577d3c5cdb7f50b787308516b1273039adc..0000000000000000000000000000000000000000 --- a/content/docs/salomon/storage.mdx +++ /dev/null @@ -1,350 +0,0 @@ ---- -title: "Storage" ---- -## Introduction - -There are two main shared file systems on Salomon cluster: [HOME][1] and [SCRATCH][2]. - -All login and compute nodes may access same data on shared file systems. Compute nodes are also equipped with local (non-shared) scratch, ramdisk, and tmp file systems. - -## Policy (In a Nutshell) - -<Callout> - * Use [HOME][1] for your most valuable data and programs. - * Use [WORK][3] for your large project files. - * Use [TEMP][4] for large scratch data. -</Callout> - -<Callout type=warn> - Do not use for [archiving][5]! -</Callout> - -## Archiving - -Do not use shared file systems as a backup for large amount of data or long-term archiving mean. The academic staff and students of research institutions in the Czech Republic can use [CESNET storage service][6], which is available via SSHFS. - -## Shared File Systems - -Salomon computer provides two main shared file systems, the [HOME file system][7] and the [SCRATCH file system][8]. The SCRATCH file system is partitioned to [WORK and TEMP workspaces][9]. The HOME file system is realized as a tiered NFS disk storage. The SCRATCH file system is realized as a parallel Lustre file system. Both shared file systems are accessible via the Infiniband network. Extended ACLs are provided on both HOME/SCRATCH file systems for sharing data with other users using fine-grained control. - -### HOME File System - -The HOME file system is realized as a Tiered file system, exported via NFS. The first tier has the capacity of 100 TB, second tier has the capacity of 400 TB. The file system is available on all login and computational nodes. The Home file system hosts the [HOME workspace][1]. - -### SCRATCH File System - -The architecture of Lustre on Salomon is composed of two metadata servers (MDS) and six data/object storage servers (OSS). Accessible capacity is 1.69 PB, shared among all users. The SCRATCH file system hosts the [WORK and TEMP workspaces][9]. - -Configuration of the SCRATCH Lustre storage - -* SCRATCH Lustre object storage - * Disk array SFA12KX - * 540 x 4 TB SAS 7.2krpm disk - * 54 x OST of 10 disks in RAID6 (8+2) - * 15 x hot-spare disk - * 4 x 400 GB SSD cache -* SCRATCH Lustre metadata storage - * Disk array EF3015 - * 12 x 600 GB SAS 15 krpm disk - -### Understanding the Lustre File Systems - -A user file on the Lustre file system can be divided into multiple chunks (stripes) and stored across a subset of the object storage targets (OSTs) (disks). The stripes are distributed among the OSTs in a round-robin fashion to ensure load balancing. - -When a client (a compute node from your job) needs to create or access a file, the client queries the metadata server (MDS) and the metadata target (MDT) for the layout and location of the file's stripes. Once the file is opened and the client obtains the striping information, the MDS is no longer involved in the file I/O process. The client interacts directly with the object storage servers (OSSes) and OSTs to perform I/O operations such as locking, disk allocation, storage, and retrieval. - -If multiple clients try to read and write the same part of a file at the same time, the Lustre distributed lock manager enforces coherency so that all clients see consistent results. - -## Disk Usage and Quota Commands - -Disk usage and user quotas can be checked and reviewed using the following command: - -```console -$ it4i-disk-usage -``` - -Example for Salomon: - -```console -$ it4i-disk-usage -h -# Using human-readable format -# Using power of 1000 for space -# Using power of 1000 for entries - -Filesystem: /home -Space used: 110GB -Space limit: 250GB -Entries: 40K -Entries limit: 500K -# based on filesystem quota - -Filesystem: /scratch -Space used: 377GB -Space limit: 100TB -Entries: 14K -Entries limit: 10M -# based on Lustre quota - -Filesystem: /scratch -Space used: 377GB -Entries: 14K -# based on Robinhood - -Filesystem: /scratch/work -Space used: 377GB -Entries: 14K -Entries: 40K -Entries limit: 1.0M -# based on Robinhood - -Filesystem: /scratch/temp -Space used: 12K -Entries: 6 -# based on Robinhood -``` - -In this example, we view current size limits and space occupied on the /home and /scratch filesystem, for a particular user executing the command. -Note that limits are imposed also on number of objects (files, directories, links, etc.) that the user is allowed to create. - -To have a better understanding of where the space is exactly used, use the following command: - -```console -$ du -hs dir -``` - -Example for your HOME directory: - -```console -$ cd /home -$ du -hs * .[a-zA-z0-9]* | grep -E "[0-9]*G|[0-9]*M" | sort -hr -258M cuda-samples -15M .cache -13M .mozilla -5,5M .eclipse -2,7M .idb_13.0_linux_intel64_app -``` - -This will list all directories with megabytes or gigabytes of consumed space in your actual (in this example HOME) directory. List is sorted in descending order from largest to smallest files/directories. - -To have a better understanding of the previous commands, read the man pages: - -```console -$ man lfs -``` - -```console -$ man du -``` - -## Extended Access Control List (ACL) - -Extended ACLs provide another security mechanism beside the standard POSIX ACLs which are defined by three entries (for owner/group/others). Extended ACLs have more than the three basic entries. In addition, they also contain a mask entry and may contain any number of named user and named group entries. - -ACLs on a Lustre file system work exactly like ACLs on any Linux file system. They are manipulated with the standard tools in the standard manner. - -For more information, see the [Access Control List][11] section of the documentation. - -## Shared Workspaces - -### Home - -Users home directories /home/username reside on HOME file system. Accessible capacity is 0.5 PB, shared among all users. Individual users are restricted by file system usage quotas, set to 250 GB per user. If 250 GB should prove as insufficient for particular user, contact [support][d], the quota may be lifted upon request. - -<Callout> - The HOME file system is intended for preparation, evaluation, processing and storage of data generated by active Projects. -</Callout> - -The HOME should not be used to archive data of past Projects or other unrelated data. - -The files on HOME will not be deleted until end of the user's lifecycle. - -The workspace is backed up, such that it can be restored in case of catastrophic failure resulting in significant data loss. This backup however is not intended to restore old versions of user data or to restore (accidentally) deleted files. - -| HOME workspace | | -| ----------------- | -------------- | -| Accesspoint | /home/username | -| Capacity | 500TB | -| Throughput | 6GB/s | -| User space quota | 250GB | -| User inodes quota | 500K | -| Protocol | NFS, 2-Tier | - -### Scratch - -The SCRATCH is realized as Lustre parallel file system and is available from all login and computational nodes. There are 54 OSTs dedicated for the SCRATCH file system. - -Accessible capacity is 1.6PB, shared among all users on TEMP and WORK. Individual users are restricted by file system usage quotas, set to 10M inodes and 100 TB per user. The purpose of this quota is to prevent runaway programs from filling the entire file system and deny service to other users. Should 100TB of space or 10M inodes prove insufficient, contact [support][d], the quota may be lifted upon request. - -#### Work - -The WORK workspace resides on SCRATCH file system. Users may create subdirectories and files in the **/scratch/work/project/projectid** directory. The directory is accessible to all users involved in the `projectid` project. - -<Callout> - The WORK workspace is intended to store users project data as well as for high performance access to input and output files. All project data should be removed once the project is finished. The data on the WORK workspace are not backed up. - - Files on the WORK file system are **persistent** (not automatically deleted) throughout duration of the project. -</Callout> - -#### Temp - -The TEMP workspace resides on SCRATCH file system. The TEMP workspace accesspoint is /scratch/temp. Users may freely create subdirectories and files on the workspace. Accessible capacity is 1.6 PB, shared among all users on TEMP and WORK. - -<Callout> - The TEMP workspace is intended for temporary scratch data generated during the calculation as well as for high performance access to input and output files. All I/O intensive jobs must use the TEMP workspace as their working directory. - - Users are advised to save the necessary data from the TEMP workspace to HOME or WORK after the calculations and clean up the scratch files. -</Callout> - -<Callout type=warn> - Files on the TEMP file system that are **not accessed for more than 90 days** will be automatically **deleted**. -</Callout> - -<table> - <tr> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;"></td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">WORK workspace</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">TEMP workspace</td> - </tr> - <tr> - <td style="vertical-align : middle">Accesspoints</td> - <td>/scratch/work/user/projectid</td> - <td>/scratch/temp</td> - </tr> - <tr> - <td>Capacity</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">1.6PB</td> - </tr> - <tr> - <td>Throughput</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">30GB/s</td> - </tr> - <tr> - <td>User space quota</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">100TB</td> - </tr> - <tr> - <td>User inodes quota</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">10M</td> - </tr> - <tr> - <td>Number of OSTs</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">54</td> - </tr> - <tr> - <td>Protocol</td> - <td colspan="2" style="vertical-align : middle;text-align:center;">Lustre</td> - </tr> -</table> - -## RAM Disk - -### Local RAM Disk - -Every computational node is equipped with file system realized in memory, so called RAM disk. - -The local RAM disk is mounted as /ramdisk and is accessible to user at /ramdisk/$PBS_JOBID directory. - -The RAM disk is private to a job and local to node, created when the job starts and deleted at the job end. - -<Callout> - The local RAM disk directory /ramdisk/$PBS_JOBID will be deleted immediately after the calculation end. Users should take care to save the output data from within the jobscript. -</Callout> - -The local RAM disk file system is intended for temporary scratch data generated during the calculation as well as -for high-performance access to input and output files. Size of RAM disk file system is limited. -It is not recommended to allocate large amount of memory and use large amount of data in RAM disk file system at the same time. - -<Callout type=warn> - Be very careful, use of RAM disk file system is at the expense of operational memory. -</Callout> - -| Local RAM disk | | -| ----------- | ------------------------------------------------------------------------------------------------------- | -| Mountpoint | /ramdisk | -| Accesspoint | /ramdisk/$PBS_JOBID | -| Capacity | 110GB | -| Throughput | over 1.5GB/s write, over 5GB/s read, single thread, over 10GB/s write, over 50GB/s read, 16 threads | -| User quota | none | - -### Global RAM Disk - -The Global RAM disk spans the local RAM disks of all the nodes within a single job. -For more information, see the [Job Features][12] section. - -## Summary - -<table> - <tr> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Mountpoint</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Usage</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Protocol</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Net Capacity</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Throughput</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Space/Inodes quota</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Access</td> - <td style="background-color: rgba(0, 0, 0, 0.54); color: white;">Service</td> - </tr> - <tr> - <td>/home</td> - <td>home directory</td> - <td>NFS, 2-Tier</td> - <td>500TB</td> - <td>6GB/s</td> - <td>250GB / 500K</td> - <td>Compute and login nodes</td> - <td>backed up</td> - </tr> - <tr> - <td style="background-color: #D3D3D3;">/scratch/work</td> - <td style="background-color: #D3D3D3;">large project files</td> - <td rowspan="2" style="background-color: #D3D3D3; vertical-align : middle;text-align:center;">Lustre</td> - <td rowspan="2" style="background-color: #D3D3D3; vertical-align : middle;text-align:center;">1.69PB</td> - <td rowspan="2" style="background-color: #D3D3D3; vertical-align : middle;text-align:center;">30GB/s</td> - <td rowspan="2" style="background-color: #D3D3D3; vertical-align : middle;text-align:center;">100TB / 10M</td> - <td style="background-color: #D3D3D3;">Compute and login nodes</td> - <td style="background-color: #D3D3D3;">none</td> - </tr> - <tr> - <td style="background-color: #D3D3D3;">/scratch/temp</td> - <td style="background-color: #D3D3D3;">job temporary data</td> - <td style="background-color: #D3D3D3;">Compute and login nodes</td> - <td style="background-color: #D3D3D3;">files older 90 days removed</td> - </tr> - <tr> - <td>/ramdisk</td> - <td>job temporary data, node local</td> - <td>tmpfs</td> - <td>110GB</td> - <td>90GB/s</td> - <td>none / none</td> - <td>Compute nodes, node local</td> - <td>purged after job ends</td> - </tr> - <tr> - <td style="background-color: #D3D3D3;">/mnt/global_ramdisk</td> - <td style="background-color: #D3D3D3;">job temporary data</td> - <td style="background-color: #D3D3D3;">BeeGFS</td> - <td style="background-color: #D3D3D3;">(N*110)GB</td> - <td style="background-color: #D3D3D3;">3*(N+1)GB/s</td> - <td style="background-color: #D3D3D3;">none / none</td> - <td style="background-color: #D3D3D3;">Compute nodes, job shared</td> - <td style="background-color: #D3D3D3;">purged after job ends</td> - </tr> -</table> - -N = number of compute nodes in the job. - -[1]: #home -[2]: #shared-filesystems -[3]: #work -[4]: #temp -[5]: #archiving -[6]: ../storage/cesnet-storage.md -[7]: #home-filesystem -[8]: #scratch-filesystem -[9]: #shared-workspaces -[11]: ../storage/standard-file-acl.md -[12]: ../job-features.md#global-ram-disk - -[c]: https://access.redhat.com/documentation/en-US/Red_Hat_Storage/2.0/html/Administration_Guide/ch09s05.html -[d]: https://support.it4i.cz/rt diff --git a/content/docs/salomon/visualization.mdx b/content/docs/salomon/visualization.mdx deleted file mode 100644 index b19e8b49a19e8f8709b335fa83e2a9650958745d..0000000000000000000000000000000000000000 --- a/content/docs/salomon/visualization.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Visualization Servers" ---- -Remote visualization with [NICE DCV software][3] or [VirtualGL][4] is availabe on two nodes. - -| Node | Count | Processor | Cores | Memory | GPU Accelerator | -|---------------|-------|-----------------------------------|-------|--------|------------------------------| -| visualization | 2 | 2 x Intel Xeon E5-2695v3, 2.3 GHz | 28 | 512 GB | NVIDIA QUADRO K5000 4 GB | - -## Resource Allocation Policy - -| queue | active project | project resources | nodes | min ncpus | priority | authorization | walltime | -|-------|----------------|-------------------|-------|-----------|----------|---------------|----------| -| qviz Visualization queue | yes | none required | 2 (with NVIDIA Quadro K5000) | 4 | 150 | no | 1h/8h | - -## References - -* [Graphical User Interface][1] -* [VPN Access][2] - -[1]: ../general/shell-and-data-access.md#graphical-user-interface -[2]: ../general/shell-and-data-access.md#vpn-access -[3]: ../software/viz/NICEDCVsoftware.md -[4]: ../software/viz/vgl.md \ No newline at end of file diff --git a/content/docs/software/bio/meta.json b/content/docs/software/bio/meta.json deleted file mode 100644 index 618329b4b88f56f2eebc4d48a8a0c62a05bdfd8f..0000000000000000000000000000000000000000 --- a/content/docs/software/bio/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Bio", - "pages": [ - "omics-master" - ] -} diff --git a/content/docs/software/bio/omics-master/diagnostic-component-team.mdx b/content/docs/software/bio/omics-master/diagnostic-component-team.mdx deleted file mode 100644 index b998e164850e14c6e1b076328cd77c9d819e4aa9..0000000000000000000000000000000000000000 --- a/content/docs/software/bio/omics-master/diagnostic-component-team.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Diagnostic Component (TEAM)" ---- -## Access - -TEAM is available at the [following address][a] - -<Callout> - The address is accessible only via VPN. -</Callout> - -## Diagnostic Component - -VCF files are scanned by this diagnostic tool for known diagnostic disease-associated variants. When no diagnostic mutation is found, the file can be sent to the disease-causing gene discovery tool to see whether new disease-associated variants can be found. - -TEAM (27) is an intuitive and easy-to-use web tool that fills the gap between the predicted mutations and the final diagnostic in targeted enrichment sequencing analysis. The tool searches for known diagnostic mutations, corresponding to a disease panel, among the predicted patient’s variants. Diagnostic variants for the disease are taken from four databases of disease-related variants (HGMD, HUMSAVAR , ClinVar and COSMIC) If no primary diagnostic variant is found, then a list of secondary findings that can help to establish a diagnostic is produced. TEAM also provides with an interface for the definition of and customization of panels, by means of which, genes and mutations can be added or discarded to adjust panel definitions. - - - -**Figure 5.** Interface of the application. Panels for defining targeted regions of interest can be set up by just drag and drop known disease genes or disease definitions from the lists. Thus, virtual panels can be interactively improved as the knowledge of the disease increases. - -[a]: http://omics.it4i.cz/team/ diff --git a/content/docs/software/bio/omics-master/meta.json b/content/docs/software/bio/omics-master/meta.json deleted file mode 100644 index 9ce4100d5e8235d4130885addaf342d2666b76df..0000000000000000000000000000000000000000 --- a/content/docs/software/bio/omics-master/meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "title": "Omics-master", - "pages": [ - "diagnostic-component-team", - "overview", - "priorization-component-bierapp" - ] -} diff --git a/content/docs/software/bio/omics-master/overview.mdx b/content/docs/software/bio/omics-master/overview.mdx deleted file mode 100644 index 13dfce9e016943b09da1f1c1d9a3157b904e9167..0000000000000000000000000000000000000000 --- a/content/docs/software/bio/omics-master/overview.mdx +++ /dev/null @@ -1,415 +0,0 @@ ---- -title: "Overview" ---- -A human NGS data processing solution. - -## Introduction - -The scope of this OMICS MASTER solution is restricted to human genomics research (disease causing gene discovery in the whole human genome or exome) or diagnosis (panel sequencing), although it could be extended to other usages in the future. - -The pipeline inputs the raw data produced by the sequencing machines and undergoes a processing procedure that consists of a quality control, the mapping and variant calling steps that result in a file containing the set of variants in the sample. From this point, the prioritization component or the diagnostic component can be launched. - - - -Figure 1. OMICS MASTER solution overview. Data is produced in the external labs and comes to IT4I (represented by the blue dashed line). The data pre-processor converts raw data into a list of variants and annotations for each sequenced patient. These lists files together with primary and secondary (alignment) data files are stored in IT4I sequence DB and uploaded to the discovery (candidate prioritization) or diagnostic component where they can be analyzed directly by the user that produced them, depending of the experimental design carried out. - -Typical genomics pipelines are composed by several components that need to be launched manually. The advantage of OMICS MASTER pipeline is that all these components are invoked sequentially in an automated way. - -OMICS MASTER pipeline inputs a FASTQ file and outputs an enriched VCF file. This pipeline is able to queue all the jobs by only launching a process taking all the necessary input files and creates the intermediate and final folders - -Let us see each of the OMICS MASTER solution components: - -## Components - -### Processing - -This component is composed by a set of programs that carry out quality controls, alignment, realignment, variant calling and variant annotation. It turns raw data from the sequencing machine into files containing lists of variants (VCF) that once annotated, can be used by the following components (discovery and diagnosis). - -We distinguish three types of sequencing instruments: bench sequencers (MySeq, IonTorrent, and Roche Junior, although the last one is being discontinued), which produce relatively Genomes in the clinic. - -Low throughput (tens of million reads), and high-end sequencers, which produce high throughput (hundreds of million reads) among which we have Illumina HiSeq 2000 (and new models) and SOLiD. All of them but SOLiD produce data in sequence format. SOLiD produces data in a special format called color space that require specific software for the mapping process. Once the mapping has been done, the rest of the pipeline is identical. SOLiD is a technology which is also being discontinued by the manufacturer, so this type of data will be scarce in the future. - -#### Quality Control, Preprocessing and Statistics for FASTQ - -FastQC& FastQC. - -These steps are carried out over the original FASTQ file with optimized scripts and includes the following steps: sequence cleansing, estimation of base quality scores, elimination of duplicates, and statistics. - -Input: FASTQ file. - -Output: FASTQ file plus an HTML file containing statistics on the data. - -FASTQ format represents the nucleotide sequence and its corresponding quality scores. - - -Figure 2.FASTQ file. - -#### Mapping - -Component: Hpg-aligner. - -Sequence reads are mapped over the human reference genome. SOLiD reads are not covered by this solution; they should be mapped with specific software (among the few available options, SHRiMP seems to be the best one). For the rest of NGS machine outputs we use HPG Aligner. HPG-Aligner is an innovative solution, based on a combination of mapping with BWT and local alignment with Smith-Waterman (SW), that drastically increases mapping accuracy (97% versus 62-70% by current mappers, in the most common scenarios). This proposal provides a simple and fast solution that maps almost all the reads, even those containing a high number of mismatches or indels. - -Input: FASTQ file. - -Output: Aligned file in BAM format. - -#### Sequence Alignment/Map (SAM) - -It is a human readable tab-delimited format in which each read and its alignment is represented on a single line. The format can represent unmapped reads, reads that are mapped to unique locations, and reads that are mapped to multiple locations. - -The SAM format (1) consists of one header section and one alignment section. The lines in the header section start with the â€@’ character, and lines in the alignment section do not. All lines are TAB delimited. - -In SAM, each alignment line has 11 mandatory fields and a variable number of optional fields. The mandatory fields are briefly described in Table 1. They must be present but their value can be a â€\’ or a zero (depending on the field) if the -corresponding information is unavailable. - -| No. | Name | Description | -| --------- | ---------- | ----------------------------------------------------- | -| 1 | QNAME | Query NAME of the read or the read pai | -| 2 | FLAG | Bitwise FLAG (pairing,strand,mate strand,etc.) | -| 3 | RNAME | Reference sequence NAME | -| 4 | POS | 1-Based leftmost POSition of clipped alignment | -| 5 | MAPQ | MAPping Quality (Phred-scaled) | -| 6 | CIGAR | Extended CIGAR string (operations:MIDNSHP) | -| 7 | MRNM | Mate REference NaMe ('=' if same RNAME) | -| 8 | MPOS | 1-Based leftmost Mate POSition | -| 9 | ISIZE | Inferred Insert SIZE | -| 10 | SEQ | Query SEQuence on the same strand as the reference | -| 11 | QUAL | Query QUALity (ASCII-33=Phred base quality) | - - Table 1. Mandatory fields in the SAM format. - -The standard CIGAR description of pairwise alignment defines three operations: â€M’ for match/mismatch, â€I’ for insertion compared with the reference and â€D’ for deletion. The extended CIGAR proposed in SAM added four more operations: â€N’ for skipped bases on the reference, â€S’ for soft clipping, â€H’ for hard clipping and â€P’ for padding. These support splicing, clipping, multi-part and padded alignments. Figure 3 shows examples of CIGAR strings for different types of alignments. - -![SAM format file. The â€@SQ’ line in the header section gives the order of reference sequences. Notably, r001 is the name of a read pair. According to FLAG 163 (/it4i/img/fig3.png) - - Figure 3. SAM format file. The â€@SQ’ line in the header section gives the order of reference sequences. Notably, r001 is the name of a read pair. According to FLAG 163 (=1+2+32+128), the read mapped to position 7 is the second read in the pair (128) and regarded as properly paired (1 + 2); its mate is mapped to 37 on the reverse strand (32). Read r002 has three soft-clipped (unaligned) bases. The coordinate shown in SAM is the position of the first aligned base. The CIGAR string for this alignment contains a P (padding) operation, which correctly aligns the inserted sequences. Padding operations can be absent when an aligner does not support multiple sequence alignment. The last six bases of read r003 map to position 9, and the first five to position 29 on the reverse strand. The hard clipping operation H indicates that the clipped sequence is not present in the sequence field. The NM tag gives the number of mismatches. Read r004 is aligned across an intron, indicated by the N operation. - -##### Binary Alignment/Map (BAM) - -BAM is the binary representation of SAM and keeps exactly the same information as SAM. BAM uses lossless compression to reduce the size of the data by about 75% and provides an indexing system that allows reads that overlap a region of the genome to be retrieved and rapidly traversed. - -#### Quality Control, Preprocessing and Statistics for BAM - -Component: Hpg-Fastq & FastQC. - -Some features - - Quality control - reads with N errors - reads with multiple mappings - strand bias - paired-end insert - Filtering: by number of errors, number of hits - Comparator: stats, intersection, etc. - -Input: BAM file. - -Output: BAM file plus an HTML file containing statistics. - -#### Variant Calling - -Component: GATK. - -Identification of single nucleotide variants and indels on the alignments is performed using the Genome Analysis Toolkit (GATK). GATK (2) is a software package developed at the Broad Institute to analyze high-throughput sequencing data. The toolkit offers a wide variety of tools, with a primary focus on variant discovery and genotyping as well as strong emphasis on data quality assurance. - -Input: BAM - -Output:VCF - -Variant Call Format (VCF) - -VCF (3) is a standardized format for storing the most prevalent types of sequence variation, including SNPs, indels and larger structural variants, together with rich annotations. The format was developed with the primary intention to represent human genetic variation, but its use is not restricted to diploid genomes and can be used in different contexts as well. Its flexibility and user extensibility allows representation of a wide variety of genomic variation with respect to a single reference sequence. - -A VCF file consists of a header section and a data section. The header contains an arbitrary number of metainformation lines, each starting with characters â€##’, and a TAB delimited field definition line, starting with a single â€#’ character. The meta-information header lines provide a standardized description of tags and annotations used in the data section. The use of meta-information allows the information stored within a VCF file to be tailored to the dataset in question. It can be also used to provide information about the means of file creation, date of creation, version of the reference sequence, software used and any other information relevant to the history of the file. The field definition line names eight mandatory columns, corresponding to data columns representing the chromosome (CHROM), a 1-based position of the start of the variant (POS), unique identifiers of the variant (ID), the reference allele (REF), a comma separated list of alternate non-reference alleles (ALT), a phred-scaled quality score (QUAL), site filtering information (FILTER) and a semicolon separated list of additional, user extensible annotation (INFO). In addition, if samples are present in the file, the mandatory header columns are followed by a FORMAT column and an arbitrary number of sample IDs that define the samples included in the VCF file. The FORMAT column is used to define the information contained within each subsequent genotype column, which consists of a colon separated list of fields. For example, the FORMAT field GT:GQ:DP in the fourth data entry of Figure 1a indicates that the subsequent entries contain information regarding the genotype, genotype quality and read depth for each sample. All data lines are TAB delimited and the number of fields in each data line must match the number of fields in the header line. It is strongly recommended that all annotation tags used are declared in the VCF header section. - -![a) Example of valid VCF. The header lines ##fileformat and #CHROM are mandatory, the rest is optional but strongly recommended. Each line of the body describes variants present in the sampled population at one genomic position or region. All alternate alleles are listed in the ALT column and referenced from the genotype fields as 1-based indexes to this list; the reference haplotype is designated as 0. For multiploid data, the separator indicates whether the data are phased (/it4i/img/fig4.png) - - Figure 4 . (a) Example of valid VCF. The header lines ##fileformat and #CHROM are mandatory, the rest is optional but strongly recommended. Each line of the body describes variants present in the sampled population at one genomic position or region. All alternate alleles are listed in the ALT column and referenced from the genotype fields as 1-based indexes to this list; the reference haplotype is designated as 0. For multiploid data, the separator indicates whether the data are phased (|) or unphased (/). Thus, the two alleles C and G at the positions 2 and 5 in this figure occur on the same chromosome in SAMPLE1. The first data line shows an example of a deletion (present in SAMPLE1) and a replacement of two bases by another base (SAMPLE2); the second line shows a SNP and an insertion; the third a SNP; the fourth a large structural variant described by the annotation in the INFO column, the coordinate is that of the base before the variant. (b–f ) Alignments and VCF representations of different sequence variants: SNP, insertion, deletion, replacement, and a large deletion. The REF columns shows the reference bases replaced by the haplotype in the ALT column. The coordinate refers to the first reference base. (g) Users are advised to use simplest representation possible and lowest coordinate in cases where the position is ambiguous. - -### Annotating - -Component: HPG-Variant - -The functional consequences of every variant found are then annotated using the HPG-Variant software, which extracts from CellBase, the Knowledge database, all the information relevant on the predicted pathologic effect of the variants. - -VARIANT (VARIant Analysis Tool) (4) reports information on the variants found that include consequence type and annotations taken from different databases and repositories (SNPs and variants from dbSNP and 1000 genomes, and disease-related variants from the Genome-Wide Association Study (GWAS) catalog, Online Mendelian Inheritance in Man (OMIM), Catalog of Somatic Mutations in Cancer (COSMIC) mutations, etc. VARIANT also produces a rich variety of annotations that include information on the regulatory (transcription factor or miRNAbinding sites, etc.) or structural roles, or on the selective pressures on the sites affected by the variation. This information allows extending the conventional reports beyond the coding regions and expands the knowledge on the contribution of non-coding or synonymous variants to the phenotype studied. - - Input: VCF - - Output: The output of this step is the Variant Calling Format (VCF) file, which contains changes with respect to the reference genome with the corresponding QC and functional annotations. - -#### CellBase - -CellBase(5) is a relational database integrates biological information from different sources and includes: - -Core features - -We took genome sequences, genes, transcripts, exons, cytobands or cross references (xrefs) identifiers (IDs) from Ensembl (6). Protein information including sequences, xrefs or protein features (natural variants, mutagenesis sites, post-translational modifications, etc.) were imported from UniProt (7). - -Regulatory - -CellBase imports miRNA from miRBase (8); curated and non-curated miRNA targets from miRecords (9), miRTarBase (10), -TargetScan(11) and microRNA.org (12) and CpG islands and conserved regions from the UCSC database (13). - -Functional annotation - -OBO Foundry (14) develops many biomedical ontologies that are implemented in OBO format. We designed a SQL schema to store these OBO ontologies and 30 ontologies were imported. OBO ontology term annotations were taken from Ensembl (6). InterPro (15) annotations were also imported. - -Variation - -CellBase includes SNPs from dbSNP (16)^; SNP population frequencies from HapMap (17), 1000 genomes project (18) and Ensembl (6); phenotypically annotated SNPs were imported from NHRI GWAS Catalog (19),HGMD (20), Open Access GWAS Database (21), UniProt (7) and OMIM (22); mutations from COSMIC (23) and structural variations from Ensembl (6). - -Systems biology - -We also import systems biology information like interactome information from IntAct (24). Reactome (25) stores pathway and interaction information in BioPAX (26) format. BioPAX data exchange format enables the integration of diverse pathway -resources. We successfully solved the problem of storing data released in BioPAX format into a SQL relational schema, which allowed us importing Reactome in CellBase. - -### Diagnostic Component (TEAM) - -More detail [here][1]. - -### Priorization Component (BiERApp) - -More detail [here][2]. - -## Usage - -First, we should load ngsPipeline module: - -```console -$ ml ngsPipeline -``` - -This command will load python/2.7.5 module and all the required modules (hpg-aligner, gatk, etc) - -If we launch ngsPipeline with â€-h’, we will get the usage help: - -```console -$ ngsPipeline -h - Usage: ngsPipeline.py [-h] -i INPUT -o OUTPUT -p PED --project PROJECT --queue - QUEUE [--stages-path STAGES_PATH] [--email EMAIL] - [--prefix PREFIX] [-s START] [-e END] --log - - Python pipeline - - optional arguments: - -h, --help show this help message and exit - -i INPUT, --input INPUT - -o OUTPUT, --output OUTPUT - Output Data directory - -p PED, --ped PED Ped file with all individuals - --project PROJECT Project Id - --queue QUEUE Queue Id - --stages-path STAGES_PATH - Custom Stages path - --email EMAIL Email - --prefix PREFIX Prefix name for Queue Jobs name - -s START, --start START - Initial stage - -e END, --end END Final stage - --log Log to file -``` - -Let us see a brief description of the arguments: - -```console - -h --help. Show the help. - - -i, --input. The input data directory. This directory must to have a special structure. We have to create one folder per sample (with the same name). These folders will host the fastq files. These fastq files must have the following pattern “sampleName” + “_” + “1 or 2” + “.fq”. 1 for the first pair (in paired-end sequences), and 2 for the -second one. - - -o , --output. The output folder. This folder will contain all the intermediate and final folders. When the pipeline will be executed completely, we could remove the intermediate folders and keep only the final one (with the VCF file containing all the variants) - - -p , --ped. The ped file with the pedigree. This file contains all the sample names. These names must coincide with the names of the input folders. If our input folder contains more samples than the .ped file, the pipeline will use only the samples from the .ped file. - - --email. Email for notifications. - - --prefix. Prefix for Job names. - - -s, --start & -e, --end. Initial and final stage. If we want to launch the pipeline in a specific stage we must use -s. If we want to end the pipeline in a specific stage we must use -e. - - --log. Using log argument NGSpipeline will prompt all the logs to this file. - - --project>. Project ID of your supercomputer allocation. - - --queue. [Queue][3] to run the jobs in. -``` - -Input, output and ped arguments are mandatory. If the output folder does not exist, the pipeline will create it. - -## Examples - -This is an example usage of NGSpipeline: - -We have a folder with the following structure in - -```console -/apps/bio/omics/1.0/sample_data/ >: - - /apps/bio/omics/1.0/sample_data - └── data - ├── file.ped - ├── sample1 - │ ├── sample1_1.fq - │ └── sample1_2.fq - └── sample2 - ├── sample2_1.fq - └── sample2_2.fq -``` - -The ped file (file.ped) contains the following info: - -```console - #family_ID sample_ID parental_ID maternal_ID sex phenotype - FAM sample_A 0 0 1 1 - FAM sample_B 0 0 2 2 -``` - -Now, let us load the NGSPipeline module and copy the sample data to a [scratch directory][4]: - -```console -$ ml ngsPipeline -$ mkdir -p /scratch/$USER/omics/results -$ cp -r /apps/bio/omics/1.0/sample_data /scratch/$USER/omics/ -``` - -Now, we can launch the pipeline (replace OPEN-0-0 with your Project ID): - -```console -$ ngsPipeline -i /scratch/$USER/omics/sample_data/data -o /scratch/$USER/omics/results -p /scratch/$USER/omics/sample_data/data/file.ped --project OPEN-0-0 --queue qprod -``` - -This command submits the processing [jobs to the queue][5]. - -If we want to re-launch the pipeline from stage 4 until stage 20, we should use the next command: - -```console -$ ngsPipeline -i /scratch/$USER/omics/sample_data/data -o /scratch/$USER/omics/results -p /scratch/$USER/omics/sample_data/data/file.ped -s 4 -e 20 --project OPEN-0-0 --queue qprod -``` - -## Details on the Pipeline - -The pipeline calls the following tools - - [fastqc][a], quality control tool for high throughput sequence data. - [gatk][b], The Genome Analysis Toolkit or GATK is a software package developed at the Broad Institute to analyze high-throughput sequencing data. The toolkit offers a wide variety of tools, with a primary focus on variant discovery and genotyping as well as strong emphasis on data quality assurance. Its robust architecture, powerful processing engine and high-performance computing features make it capable of taking on projects of any size. - [hpg-aligner][c], HPG Aligner has been designed to align short and long reads with high sensitivity, therefore any number of mismatches or indels are allowed. HPG Aligner implements and combines two well known algorithms: _Burrows-Wheeler Transform_ (BWT) to speed-up mapping high-quality reads, and _Smith-Waterman_> (SW) to increase sensitivity when reads cannot be mapped using BWT. - [hpg-fastq][d], a quality control tool for high throughput sequence data. - [hpg-variant][e], The HPG Variant suite is an ambitious project aimed to provide a complete suite of tools to work with genomic variation data, from VCF tools to variant profiling or genomic statistics. It is being implemented using High Performance Computing technologies to provide the best performance possible. - [picard][f], Picard comprises Java-based command-line utilities that manipulate SAM files, and a Java API (HTSJDK) for creating new programs that read and write SAM files. Both SAM text format and SAM binary (BAM) format are supported. - [samtools][g], SAM Tools provide various utilities for manipulating alignments in the SAM format, including sorting, merging, indexing and generating alignments in a per-position format. - [snpEff][h], Genetic variant annotation and effect prediction toolbox. - -This listing show which tools are used in each step of the pipeline - - stage-00: fastqc - stage-01: hpg_fastq - stage-02: fastqc - stage-03: hpg_aligner and samtools - stage-04: samtools - stage-05: samtools - stage-06: fastqc - stage-07: picard - stage-08: fastqc - stage-09: picard - stage-10: gatk - stage-11: gatk - stage-12: gatk - stage-13: gatk - stage-14: gatk - stage-15: gatk - stage-16: samtools - stage-17: samtools - stage-18: fastqc - stage-19: gatk - stage-20: gatk - stage-21: gatk - stage-22: gatk - stage-23: gatk - stage-24: hpg-variant - stage-25: hpg-variant - stage-26: snpEff - stage-27: snpEff - stage-28: hpg-variant - -## Interpretation - -The output folder contains all the subfolders with the intermediate data. This folder contains the final VCF with all the variants. This file can be uploaded into [TEAM][1] by using the VCF file button. It is important to note here that the entire management of the VCF file is local: no patient’s sequence data is sent over the Internet thus avoiding any problem of data privacy or confidentiality. - -![TEAM upload panel. Once the file has been uploaded, a panel must be chosen from the Panel list. Then, pressing the Run button the diagnostic process starts.]\(/it4i/img/fig7.png) - - Figure 7. _TEAM upload panel._ _Once the file has been uploaded, a panel must be chosen from the Panel_ list. Then, pressing the Run button the diagnostic process starts. - -Once the file has been uploaded, a panel must be chosen from the Panel list. Then, pressing the Run button the diagnostic process starts. TEAM searches first for known diagnostic mutation(s) taken from four databases: HGMD-public (20), [HUMSAVAR][i], ClinVar (29) and COSMIC (23). - -\ - - Figure 8. \BierApp VCF upload panel. It is recommended to choose a name for the job as well as a description \\. - -Each prioritization (â€job’) has three associated screens that facilitate the filtering steps. The first one, the â€Summary’ tab, displays a statistic of the data set analyzed, containing the samples analyzed, the number and types of variants found and its distribution according to consequence types. The second screen, in the â€Variants and effect’ tab, is the actual filtering tool, and the third one, the â€Genome view’ tab, offers a representation of the selected variants within the genomic context provided by an embedded version of the Genome Maps Tool (30). - - - - Figure 9. This picture shows all the information associated to the variants. If a variant has an associated phenotype we could see it in the last column. In this case, the variant 7:132481242 CT is associated to the phenotype: large intestine tumor. - -## References - -1. Heng Li, Bob Handsaker, Alec Wysoker, Tim Fennell, Jue Ruan, Nils Homer, Gabor Marth5, Goncalo Abecasis6, Richard Durbin and 1000 Genome Project Data Processing Subgroup: The Sequence Alignment/Map format and SAMtools. Bioinformatics 2009, 25: 2078-2079. -1. McKenna A, Hanna M, Banks E, Sivachenko A, Cibulskis K, Kernytsky A, Garimella K, Altshuler D, Gabriel S, Daly M, DePristo MA: The Genome Analysis Toolkit: a MapReduce framework for analyzing next-generation DNA sequencing data. _Genome Res_ >2010, 20:1297-1303. -1. Petr Danecek, Adam Auton, Goncalo Abecasis, Cornelis A. Albers, Eric Banks, Mark A. DePristo, Robert E. Handsaker, Gerton Lunter, Gabor T. Marth, Stephen T. Sherry, Gilean McVean, Richard Durbin, and 1000 Genomes Project Analysis Group. The variant call format and VCFtools. Bioinformatics 2011, 27: 2156-2158. -1. Medina I, De Maria A, Bleda M, Salavert F, Alonso R, Gonzalez CY, Dopazo J: VARIANT: Command Line, Web service and Web interface for fast and accurate functional characterization of variants found by Next-Generation Sequencing. Nucleic Acids Res 2012, 40:W54-58. -1. Bleda M, Tarraga J, de Maria A, Salavert F, Garcia-Alonso L, Celma M, Martin A, Dopazo J, Medina I: CellBase, a comprehensive collection of RESTful web services for retrieving relevant biological information from heterogeneous sources. Nucleic Acids Res 2012, 40:W609-614. -1. Flicek,P., Amode,M.R., Barrell,D., Beal,K., Brent,S., Carvalho-Silva,D., Clapham,P., Coates,G., Fairley,S., Fitzgerald,S. et al. (2012) Ensembl 2012. Nucleic Acids Res., 40, D84–D90. -1. UniProt Consortium. (2012) Reorganizing the protein space at the Universal Protein Resource (UniProt). Nucleic Acids Res., 40, D71–D75. -1. Kozomara,A. and Griffiths-Jones,S. (2011) miRBase: integrating microRNA annotation and deep-sequencing data. Nucleic Acids Res., 39, D152–D157. -1. Xiao,F., Zuo,Z., Cai,G., Kang,S., Gao,X. and Li,T. (2009) miRecords: an integrated resource for microRNA-target interactions. Nucleic Acids Res., 37, D105–D110. -1. Hsu,S.D., Lin,F.M., Wu,W.Y., Liang,C., Huang,W.C., Chan,W.L., Tsai,W.T., Chen,G.Z., Lee,C.J., Chiu,C.M. et al. (2011) miRTarBase: a database curates experimentally validated microRNA-target interactions. Nucleic Acids Res., 39, D163–D169. -1. Friedman,R.C., Farh,K.K., Burge,C.B. and Bartel,D.P. (2009) Most mammalian mRNAs are conserved targets of microRNAs. Genome Res., 19, 92–105. 12. Betel,D., Wilson,M., Gabow,A., Marks,D.S. and Sander,C. (2008) The microRNA.org resource: targets and expression. Nucleic Acids Res., 36, D149–D153. -1. Dreszer,T.R., Karolchik,D., Zweig,A.S., Hinrichs,A.S., Raney,B.J., Kuhn,R.M., Meyer,L.R., Wong,M., Sloan,C.A., Rosenbloom,K.R. et al. (2012) The UCSC genome browser database: extensions and updates 2011. Nucleic Acids Res.,40, D918–D923. -1. Smith,B., Ashburner,M., Rosse,C., Bard,J., Bug,W., Ceusters,W., Goldberg,L.J., Eilbeck,K., Ireland,A., Mungall,C.J. et al. (2007) The OBO Foundry: coordinated evolution of ontologies to support biomedical data integration. Nat. Biotechnol., 25, 1251–1255. -1. Hunter,S., Jones,P., Mitchell,A., Apweiler,R., Attwood,T.K.,Bateman,A., Bernard,T., Binns,D., Bork,P., Burge,S. et al. (2012) InterPro in 2011: new developments in the family and domain prediction database. Nucleic Acids Res.,40, D306–D312. -1. Sherry,S.T., Ward,M.H., Kholodov,M., Baker,J., Phan,L., Smigielski,E.M. and Sirotkin,K. (2001) dbSNP: the NCBI database of genetic variation. Nucleic Acids Res., 29, 308–311. -1. Altshuler,D.M., Gibbs,R.A., Peltonen,L., Dermitzakis,E., Schaffner,S.F., Yu,F., Bonnen,P.E., de Bakker,P.I., Deloukas,P., Gabriel,S.B. et al. (2010) Integrating common and rare genetic variation in diverse human populations. Nature, 467, 52–58. -1. 1000 Genomes Project Consortium. (2010) A map of human genome variation from population-scale sequencing. Nature, 467, 1061–1073. -1. Hindorff,L.A., Sethupathy,P., Junkins,H.A., Ramos,E.M., Mehta,J.P., Collins,F.S. and Manolio,T.A. (2009) Potential etiologic and functional implications of genome-wide association loci for human diseases and traits. Proc. Natl Acad. Sci. USA, 106, 9362–9367. -1. Stenson,P.D., Ball,E.V., Mort,M., Phillips,A.D., Shiel,J.A., Thomas,N.S., Abeysinghe,S., Krawczak,M. and Cooper,D.N. (2003) Human gene mutation database (HGMD): 2003 update. Hum. Mutat., 21, 577–581. -1. Johnson,A.D. and O’Donnell,C.J. (2009) An open access database of genome-wide association results. BMC Med. Genet, 10, 6. -1. McKusick,V. (1998) A Catalog of Human Genes and Genetic Disorders, 12th edn. John Hopkins University Press,Baltimore, MD. -1. Forbes,S.A., Bindal,N., Bamford,S., Cole,C., Kok,C.Y., Beare,D., Jia,M., Shepherd,R., Leung,K., Menzies,A. et al. (2011) COSMIC: mining complete cancer genomes in the catalogue of somatic mutations in cancer. Nucleic Acids Res., 39, D945–D950. -1. Kerrien,S., Aranda,B., Breuza,L., Bridge,A., Broackes-Carter,F., Chen,C., Duesbury,M., Dumousseau,M., Feuermann,M., Hinz,U. et al. (2012) The Intact molecular interaction database in 2012. Nucleic Acids Res., 40, D841–D846. -1. Croft,D., O’Kelly,G., Wu,G., Haw,R., Gillespie,M., Matthews,L., Caudy,M., Garapati,P., Gopinath,G., Jassal,B. et al. (2011) Reactome: a database of reactions, pathways and biological processes. Nucleic Acids Res., 39, D691–D697. -1. Demir,E., Cary,M.P., Paley,S., Fukuda,K., Lemer,C., Vastrik,I.,Wu,G., D’Eustachio,P., Schaefer,C., Luciano,J. et al. (2010) The BioPAX community standard for pathway data sharing. Nature Biotechnol., 28, 935–942. -1. Alemán Z, GarcĂa-GarcĂa F, Medina I, Dopazo J (2014): A web tool for the design and management of panels of genes for targeted enrichment and massive sequencing for clinical applications. Nucleic Acids Res 42: W83-7. -1. [Alemán A][j], [Garcia-Garcia F][k], [Salavert F][l], [Medina I][m], [Dopazo J][n] (2014). A web-based interactive framework to assist in the prioritization of disease candidate genes in whole-exome sequencing studies. [Nucleic Acids Res.][o], W88-93. -1. Landrum,M.J., Lee,J.M., Riley,G.R., Jang,W., Rubinstein,W.S., Church,D.M. and Maglott,D.R. (2014) ClinVar: public archive of relationships among sequence variation and human phenotype. Nucleic Acids Res., 42, D980–D985. -1. Medina I, Salavert F, Sanchez R, de Maria A, Alonso R, Escobar P, Bleda M, Dopazo J: Genome Maps, a new generation genome browser. Nucleic Acids Res 2013, 41:W41-46. - -[1]: diagnostic-component-team.md -[2]: priorization-component-bierapp.md -[3]: ../../../general/resources-allocation-policy.md -[4]: ../../../salomon/storage.md -[5]: ../../../general/job-submission-and-execution.md - -[a]: http://www.bioinformatics.babraham.ac.uk/projects/fastqc/ -[b]: https://www.broadinstitute.org/gatk/ -[c]: https://github.com/opencb-hpg/hpg-aligner -[d]: http://docs.bioinfo.cipf.es/projects/fastqhpc/wiki -[e]: http://docs.bioinfo.cipf.es/projects/hpg-variant/wiki -[f]: http://picard.sourceforge.net/ -[g]: http://samtools.sourceforge.net/samtools-c.shtml -[h]: http://snpeff.sourceforge.net/ -[i]: http://www.uniprot.org/docs/humsavar -[j]: http://www.ncbi.nlm.nih.gov/pubmed?term=Alem%C3%A1n%20A%5BAuthor%5D&cauthor=true&cauthor_uid=24803668 -[k]: http://www.ncbi.nlm.nih.gov/pubmed?term=Garcia-Garcia%20F%5BAuthor%5D&cauthor=true&cauthor_uid=24803668 -[l]: http://www.ncbi.nlm.nih.gov/pubmed?term=Salavert%20F%5BAuthor%5D&cauthor=true&cauthor_uid=24803668 -[m]: http://www.ncbi.nlm.nih.gov/pubmed?term=Medina%20I%5BAuthor%5D&cauthor=true&cauthor_uid=24803668 -[n]: http://www.ncbi.nlm.nih.gov/pubmed?term=Dopazo%20J%5BAuthor%5D&cauthor=true&cauthor_uid=24803668 -[o]: http://www.ncbi.nlm.nih.gov/pubmed/?term=BiERapp diff --git a/content/docs/software/bio/omics-master/priorization-component-bierapp.mdx b/content/docs/software/bio/omics-master/priorization-component-bierapp.mdx deleted file mode 100644 index d6e77e8956107ce7e0c30ac18e3f35a41828078a..0000000000000000000000000000000000000000 --- a/content/docs/software/bio/omics-master/priorization-component-bierapp.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Prioritization Component (BiERapp)" ---- -## Access - -BiERapp is available at the [following address][1]. - -<Callout> - The address is accessible only via VPN. -</Callout> - -## BiERapp - -** This tool is aimed at discovering new disease genes or variants by studying affected families or cases and controls. It carries out a filtering process to sequentially remove: (i) variants which are not compatible with the disease because they are not expected to have impact on the protein function; (ii) variants that exist at frequencies incompatible with the disease; (iii) variants that do not segregate with the disease. The result is a reduced set of disease gene candidates that should be further validated experimentally. ** - -BiERapp (28) efficiently helps in the identification of causative variants in family and sporadic genetic diseases. The program reads lists of predicted variants (nucleotide substitutions and indels) in affected individuals or tumor samples and controls. In family studies, different modes of inheritance can easily be defined to filter out variants that do not segregate with the disease along the family. Moreover, BiERapp integrates additional information such as allelic frequencies in the general population and the most popular damaging scores to further narrow down the number of putative variants in successive filtering steps. BiERapp provides an interactive and user-friendly interface that implements the filtering strategy used in the context of a large-scale genomic project carried out by the Spanish Network for Research, in Rare Diseases (CIBERER), and the Medical Genome Project. in which more than 800 exomes have been analyzed. - -![Web interface to the prioritization tool. This figure shows the interface of the web tool for candidate gene prioritization with the filters available. The tool includes a genomic viewer (/it4i/img/fig6.png) - -**Figure 6**. Web interface to the prioritization tool. This figure shows the interface of the web tool for candidate gene -prioritization with the filters available. The tool includes a genomic viewer (Genome Maps 30) that enables the representation of the variants in the corresponding genomic coordinates. - -[1]: http://omics.it4i.cz/bierapp/ diff --git a/content/docs/software/cae/comsol/comsol-multiphysics.mdx b/content/docs/software/cae/comsol/comsol-multiphysics.mdx deleted file mode 100644 index 7aab34eba04152dd80ebe96781ef0c40aa407052..0000000000000000000000000000000000000000 --- a/content/docs/software/cae/comsol/comsol-multiphysics.mdx +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: "COMSOL Multiphysics" ---- -## Introduction - -[COMSOL][a] is a powerful environment for modelling and solving various engineering -and scientific problems based on partial differential equations. -COMSOL is designed to solve coupled or multiphysics phenomena. -For many standard engineering problems, COMSOL provides add-on products (modules) -such as electrical, mechanical, fluid flow, and chemical applications. - -* [Structural Mechanics Module][b], -* [Heat Transfer Module][c], -* [CFD Module][d], -* [Acoustics Module][e]. -* and [many others][f] - -COMSOL also allows an interface support for equation-based modelling of partial differential equations. - -## Execution - -There are two types of license: - -* **Non commercial** or so called **EDU variant**, which can be used for research and educational purposes. - -* **Commercial** or so called **COM variant**, which can used also for commercial activities. **COM variant** has only subset of features compared to the **EDU variant** available. More about licensing [here][1]. - -By default, the **EDU variant** is loaded. If you needs other version or variant, load the particular version. To obtain the list of available versions, use: - -```console -$ ml av COMSOL -``` - -To prepare COMSOL jobs in the interactive mode, we recommend using COMSOL on the compute nodes. - -<Callout> - To run the COMSOL Desktop GUI on Windows, we recommend using the [Virtual Network Computing (VNC)][2]. -</Callout> - -Example for Karolina: - -```console -$srun --account=PROJECT_ID --partition=qcpu --nodes=1 --ntasks=128 --cpus-per-task=1 --x11 - -$ ml av COMSOL - ------------------------------- /apps/modules/phys ----------------------------- - COMSOL/5.2.0-COM COMSOL/5.2.0-EDU (D) - -$ ml COMSOL/5.2.0-EDU -$ comsol -3drend sw -``` - -* If you receive errors at startup, for example, of the following type: - -```console -FL3D: error at line 814 in file fl3dglcontext_x11common.c: - PBuffers are not supported by the system. -FL3D: error at line 235 in file fl3dglcontext_x11common.c: - assert: x11Handle -``` - -you need to run COMSOL with additional parameters: - -```console -$ comsol -3drend sw -``` - -To run COMSOL in batch mode without the COMSOL Desktop GUI environment, -utilize the following (`comsol.slurm`) job script and execute it via the `salloc` command: - -```bash -#!/bin/bash -#SBATCH --nodes=3 -#SBATCH --ntasks-per-node=128 -#SBATCH --cpus-per-task=1 -#SBATCH --partition=qcpu -#SBATCH --job-name=JOB_NAME -#SBATCH --account=PROJECT_ID - -cd /scratch/project/PROJECT_ID/ || exit - -echo Time is `date` -echo Directory is `pwd` -echo '**SLURM_JOB_NODELIST***START*******' -scontrol show hostname $SLURM_JOB_NODELIST -echo '**SLURM_JOB_NODELIST***END*********' - -# Assign the number of tasks -ntask=$(scontrol show hostname $SLURM_JOB_NODELIST | wc -l) - -# Load COMSOL module -ml COMSOL/5.2.0-EDU - -# Run COMSOL with SLURM options -comsol -3drend sw -nn ${ntask} batch -configuration /tmp \ - –mpiarg –rmk –mpiarg slurm \ - -tmpdir /scratch/project/PROJECT_ID/ \ - -inputfile name_input_f.mph \ - -outputfile name_output_f.mph \ - -batchlog name_log_f.log -``` - -A working directory has to be created before sending the (`comsol.slurm`) job script into the queue. -The input file (name_input_f.mph) has to be in the working directory -or a full path to the input file has to be specified. -The appropriate path to the temp directory of the job has to be set by the `-tmpdir` command option. - -### Starting a COMSOL Server - -Starting a COMSOL server on a compute node and then connecting to it -through a COMSOL Desktop GUI environment is a convenient way of running calculations from GUI. -To do so, you first need to submit a job with which you'll start the COMSOL server, for example: - -<Callout> - You may be prompted to provide username and password. These can be different from your IT4Innovations credentials, and will be used during the authentication when trying to connect to the server from GUI. -</Callout> - -```bash -$ salloc --account=PROJECT_ID --partition=qcpu_exp --nodes=1 --ntasks=36 --cpus-per-task=1 -salloc: Granted job allocation 694746 -salloc: Waiting for resource configuration -salloc: Nodes cn58 are ready for job - -$ ml COMSOL/5.2.0-COM -$ comsol server -COMSOL 5.2 (Build: 166) Multiphysics Server started listening on port 2036 -Use the console command 'close' to exit the program -``` - -After that, start your COMSOL Desktop GUI session and fill required information under `File -> Client Server -> Connect to Server`, where server will be the node where COMSOL server is running. Once you are done, your computational tasks will be offloaded to the COMSOL server. - -## LiveLink for MATLAB - -COMSOL is a software package for the numerical solution of partial differential equations. LiveLink for MATLAB allows connection to the COMSOL API (Application Programming Interface) with the benefits of the programming language and computing environment of MATLAB. - -LiveLink for MATLAB is available in both **EDU** and **COM** **variant** of the COMSOL release. On the clusters there is 1 commercial (**COM**) and 5 educational (**EDU**) licenses of LiveLink for MATLAB (see the [ISV Licenses][3]). The following example shows how to start COMSOL model from MATLAB via LiveLink in the interactive mode. - -```console -salloc --account=PROJECT_ID --partition=qcpu_exp --nodes=1 --ntasks=128 --cpus-per-task=1 --x11 -$ ml <matlab_module> and <comsol_module> -$ comsol -3drend sw server MATLAB -``` - -On the first start of the LiveLink for MATLAB (client-MATLAB/server-COMSOL connection), the login and password is requested; this information is not requested again. - -To run LiveLink for MATLAB in batch mode with (`comsol_matlab.slurm`) job script, -you can utilize/modify the following script and execute it via the `sbatch` command. - -```bash -#!/bin/bash -#SBATCH --nodes=3 -#SBATCH --ntasks-per-node=128 -#SBATCH --cpus-per-task=1 -#SBATCH --partition=qcpu -#SBATCH --job-name=JOB_NAME -#SBATCH --account=PROJECT_ID - -cd /scratch/project/PROJECT_ID || exit - -echo Time is `date` -echo Directory is `pwd` -echo '**SLURM_JOB_NODELIST***START*******' -scontrol show hostname $SLURM_JOB_NODELIST -echo '**SLURM_JOB_NODELIST***END*********' - -# Assign the number of tasks -ntask=$(scontrol show hostname $SLURM_JOB_NODELIST | wc -l) - -# Load modules -ml <matlab_module> and <comsol_module> - -# Run with Slurm options -comsol -3drend sw -nn ${ntask} server -configuration /tmp -mpiarg -rmk -mpiarg slurm -tmpdir /scratch/project/PROJECT_ID & -cd $EBROOTCOMSOL/mli -matlab -nodesktop -nosplash -r "mphstart; addpath /scratch/project/PROJECT_ID; test_job" -``` - -This example shows how to run LiveLink for MATLAB with the following configuration: -3 nodes and 128 cores per node. A working directory has to be created -before submitting (`comsol_matlab.slurm`) job script into the queue. -The input file (`test_job.m`) has to be in the working directory -or a full path to the input file has to be specified. -The MATLAB command option (`-r ”mphstart”`) created a connection with a COMSOL server using the default port number. - -[1]: licensing-and-available-versions.md -[2]: ../../../general/accessing-the-clusters/graphical-user-interface/vnc.md -[3]: ../../isv_licenses.md -[4]: ../../../modules/lmod/#loading-modules - -[a]: http://www.comsol.com -[b]: http://www.comsol.com/structural-mechanics-module -[c]: http://www.comsol.com/heat-transfer-module -[d]: http://www.comsol.com/cfd-module -[e]: http://www.comsol.com/acoustics-module -[f]: http://www.comsol.com/products diff --git a/content/docs/software/cae/comsol/licensing-and-available-versions.mdx b/content/docs/software/cae/comsol/licensing-and-available-versions.mdx deleted file mode 100644 index 8fdc794c9b9529ddeeb9fbd530e224ffcf591353..0000000000000000000000000000000000000000 --- a/content/docs/software/cae/comsol/licensing-and-available-versions.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Licensing and Available Versions" ---- -## COMSOL License Can Be Used By: - -* all persons carrying out the CE IT4Innovations Project (In addition to the primary licensee, which is VSB - Technical University of Ostrava, users are CE IT4Innovations third parties - CE IT4Innovations project partners, particularly the University of Ostrava, the Brno University of Technology - Faculty of Informatics, the Silesian University in Opava, Institute of Geonics AS CR.); -* all persons who have a valid license; -* students of the Technical University. - -## COMSOL Network License Types - -| Type | Description | -| ---- | ----------- | -| EDU | Academic license for science and research, publications, students’ projects, and teaching. | -| COM | Commercial license for science and research, publications, students’ projects, and commercial research with no commercial use restrictions. Enables the solution of at least one job by one user in one program start. | - -## Available Versions - -See the [list of available licenses][a]. - -[a]: http://licelin.it4i.cz/list/ \ No newline at end of file diff --git a/content/docs/software/cae/comsol/meta.json b/content/docs/software/cae/comsol/meta.json deleted file mode 100644 index 3aafc618a18b925a41595dcac05650c2c5d09834..0000000000000000000000000000000000000000 --- a/content/docs/software/cae/comsol/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Comsol", - "pages": [ - "comsol-multiphysics", - "licensing-and-available-versions" - ] -} diff --git a/content/docs/software/cae/meta.json b/content/docs/software/cae/meta.json deleted file mode 100644 index 61ad618029c48206f4ce64560e725e822a8d5046..0000000000000000000000000000000000000000 --- a/content/docs/software/cae/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Cae", - "pages": [ - "comsol" - ] -} diff --git a/content/docs/software/chemistry/files-nwchem/meta.json b/content/docs/software/chemistry/files-nwchem/meta.json deleted file mode 100644 index 301c21cce82b5ace9df0ad506d28092024640b77..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/files-nwchem/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Files-nwchem", - "pages": [] -} diff --git a/content/docs/software/chemistry/files-phono3py/meta.json b/content/docs/software/chemistry/files-phono3py/meta.json deleted file mode 100644 index 147c613f635a64e763822a9c3a008a4b5bb5ffff..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/files-phono3py/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Files-phono3py", - "pages": [] -} diff --git a/content/docs/software/chemistry/files-phonopy/meta.json b/content/docs/software/chemistry/files-phonopy/meta.json deleted file mode 100644 index 1a2fcdec77cc0e7e29e5001f9457ca3c1ba2f130..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/files-phonopy/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Files-phonopy", - "pages": [] -} diff --git a/content/docs/software/chemistry/gaussian.mdx b/content/docs/software/chemistry/gaussian.mdx deleted file mode 100644 index 08d5d134ac76e5b8e8e8691c1d8adfcf2e1b8d31..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/gaussian.mdx +++ /dev/null @@ -1,267 +0,0 @@ ---- -title: "Gaussian" ---- -## Introduction - -Gaussian provides state-of-the-art capabilities for electronic structure modeling. -Gaussian provides a wide-ranging suite of the most advanced modeling capabilities available. -Starting from the fundamental laws of quantum mechanics, Gaussian predicts the energies, molecular structures, vibrational frequencies, and molecular properties of compounds and reactions in a wide variety of chemical environments. -Gaussians models can be applied to both stable species and compounds that are difficult or impossible to observe experimentally. - -For more information, see the [official webpage][a]. - -## License - -Gaussian software package is available to all users that are -not in direct or indirect competition with the Gaussian Inc. company and have a valid AUP with the IT4Innovations National Supercomputing Center. -The license includes GPU support and Linda parallel environment for Gaussian multi-node parallel execution. - -<Callout> - You need to be a member of the **gaussian group**. Contact [support\[at\]it4i.cz][b] in order to get included in the gaussian group. -</Callout> - -Check your group membership: - -```bash -$ id -uid=1000(user) gid=1000(user) groups=1000(user),1234(open-0-0),7310(gaussian) -``` - -## Installed Version - -The following versions of Gaussian is available on Karolina, Barbora, and DGX-2 systems. - -| Module | CPU support | GPU support | Parallelization | Note | Barbora | DGX-2 | Karolina | -|--------------------------------------|-------------|--------------|-----------------|---------------------|---------|-------| -------- | -| Gaussian/09-a02 | AVX2 | No | SMP + Linda | IT4I compiled | Yes | No | No | -| Gaussian/09-d01 | AVX2 | No | SMP + Linda | IT4I compiled | Yes | No | No | -| Gaussian/16_rev_c0-binary | AVX2 | Yes | SMP | Binary distribution | Yes | Yes | No | -| Gaussian/16_rev_c0-binary-Linda | AVX2 | Yes | SMP + Linda | Binary distribution | Yes | No | No | -| Gaussian/16_rev_c0-CascadeLake | AVX-512 | No | SMP | IT4I compiled | Yes | No | No | -| Gaussian/16_rev_c0-CascadeLake-Linda | AVX-512 | No | SMP + Linda | IT4I compiled | Yes | No | No | -| Gaussian/16_rev_c0-GPU-Linda | AVX2 | Yes | SMP + Linda | IT4I compiled | Yes | No | No | -| Gaussian/16_rev_c0-GPU | AVX2 | Yes | SMP | IT4I compiled | No | Yes | No | -| Gaussian/16_rev_c0-Linda | AVX2 | No | SMP + Linda | IT4I compiled | No | No | No | -| Gaussian/16_rev_c0 | AVX2 | No | SMP + Linda | IT4I compiled | No | No | No | -| Gaussian/16_rev_c2 | AVX2 | Yes | SMP + Linda | IT4I compiled | No | No | Yes | - -Speedup may be observed on Barbora and DGX-2 systems when using the `CascadeLake` and `GPU` modules compared to the `binary` module. - -## Running - -Gaussian is compiled for single node parallel execution as well as multi-node parallel execution using Linda. -GPU support for V100 cards is available on Barbora and DGX-2. - -<Callout> - By default, the execution is single-core, single-node, and without GPU acceleration. -</Callout> - -### Shared-Memory Multiprocessor Parallel Execution (Single Node) - -Load module - -```bash -$ ml Gaussian/16_rev_c0-binary -``` - -In the input file Link0 header section, set the CPU cores (e.g. 36 for Barbora, 48 for DGX-2) and memory amount. - -```bash -%CPU=0-35 -%Mem=8GB -``` - -### Cluster/Network Parallel Execution (Multi Node) - -Load Linda-enabled module - -```bash -$ ml Gaussian/16_rev_c0-binary-Linda -``` - -The network parallelization environment is **Linda**. -In the input file Link0 header section, set the CPU cores (e.g. 36 for Barbora, 48 for DGX-2) and memory amount. -Include the `%UseSSH` keyword, as well. This enables Linda to spawn parallel workers. - -```bash -%CPU=0-35 -%Mem=8GB -%UseSSH -``` - -The number and placement of Linda workers may be controlled by %LindaWorkers keyword or by -GAUSS_WDEF environment variable. When running multi-node job via the batch queue, loading -the Linda-enabled module **automatically sets the `GAUSS_WDEF` variable** to the correct node-list, using one worker per node. -In combination with the %CPU keyword, this enables a full-scale multi-node execution. - -```bash -$ echo $GAUSS_WDEF -``` - -If a different amount of Linda workers is required, unset or modify -the GAUSS_WDEF environment variable accordingly. - -### GPU-Accelerated Execution (Single Node/Multi Node) - -#### Karolina - -Karolina is equipped with NVIDIA A100 GPUs and the Ampere architecture requires new CUDA and compiler versions which are supported by the module `Gaussian/16_rev_c2`. - -#### Barbora - -On Barbora, the GPU acceleration may be combined with the Linda parallelization. -Load Linda-enabled binary module: - -```bash -$ ml Gaussian/16_rev_c0-binary-Linda -``` - -or GPU-enabled module: - -```bash -$ ml Gaussian/16_rev_c0-GPU-Linda -``` - -In the input file Link0 header section, set the CPU cores (24 for Barbora GPU nodes) and memory. -To enable GPU acceleration, set the `%GPUCPU` keyword. This keyword activates GPU accelerators and dedicates CPU cores to drive the GPU accelerators. -On Barbora GPU nodes, we activate GPUs 0-3 and assign cores 0, 2, 12, 14 (two from each CPU socket) to drive the accelerators. -If multi-node computation is intended, include the `%UseSSH` keyword, as well. This enables Linda to spawn parallel workers. - -```bash -%CPU=0-23 -%GPUCPU=0-3=0,2,12,14 -%Mem=8GB -%UseSSH -``` - -#### DGX-2 - -GPU-accelerated calculations on the **DGX-2** are supported with Gaussian binary module: - -```bash -$ ml Gaussian/16_rev_c0-binary -``` - -Or IT4I-compiled module - -```bash -$ ml Gaussian/16_rev_c0-GPU -``` - -In the input file Link0 header section, modify the `%CPU` keyword to 48 cores and the `%GPUCPU` keyword to 16 GPU accelerators. Omit the Linda. - -```bash -%CPU=0-47 -%GPUCPU=0-15=0,2,4,6,8,10,12,14,24,26,28,30,32,34,36,38 -%Mem=512GB -``` - -### Example Input File - -This example input file sets water molecule geometry optimization and vibrational frequencies computation -using 36 cores (on Barbora supercomputer) and Linda parallelization. - -```bash -%CPU=0-35 -%Mem=8GB -%UseSSH -#p rb3lyp/6-31G* test opt freq - -Gaussian Test Job: -WATER H20 optimization - - 0 1 - O - H 1 R - H 1 R 2 A - -R 0.96 -A 109.471221 - -``` - -### Run Gaussian (All Modes) - -Set a scratch directory: - -```bash -$ GAUSS_SCRDIR=/scratch/project/open-0-0/GaussianJob # on Barbora -``` - -Copy files from a local home to the scratch directory: - -```bash -cp * $GAUSS_SCRDIR/ -``` - -Run Gaussian: - -```bash -cd $GAUSS_SCRDIR -g16 < input.inp > output.out -``` - -After the calculation, you can move the data back to your home directory and delete the scratch folder. -For more details, see the [Gaussian documentation][c]. - -### Example Jobscript - -This jobscript will run parallel Gaussian job on Barbora supercomputer, using 4 nodes (4*36 = 144 cores) via Linda. The Linda workers are set -up automatically by the module load. - -```bash -#!/bin/bash -#SBATCH --account=PROJECT_ID -#SBATCH --partition=qcpu -#SBATCH --job-name=MY_JOB -#SBATCH --nodes=4 - -# change to workdir -cd $$SLURM_SUBMIT_DIR - -# load Gaussian Linda enabled module and set up Linda -ml Gaussian/16_rev_c0-binary-Linda - -# create scratch folder and copy input files -GAUSS_SCRDIR=/scratch/work/project/open-0-0/GaussianJob -mkdir -p $GAUSS_SCRDIR -cd $GAUSS_SCRDIR || exit -cp $SLURM_SUBMIT_DIR/* . - -# run Gaussian calculation -# g16 < input.inp > output.out - -# run Gaussian from stdin -g16 << EOF > output.out -%CPU=0-35 -%Mem=8GB -%UseSSH -#p rb3lyp/6-31G* test opt freq - -Gaussian Test Job: -WATER H20 optimization - - 0 1 - O - H 1 R - H 1 R 2 A - -R 0.96 -A 109.471221 - - -EOF - -# copy output files to home - cp * $SLURM_SUBMIT_DIR/. && cd ../ - -# delete scratch directory -rm -rf $GAUSS_SCRDIR - -#end -exit -``` - -[a]: https://gaussian.com/gaussian16/ -[b]: mailto:support@it4i.cz -[c]: https://gaussian.com/man/ diff --git a/content/docs/software/chemistry/meta.json b/content/docs/software/chemistry/meta.json deleted file mode 100644 index b71bcdf17bf237ff98fadaa13e15abed219cef34..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/meta.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Chemistry", - "pages": [ - "files-nwchem", - "files-phono3py", - "files-phonopy", - "gaussian", - "molpro", - "nwchem", - "orca", - "phono3py", - "phonopy", - "vasp" - ] -} diff --git a/content/docs/software/chemistry/molpro.mdx b/content/docs/software/chemistry/molpro.mdx deleted file mode 100644 index 95c148451b8c316e0139ff231e6593935f64a309..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/molpro.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Molpro" ---- -## Introduction - -MOLPRO is a complete software package used for accurate ab-initio quantum chemistry calculations. -For more information, see the [official webpage][a]. - -## License - -MOLPRO software package is available only to users that have a valid license. Contact support to enable access to MOLPRO if you have a valid license appropriate for running on our cluster (e.g. academic research group licence, parallel execution). - -To run MOLPRO, you need to have a valid license token present in `HOME/.molpro/token`. You can download the token from [MOLPRO website][b]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Molpro -``` - -Compilation parameters are default: - -| Parameter | Value | -| ---------------------------------- | ------------ | -| max number of atoms | 200 | -| max number of valence orbitals | 300 | -| max number of basis functions | 4095 | -| max number of states per symmetry | 20 | -| max number of state symmetries | 16 | -| max number of records | 200 | -| max number of primitives | maxbfn x [2] | - -## Running - -MOLPRO is compiled for parallel execution using MPI and OpenMP. -By default, MOLPRO reads the number of allocated nodes from Slurm -and launches a data server on one node. -On the remaining allocated nodes, compute processes are launched, one process per node. -You can modify this behavior by using the `-n`, `-t`, and `helper-server` options. -For more details, see the [MOLPRO documentation][c]. - -<Callout> - The OpenMP parallelization in MOLPRO is limited and has been observed to produce limited scaling. We therefore recommend to use MPI parallelization only. This can be achieved by passing the `--ntasks-per-node=128` and `--cpus-per-task=1` options to Slurm. -</Callout> - -You are advised to use the `-d` option to point to a directory in SCRATCH file system. -MOLPRO can produce a large amount of temporary data during its run, -so it is important that these are placed in the fast scratch file system. - -### Example jobscript - -```bash -#!/bin/bash -#SBATCH --account=PROJECT_ID -#SBATCH --partition=qcpu -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=128 -#SBATCH --cpus-per-task=1 - -cd $SLURM_SUBMIT_DIR - -# load Molpro module -ml Molpro/mpp-2024.1.0.linux_x86_64_mpipr - -# create a directory in the SCRATCH filesystem -mkdir -p /scratch/project/PROJECT_ID/$SLURM_JOB_ID -cd /scratch/project/PROJECT_ID/$SLURM_JOB_ID - -# copy an example input -cp $EBROOTMOLPRO/examples/caffeine_opt_diis.com . - -# run Molpro with default options -molpro -d /scratch/project/PROJECT_ID/$SLURM_JOB_ID caffeine_opt_diis.com - -exit 0 -``` - -[a]: http://www.molpro.net/ -[b]: https://www.molpro.net/licensee/?portal=licensee -[c]: http://www.molpro.net/info/2010.1/doc/manual/node9.html diff --git a/content/docs/software/chemistry/nwchem.mdx b/content/docs/software/chemistry/nwchem.mdx deleted file mode 100644 index 2cf96a01482eb93602cc2000c9e72bbf7a15c9ff..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/nwchem.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "NWChem" ---- -## Introduction - -[NWChem][a] aims to provide its users with computational chemistry tools -that are scalable both in their ability to treat large scientific computational chemistry problems efficiently, -and in their use of available parallel computing resources -from high-performance parallel supercomputers to conventional workstation clusters. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av NWChem -``` - -## Running - -NWChem is compiled for parallel MPI execution. -A standard procedure for MPI jobs applies. -A sample jobscript (for Karolina on 128 threads) using a sample input file [h2o.nw][1]: - -```bash -#SBATCH --account=ACCOUNT_ID -#SBATCH --partition=qcpu -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=128 -#SBATCH --cpus-per-task=1 - -cd $SLURM_SUBMIT_DIR -ml NWChem/7.0.2-intel-2020a-Python-3.8.2-karolina -mpirun nwchem h2o.nw -``` - -## Options - -Refer to [the documentation][b] and set the following directives in the input file: - -* MEMORY : controls the amount of memory NWChem will use -* SCRATCH_DIR : set this to a directory in SCRATCH filesystem (or run the calculation completely in a scratch directory). For certain calculations, it might be advisable to reduce I/O by forcing the `direct` mode, e.g. `scf direct` - -[1]: ./files-nwchem/h2o.nw - -[a]: https://www.nwchem-sw.org/index.php/Main_Page -[b]: https://github.com/nwchemgit/nwchem/wiki diff --git a/content/docs/software/chemistry/orca.mdx b/content/docs/software/chemistry/orca.mdx deleted file mode 100644 index 352e462f69ae218b42452a0eac489c064bf6d2b3..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/orca.mdx +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: "ORCA" ---- -## Introduction - -ORCA is a flexible, efficient, and easy-to-use general-purpose tool for quantum chemistry with specific emphasis on spectroscopic properties of open-shell molecules. It features a wide variety of standard quantum chemical methods ranging from semiempirical methods to DFT to single- and multireference correlated ab initio methods. It can also treat environmental and relativistic effects. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av orca -``` - -## Serial Computation With ORCA - -You can test a serial computation with this simple input file. -Create a file called `orca_serial.inp` and paste into it the following ORCA commands: - -```bash - ! HF SVP - * xyz 0 1 - C 0 0 0 - O 0 0 1.13 - * -``` - -Next, create a Slurm submission file for Karolina cluster (interactive job can be used too): - -```bash -#!/bin/bash -#SBATCH --job-name=ORCA_SERIAL -#SBATCH --nodes=1 -#SBATCH --partition=qcpu_exp -#SBATCH --time=1:00:00 -#SBATCH --account=OPEN-0-0 - -ml ORCA/6.0.0-gompi-2023a-avx2 -orca orca_serial.inp -``` - -Submit the job to the queue. -After the job ends, you can find an output log in your working directory: - -```console -sbatch submit_serial.slurm -1417552 - -$ ll ORCA_SERIAL.* --rw------- 1 user user 0 Aug 21 12:24 ORCA_SERIAL.e1417552 --rw------- 1 user user 20715 Aug 21 12:25 ORCA_SERIAL.o1417552 - -$ cat ORCA_SERIAL.o1417552 - - ***************** - * O R C A * - ***************** - - ######################################################### - # -***- # - # Department of theory and spectroscopy # - # # - # Frank Neese # - # # - # Directorship, Architecture, Infrastructure # - # SHARK, DRIVERS # - # Core code/Algorithms in most modules # - # # - # Max Planck Institute fuer Kohlenforschung # - # Kaiser Wilhelm Platz 1 # - # D-45470 Muelheim/Ruhr # - # Germany # - # # - # All rights reserved # - # -***- # - ######################################################### - - - Program Version 6.0.0 - RELEASE - - -... - - ****ORCA TERMINATED NORMALLY**** -TOTAL RUN TIME: 0 days 0 hours 0 minutes 0 seconds 980 msec -``` - -## Running ORCA in Parallel - -Your serial computation can be easily converted to parallel. -Simply specify the number of parallel processes by the `%pal` directive. -In this example, 1 node, 16 cores are used. - -<Callout type=warn> - Do not use the `! PAL` directive as only PAL2 to PAL8 is recognized. -</Callout> - -```bash - ! HF SVP - %pal - nprocs 16 - end - * xyz 0 1 - C 0 0 0 - O 0 0 1.13 - * -``` - -You also need to edit the previously used Slurm submission file. -You have to specify number of nodes, cores, and MPI-processes to run: - -```bash - -#!/bin/bash -#SBATCH --job-name=ORCA_PARALLEL -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=16 -#SBATCH --partition=qcpu_exp -#SBATCH --account=OPEN-0-0 -#SBATCH --time=1:00:00 - -ml ORCA/6.0.0-gompi-2023a-avx2 -$(which orca) orca_parallel.inp > output.out -``` - -<Callout> - When running ORCA in parallel, ORCA should **NOT** be started with `mpirun` (e.g. `mpirun -np 4 orca`, etc.) - like many MPI programs and **has to be called with a full pathname**. -</Callout> - -Submit this job to the queue and see the output file. - -```console -$ sbatch submit_parallel.slurm -Submitted batch job 2127305 - -$ cat output.out - - ***************** - * O R C A * - ***************** - - - ######################################################### - # -***- # - # Department of theory and spectroscopy # - # # - # Frank Neese # - # # - # Directorship, Architecture, Infrastructure # - # SHARK, DRIVERS # - # Core code/Algorithms in most modules # - # # - # Max Planck Institute fuer Kohlenforschung # - # Kaiser Wilhelm Platz 1 # - # D-45470 Muelheim/Ruhr # - # Germany # - # # - # All rights reserved # - # -***- # - ######################################################### - - - Program Version 6.0.0 - RELEASE - -... - - ************************************************************ - * Program running with 16 parallel MPI-processes * - * working on a common directory * - ************************************************************ - -... - ****ORCA TERMINATED NORMALLY**** -TOTAL RUN TIME: 0 days 0 hours 0 minutes 17 seconds 62 msec -``` - -You can see, that the program was running with 16 parallel MPI-processes. -In version 6.0.0, only the following modules are parallelized: - -* AUTOCI -* CASSCF / NEVPT2 / CASSCFRESP -* CIPSI -* CIS/TDDFT -* GRAD (general Gradient program) -* GUESS -* LEANSCF (memory conserving SCF solver) -* MCRPA -* MDCI (Canonical- and DLPNO-Methods) -* MM -* MP2 and RI-MP2 (including Gradients) -* MRCI -* PC -* PLOT -* PNMR -* POP -* PROP -* PROPINT -* REL -* ROCIS -* SCFGRAD -* SCFRESP (with SCFHessian) -* STARTUP -* VPOT -* Numerical Gradients, Frequencies, Overtones-and-Combination-Bands -* VPT2 -* NEB (Nudged Elastic Band - -<!-- - -## Example Submission Script - -The following script contains all of the necessary instructions to run an ORCA job, -including copying of the files to and from `/scratch` to utilize the InfiniBand network: - -```bash -#!/bin/bash -#SBATCH --account=OPEN-00-00 -#SBATCH --job-name=example-CO -#SBATCH --partition=qexp -#SBATCH --nodes=2 -#SBATCH --ntasks-per-node=128 -#SBATCH --cpus-per-task=1 -#SBATCH --time=00:05:00 - -ml purge -ml ORCA/5.0.1-OpenMPI-4.1.1 - -echo $SLURM_O_WORKDIR -cd $SLURM_O_WORKDIR - -# create /scratch dir -b=$(basename $SLURM_O_WORKDIR) -SCRDIR=/scratch/project/OPEN-00-00/$USER/${b}_${SLURM_JOBID}/ -echo $SCRDIR -mkdir -p $SCRDIR -cd $SCRDIR || exit - -# get number of cores used for our job -ncpus=$(sacct -j 727825 --format=AllocCPUS --noheader | head -1) - -### create ORCA input file -cat > ${SLURM_JOBNAME}.inp <<EOF -! HF def2-TZVP -%pal - nprocs $ncpus -end -* xyz 0 1 -C 0.0 0.0 - 0.0 -O 0.0 0.0 - 1.13 -* -EOF -### - -# copy input files to /scratch -cp -r $SLURM_O_WORKDIR/* . - -# run calculations -$(which orca) ${SLURM_JOBNAME}.inp > $SLURM_O_WORKDIR/${SLURM_JOBNAME}.out - -# copy output files to home, delete the rest -cp * $SLURM_O_WORKDIR/ && cd $SLURM_O_WORKDIR -rm -rf $SCRDIR -exit -``` - ---> - -## Register as User - -You are encouraged to register as a user of ORCA [here][a] -in order to take advantage of updates, announcements, and the users forum. - -## Documentation - -A comprehensive [manual][b] is available online for registered users. - -[a]: https://orcaforum.kofo.mpg.de/app.php/portal -[b]: https://www.faccts.de/docs - diff --git a/content/docs/software/chemistry/phono3py.mdx b/content/docs/software/chemistry/phono3py.mdx deleted file mode 100644 index 8fe63ca402ccd4d674443aed2bfc5fde711baf75..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/phono3py.mdx +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: "Phono3py" ---- -## Introduction - -This GPL software calculates phonon-phonon interactions via the third order force constants. It allows obtaining lattice thermal conductivity, phonon lifetime/linewidth, imaginary part of self energy at the lowest order, joint density of states (JDOS), and weighted-JDOS. For details, see Phys. Rev. B 91, 094306 (2015) and [website][a]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av phono3py -``` - -## Example of Calculating Thermal Conductivity of Si Using VASP Code. - -### Calculating Force Constants - -You need to calculate second order and third order force constants using the diamond structure of silicon stored in [POSCAR][1] (the same form as in VASP) using single displacement calculations within supercell. - -```console -$ cat POSCAR - Si - 1.0 - 5.4335600309153529 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 5.4335600309153529 0.0000000000000000 - 0.0000000000000000 0.0000000000000000 5.4335600309153529 - Si - 8 -Direct - 0.8750000000000000 0.8750000000000000 0.8750000000000000 - 0.8750000000000000 0.3750000000000000 0.3750000000000000 - 0.3750000000000000 0.8750000000000000 0.3750000000000000 - 0.3750000000000000 0.3750000000000000 0.8750000000000000 - 0.1250000000000000 0.1250000000000000 0.1250000000000000 - 0.1250000000000000 0.6250000000000000 0.6250000000000000 - 0.6250000000000000 0.1250000000000000 0.6250000000000000 - 0.6250000000000000 0.6250000000000000 0.1250000000000000 -``` - -### Generating Displacement Using 2 by 2 by 2 Supercell for Both Second and Third Order Force Constants - -```console -$ phono3py -d --dim="2 2 2" -c POSCAR -``` - - 111 displacements is created stored in -`disp_fc3.yaml`, and the structure input files with this displacements are `POSCAR-00XXX`, where the `XXX=111`. - -```console -disp_fc3.yaml POSCAR-00008 POSCAR-00017 POSCAR-00026 POSCAR-00035 POSCAR-00044 POSCAR-00053 POSCAR-00062 POSCAR-00071 POSCAR-00080 POSCAR-00089 POSCAR-00098 POSCAR-00107 -POSCAR POSCAR-00009 POSCAR-00018 POSCAR-00027 POSCAR-00036 POSCAR-00045 POSCAR-00054 POSCAR-00063 POSCAR-00072 POSCAR-00081 POSCAR-00090 POSCAR-00099 POSCAR-00108 -POSCAR-00001 POSCAR-00010 POSCAR-00019 POSCAR-00028 POSCAR-00037 POSCAR-00046 POSCAR-00055 POSCAR-00064 POSCAR-00073 POSCAR-00082 POSCAR-00091 POSCAR-00100 POSCAR-00109 -POSCAR-00002 POSCAR-00011 POSCAR-00020 POSCAR-00029 POSCAR-00038 POSCAR-00047 POSCAR-00056 POSCAR-00065 POSCAR-00074 POSCAR-00083 POSCAR-00092 POSCAR-00101 POSCAR-00110 -POSCAR-00003 POSCAR-00012 POSCAR-00021 POSCAR-00030 POSCAR-00039 POSCAR-00048 POSCAR-00057 POSCAR-00066 POSCAR-00075 POSCAR-00084 POSCAR-00093 POSCAR-00102 POSCAR-00111 -POSCAR-00004 POSCAR-00013 POSCAR-00022 POSCAR-00031 POSCAR-00040 POSCAR-00049 POSCAR-00058 POSCAR-00067 POSCAR-00076 POSCAR-00085 POSCAR-00094 POSCAR-00103 -POSCAR-00005 POSCAR-00014 POSCAR-00023 POSCAR-00032 POSCAR-00041 POSCAR-00050 POSCAR-00059 POSCAR-00068 POSCAR-00077 POSCAR-00086 POSCAR-00095 POSCAR-00104 -POSCAR-00006 POSCAR-00015 POSCAR-00024 POSCAR-00033 POSCAR-00042 POSCAR-00051 POSCAR-00060 POSCAR-00069 POSCAR-00078 POSCAR-00087 POSCAR-00096 POSCAR-00105 -POSCAR-00007 POSCAR-00016 POSCAR-00025 POSCAR-00034 POSCAR-00043 POSCAR-00052 POSCAR-00061 POSCAR-00070 POSCAR-00079 POSCAR-00088 POSCAR-00097 POSCAR-00106 -``` - -For each displacement, the forces needs to be calculated, i.e. in form of the output file of VASP (vasprun.xml). For a single VASP calculations, you need [KPOINTS][2], [POTCAR][3], and [INCAR][4] in your case directory (where you have POSCARS) and those 111 displacements calculations can be generated by the [prepare.sh][5] script. Then each of the single 111 calculations is submitted [run.sh][6] by [submit.sh][7]. - -```console -$./prepare.sh -$ls -disp-00001 disp-00009 disp-00017 disp-00025 disp-00033 disp-00041 disp-00049 disp-00057 disp-00065 disp-00073 disp-00081 disp-00089 disp-00097 disp-00105 INCAR -disp-00002 disp-00010 disp-00018 disp-00026 disp-00034 disp-00042 disp-00050 disp-00058 disp-00066 disp-00074 disp-00082 disp-00090 disp-00098 disp-00106 KPOINTS -disp-00003 disp-00011 disp-00019 disp-00027 disp-00035 disp-00043 disp-00051 disp-00059 disp-00067 disp-00075 disp-00083 disp-00091 disp-00099 disp-00107 POSCAR -disp-00004 disp-00012 disp-00020 disp-00028 disp-00036 disp-00044 disp-00052 disp-00060 disp-00068 disp-00076 disp-00084 disp-00092 disp-00100 disp-00108 POTCAR -disp-00005 disp-00013 disp-00021 disp-00029 disp-00037 disp-00045 disp-00053 disp-00061 disp-00069 disp-00077 disp-00085 disp-00093 disp-00101 disp-00109 prepare.sh -disp-00006 disp-00014 disp-00022 disp-00030 disp-00038 disp-00046 disp-00054 disp-00062 disp-00070 disp-00078 disp-00086 disp-00094 disp-00102 disp-00110 run.sh -disp-00007 disp-00015 disp-00023 disp-00031 disp-00039 disp-00047 disp-00055 disp-00063 disp-00071 disp-00079 disp-00087 disp-00095 disp-00103 disp-00111 submit.sh -disp-00008 disp-00016 disp-00024 disp-00032 disp-00040 disp-00048 disp-00056 disp-00064 disp-00072 disp-00080 disp-00088 disp-00096 disp-00104 disp_fc3.yaml -``` - -Tailor your run.sh script to fit into your project and other needs and submit all 111 calculations using the submit.sh script - -```console -$ ./submit.sh -``` - -## Collecting Results and Post-Processing With Phono3py - -Once all jobs are finished and vasprun.xml is created in each disp-XXXXX directory, the collection is done by: - -```console -$ phono3py --cf3 disp-{00001..00111}/vasprun.xml -``` - -and `disp_fc2.yaml, FORCES_FC2`, `FORCES_FC3`, and `disp_fc3.yaml` should appear and put into the HDF format by: - -```console -$ phono3py --dim="2 2 2" -c POSCAR -``` - -resulting in `fc2.hdf5` and `fc3.hdf5`. - -### Thermal Conductivity - -The phonon lifetime calculations take some time; however, it is independent on grid points, so it can be split: - -```console -$ phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" --sigma 0.1 --wgp -``` - -### Inspecting ir_grid_points.yaml - -```console -$ grep grid_point ir_grid_points.yaml -num_reduced_ir_grid_points: 35 -ir_grid_points: # [address, weight] -* grid_point: 0 -* grid_point: 1 -* grid_point: 2 -* grid_point: 3 -* grid_point: 4 -* grid_point: 10 -* grid_point: 11 -* grid_point: 12 -* grid_point: 13 -* grid_point: 20 -* grid_point: 21 -* grid_point: 22 -* grid_point: 30 -* grid_point: 31 -* grid_point: 40 -* grid_point: 91 -* grid_point: 92 -* grid_point: 93 -* grid_point: 94 -* grid_point: 101 -* grid_point: 102 -* grid_point: 103 -* grid_point: 111 -* grid_point: 112 -* grid_point: 121 -* grid_point: 182 -* grid_point: 183 -* grid_point: 184 -* grid_point: 192 -* grid_point: 193 -* grid_point: 202 -* grid_point: 273 -* grid_point: 274 -* grid_point: 283 -* grid_point: 364 -``` - -You can find which grid points needed to be calculated, for instance, using: - -```console -$ phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write-gamma --gp="0 1 2 -``` - -You can calculate grid points 0, 1, 2. To automate, use, for instance, scripts to submit 5 points in series, see [gofree-cond1.sh][8]. - -```console -$ sbatch gofree-cond1.sh -``` - -Finally, the thermal conductivity result is produced by grouping single conductivity per grid calculations using: - -```console -$ phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" --br --read_gamma -``` - -[1]: ./files-phono3py/POSCAR.txt -[2]: ./files-phono3py/KPOINTS.txt -[3]: ./files-phono3py/POTCAR.txt -[4]: ./files-phono3py/INCAR.txt -[5]: ./files-phono3py/prepare.sh -[6]: ./files-phono3py/run.sh -[7]: ./files-phono3py/submit.sh -[8]: ./files-phono3py/gofree-cond1.sh - -[a]: https://phonopy.github.io/phono3py/ - -<!--- -2021-03-31 - -## Notes -On salomon, all of the Python2.7-dependent versions no longer work, since Python2.7 is obsoleted. -On barbora, all of the modules in /apps/modules/phys seem to work. ---> diff --git a/content/docs/software/chemistry/phonopy.mdx b/content/docs/software/chemistry/phonopy.mdx deleted file mode 100644 index 01832f6c0f1128264cf6726adf017029f0d77b49..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/phonopy.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: "Phonopy" ---- -## Introduction - -Phonopy is a free, open-source software for calculating phonons via harmonic and quasi-harmonic approximations, utilizing the direct force-constant method. At harmonic level, it allows calculating phonon band structure, phonon DOS and partial-DOS, phonon thermal properties, such as free energy, izochoric heat capacity, entropy, and other properties at constant volume, while the quasi-harmonic approximation can be used to obtain properties at constant pressure, such as izobaric heat capacity and thermal expansion coefficients. For details, see [Scr. Mater., 108 (2015), pp. 1-5][a], and the [Phonopy website][b]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -ml av phonopy -``` - -## Example of the Calculation of Phonon Density of States and Thermal Properties of Aluminum Using the VASP Code - -### Generating Displacements - -All of the Phonopy calculations generally require a [POSCAR][1] with well relaxed forces in order for the resulting values to carry any physical meaning. - -```console -cat POSCAR -``` - -```console -Al4 - 1.00000000000000 - 4.0432254711710000 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 4.0432254711710000 0.0000000000000000 - 0.0000000000000000 0.0000000000000000 4.0432254711710000 - Al - 4 -Direct - 0.0000000000000000 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 0.5000000000000000 0.5000000000000000 - 0.5000000000000000 0.0000000000000000 0.5000000000000000 - 0.5000000000000000 0.5000000000000000 0.0000000000000000 -``` - -After obtaining a POSCAR with relaxed forces, we can either generate the displacements directly - -```console -phonopy -d --dim 2 2 2 --pa auto -c POSCAR -``` - -or we can specify a config file [mesh.conf][2], which will contain all of our required attributes - -```console -# contents of mesh.conf -ATOM_NAME = Al -DIM = 2 2 2 -PRIMITIVE_AXES = Auto -``` - -and pass the file to phonopy as an argument - -```console -phonopy -d mesh.conf -c POSCAR -``` - -For the list of all the possible phonopy tags, see [official documentation][d]. - -### Running Jobs - -Each unique displacement is named `POSCAR-XXX`, in our case we have only one, which is named `POSCAR-001`. If you are calculating plus and minus displacements, the minus displacement immediately follows the plus displacement. -Each unique displacement should then be moved to a separate folder, with every displacement file renamed to POSCAR, and POTCAR, [KPOINTS][3] and [INCAR][4] should be added. -If one doesn't use the automatic settings for the KPOINTS generation, it is important to lower the amount of generated k-points accordingly (for example, with k-points grid `8 8 8` for the unit cell, the `2 2 2` supercell should have a `4 4 4` k-points grid; it's always good to verify the number of generated k-points stays the same). -During the calculation, we need to move one of the atoms specified in POSCAR and calculate the forces (`ISIF = 0`, `ISMEAR` according to the type of the material at question). -After this, we can submit the VASP calculation using the `salloc` command. - -### Calculating Force Constants - -After the calculations finish, we can generate the FORCE_SETS file using the following command: - -```console -phonopy -f POSCAR-???.dir/vasprun.xml -``` - -### Calculating DOS and Thermal Properties - -Assuming we wrote all of our required parameters (such as the q-point mesh) to the mesh.conf file, we can then derive the phonon density of states (DOS) - -```console -phonopy -p mesh.conf -``` - -with the DOS written in total_dos.dat file. - -The thermal properties can then be calculated with - -```console -phonopy -t -p mesh.conf -``` - -which outputs the thermal properties in the thermal_properties.yaml file. - -## Example of the Calculation of Thermal Expansion Coeffiecients of Aluminum Using the VASP Code - -To calculate the thermal expansion coefficients, we need to obtain the volume dependence, which means we need to repeat the previous example for several different volumes of our POSCAR. All the rules mentioned in the previous example (i. e. the initial POSCARs have to be relaxed) still apply. We are also going to need a file containing the energy-volume dependence. Assuming we have calculated, we can either parse the data ourselves, or use the vasprun.xml files from the static calculations and running a command - -```console -phonopy-vasp-efe vasprun.xml-{095..105} -``` - -Where the vasprun.xml-??? are the vaspruns for the static calculations for different (ionically relaxed) volumes of the unit cell (here, for example, `095` denotes that the initial POSCAR for the `095` calculation was at 95 % of the equilibrium volume etc.). The output file, `e-v.dat`, contains the extracted energy-volume curve. -Next we compile the thermal_properties.yaml files which we calculated for our selected (supercell) volumes into a single directory under unique names and run command - -```console -phonopy-qha -p e-v.dat thermal_properties.yaml-{095..105} -``` - -## Useful Notes - -* Always remember to check the FORCE_SETS file and verify that the displaced atoms are the ones with the largest forces acting on them, and that forces on other atoms are one or more orders lower; this can prevent your phonons from becoming imaginary. The forces can be adjusted by increasing (or lowering) the amplitude (`DISPLACEMENT_DISTANCE` tag). -* Never mix energy-volume curve of conventional unit cell and the supercell calculation of the primitive unit cell (and vice versa). This can be adjusted by the `PM` (primitive axes) tag. To verify whether your POSCAR contains conventional or primitive unit cell, you can run `phonopy --symmetry` on it. This outputs two files: BPOSCAR, which contains the conventional unit cell, and PPOSCAR, which will be the smallest possible cell. - * If you used the `Auto` settings for the primitive axes, and aren't sure which cell has been used, you can check the calculated izochoric heat capacity, whose limit should be approaching at most 25 (3\*R) per mole (in our case per atom). -* Phonopy is a lightweight tool, and as such can be conveniently [run on your local machine][c]. - -[1]: ./files-phonopy/POSCAR.txt -[2]: ./files-phonopy/mesh.conf -[3]: ./files-phonopy/KPOINTS.txt -[4]: ./files-phonopy/INCAR.txt - -[a]: https://doi.org/10.1016/j.scriptamat.2015.07.021 -[b]: https://phonopy.github.io/phonopy/ -[c]: https://phonopy.github.io/phonopy/install.html -[d]: https://phonopy.github.io/phonopy/setting-tags.html diff --git a/content/docs/software/chemistry/vasp.mdx b/content/docs/software/chemistry/vasp.mdx deleted file mode 100644 index 2a39fc0802cbe53604f8c8458edacf3b756bbdae..0000000000000000000000000000000000000000 --- a/content/docs/software/chemistry/vasp.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Vasp" ---- -## Introduction - -The Vienna Ab initio Simulation Package (VASP) is a local computer program for atomic scale materials modelling, e.g. electronic structure calculations and quantum-mechanical molecular dynamics, from first principles. - -To use VASP, You need academic licenses from the University of Vienna. Follow the [official FAQ instructions](https://www.vasp.at/faqs/) at the [official website](https://www.vasp.at/). - -Once obtained, it is necessary to send us a list of authorized users and their IDs for which you need this access. Please, use only [our ticketing system](https://support.it4i.cz/rt). We are responsible for verifying your licences, and as such, you will be allowed to use VASP in our enviroment only **after** the sucessful verification. - -## Installed Versions - -For the current list of installed versions, use: - -```console -ml av vasp -``` - -## Running Jobs - -To learn how to submit a job, please refer to the [Job Submission and Execution](https://docs.it4i.cz/general/job-submission-and-execution/) part of this documentation. - -VASP uses a [Message Passing Interface](https://en.wikipedia.org/wiki/Message_Passing_Interface) to distribute the workload, and as such can be run via the `mpirun` command, such as - -```console -mpirun vasp_std -``` - -### VASP Compilations - -<Callout> - Starting from version 6.3.1, we compile VASP with HDF5 support. -</Callout> - -VASP can be ran using several different binaries, each being compiled for a specific purpose, for example: - -* `vasp_std` is the standard VASP binary for regular jobs -* `vasp_ncl` must be used when running non-collinear (spin-orbit coupling) jobs -* `vasp_gam` is optimized for calculations at the Gamma point - -GPU-enabled modules are denoted by their CUDA version's suffix. - -## Tutorials and Examples - -Tutorials and examples can be found at the [offical VASP wiki](https://www.vasp.at/wiki/index.php/The_VASP_Manual), specifically in the sections [Tutorials](https://www.vasp.at/wiki/index.php/Category:Tutorials) and [Examples](https://www.vasp.at/wiki/index.php/Category:Examples). These should provide you with enough information to write and run your own jobs. - -VASP wiki also contains all the necessary information about the input and output files, tags, algorithms, and much more. - -## Useful Links - -* [VASP documentation](https://www.vasp.at/documentation/) containing all the necesary links, including to the VASP wiki, VASP workshop lectures resources, and other -* [VASP wiki](https://www.vasp.at/wiki/index.php/The_VASP_Manual) is **the** resource for questions regarding anything VASP-related -* [VASP forum](https://www.vasp.at/forum/) to look up & ask questions -* [how to cite VASP](https://www.vasp.at/forum/viewtopic.php?f=4&t=2971) -* [Google](https://www.google.com) :) diff --git a/content/docs/software/compilers.mdx b/content/docs/software/compilers.mdx deleted file mode 100644 index fffe69e0e02599657eb87f93a242ab7d2c93c809..0000000000000000000000000000000000000000 --- a/content/docs/software/compilers.mdx +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: "Compilers" ---- -## Available Compilers - -There are several compilers for different programming languages available on the cluster: - -* C/C++ -* Fortran 77/90/95/HPF -* Unified Parallel C -* Java -* NVIDIA CUDA - -The C/C++ and Fortran compilers are provided by: - -Open source: - -* GNU GCC -* Clang/LLVM - -Commercial licenses: - -* Intel -* PGI - -## Intel Compilers - -For information about the usage of Intel Compilers and other Intel products, read the [Intel Parallel studio][1] page. - -## PGI Compilers - -The Portland Group Cluster Development Kit (PGI CDK). - -```console -$ ml PGI -$ pgcc -v -$ pgc++ -v -$ pgf77 -v -$ pgf90 -v -$ pgf95 -v -$ pghpf -v -``` - -The PGI CDK also incudes tools for debugging and profiling. - -PGDBG OpenMP/MPI debugger and PGPROF OpenMP/MPI profiler are available - -```console -$ ml PGI -$ ml Java -$ pgdbg & -$ pgprof & -``` - -For more information, see the [PGI page][a]. - -## GNU - -For compatibility reasons, the original (old 4.8.5) versions of GNU compilers as part of the OS are still available. These are accessible in the search path by default. - -It is strongly recommended to use the up to date version which comes with the module GCC: - -```console -$ ml GCC -$ gcc -v -$ g++ -v -$ gfortran -v -``` - -With the module loaded, two environment variables are predefined. One for maximum optimizations on the cluster's architecture, and the other for debugging purposes: - -```console -$ echo $OPTFLAGS --O3 -march=native - -$ echo $DEBUGFLAGS --O0 -g -``` - -For more information about the possibilities of the compilers, see the man pages. - -**Simple program to test the compiler** - -```cpp -$ cat count.upc - -/* hello.upc - a simple UPC example */ -#include <upc.h> -#include <stdio.h> - -int main() { - if (MYTHREAD == 0) { - printf("Welcome to GNU UPC!!!n"); - } - upc_barrier; - printf(" - Hello from thread %in", MYTHREAD); - return 0; -} -``` - -To compile the example, use: - -```console -$ gupc -o count.upc.x count.upc -``` - -To run the example with 5 threads, use: - -```console -$ ./count.upc.x -fupc-threads-5 -``` - -For more information, see the man pages. - -## Java - -For information on how to use Java (runtime and/or compiler), read the [Java page][2]. - -## NVIDIA CUDA - -For information on how to work with NVIDIA CUDA, read the [NVIDIA CUDA page][3]. - -[1]: intel/intel-suite/intel-compilers.md -[2]: lang/java.md -[3]: nvidia-cuda.md - -[a]: http://www.pgroup.com/products/pgicdk.htm diff --git a/content/docs/software/data-science/dask.mdx b/content/docs/software/data-science/dask.mdx deleted file mode 100644 index 26475b4f029124f94c97899554b59460130da043..0000000000000000000000000000000000000000 --- a/content/docs/software/data-science/dask.mdx +++ /dev/null @@ -1,288 +0,0 @@ ---- -title: "Dask" ---- -[Dask](https://docs.dask.org/en/latest/) is a popular open-source library that allows you to -parallelize your Python code using a distributed cluster easily. It can parallelize arbitrary -Python code in the form of a task DAG (Directed Acyclic Graph), but it also offers parallelized -versions of popular Python data science libraries like -[numpy](https://docs.dask.org/en/latest/array.html) or -[Pandas](https://docs.dask.org/en/latest/dataframe.html). - -<Callout> - For links to Python documentation, style guide, and introductory tutorial, see the [Python page][a]. -</Callout> - -## Installation - -To install Dask, load a recent version of Python 3 and install Dask using `pip`. We heavily -recommend you to install Python packages inside a Python virtual environment. - -```bash -# Load Python (preferably use a specific Python version) -$ ml Python3 - -# Create a virtual environment -$ python3 -m venv dask - -# Activate and update the virtual environment -$ source dask/bin/activate -(dask) $ pip install -U setuptools pip wheel - -# Install Dask -(dask) $ pip install distributed -``` - -## Starting a Dask Cluster - -Before you can use Dask, you need to set up a Dask cluster, which consists of a single server -component which coordinates the cluster, and an arbitrary number of workers, which actually -execute your tasks. - - - -After you start a job, you should therefore first start the server and the workers on the -available computing nodes and then run your Python program that uses Dask. There are multiple ways -of deploying the cluster. A common scenario is to run a Dask server on a single computing node, -run a single worker per node on all remaining computing nodes and then run your program on the node -with the server. - -> There are some performance considerations to be taken into account regarding Dask cluster -> deployment, see [below](#dask-performance-considerations) for more information. - -<Callout> - All the following deployment methods assume that you are inside a Python environment that has - Dask installed. Do not forget to load Python and activate the correct virtual environment at - the beginning of your job! And also do the same after connecting to any worker nodes - manually using SSH. -</Callout> - -### Manual Deployment - -Both the server and the worker nodes can be started using a CLI command. If you prefer manual -deployment, you can manually start the server on a selected node and then start the workers on -other nodes available inside your job. - -```bash -# Start the server on some node N -$ dask-scheduler - -# Start a single worker on some other node, pass it the address of the server -$ dask-worker tcp://<hostname-of-N>:8786 -``` - -### Dask-ssh Deployment - -Dask actually contains [built-in support](https://docs.dask.org/en/latest/setup/ssh.html) for -automating Dask deployment using SSH. It also supports nodefiles provided by Slurm, -so inside of your job, you can simply run - -```bash -$ dask-ssh --hostfile $SLURM_NODELIST -``` - -to start the Dask cluster on all available computing nodes. This will start the server on the first -node of your job and then a single worker on each node. The first node will therefore be shared -by a server and a worker, which might not be ideal from a performance point of view. - -> Note that for this to work, the `paramiko` Python library has to be installed inside your Python -> environment (you can install it using `$ pip install paramiko`). - -You can also start the Cluster directly from your -[Python script](https://docs.dask.org/en/latest/setup/ssh.html#python-interface). In this way you -can start the scheduler and the workers on separate nodes to avoid overcrowding the server node. - -### Other Deployment Options - -Dask has a lot of other ways of being deployed, e.g. using MPI, or using a shared file on the -network file system. It also allows you to create a job directly, wait for it to be started and -then it starts the whole cluster inside the job. You can find more information about Dask HPC -deployment [here](https://docs.dask.org/en/latest/setup/hpc.html). - -## Connecting to the Cluster - -Once you have deployed your cluster, you must create a `Client` at the beginning of your program -and pass it the address of the server. - -```python -from distributed import Client - -client = Client("<hostname-of-server>:8786") -``` - -Once the client connects to the server successfully, all subsequent Dask computations will be -parallelized using the cluster. - -Below are some examples of computations that you can perform with Dask. Note that the code should -only be executed after a client was connected to a server! - -### Parallelize Arbitrary Python Code Using `Delayed` - -The `delayed` function (or a decorator) turns a Python function into a lazy computation. If you -call such a function, it will not execute right away. It will only return a future object that can -be composed with other futures to build a DAG of tasks. After you describe your whole computation, -you can actually execute it using `dask.compute(<future>)`. - -```python -import dask - -@dask.delayed -def inc(x): - return x + 1 - -@dask.delayed -def double(x): - return x * 2 - -@dask.delayed -def add(x, y): - return x + y - -data = [1, 2, 3, 4, 5] - -output = [] -for x in data: - a = inc(x) - b = double(x) - c = add(a, b) - output.append(c) - -total = dask.delayed(sum)(output) - -# `total` is just a lazy computation -# To get the actual value, call dask.compute -result = dask.compute(total) -``` - -You can find more information about the `delayed` API -[here](https://docs.dask.org/en/latest/delayed.html). - -### Parallelize `Pandas` - -Dask contains a module called `dataframe` which mirrors the API of `pandas`, a popular library for -tabular analysis. Using `dataframe` you can distribute your `pandas` code to multiple nodes easily. -You can find more information about it [here](https://docs.dask.org/en/latest/dataframe.html). - -Here is an example of its usage: - -```python -import dask.dataframe as pd - -# Load CSV -df = pd.read_csv("table.csv") - -# Describe a lazy computation (this is not computed yet) -df2 = df[df.y == "a"].x + 1 - -# Actually compute the table operations on worker nodes -result = df2.compute() -``` - -### Parallelize `Numpy` - -Dask contains a module called `array` which mirrors the API of `numpy`, a popular library for -n-dimensional array computations. Using `array` you can distribute your `numpy` code to multiple -nodes easily. You can find more information about it -[here](https://examples.dask.org/array.html). - -Here is an example of its usage: - -```python -import dask.array as np -x = np.random.random((10000, 10000), chunks=(1000, 1000)) - -# Describe a lazy computation (this is not computed yet) -y = x + x.T -z = y[::2, 5000:].mean(axis=1) - -# Actually compute the arary operations on worker nodes -result = z.compute() -``` - -## Dask Performance Considerations - -Dask should be fast enough by default for most use cases, but there are some considerations that -should be taken into account. - -### Selecting the Number of Processes and Threads Per Worker - -When starting a Dask worker on a node, it will by default use a number of threads equal to the -number of cores on the given machine. At the same time, (C)Python uses a global lock -([GIL](https://realpython.com/python-gil/)) that prevents more than a single thread to execute at -once. This is fine if your computational tasks are I/O bound or if they spend most of their time -inside C libraries that release the GIL. - -However, if your tasks executed with Dask are heavily compute-bound, and they hold the GIL (e.g. -the heavy computation is performed directly inside Python), you might not be able to fully harness -all cores of the worker node. - -To solve this, you can run multiple workers (each with a reduced number of threads) per node. This -is a trade-off. With more workers on a node, you will be able to utilize more cores (assuming -your tasks are compute-bound). However, you will also increase the pressure on the central server -and on the network, because there will be more workers that will communicate with each other and -with the server. - -You can choose the number of workers and threads per each worker using the `--nprocs` and -`--nthreads` parameters of `dask-worker` (there are similar arguments when using other deployment -methods). - -Some examples (assuming a node with 24 cores): - -```bash -# Run a single worker using 24 threads. Reduces network and server traffic, but may not utilize all cores. -$ dask-worker --nprocs 1 --nthreads 24 - -# Run 24 workers, each with a single thread. Maximizes core usage, but may overload server or network. -$ dask-worker --nprocs 24 --nthreads 1 - -# Run 6 workers, each with 4 threads. Strikes a balance between core usage and network/server pressure. -$ dask-worker --nprocs 6 --nthreads 4 -``` - -From our experiments, we found that often it is best to run a single worker per each core of a -node to achieve the best performance. With this configuration, we found that Dask scales reasonably -up to 200 workers (e.g. <10 Barbora nodes). If you start to run into performance problems because -of the amount of workers, try to use [RSDS](#rsds) to achieve better scaling. - -### Memory Considerations - -A common reason to use Dask is that your computation does not fit inside the memory of a single -node. Dask can alleviate this, but you still have to be careful about your memory usage. For -example, when you use the `dataframe` or `array` API, you should pay attention into how many -partitions (or chunks) is your data split it. If you use a single partition, it will probably take -a lot of memory, and it will not offer many possibilities for parallelization. You can find more -information [here](https://docs.dask.org/en/latest/dataframe-design.html#partitions). - -By default, multiple workers on a node will split the available memory. Therefore, if the node -has 100 GiB of RAM and you start the Dask worker on a single node like this: - -```bash -$ dask-worker --nprocs 10 -``` - -Each worker will have around 10 GiB memory available. You can set the memory requirements of each -worker manually using the `--memory-limit` argument. - -If your program is strictly memory-bound, you can also try alternative approaches to Dask. -As an example, [Vaex](https://github.com/vaexio/vaex) is a library that allows you to easily -process dataframes that do not fit inside your operating memory. - -### UCX - -In some cases (especially with many workers), the network can be a bottleneck. By default, Dask -uses TCP/IP for communication, but it also has support for UCX, which enables more efficient usage -of the available InfiniBand interfaces. It is a bit cumbersome to set up, but if you want to try, -check [this tutorial](https://ucx-py.readthedocs.io/en/latest/dask.html). - -### Nvidia - -Dask has built-in support for GPU workers. You can find more information about this use case -[here](https://docs.dask.org/en/latest/gpu.html). - -### RSDS - -If you need to run a large amount of tasks and Dask does not perform well enough, you can try to -use [RSDS](https://github.com/It4innovations/rsds). It is our version of Dask which is optimized -for HPC use cases, and it should provide better scaling than Dask. You can read more about RSDS -in this [article](https://arxiv.org/abs/2010.11105). - -[a]: https://docs.it4i.cz/software/lang/python/#python diff --git a/content/docs/software/data-science/meta.json b/content/docs/software/data-science/meta.json deleted file mode 100644 index ce810905d29e6120f2387a243e525f140008cd1b..0000000000000000000000000000000000000000 --- a/content/docs/software/data-science/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Data-science", - "pages": [ - "dask" - ] -} diff --git a/content/docs/software/debuggers/allinea-ddt.mdx b/content/docs/software/debuggers/allinea-ddt.mdx deleted file mode 100644 index 7ad00c372dc6e54499b1ef6fd559397ac4a1d8d6..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/allinea-ddt.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "Allinea Forge (DDT, MAP)" ---- -## Introduction - -Allinea Forge consist of two tools: - -Allinea DDT is a commercial debugger primarily for debugging parallel MPI or OpenMP programs. It also supports for GPU (CUDA) and Intel Xeon Phi accelerators. DDT provides all the standard debugging features (stack trace, breakpoints, watches, view variables, threads, etc.) for every thread running as a part of your program, or for every process - even if these processes are distributed across a cluster using an MPI implementation. - -Allinea MAP is a profiler for C/C++/Fortran HPC codes. It is designed for profiling parallel code, which uses pthreads, OpenMP, or MPI. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Forge -``` - -## Compiling Code to Run With DDT - -### Modules - -Load all necessary modules to compile the code, for example: - -```console -$ ml intel -$ ml impi **or** ml OpenMPI/X.X.X-icc -``` - -Load the Allinea DDT module: - -```console -$ ml Forge -``` - -<Callout> - Loading default modules is [**not** recommended][2]. -</Callout> - -Compile the code: - -```console -$ mpicc -g -O0 -o test_debug test.c -$ mpif90 -g -O0 -o test_debug test.f -``` - -### Compiler Flags - -Before debugging, you need to compile your code with these flags: - -<Callout> - `-g`: Generates extra debugging information usable by GDB. `-g3` includes even more debugging information. This option is available for GNU and Intel C/C++ and Fortran compilers. - `-O0`: Suppresses all optimizations. -</Callout> - -## Starting a Job With DDT - -Be sure to log in with an X window forwarding enabled. This could mean using the `--x11` in the `ssh`: - -```console -$ ssh -X username@login1.karolina.it4i.cz -``` - -Another options is to access the login node using VNC. See the detailed information on how to [use graphic user interface][1]. - -From the login node, an interactive session **with X windows forwarding** (the `-x11` option) can be started by the following command: - -```console -$ salloc -A PROJECT_ID -p qcpu --nodes=1 --ntasks-per-node=128 --cpus-per-task=1 --time=01:00:00 --x11 -``` - -Then launch the debugger with the `ddt` command followed by the name of the executable to debug: - -```console -$ ddt test_debug -``` - -A submission window appears with a prefilled path to the executable to debug. Select the number of MPI processors and/or OpenMP threads on which to run, then press run. Command line arguments to a program can be entered to the Arguments field. - - - -To start the debugging directly without the submission window, the user can specify the debugging and execution parameters from the command line. For example, the number of MPI processes is set by the `-np 4` option. Skipping the dialog is done by the `-start` option. To see the list of the `ddt` command line parameters, run `ddt --help`. - -```console -ddt -start -np 4 ./hello_debug_impi -``` - -## Documentation - -Users can find the original User Guide after loading the DDT module: - -```console -$DDTPATH/doc/userguide.pdf -``` - -[1] Discipline, Magic, Inspiration and Science: Best Practice Debugging with Allinea DDT, Workshop conducted at LLNL by Allinea on May 10, 2013, [link][a] - -[1]: ../../general/accessing-the-clusters/graphical-user-interface/x-window-system.md -[2]: ../../modules/lmod/#loading-modules - -[a]: https://computing.llnl.gov/tutorials/allineaDDT/index.html diff --git a/content/docs/software/debuggers/allinea-performance-reports.mdx b/content/docs/software/debuggers/allinea-performance-reports.mdx deleted file mode 100644 index af773394d9c2f9bd59e53573131019b2108b0ce8..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/allinea-performance-reports.mdx +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Allinea Performance Reports" ---- -## Introduction - -Allinea Performance Reports characterize the performance of HPC application runs. After executing your application through the tool, a synthetic HTML report is generated automatically, containing information about several metrics along with clear behavior statements and hints to help you improve the efficiency of your runs. - -Allinea Performance Reports is most useful in profiling MPI programs. - -Our license is limited to 64 MPI processes. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Forge -``` - -The module sets up environment variables, required for using the Allinea Performance Reports. - -## Usage - -Instead of [running your MPI program the usual way][1], use the `perf-report` wrapper: - -```console -$ perf-report mpirun ./mympiprog.x -``` - -The MPI program will run as usual. `perf-report` creates two additional files, in \*.txt and \*.html format, containing the performance report. Note that demanding MPI code should be run within [the queue system][2]. - -## Example - -In this example, we will be profiling the `mympiprog.x` MPI program, using Allinea performance reports. Assume that the code is compiled with Intel compilers and linked against Intel MPI library: - -First, we allocate nodes via the express queue: - -```console -$ salloc -A PROJECT_ID -p qcpu_exp --nodes=2 --ntasks-per-node=128 --cpus-per-task=1 -salloc: Granted job allocation 1566484 -salloc: Waiting for resource configuration -salloc: Nodes cn[206-207] are ready for job -``` - -Then we load the modules and run the program the usual way: - -```console -$ ml intel/2020b Forge/20.1.1 -$ ml PerfReports/6.0 -$ mpirun ./mympiprog.x -``` - -Now let us profile the code: - -```console -$ perf-report mpirun ./mympiprog.x -``` - -Performance report files [mympiprog_32p\*.txt][3] and [mympiprog_32p\*.html][4] were created. We can see that the code is very efficient on MPI and is CPU bounded. - -[1]: ../mpi/mpi.md -[2]: ../../general/job-submission-and-execution.md -[3]: mympiprog_32p_2014-10-15_16-56.txt -[4]: mympiprog_32p_2014-10-15_16-56.html diff --git a/content/docs/software/debuggers/cube.mdx b/content/docs/software/debuggers/cube.mdx deleted file mode 100644 index 974c4eddbbc5444b6d35fff714ceca396c3dfb11..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/cube.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "CUBE" ---- -## Introduction - -CUBE is a graphical performance report explorer for displaying data from Score-P and Scalasca (and other compatible tools). The name comes from the fact that it displays performance data in three dimensions: - -* **performance metric**, where a number of metrics is available, such as communication time or cache misses, -* **call path**, which contains the call tree of your program -* **system resource**, which contains system's nodes, processes and threads, depending on the parallel programming model. - -Each dimension is organized in a tree, for example the time performance metric is divided into Execution time and Overhead time, call path dimension is organized by files and routines in your source code, etc. - - - -\*Figure 1. Screenshot of CUBE displaying data from Scalasca.\* - -Each node in the tree is colored by severity (the color scheme is displayed at the bottom of the window, ranging from the least severe blue to the most severe being red). For example in Figure 1, we can see that most of the point-to-point MPI communication happens in the `exch_qbc` routine, colored red. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Cube -``` - -## Usage - -CUBE is a graphical application. Refer to the Graphical User Interface documentation for a list of methods to launch graphical applications clusters. - -<Callout> - Analyzing large data sets can consume large amount of CPU and RAM. Do not perform large analysis on login nodes. -</Callout> - -After loading the appropriate module, simply launch the cube command, or alternatively you can use the `scalasca -examine` command to launch the GUI. Note that for Scalasca data sets, if you do not analyze the data with `scalasca -examine` before opening them with CUBE, not all performance data will be available. - -References -1\. [Download link][a] - -[1]: ../../modules-matrix.md - -[a]: http://www.scalasca.org/software/cube-4.x/download.html diff --git a/content/docs/software/debuggers/intel-performance-counter-monitor.mdx b/content/docs/software/debuggers/intel-performance-counter-monitor.mdx deleted file mode 100644 index 176d45956f2e760fc8cf94bd2fb9881feab34b14..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/intel-performance-counter-monitor.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: "Intel Performance Counter Monitor" ---- -## Introduction - -Intel PCM (Performance Counter Monitor) is a tool to monitor performance hardware counters on Intel® processors, similar to [PAPI][1]. The difference between PCM and PAPI is that PCM supports only Intel hardware, but PCM can also monitor uncore metrics, like memory controllers and QuickPath Interconnect links. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av intelpcm -``` - -## Command Line Tools - -PCM provides a set of tools to monitor a system/or application. - -### PCM-Memory - - Measures memory bandwidth of your application or the whole system. Usage: - -```console -$ pcm-memory.x <delay>|[external_program parameters] -``` - -Specify either a delay of updates in seconds or an external program to monitor. If you get an error about PMU in use, respond `y` and relaunch the program. - -Sample output: - -```console - ---------------------------------------||--------------------------------------- - -- Socket 0 --||-- Socket 1 -- - ---------------------------------------||--------------------------------------- - ---------------------------------------||--------------------------------------- - ---------------------------------------||--------------------------------------- - -- Memory Performance Monitoring --||-- Memory Performance Monitoring -- - ---------------------------------------||--------------------------------------- - -- Mem Ch 0: Reads (MB/s): 2.44 --||-- Mem Ch 0: Reads (MB/s): 0.26 -- - -- Writes(MB/s): 2.16 --||-- Writes(MB/s): 0.08 -- - -- Mem Ch 1: Reads (MB/s): 0.35 --||-- Mem Ch 1: Reads (MB/s): 0.78 -- - -- Writes(MB/s): 0.13 --||-- Writes(MB/s): 0.65 -- - -- Mem Ch 2: Reads (MB/s): 0.32 --||-- Mem Ch 2: Reads (MB/s): 0.21 -- - -- Writes(MB/s): 0.12 --||-- Writes(MB/s): 0.07 -- - -- Mem Ch 3: Reads (MB/s): 0.36 --||-- Mem Ch 3: Reads (MB/s): 0.20 -- - -- Writes(MB/s): 0.13 --||-- Writes(MB/s): 0.07 -- - -- NODE0 Mem Read (MB/s): 3.47 --||-- NODE1 Mem Read (MB/s): 1.45 -- - -- NODE0 Mem Write (MB/s): 2.55 --||-- NODE1 Mem Write (MB/s): 0.88 -- - -- NODE0 P. Write (T/s) : 31506 --||-- NODE1 P. Write (T/s): 9099 -- - -- NODE0 Memory (MB/s): 6.02 --||-- NODE1 Memory (MB/s): 2.33 -- - ---------------------------------------||--------------------------------------- - -- System Read Throughput(MB/s): 4.93 -- - -- System Write Throughput(MB/s): 3.43 -- - -- System Memory Throughput(MB/s): 8.35 -- - ---------------------------------------||--------------------------------------- -``` - -### PCM-Msr - -The `pcm-msr.x` command can be used to read/write model specific registers of the CPU. - -### PCM-Numa - -Monitors local and remote memory accesses. - -### PCM-Pcie - -Can be used to monitor PCI Express bandwidth. Usage: `pcm-pcie.x <delay>` - -### PCM-Power - -Displays energy usage and thermal headroom for CPU and DRAM sockets. Usage: `pcm-power.x <delay> | <external program>` - -### PCM - -This command provides an overview of performance counters and memory usage. Usage: `pcm.x <delay> | <external program>` - -Sample output: - -```console - $ pcm.x ./matrix - - Intel(r) Performance Counter Monitor V2.6 (2013-11-04 13:43:31 +0100 ID=db05e43) - - Copyright (c) 2009-2013 Intel Corporation - - Number of physical cores: 16 - Number of logical cores: 16 - Threads (logical cores) per physical core: 1 - Num sockets: 2 - Core PMU (perfmon) version: 3 - Number of core PMU generic (programmable) counters: 8 - Width of generic (programmable) counters: 48 bits - Number of core PMU fixed counters: 3 - Width of fixed counters: 48 bits - Nominal core frequency: 2400000000 Hz - Package thermal spec power: 115 Watt; Package minimum power: 51 Watt; Package maximum power: 180 Watt; - Socket 0: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected. - Socket 1: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected. - Number of PCM instances: 2 - Max QPI link speed: 16.0 GBytes/second (8.0 GT/second) - - Detected Intel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz "Intel(r) microarchitecture codename Sandy Bridge-EP/Jaketown" - - Executing "./matrix" command: - - Exit code: 0 - - EXEC : instructions per nominal CPU cycle - IPC : instructions per CPU cycle - FREQ : relation to nominal CPU frequency='unhalted clock ticks'/'invariant timer ticks' (includes Intel Turbo Boost) - AFREQ : relation to nominal CPU frequency while in active state (not in power-saving C state)='unhalted clock ticks'/'invariant timer ticks while in C0-state' (includes Intel Turbo Boost) - L3MISS: L3 cache misses - L2MISS: L2 cache misses (including other core's L2 cache *hits*) - L3HIT : L3 cache hit ratio (0.00-1.00) - L2HIT : L2 cache hit ratio (0.00-1.00) - L3CLK : ratio of CPU cycles lost due to L3 cache misses (0.00-1.00), in some cases could be >1.0 due to a higher memory latency - L2CLK : ratio of CPU cycles lost due to missing L2 cache but still hitting L3 cache (0.00-1.00) - READ : bytes read from memory controller (in GBytes) - WRITE : bytes written to memory controller (in GBytes) - TEMP : Temperature reading in 1 degree Celsius relative to the TjMax temperature (thermal headroom): 0 corresponds to the max temperature - - Core (SKT) | EXEC | IPC | FREQ | AFREQ | L3MISS | L2MISS | L3HIT | L2HIT | L3CLK | L2CLK | READ | WRITE | TEMP - - 0 0 0.00 0.64 0.01 0.80 5592 11 K 0.49 0.13 0.32 0.06 N/A N/A 67 - 1 0 0.00 0.18 0.00 0.69 3086 5552 0.44 0.07 0.48 0.08 N/A N/A 68 - 2 0 0.00 0.23 0.00 0.81 300 562 0.47 0.06 0.43 0.08 N/A N/A 67 - 3 0 0.00 0.21 0.00 0.99 437 862 0.49 0.06 0.44 0.09 N/A N/A 73 - 4 0 0.00 0.23 0.00 0.93 293 559 0.48 0.07 0.42 0.09 N/A N/A 73 - 5 0 0.00 0.21 0.00 1.00 423 849 0.50 0.06 0.43 0.10 N/A N/A 69 - 6 0 0.00 0.23 0.00 0.94 285 558 0.49 0.06 0.41 0.09 N/A N/A 71 - 7 0 0.00 0.18 0.00 0.81 674 1130 0.40 0.05 0.53 0.08 N/A N/A 65 - 8 1 0.00 0.47 0.01 1.26 6371 13 K 0.51 0.35 0.31 0.07 N/A N/A 64 - 9 1 2.30 1.80 1.28 1.29 179 K 15 M 0.99 0.59 0.04 0.71 N/A N/A 60 - 10 1 0.00 0.22 0.00 1.26 315 570 0.45 0.06 0.43 0.08 N/A N/A 67 - 11 1 0.00 0.23 0.00 0.74 321 579 0.45 0.05 0.45 0.07 N/A N/A 66 - 12 1 0.00 0.22 0.00 1.25 305 570 0.46 0.05 0.42 0.07 N/A N/A 68 - 13 1 0.00 0.22 0.00 1.26 336 581 0.42 0.04 0.44 0.06 N/A N/A 69 - 14 1 0.00 0.22 0.00 1.25 314 565 0.44 0.06 0.43 0.07 N/A N/A 69 - 15 1 0.00 0.29 0.00 1.19 2815 6926 0.59 0.39 0.29 0.08 N/A N/A 69 - ------------------------------------------------------------------------------------------------------------------- - SKT 0 0.00 0.46 0.00 0.79 11 K 21 K 0.47 0.10 0.38 0.07 0.00 0.00 65 - SKT 1 0.29 1.79 0.16 1.29 190 K 15 M 0.99 0.59 0.05 0.70 0.01 0.01 61 - ------------------------------------------------------------------------------------------------------------------- - TOTAL * 0.14 1.78 0.08 1.28 201 K 15 M 0.99 0.59 0.05 0.70 0.01 0.01 N/A - - Instructions retired: 1345 M ; Active cycles: 755 M ; Time (TSC): 582 Mticks ; C0 (active,non-halted) core residency: 6.30 % - - C1 core residency: 0.14 %; C3 core residency: 0.20 %; C6 core residency: 0.00 %; C7 core residency: 93.36 %; - C2 package residency: 48.81 %; C3 package residency: 0.00 %; C6 package residency: 0.00 %; C7 package residency: 0.00 %; - - PHYSICAL CORE IPC : 1.78 => corresponds to 44.50 % utilization for cores in active state - Instructions per nominal CPU cycle: 0.14 => corresponds to 3.60 % core utilization over time interval - - Intel(r) QPI data traffic estimation in bytes (data traffic coming to CPU/socket through QPI links): - - QPI0 QPI1 | QPI0 QPI1 - ---------------------------------------------------------------------------------------------- - SKT 0 0 0 | 0% 0% - SKT 1 0 0 | 0% 0% - ---------------------------------------------------------------------------------------------- - Total QPI incoming data traffic: 0 QPI data traffic/Memory controller traffic: 0.00 - - Intel(r) QPI traffic estimation in bytes (data and non-data traffic outgoing from CPU/socket through QPI links): - - QPI0 QPI1 | QPI0 QPI1 - ---------------------------------------------------------------------------------------------- - SKT 0 0 0 | 0% 0% - SKT 1 0 0 | 0% 0% - ---------------------------------------------------------------------------------------------- - Total QPI outgoing data and non-data traffic: 0 - - ---------------------------------------------------------------------------------------------- - SKT 0 package consumed 4.06 Joules - SKT 1 package consumed 9.40 Joules - ---------------------------------------------------------------------------------------------- - TOTAL: 13.46 Joules - - ---------------------------------------------------------------------------------------------- - SKT 0 DIMMs consumed 4.18 Joules - SKT 1 DIMMs consumed 4.28 Joules - ---------------------------------------------------------------------------------------------- - TOTAL: 8.47 Joules - Cleaning up -``` - -### PCM-Sensor - -Can be used as a sensor for the ksysguard GUI. - -## API - -In a similar fashion to PAPI, PCM provides a C++ API to access the performance counter from within your application. Refer to the [Doxygen documentation][a] for details of the API. - -Sample program using the API : - -```cpp - #include <stdlib.h> - #include <stdio.h> - #include "cpucounters.h" - - #define SIZE 1000 - - using namespace std; - - int main(int argc, char **argv) { - float matrixa[SIZE][SIZE], matrixb[SIZE][SIZE], mresult[SIZE][SIZE]; - float real_time, proc_time, mflops; - long long flpins; - int retval; - int i,j,k; - - PCM * m = PCM::getInstance(); - - if (m->program() != PCM::Success) return 1; - - SystemCounterState before_sstate = getSystemCounterState(); - - /* Initialize the Matrix arrays */ - for ( i=0; i<SIZE*SIZE; i++ ){ - mresult[0][i] = 0.0; - matrixa[0][i] = matrixb[0][i] = rand()*(float)1.1; } - - /* A naive Matrix-Matrix multiplication */ - for (i=0;i<SIZE;i++) - for(j=0;j<SIZE;j++) - for(k=0;k<SIZE;k++) - mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j]; - - SystemCounterState after_sstate = getSystemCounterState(); - - cout << "Instructions per clock:" << getIPC(before_sstate,after_sstate) - << "L3 cache hit ratio:" << getL3CacheHitRatio(before_sstate,after_sstate) - << "Bytes read:" << getBytesReadFromMC(before_sstate,after_sstate); - - for (i=0; i<SIZE;i++) - for (j=0; j<SIZE; j++) - if (mresult[i][j] == -1) printf("x"); - - return 0; - } -``` - -Compile it with: - -```console -$ icc matrix.cpp -o matrix -lpthread -lpcm -``` - -Sample output: - -```console -$ ./matrix - Number of physical cores: 16 - Number of logical cores: 16 - Threads (logical cores) per physical core: 1 - Num sockets: 2 - Core PMU (perfmon) version: 3 - Number of core PMU generic (programmable) counters: 8 - Width of generic (programmable) counters: 48 bits - Number of core PMU fixed counters: 3 - Width of fixed counters: 48 bits - Nominal core frequency: 2400000000 Hz - Package thermal spec power: 115 Watt; Package minimum power: 51 Watt; Package maximum power: 180 Watt; - Socket 0: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected. - Socket 1: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected. - Number of PCM instances: 2 - Max QPI link speed: 16.0 GBytes/second (8.0 GT/second) - Instructions per clock:1.7 - L3 cache hit ratio:1.0 - Bytes read:12513408 -``` - -## References - -1. [Intel Performance Counter Monitor - a better way to measure cpu utilization][b] -1. [Intel® Xeon® Processor E5-2600 Product Family Uncore Performance Monitoring Guide][c] -1. [API Documentation][d] - -[1]: papi.md -[2]: ../../modules-matrix.md - -[a]: http://intel-pcm-api-documentation.github.io/classPCM.html -[b]: https://software.intel.com/en-us/articles/intel-performance-counter-monitor-a-better-way-to-measure-cpu-utilization] -[c]: https://software.intel.com/sites/default/files/m/3/2/2/xeon-e5-2600-uncore-guide.pdf -[d]: http://intel-pcm-api-documentation.github.io/classPCM.html diff --git a/content/docs/software/debuggers/intel-vtune-amplifier.mdx b/content/docs/software/debuggers/intel-vtune-amplifier.mdx deleted file mode 100644 index f61a706bfa2a5da01e4c2cdf94f55ccd2071f77f..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/intel-vtune-amplifier.mdx +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "Intel VTune Amplifier XE" ---- -## Introduction - -Intel*®* VTune™ Amplifier, part of Intel Parallel studio, is a GUI profiling tool designed for Intel processors. It offers a graphical performance analysis of single core and multithreaded applications. A highlight of the features: - -* Hotspot analysis -* Locks and waits analysis -* Low-level specific counters, such as branch analysis and memory bandwidth -* Power usage analysis - frequency and sleep states. - - - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av VTune -``` - -## Usage - -To profile an application with VTune Amplifier, special kernel modules need to be loaded. The modules are not loaded on the login nodes, thus direct profiling on login nodes is not possible. By default, the kernel modules are not loaded on compute nodes either. In order to have the modules loaded, you need to specify the `--gres=vtune:` resource at job submit. The version is the same as for the environment module. - -```console -$ salloc -p qexp -A PROJECT_ID --nodes=1 --gres=vtune:2020_update3 -``` - -After that, you can verify the modules `sep*`, `pax`, and `vtsspp` are present in the kernel: - -```console -$ lsmod | grep -e sep -e pax -e vtsspp - vtsspp 362000 0 - sep3_15 546657 0 - pax 4312 0 -``` - -To launch the GUI, first load the module: - -```console -$ ml VTune/2020_update3 -``` - -and launch the GUI: - -```console -$ $ amplxe-gui -``` - -The GUI will open in a new window. Click on *New Project...* to create a new project. After clicking OK, a new window with project properties will appear. At *Application:*, select the path to the binary you want to profile (the binary should be compiled with the `-g` flag). Some additional options, such as command line arguments, can be selected. At *Managed code profiling mode:* select `Native` (unless you want to profile managed mode .NET/Mono applications). After clicking OK, your project is created. - -To run a new analysis, click *New analysis...*. You will see a list of possible analyses. Some of them will not be possible on the current CPU (e.g. Intel Atom analysis is not possible on Sandy Bridge CPU), the GUI will show an error box if you select the wrong analysis. For example, select *Advanced Hotspots*. Clicking on *Start* will start profiling of the application. - -## Remote Analysis - -VTune Amplifier also allows a form of remote analysis. In this mode, data for analysis is collected from the command line without GUI, and the results are then loaded to GUI on another machine. This allows profiling without interactive graphical jobs. To perform a remote analysis, launch the GUI somewhere, open the new analysis window and then click the *Command line* button in the bottom right corner. It will show the command line needed to perform the selected analysis. - -The command line will look like this: - -```console -amplxe-cl -collect advanced-hotspots -app-working-dir /home/$USER/tmp -- /home/$USER/tmp/sgemm -``` - -Copy the line to clipboard and then you can paste it in your jobscript or in the command line. After the collection is run, open the GUI once again, click the menu button in the upper right corner, and select *Open > Result...*. The GUI will load the results from the run. - -## References - -1. [Intel® VTune™ Amplifier Support][a] -1. [Amplifier Help Linux][b] - -[a]: https://software.intel.com/en-us/intel-vtune-amplifier-xe-support/documentation -[b]: https://software.intel.com/en-us/amplifier_help_linux diff --git a/content/docs/software/debuggers/intel-vtune-profiler.mdx b/content/docs/software/debuggers/intel-vtune-profiler.mdx deleted file mode 100644 index 165d5ded0b3c2911bc1a20ed5661d8c31d5e5a4a..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/intel-vtune-profiler.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "Intel VTune Profiler" ---- -## Introduction - -Intel® VTune™ Profiler, part of Intel Parallel studio, is a GUI profiling tool designed for Intel processors. It offers a graphical performance analysis of single-core and multithreaded applications. A highlight of the features: - -* Hotspot analysis -* Locks and waits analysis -* Low level specific counters, such as branch analysis and memory bandwidth -* Power usage analysis - frequency and sleep states. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av VTune -``` - -## Usage - -To profile an application with VTune Profiler, special kernel modules need to be loaded. The modules are not loaded on the login nodes, thus direct profiling on login nodes is not possible. By default, the kernel modules are not loaded on compute nodes either. In order to have the modules loaded, you need to specify the `vtune:version` resource at job submission. The version is the same as for the environment module. For example, to use VTune/2020_update3: - -```console -$ salloc -p qcpu_exp -A OPEN-0-0 --nodes=1 --gres=vtune:2020_update3 -``` - -For VTune/2022.2.0-intel-2021b use `vtune:2022_2_0` parameter. - -After that, you can verify that the modules `sep*`, `pax`, and `vtsspp` are present in the kernel: - -```console -$ lsmod | grep -e sep -e pax -e vtsspp -vtsspp 367418 0 -sep5 885333 0 -socperf3 595104 2 sep5,socwatch2_12 -pax 13820 0 -``` - -To launch the GUI, first load the module: - -```console -$ ml VTune/2020_update3 -``` - -and launch the GUI: - -```console -$ vtune-gui -``` - -<Callout type=warn> - The command line `amplxe-gui` is deprecated. Use `vtune-gui` instead. -</Callout> - -The GUI will open in a new window. Click on "New Project..." to create a new project. After clicking OK, a new window with project properties will appear. At "Application:", select the path to your binary you want to profile (the binary should be compiled with the `-g` flag). You can also select some additional options such as command line arguments. Click OK to create the project. - -To run a new analysis, click "New analysis...". You will see a list of possible analyses. Some of them will not be possible on the current CPU, the GUI will show an error box if you select a wrong analysis. Clicking on Start will start profiling of the application. - -## Remote Analysis - -VTune Profiler also allows a form of remote analysis. In this mode, data for analysis is collected from the command line without GUI, and the results are then loaded to GUI on another machine. This allows profiling without interactive graphical jobs. To perform a remote analysis, launch a GUI somewhere, open the new analysis window and then click the "Command line" button in the bottom right corner. It will show the command line needed to perform the selected analysis. - -The command line will look like this: - -```console -vtune -collect hotspots -app-working-dir /home/$USER/tmp -- /home/$USER/tmp/sgemm -``` - -<Callout type=warn> - The command line `amplxe-cl` is a relative link to command `vtune`. -</Callout> - -Copy the line to clipboard and then you can paste it in your jobscript or in the command line. After the collection is run, open the GUI again, click the menu button in the upper right corner, and select "Open > Result...". The GUI will load the results from the run. - -## References - -1. [Intel® VTune™ Amplifier Support][a] -1. [Amplifier Help Linux][b] - -[a]: https://software.intel.com/en-us/intel-vtune-amplifier-xe-support/documentation -[b]: https://software.intel.com/en-us/amplifier_help_linux diff --git a/content/docs/software/debuggers/introduction.mdx b/content/docs/software/debuggers/introduction.mdx deleted file mode 100644 index 3356b0ddcff543b11cfecd80526b664b46336020..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/introduction.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Debuggers and Profilers Summary" ---- -## Introduction - -We provide state of the art programs and tools to develop, profile, and debug HPC codes at IT4Innovations. In this cestion, we provide an overview of the profiling and debugging tools available on IT4I clusters. - -## Allinea Forge (DDT/MAP) - -Allinea DDT is a commercial debugger primarily for debugging parallel MPI or OpenMP programs. It also has a support for GPU (CUDA) and Intel Xeon Phi accelerators. DDT provides all the standard debugging features (stack trace, breakpoints, watches, view variables, threads, etc.) for every thread running as part of your program, or for every process - even if these processes are distributed across a cluster using an MPI implementation. - -```console -$ ml Forge/20.0.1 -$ forge -``` - -Read more at the [Allinea DDT][2] page. - -## Allinea Performance Reports - -Allinea Performance Reports characterize the performance of HPC application runs. After executing your application through the tool, a synthetic HTML report is generated automatically, containing information about several metrics along with clear behavior statements and hints to help you improve the efficiency of your runs. Our license is limited to 64 MPI processes. - -```console -$ ml Forge/20.0.1 -$ perf-report mpirun -n 64 ./my_application argument01 argument02 -``` - -Read more at the [Allinea Performance Reports][3] page. - -## RougeWave Totalview - -TotalView is a source- and machine-level debugger for multi-process, multi-threaded programs. Its wide range of tools provides ways to analyze, organize, and test programs, making it easy to isolate and identify problems in individual threads and processes in programs of great complexity. - -```console -$ ml TotalView/2021.2.14 -$ totalview -``` - -Read more at the [Totalview][4] page. - -## Vampir Trace Analyzer - -Vampir is a GUI trace analyzer for traces in OTF format. - -```console -$ ml Vampir/9.9.0 -$ vampir -``` - -Read more at the [Vampir][5] page. - -[2]: allinea-ddt.md -[3]: allinea-performance-reports.md -[4]: total-view.md -[5]: vampir.md diff --git a/content/docs/software/debuggers/meta.json b/content/docs/software/debuggers/meta.json deleted file mode 100644 index 158d7e43f72fcec56c963beda4a950f929ffc86c..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/meta.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Debuggers", - "pages": [ - "allinea-ddt", - "allinea-performance-reports", - "cube", - "intel-performance-counter-monitor", - "intel-vtune-amplifier", - "intel-vtune-profiler", - "introduction", - "papi", - "scalasca", - "score-p", - "total-view", - "valgrind", - "vampir" - ] -} diff --git a/content/docs/software/debuggers/papi.mdx b/content/docs/software/debuggers/papi.mdx deleted file mode 100644 index ccfe0593329f08f74b477ac37d8b0833d92258d6..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/papi.mdx +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: "PAPI" ---- -## Introduction - -Performance Application Programming Interface (PAPI) is a portable interface to access hardware performance counters (such as instruction counts and cache misses) found in most modern architectures. With the new component framework, PAPI is not limited only to CPU counters, but offers also components for CUDA, network, Infiniband, etc. - -PAPI provides two levels of interface: a simpler high-level interface and more detailed low-level interface. - -PAPI can be used with parallel as well as serial programs. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av papi -``` - -## Utilities - -The bin directory of PAPI, which is automatically added to $PATH upon loading the module, contains various utilites. - -### Papi_avail - -Prints which preset events are available on the current CPU. The third column indicates whether the preset event is available on the current CPU. - -* Barbora cluster - -```console -$ papi_avail -Available PAPI preset and user defined events plus hardware information. --------------------------------------------------------------------------------- -PAPI version : 6.0.0.0 -Operating system : Linux 3.10.0-1160.6.1.el7.x86_64 -Vendor string and code : GenuineIntel (1, 0x1) -Model string and code : Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz (85, 0x55) -CPU revision : 7.000000 -CPUID : Family/Model/Stepping 6/85/7, 0x06/0x55/0x07 -CPU Max MHz : 3900 -CPU Min MHz : 1000 -Total cores : 72 -SMT threads per core : 2 -Cores per socket : 18 -Sockets : 2 -Cores per NUMA region : 36 -NUMA regions : 2 -Running in a VM : no -Number Hardware Counters : 10 -Max Multiplex Counters : 384 -Fast counter read (rdpmc): no --------------------------------------------------------------------------------- - -================================================================================ - PAPI Preset Events -================================================================================ - Name Code Avail Deriv Description (Note) -PAPI_L1_DCM 0x80000000 Yes No Level 1 data cache misses -PAPI_L1_ICM 0x80000001 Yes No Level 1 instruction cache misses -PAPI_L2_DCM 0x80000002 Yes Yes Level 2 data cache misses -PAPI_L2_ICM 0x80000003 Yes No Level 2 instruction cache misses -PAPI_L3_DCM 0x80000004 No No Level 3 data cache misses -PAPI_L3_ICM 0x80000005 No No Level 3 instruction cache misses -PAPI_L1_TCM 0x80000006 Yes Yes Level 1 cache misses -PAPI_L2_TCM 0x80000007 Yes No Level 2 cache misses -PAPI_L3_TCM 0x80000008 Yes No Level 3 cache misses - .... -``` - -* Karolina cluster - -```console -Available PAPI preset and user defined events plus hardware information. --------------------------------------------------------------------------------- -PAPI version : 6.0.0.0 -Operating system : Linux 3.10.0-1160.21.1.el7.x86_64 -Vendor string and code : AuthenticAMD (2, 0x2) -Model string and code : AMD EPYC 7H12 64-Core Processor (49, 0x31) -CPU revision : 0.000000 -CPUID : Family/Model/Stepping 23/49/0, 0x17/0x31/0x00 -CPU Max MHz : 2594 -CPU Min MHz : 2594 -Total cores : 128 -SMT threads per core : 1 -Cores per socket : 64 -Sockets : 2 -Cores per NUMA region : 16 -NUMA regions : 8 -Running in a VM : no -Number Hardware Counters : 5 -Max Multiplex Counters : 384 -Fast counter read (rdpmc): no --------------------------------------------------------------------------------- - -================================================================================ - PAPI Preset Events -================================================================================ - Name Code Avail Deriv Description (Note) -PAPI_L1_DCM 0x80000000 No No Level 1 data cache misses -PAPI_L1_ICM 0x80000001 No No Level 1 instruction cache misses -PAPI_L2_DCM 0x80000002 No No Level 2 data cache misses -PAPI_L2_ICM 0x80000003 No No Level 2 instruction cache misses -PAPI_L3_DCM 0x80000004 No No Level 3 data cache misses -PAPI_L3_ICM 0x80000005 No No Level 3 instruction cache misses -PAPI_L1_TCM 0x80000006 No No Level 1 cache misses -PAPI_L2_TCM 0x80000007 No No Level 2 cache misses -PAPI_L3_TCM 0x80000008 No No Level 3 cache misses -... -``` - -### Papi_native_avail - -Prints which native events are available on the current CPU. - -### Papi_cost - -Measures the cost (in cycles) of basic PAPI operations. - -### Papi_mem_info - -Prints information about the memory architecture of the current CPU. - -## PAPI API - -PAPI provides two kinds of events: - -* **Preset events** is a set of predefined common CPU events, standardized across platforms. -* **Native events** is a set of all events supported by the current hardware. This is a larger set of features than preset. For other components than CPU, only native events are usually available. - -To use PAPI in your application, you need to link the appropriate include file. - -* papi.h for C -* f77papi.h for Fortran 77 -* f90papi.h for Fortran 90 -* fpapi.h for Fortran with preprocessor - -The include path is automatically added by the `papi` module to `$INCLUDE`. - -### High-Level API - -Refer to [this description of the High-level API][a]. - -### Low-Level API - -Please refer to [this description of the Low-level API][b]. - -### Timers - -PAPI provides the most accurate timers the platform can support, [see][c]. - -### System Information - -PAPI can be used to query some system information, such as CPU name and MHz, [see][d]. - -## Example - -The following example prints MFLOPS rate of a naive matrix-matrix multiplication: - -```cpp - #include <stdlib.h> - #include <stdio.h> - #include "papi.h" - #define SIZE 1000 - - int main(int argc, char **argv) { - float matrixa[SIZE][SIZE], matrixb[SIZE][SIZE], mresult[SIZE][SIZE]; - float real_time, proc_time, mflops; - long long flpins; - int retval; - int i,j,k; - - /* Initialize the Matrix arrays */ - for ( i=0; i<SIZE*SIZE; i++ ){ - mresult[0][i] = 0.0; - matrixa[0][i] = matrixb[0][i] = rand()*(float)1.1; - } - - /* Setup PAPI library and begin collecting data from the counters */ - if((retval=PAPI_flops( &real_time, &proc_time, &flpins, &mflops))<PAPI_OK) - printf("Error!"); - - /* A naive Matrix-Matrix multiplication */ - for (i=0;i<SIZE;i++) - for(j=0;j<SIZE;j++) - for(k=0;k<SIZE;k++) - mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j]; - - /* Collect the data into the variables passed in */ - if((retval=PAPI_flops( &real_time, &proc_time, &flpins, &mflops))<PAPI_OK) - printf("Error!"); - - printf("Real_time:t%fnProc_time:t%fnTotal flpins:t%lldnMFLOPS:tt%fn", real_time, proc_time, flpins, mflops); - PAPI_shutdown(); - return 0; - } -``` - -Now compile and run the example: - -```console -$ gcc matrix.c -o matrix -lpapi -$ ./matrix - Real_time: 8.852785 - Proc_time: 8.850000 - Total flpins: 6012390908 - MFLOPS: 679.366211 -``` - -Let us try with optimizations enabled: - -```console -$ gcc -O3 matrix.c -o matrix -lpapi -$ ./matrix - Real_time: 0.000020 - Proc_time: 0.000000 - Total flpins: 6 - MFLOPS: inf -``` - -Now we see a seemingly strange result - the multiplication took no time and only 6 floating point instructions were issued. This is because the compiler optimizations have completely removed the multiplication loop, as the result is actually not used anywhere in the program. We can fix this by adding some "dummy" code at the end of the Matrix-Matrix multiplication routine: - -```cpp - for (i=0; i<SIZE;i++) - for (j=0; j<SIZE; j++) - if (mresult[i][j] == -1.0) printf("x"); -``` - -Now the compiler will not remove the multiplication loop. (However, it is still not that smart to see that the result will never be negative). Now run the code again: - -```console -$ gcc -O3 matrix.c -o matrix -lpapi -$ ./matrix - Real_time: 8.795956 - Proc_time: 8.790000 - Total flpins: 18700983160 - MFLOPS: 2127.529297 -``` - -## References - -1. [Main project page](http://icl.cs.utk.edu/papi/) -1. [Wiki](http://icl.cs.utk.edu/projects/papi/wiki/Main_Page) -1. [API Documentation](http://icl.cs.utk.edu/papi/docs/) - -[1]: ../../environment-and-modules.md - -[a]: http://icl.cs.utk.edu/projects/papi/wiki/PAPIC:High_Level -[b]: http://icl.cs.utk.edu/projects/papi/wiki/PAPIC:Low_Level -[c]: http://icl.cs.utk.edu/projects/papi/wiki/PAPIC:Timers -[d]: http://icl.cs.utk.edu/projects/papi/wiki/PAPIC:System_Information diff --git a/content/docs/software/debuggers/scalasca.mdx b/content/docs/software/debuggers/scalasca.mdx deleted file mode 100644 index 5d2bfdb26a33909d8c02662406c6577c046574ae..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/scalasca.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "Scalasca" ---- -## Introduction - -[Scalasca][a] is a software tool that supports the performance optimization of parallel programs by measuring and analyzing their runtime behavior. The analysis identifies potential performance bottlenecks – in particular those concerning communication and synchronization – and offers guidance in exploring their causes. - -Scalasca supports profiling of MPI, OpenMP and hybrid MPI+OpenMP applications. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Scalasca -``` - -## Usage - -Profiling a parallel application with Scalasca consists of three steps: - -1. Instrumentation, compiling the application such way, that the profiling data can be generated. -1. Runtime measurement, running the application with the Scalasca profiler to collect performance data. -1. Analysis of reports - -### Instrumentation - -Instrumentation via `scalasca -instrument` is discouraged. Use [Score-P instrumentation][5]. - -### Runtime Measurement - -After the application is instrumented, runtime measurement can be performed with the `scalasca -analyze` command. The syntax is: - -`scalasca -analyze [scalasca options] [launcher] [launcher options] [program] [program options]` - -An example: - -```console -$ scalasca -analyze mpirun -np 4 ./mympiprogram -``` - -Some notable Scalasca options are: - -* `-t` enables trace data collection. By default, only summary data are collected. -* `-e <directory>` specifies a directory to which the collected data is saved. By default, Scalasca saves the data to a directory with the scorep\_ prefix, followed by the name of the executable and the launch configuration. - -<Callout> - Scalasca can generate a huge amount of data, especially if tracing is enabled. Consider saving the data to a scratch directory. -</Callout> - -### Analysis of Reports - -For the analysis, you must have the [Score-P][5] and [CUBE][6] modules loaded. The analysis is done in two steps. First, the data is preprocessed and then, the CUBE GUI tool is launched. - -To launch the analysis, run: - -```console -$ scalasca -examine [options] <experiment_directory> -``` - -If you do not wish to launch the GUI tool, use the `-s` option: - -```console -$ scalasca -examine -s <experiment_directory> -``` - -Alternatively, you can open CUBE and load the data directly from here. Keep in mind that in this case, the pre-processing is not done and not all metrics will be shown in the viewer. - -Refer to the [CUBE documentation][6] on usage of the GUI viewer. - -## References - -1. [http://www.scalasca.org/][a] - -[1]: ../../modules-matrix.md -[2]: ../compilers.md -[5]: score-p.md -[6]: cube.md - -[a]: http://www.scalasca.org/ diff --git a/content/docs/software/debuggers/score-p.mdx b/content/docs/software/debuggers/score-p.mdx deleted file mode 100644 index 730559c1fca2f46be4d23179b3b4f5d0ac057caa..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/score-p.mdx +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: "Score-P" ---- -## Introduction - -The [Score-P measurement infrastructure][a] is a highly scalable and easy-to-use tool suite for profiling, event tracing, and online analysis of HPC applications. - -Score-P can be used as an instrumentation tool for [Scalasca][1]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Score-P -``` - -## Instrumentation - -There are three ways to instrument your parallel applications in order to enable performance data collection: - -1. Automated instrumentation using compiler -1. Manual instrumentation using API calls -1. Manual instrumentation using directives - -### Automated Instrumentation - -This the easiest method. Score-P will automatically add instrumentation to every routine entry and exit using compiler hooks, and will intercept MPI calls and OpenMP regions. However, this method might produce a large number of data. If you want to focus on profiling a specific regions of your code, consider using the manual instrumentation methods. To use automated instrumentation, simply prepend scorep to your compilation command. For example, replace: - -```console -$ mpif90 -c foo.f90 -$ mpif90 -c bar.f90 -$ mpif90 -o myapp foo.o bar.o -``` - -with: - -```console -$ scorep mpif90 -c foo.f90 -$ scorep mpif90 -c bar.f90 -$ scorep mpif90 -o myapp foo.o bar.o -``` - -Usually your program is compiled using a Makefile or similar script, so it is advisable to add the `scorep` command to your definition of variables CC, CXX, FCC, etc. - -It is important that scorep is prepended also to the linking command, in order to link with Score-P instrumentation libraries. - -### Manual Instrumentation Using API Calls - -To use this kind of instrumentation, use `scorep` with the `--user` switch. You will then mark regions to be instrumented by inserting API calls. - -An example in C/C++: - -```cpp -#include <scorep/SCOREP_User.h> -void foo() -{ - SCOREP_USER_REGION_DEFINE( my_region_handle ) - // more declarations - SCOREP_USER_REGION_BEGIN( my_region_handle, "foo", SCOREP_USER_REGION_TYPE_COMMON ) - // do something - SCOREP_USER_REGION_END( my_region_handle ) -} -``` - -and Fortran: - -```fortran -#include "scorep/SCOREP_User.inc" -subroutine foo - SCOREP_USER_REGION_DEFINE( my_region_handle ) - ! more declarations - SCOREP_USER_REGION_BEGIN( my_region_handle, "foo", SCOREP_USER_REGION_TYPE_COMMON ) - ! do something - SCOREP_USER_REGION_END( my_region_handle ) -end subroutine foo -``` - -Refer to the [documentation for description of the API][b]. - -### Manual Instrumentation Using Directives - -This method uses POMP2 directives to mark regions to be instrumented. To use this method, use the `scorep --pomp` command. - -Example directives in C/C++: - -```cpp -void foo(...) -{ - /* declarations */ - #pragma pomp inst begin(foo) - ... - if (<condition>) - { - #pragma pomp inst altend(foo) - return; - } - ... - #pragma pomp inst end(foo) -} -``` - -and in Fortran: - -```fortran -subroutine foo(...) - !declarations - !POMP$ INST BEGIN(foo) - ... - if (<condition>) then - !POMP$ INST ALTEND(foo) - return - end if - ... - !POMP$ INST END(foo) -end subroutine foo -``` - -The directives are ignored if the program is compiled without Score-P. For details, refer to the [documentation][c]. - -[1]: scalasca.md -[2]: ../../modules-matrix.md -[3]: ../compilers.md - -[a]: http://www.vi-hps.org/projects/score-p/ -[b]: https://silc.zih.tu-dresden.de/scorep-current/pdf/scorep.pdf -[c]: https://silc.zih.tu-dresden.de/scorep-current/pdf/scorep.pdf diff --git a/content/docs/software/debuggers/total-view.mdx b/content/docs/software/debuggers/total-view.mdx deleted file mode 100644 index c2ecfddf1bf42a54bce794bbc75af2d3e0687f3d..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/total-view.mdx +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: "TotalView" ---- -## Introduction - -TotalView is a GUI-based source code multi-process, multi-thread debugger. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av TotalView -``` - -## License and Limitations for Cluster Users - -On the cluster, users can debug OpenMP or MPI code that runs up to 64 parallel processes. This limitation means that 1 user can debug up 64 processes, or 32 users can debug 2 processes, etc. - -Debugging of GPU accelerated codes is also supported. - -You can check the status of the licenses for [Karolina][a] or [Barbora][b]: - -```console -$ cat /apps/user/licenses/totalview_features_state.txt - - # totalview - # ------------------------------------------------- - # FEATURE TOTAL USED AVAIL - # ------------------------------------------------- - TotalView_Team 64 0 64 - Replay 64 0 64 - CUDA 64 0 64 -``` - -## Compiling Code to Run With TotalView - -### Modules - -Load all necessary modules to compile the code. For example: - -```console -$ ml intel/2020b -``` - -Load the TotalView module: - -```console -$ ml TotalView/2021.2.14 -``` - -Compile the code: - -```console -$ mpicc -g -O0 -o test_debug test.c -$ mpif90 -g -O0 -o test_debug test.f -``` - -### Compiler Flags - -Before debugging, you need to compile your code with theses flags: - -<Callout> - `-g` Generates extra debugging information usable by GDB. `-g3` includes additional debugging information. This option is available for GNU, Intel C/C++, and Fortran compilers. - `-O0` Suppresses all optimizations. -</Callout> - -## Starting a Job With TotalView - -Be sure to log in with an X window forwarding enabled. This could mean using the `-X` in the `ssh`: - -```console -local $ssh -X username@login1.karolina.it4i.cz -``` - -Another option is to access the login node using VNC. - -From the login node an interactive session with X windows forwarding (`--x11` option) can be started by the following command: - -```console -$ salloc -A PROJECT_ID -p qcpu --nodes=1 --ntasks-per-node=128 --cpus-per-task=1 --time=01:00:00 --x11 -``` - -Then launch the debugger with the totalview command followed by the name of the executable to debug. - -### Debugging a Serial Code - -To debug a serial code, use: - -```console -$ totalview test_debug -``` - -### Debugging a Parallel Code - Option 1 - -To debug a parallel code compiled with **OpenMPI**, you need to setup your TotalView environment: - -<Callout> - To be able to run a parallel debugging procedure from the command line without stopping the debugger in the mpiexec source code, you have to add the following function to your **~/.tvdrc** file. -</Callout> - -```console -proc mpi_auto_run_starter {loaded_id} { - set starter_programs {mpirun mpiexec orterun} - set executable_name [TV::symbol get $loaded_id full_pathname] - set file_component [file tail $executable_name] - - if {[lsearch -exact $starter_programs $file_component] != -1} { - puts "*************************************" - puts "Automatically starting $file_component" - puts "*************************************" - dgo - } -} - -# Append this function to TotalView's image load callbacks so that -# TotalView run this program automatically. - -dlappend TV::image_load_callbacks mpi_auto_run_starter -``` - -The source code of this function can be also found in - -```console -$ $EBROOTOPENMPI/etc/openmpi-totalview.tcl -``` - -You can also add only following line to your ~/.tvdrc file instead of -the entire function: - -```console -$ source $EBROOTOPENMPI/etc/openmpi-totalview.tcl -``` - -You need to do this step only once. See also [OpenMPI FAQ entry][c]. - -Now you can run the parallel debugger using: - -```console -$ mpirun -tv -n 5 ./test_debug -``` - -When the following dialog appears, click on "Yes" - - - -At this point, the main TotalView GUI window will appear and you can insert the breakpoints and start debugging: - - - -### Debugging a Parallel Code - Option 2 - -Another option to start a new parallel debugging session from a command line is to let TotalView to execute mpirun by itself. In this case, the user has to specify an MPI implementation used to compile the source code. - -The following example shows how to start a debugging session with the Intel MPI: - -```console -$ ml intel/2020b TotalView/2021.2.14 -$ totalview -mpi "Intel MPI-Hydra" -np 8 ./hello_debug_impi -``` - -After running the previous command, you will see the same window as shown in the screenshot above. - -More information regarding the command line parameters of the TotalView can be foundin the TotalView Reference Guide, Chapter 7: TotalView Command Syntax. - -## Documentation - -[1] The [TotalView documentation][d] web page is a good source for learning more about some of the advanced TotalView features. - -[a]: https://extranet.it4i.cz/rsweb/karolina/license/Totalview -[b]: https://extranet.it4i.cz/rsweb/barbora/license/Totalview -[c]: https://www.open-mpi.org/faq/?category=running#run-with-tv -[d]: http://www.roguewave.com/support/product-documentation/totalview-family.aspx#totalview diff --git a/content/docs/software/debuggers/valgrind.mdx b/content/docs/software/debuggers/valgrind.mdx deleted file mode 100644 index 8e5a3fce8164b8cf6e56ebe9692bb61541d56d1b..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/valgrind.mdx +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: "Valgrind" ---- -## Introduction - -Valgrind is an open-source tool for memory debugging and profiling. It is used mainly for debugging memory-related problems, such as memory leaks, use of uninitalized memory, etc. in C/C++ applications. However, the toolchain has been extended over time with more functionality, such as debugging of threaded applications, cache profiling, not limited only to C/C++. - -Valgrind is an extremely useful tool for debugging memory errors such as [off-by-one][a]. Valgrind uses a virtual machine and dynamic recompilation of binary code, so you can expect that programs being debugged by Valgrind run 5-100 times slower. - -The main tools available in Valgrind are: - -* **Memcheck**, the original, most used and default tool. Verifies memory access in you program and can detect use of uninitialized memory, out of bounds memory access, memory leaks, double free, etc. -* **Massif**, a heap profiler. -* **Hellgrind** and **DRD** can detect race conditions in multi-threaded applications. -* **Cachegrind**, a cache profiler. -* **Callgrind**, a callgraph analyzer. -* For more information, refer to the [official Valgrind documentation][b]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Valgrind -``` - -## Usage - -Compile the application which you want to debug as usual. It is advisable to add the compilation flags `-g` (to add debugging information to the binary so that you will see original source code lines in the output) and `-O0` (to disable compiler optimizations). - -For example, let us look at this C code, which has two problems: - -```cpp -#include <stdlib.h> - -void f(void) -{ - int* x = malloc(10 * sizeof(int)); - x[10] = 0; // problem 1: heap block overrun -} // problem 2: memory leak -- x not freed - -int main(void) -{ - f(); - return 0; -} -``` - -Now, compile it with the Intel compiler : - -```console -$ ml intel/2020b -$ icc -g valgrind-example.c -o valgrind-example -``` - -Now, let us run it with Valgrind: - -`valgrind [valgrind options] <your program binary> [your program options]` - -```console -$ ml Valgrind/3.16.1-intel-2020b -``` - -If no Valgrind options are specified, Valgrind defaults to running the Memcheck tool. For the full description of command line options, refer to the Valgrind documentation. - -```console -$ valgrind ./valgrind-example - ==12652== Memcheck, a memory error detector - ==12652== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. - ==12652== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info - ==12652== Command: ./valgrind-example - ==12652== - ==12652== Invalid write of size 4 - ==12652== at 0x40053E: f (valgrind-example.c:6) - ==12652== by 0x40054E: main (valgrind-example.c:11) - ==12652== Address 0x5861068 is 0 bytes after a block of size 40 alloc'd - ==12652== at 0x4C27AAA: malloc (vg_replace_malloc.c:291) - ==12652== by 0x400528: f (valgrind-example.c:5) - ==12652== by 0x40054E: main (valgrind-example.c:11) - ==12652== - ==12652== - ==12652== HEAP SUMMARY: - ==12652== in use at exit: 40 bytes in 1 blocks - ==12652== total heap usage: 1 allocs, 0 frees, 40 bytes allocated - ==12652== - ==12652== LEAK SUMMARY: - ==12652== definitely lost: 40 bytes in 1 blocks - ==12652== indirectly lost: 0 bytes in 0 blocks - ==12652== possibly lost: 0 bytes in 0 blocks - ==12652== still reachable: 0 bytes in 0 blocks - ==12652== suppressed: 0 bytes in 0 blocks - ==12652== Rerun with --leak-check=full to see details of leaked memory - ==12652== - ==12652== For counts of detected and suppressed errors, rerun with: -v - ==12652== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6) -``` - -In the output, we can see that Valgrind has detected both errors - the off-by-one memory access at line 5 and a memory leak of 40 bytes. If we want a detailed analysis of the memory leak, we need to run Valgrind with the `--leak-check=full` option: - -```console -$ valgrind --leak-check=full ./valgrind-example - ==23856== Memcheck, a memory error detector - ==23856== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. - ==23856== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright info - ==23856== Command: ./valgrind-example - ==23856== - ==23856== Invalid write of size 4 - ==23856== at 0x40067E: f (valgrind-example.c:6) - ==23856== by 0x40068E: main (valgrind-example.c:11) - ==23856== Address 0x66e7068 is 0 bytes after a block of size 40 alloc'd - ==23856== at 0x4C26FDE: malloc (vg_replace_malloc.c:236) - ==23856== by 0x400668: f (valgrind-example.c:5) - ==23856== by 0x40068E: main (valgrind-example.c:11) - ==23856== - ==23856== - ==23856== HEAP SUMMARY: - ==23856== in use at exit: 40 bytes in 1 blocks - ==23856== total heap usage: 1 allocs, 0 frees, 40 bytes allocated - ==23856== - ==23856== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 - ==23856== at 0x4C26FDE: malloc (vg_replace_malloc.c:236) - ==23856== by 0x400668: f (valgrind-example.c:5) - ==23856== by 0x40068E: main (valgrind-example.c:11) - ==23856== - ==23856== LEAK SUMMARY: - ==23856== definitely lost: 40 bytes in 1 blocks - ==23856== indirectly lost: 0 bytes in 0 blocks - ==23856== possibly lost: 0 bytes in 0 blocks - ==23856== still reachable: 0 bytes in 0 blocks - ==23856== suppressed: 0 bytes in 0 blocks - ==23856== - ==23856== For counts of detected and suppressed errors, rerun with: -v - ==23856== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6) -``` - -Now we can see that the memory leak is due to `malloc()` at line 6. - -## Usage With MPI - -Although Valgrind is not primarily a parallel debugger, it can be used to debug parallel applications as well. When launching your parallel applications, prepend the valgrind command. For example: - -```console -$ mpirun -np 4 valgrind myapplication -``` - -The default version without MPI support will however report a large number of false errors in the MPI library, such as: - -```console - ==30166== Conditional jump or move depends on uninitialised value(s) - ==30166== at 0x4C287E8: strlen (mc_replace_strmem.c:282) - ==30166== by 0x55443BD: I_MPI_Processor_model_number (init_interface.c:427) - ==30166== by 0x55439E0: I_MPI_Processor_arch_code (init_interface.c:171) - ==30166== by 0x558D5AE: MPID_nem_impi_init_shm_configuration (mpid_nem_impi_extensions.c:1091) - ==30166== by 0x5598F4C: MPID_nem_init_ckpt (mpid_nem_init.c:566) - ==30166== by 0x5598B65: MPID_nem_init (mpid_nem_init.c:489) - ==30166== by 0x539BD75: MPIDI_CH3_Init (ch3_init.c:64) - ==30166== by 0x5578743: MPID_Init (mpid_init.c:193) - ==30166== by 0x554650A: MPIR_Init_thread (initthread.c:539) - ==30166== by 0x553369F: PMPI_Init (init.c:195) - ==30166== by 0x4008BD: main (valgrind-example-mpi.c:18) -``` - -So it is better to use the MPI-enabled Valgrind from the module. The MPI version requires the library `$EBROOTVALGRIND/lib/valgrind/libmpiwrap-amd64-linux.so` -which must be included in the `LD_PRELOAD` environment variable. - -Let us look at this MPI example: - -```cpp -#include <stdlib.h> -#include <mpi.h> - -int main(int argc, char *argv[]) -{ - int *data = malloc(sizeof(int)*99); - - MPI_Init(&argc, &argv); - MPI_Bcast(data, 100, MPI_INT, 0, MPI_COMM_WORLD); - MPI_Finalize(); - - return 0; -} -``` - -There are two errors - use of uninitialized memory and invalid length of the buffer. Let us debug it with Valgrind: - -```console -$ ml intel/2020b Valgrind/3.16.1-intel-2020b -$ mpicc -g valgrind-example-mpi.c -o valgrind-example-mpi -$ mpirun -np 2 -env LD_PRELOAD $EBROOTVALGRIND/lib/valgrind/libmpiwrap-amd64-linux.so valgrind ./valgrind-example-mpi -``` - -Prints this output (note that there is an output printed for every launched MPI process): - -```console - ==31318== Memcheck, a memory error detector - ==31318== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. - ==31318== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info - ==31318== Command: ./valgrind-example-mpi - ==31318== - ==31319== Memcheck, a memory error detector - ==31319== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. - ==31319== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info - ==31319== Command: ./valgrind-example-mpi - ==31319== - valgrind MPI wrappers 31319: Active for pid 31319 - valgrind MPI wrappers 31319: Try MPIWRAP_DEBUG=help for possible options - valgrind MPI wrappers 31318: Active for pid 31318 - valgrind MPI wrappers 31318: Try MPIWRAP_DEBUG=help for possible options - ==31319== Unaddressable byte(s) found during client check request - ==31319== at 0x4E35974: check_mem_is_addressable_untyped (libmpiwrap.c:960) - ==31319== by 0x4E5D0FE: PMPI_Bcast (libmpiwrap.c:908) - ==31319== by 0x400911: main (valgrind-example-mpi.c:20) - ==31319== Address 0x69291cc is 0 bytes after a block of size 396 alloc'd - ==31319== at 0x4C27AAA: malloc (vg_replace_malloc.c:291) - ==31319== by 0x4007BC: main (valgrind-example-mpi.c:8) - ==31319== - ==31318== Uninitialised byte(s) found during client check request - ==31318== at 0x4E3591D: check_mem_is_defined_untyped (libmpiwrap.c:952) - ==31318== by 0x4E5D06D: PMPI_Bcast (libmpiwrap.c:908) - ==31318== by 0x400911: main (valgrind-example-mpi.c:20) - ==31318== Address 0x6929040 is 0 bytes inside a block of size 396 alloc'd - ==31318== at 0x4C27AAA: malloc (vg_replace_malloc.c:291) - ==31318== by 0x4007BC: main (valgrind-example-mpi.c:8) - ==31318== - ==31318== Unaddressable byte(s) found during client check request - ==31318== at 0x4E3591D: check_mem_is_defined_untyped (libmpiwrap.c:952) - ==31318== by 0x4E5D06D: PMPI_Bcast (libmpiwrap.c:908) - ==31318== by 0x400911: main (valgrind-example-mpi.c:20) - ==31318== Address 0x69291cc is 0 bytes after a block of size 396 alloc'd - ==31318== at 0x4C27AAA: malloc (vg_replace_malloc.c:291) - ==31318== by 0x4007BC: main (valgrind-example-mpi.c:8) - ==31318== - ==31318== - ==31318== HEAP SUMMARY: - ==31318== in use at exit: 3,172 bytes in 67 blocks - ==31318== total heap usage: 191 allocs, 124 frees, 81,203 bytes allocated - ==31318== - ==31319== - ==31319== HEAP SUMMARY: - ==31319== in use at exit: 3,172 bytes in 67 blocks - ==31319== total heap usage: 175 allocs, 108 frees, 48,435 bytes allocated - ==31319== - ==31318== LEAK SUMMARY: - ==31318== definitely lost: 408 bytes in 3 blocks - ==31318== indirectly lost: 256 bytes in 1 blocks - ==31318== possibly lost: 0 bytes in 0 blocks - ==31318== still reachable: 2,508 bytes in 63 blocks - ==31318== suppressed: 0 bytes in 0 blocks - ==31318== Rerun with --leak-check=full to see details of leaked memory - ==31318== - ==31318== For counts of detected and suppressed errors, rerun with: -v - ==31318== Use --track-origins=yes to see where uninitialised values come from - ==31318== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4) - ==31319== LEAK SUMMARY: - ==31319== definitely lost: 408 bytes in 3 blocks - ==31319== indirectly lost: 256 bytes in 1 blocks - ==31319== possibly lost: 0 bytes in 0 blocks - ==31319== still reachable: 2,508 bytes in 63 blocks - ==31319== suppressed: 0 bytes in 0 blocks - ==31319== Rerun with --leak-check=full to see details of leaked memory - ==31319== - ==31319== For counts of detected and suppressed errors, rerun with: -v - ==31319== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4) -``` - -We can see that Valgrind has reported use of the uninitialized memory on the master process (which reads the array to be broadcast) and use of the unaddressable memory on both processes. - -[1]: ../../modules-matrix.md - -[a]: http://en.wikipedia.org/wiki/Off-by-one_error -[b]: http://valgrind.org/docs/ diff --git a/content/docs/software/debuggers/vampir.mdx b/content/docs/software/debuggers/vampir.mdx deleted file mode 100644 index 8796e537a1f2632674ebb7ea98b006490413b03b..0000000000000000000000000000000000000000 --- a/content/docs/software/debuggers/vampir.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Vampir" ---- -## Introduction - -Vampir is a commercial trace analysis and visualization tool. It works with traces in OTF and OTF2 formats. It does not have the functionality to collect traces, so you need to use a trace collection tool (such as [Score-P][1]) first to collect the traces. - - - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Vampir -``` - -## User Manual - -To find the detailed user manual in PDF format, type - -```console -$ ls $EBROOTVAMPIR/doc/vampir-manual.pdf -``` - -## References - -1. [Web site][a] - -[1]: score-p.md - -[a]: https://www.vampir.eu diff --git a/content/docs/software/eessi.mdx b/content/docs/software/eessi.mdx deleted file mode 100644 index 63f1d98353d9cd4c8bcd831fc320fa898bba0759..0000000000000000000000000000000000000000 --- a/content/docs/software/eessi.mdx +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "EESSI" ---- -EESSI stands for the European Environment for Scientific Software Installations - a collaboration between different European partners in HPC community. - -The goal of this project is to build a common stack of scientific software installations for HPC systems and beyond, including laptops, personal workstations, and cloud infrastructure. - -For more information, see the [official EESSI documentation][1]. - -## EESSI on IT4I - -The EESSI project is available on login, cn, and acn nodes on both Barbora and Karolina. - -To use the EESSI software installations, load the environment using the command: - -```console -source /cvmfs/software.eessi.io/versions/2023.06/init/bash -``` - -You can then use the `ml av` command to see the list of all EESSI and IT4I modules. EESSI modules will be listed first: - -```console -{EESSI 2023.06} $ ml av - ----- /cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/intel/skylake_avx512/modules/all ---- - Abseil/20230125.2-GCCcore-12.2.0 - Abseil/20230125.3-GCCcore-12.3.0 (D) - ALL/0.9.2-foss-2023a - AOFlagger/3.4.0-foss-2023b - archspec/0.2.1-GCCcore-12.3.0 - Armadillo/11.4.3-foss-2022b - Armadillo/12.6.2-foss-2023a - Armadillo/12.8.0-foss-2023b (D) - arpack-ng/3.8.0-foss-2022b - arpack-ng/3.9.0-foss-2023a - arpack-ng/3.9.0-foss-2023b (D) - arrow-R/11.0.0.3-foss-2022b-R-4.2.2 - arrow-R/14.0.1-foss-2023a-R-4.3.2 (D) - Arrow/11.0.0-gfbf-2022b - Arrow/14.0.1-gfbf-2023a (D) - ASE/3.22.1-gfbf-2022b - at-spi2-atk/2.38.0-GCCcore-12.2.0 - at-spi2-atk/2.38.0-GCCcore-12.3.0 (D) - at-spi2-core/2.46.0-GCCcore-12.2.0 - at-spi2-core/2.49.91-GCCcore-12.3.0 (D) -lines 1-22 -``` - -## Exiting EESSI Environment - -To exit EESSI environment, you must log out of the supercomputer. - -## Bugs & Issues - -You can see the list of issues and report bugs on the [project's issue GitHub page][2]. - -[1]: https://www.eessi.io/docs/overview/ -[2]: https://github.com/EESSI/software-layer/issues diff --git a/content/docs/software/intel/intel-suite/intel-advisor.mdx b/content/docs/software/intel/intel-suite/intel-advisor.mdx deleted file mode 100644 index 9b8888b9d9b1b27ac72c12e723a610a37c2b8b72..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-advisor.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Intel Advisor" ---- -## Introduction - -Intel Advisor is a tool aiming to assist you in vectorization and threading of your code. You can use it to profile your application and identify loops that could benefit from vectorization and/or threading parallelism. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Advisor -``` - -## Usage - -Your program should be compiled with the `-g` switch to include symbol names. You should compile with `-O2` or higher to see code that is already vectorized by the compiler. - -Profiling is possible either directly from the GUI or from the command line. - -To profile from the GUI, launch Advisor: - -```console -$ advixe-gui -``` - -Then select the menu *File -> New -> Project*. Choose a directory to which the project data is saved. After clicking OK, the *Project properties* window appears, where you can configure the path to your binary, launch arguments, working directory, etc. After clicking OK, the project is ready. - -In the left pane, you can switch between *Vectorization* and *Threading* workflows. Each has several possible steps, which you can execute by clicking the *Collect* button. Alternatively, you can click on *Command Line* to see the command line required to run the analysis directly from the command line. - -## References - -1. [Intel® Advisor 2022 Tutorial: Get Started with Intel® Advisor][a] -1. [Product page][b] -1. [Documentation][c] - -[a]: https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-advisor/top.html -[b]: https://software.intel.com/en-us/intel-advisor-xe -[c]: https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html diff --git a/content/docs/software/intel/intel-suite/intel-compilers.mdx b/content/docs/software/intel/intel-suite/intel-compilers.mdx deleted file mode 100644 index 71ca4ba6976e751bac1b71d9112cf0b9e29bc7a1..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-compilers.mdx +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Intel Compilers" ---- -## Introduction - -Intel compilers are compilers for Intel processor-based systems, available for Microsoft Windows, Linux, and macOS operating systems. - -## Installed Versions - -<Callout type=warn> - An `intel/2023a` module has been installed on the Karolina and Barbora clusters. - This module contains new compilers `icx`, `icpx`, and `ifx`.<br> - See the porting guides for [ICC Users to DPCPP or ICX][b] or for [Intel® Fortran Compiler][c]. -</Callout> - -Intel compilers are available in multiple versions via the `intel` module. The compilers include the icc C and C++ compiler and the ifort Fortran 77/90/95 compiler. - -For the current list of installed versions, use: - -```console -$ ml av intel/ -``` - -```console -$ ml intel/2020b -$ icc -v -icc version 19.1.3.304 (gcc version 10.2.0 compatibility) -$ ifort -v -ifort version 19.1.3.304 -``` - -## Instructions Vectorization - -Intel compilers provide vectorization of the code via the AVX-2/AVX-512 instructions and support threading parallelization via OpenMP. - -For maximum performance on the Barbora cluster compute nodes, compile your programs using the AVX-512 instructions, with reporting where the vectorization was used. We recommend the following compilation options for high performance. - -<Callout> - Barbora non-accelerated nodes support AVX-512 instructions (cn1-cn192). -</Callout> - -```console -$ icc -ipo -O3 -xCORE-AVX512 -qopt-report1 -qopt-report-phase=vec myprog.c mysubroutines.c -o myprog.x -``` - -In this example, we compile the program enabling interprocedural optimizations between source files (`-ipo`), aggressive loop optimizations (`-O3`), and vectorization (`-xCORE-AVX512`). - -For maximum performance on the Barbora GPU nodes or Karolina cluster compute nodes, compile your programs using the AVX-2 instructions, with reporting where the vectorization was used. We recommend the following compilation options for high performance. - -```console -$ icc -ipo -O3 -xCORE-AVX2 -qopt-report1 -qopt-report-phase=vec myprog.c mysubroutines.c -o myprog.x -``` - -<Callout type=warn> - Karolina cluster has AMD cpu, use compiler options `-march=core-avx2`. -</Callout> - -In this example, we compile the program enabling interprocedural optimizations between source files (`-ipo`), aggressive loop optimizations (`-O3`), and vectorization (`-xCORE-AVX2`). - -The compiler recognizes the omp, simd, vector, and ivdep pragmas for OpenMP parallelization and AVX2 vectorization. Enable the OpenMP parallelization by the `-openmp` compiler switch. - -```console -$ icc -ipo -O3 -xCORE-AVX2 -qopt-report1 -qopt-report-phase=vec -openmp myprog.c mysubroutines.c -o myprog.x -``` - -Read more [here][a]. - -[a]: https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top.html -[b]: https://www.intel.com/content/www/us/en/developer/articles/guide/porting-guide-for-icc-users-to-dpcpp-or-icx.html -[c]: https://www.intel.com/content/www/us/en/developer/articles/guide/porting-guide-for-ifort-to-ifx.html?wapkw=ifx diff --git a/content/docs/software/intel/intel-suite/intel-inspector.mdx b/content/docs/software/intel/intel-suite/intel-inspector.mdx deleted file mode 100644 index 4b32f0494981b557a2fbb13885d65f625d5731ab..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-inspector.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Intel Inspector" ---- -## Introduction - -Intel Inspector is a dynamic memory and threading error-checking tool for C/C++/Fortran applications. It can detect issues such as memory leaks, invalid memory references, uninitialized variables, race conditions, deadlocks, etc. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av Inspector -``` - -## Usage - -Your program should be compiled with the `-g` switch to include symbol names. Optimizations can be turned on. - -Debugging is possible either directly from the GUI, or from command line. - -### GUI Mode - -To debug from GUI, launch Inspector: - -```console -$ inspxe-gui & -``` - -Then select the *File -> New -> Project* menu. Choose a directory to which the project data is saved. After clicking OK, the *Project properties* window appears, where you can configure the path to your binary, launch arguments, working directory, etc. After clicking OK, the project is ready. - -In the main pane, you can start a predefined analysis type or define your own. Click *Start* to start the analysis. Alternatively, you can click on *Command Line*, to see the command line required to run the analysis directly from the command line. - -### Batch Mode - -Analysis can be also run from the command line in batch mode. Batch mode analysis is run with the `inspxe-cl` command. To obtain the required parameters, consult the documentation or configure the analysis in the GUI and then click the *Command Line* button in the lower right corner to the respective command line. - -Results obtained from batch mode can be then viewed in the GUI by selecting *File -> Open -> Result...*. - -## References - -1. [Product page, Documentation and Release Notes][a] -1. [Tutorials][b] - -[a]: https://www.intel.com/content/www/us/en/developer/tools/oneapi/inspector.html -[c]: https://www.intel.com/content/www/us/en/developer/articles/training/inspector-tutorials.html diff --git a/content/docs/software/intel/intel-suite/intel-integrated-performance-primitives.mdx b/content/docs/software/intel/intel-suite/intel-integrated-performance-primitives.mdx deleted file mode 100644 index 185064c70a57fbad215f41c90efe1ee8b9289af7..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-integrated-performance-primitives.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Intel IPP" ---- -## Introduction - -Intel Integrated Performance Primitives is a very rich library of highly optimized algorithmic building blocks for media and data applications. This includes signal, image, and frame processing algorithms, such as FFT, FIR, Convolution, Optical Flow, Hough transform, Sum, MinMax, as well as cryptographic functions, linear algebra functions, and many more. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av ipp -``` - -## IPP Example - -```cpp -#include "ipp.h" -#include <stdio.h> -int main(int argc, char* argv[]) -{ - const IppLibraryVersion *lib; - Ipp64u fm; - IppStatus status; - - status= ippInit(); //IPP initialization with the best optimization layer - if( status != ippStsNoErr ) { - printf("IppInit() Error:n"); - printf("%sn", ippGetStatusString(status) ); - return -1; - } - - //Get version info - lib = ippiGetLibVersion(); - printf("%s %sn", lib->Name, lib->Version); - - //Get CPU features enabled with selected library level - fm=ippGetEnabledCpuFeatures(); - printf("SSE :%cn",(fm>1)&1?'Y':'N'); - printf("SSE2 :%cn",(fm>2)&1?'Y':'N'); - printf("SSE3 :%cn",(fm>3)&1?'Y':'N'); - printf("SSSE3 :%cn",(fm>4)&1?'Y':'N'); - printf("SSE41 :%cn",(fm>6)&1?'Y':'N'); - printf("SSE42 :%cn",(fm>7)&1?'Y':'N'); - printf("AVX :%cn",(fm>8)&1 ?'Y':'N'); - printf("AVX2 :%cn", (fm>15)&1 ?'Y':'N' ); - printf("----------n"); - printf("OS Enabled AVX :%cn", (fm>9)&1 ?'Y':'N'); - printf("AES :%cn", (fm>10)&1?'Y':'N'); - printf("CLMUL :%cn", (fm>11)&1?'Y':'N'); - printf("RDRAND :%cn", (fm>13)&1?'Y':'N'); - printf("F16C :%cn", (fm>14)&1?'Y':'N'); - - return 0; -} -``` - -Compile the example above, using any compiler and the `ipp` module: - -```console -$ ml intel/2020b ipp/2020.3.304 -$ icc testipp.c -o testipp.x -lippi -lipps -lippcore -``` - -You will need the `ipp` module loaded to run an IPP-enabled executable. This may be avoided, by compiling library search paths into the executable: - -```console -$ ml intel/2020b ipp/2020.3.304 -$ icc testipp.c -o testipp.x -Wl,-rpath=$LIBRARY_PATH -lippi -lipps -lippcore -``` - -## Code Samples and Documentation - -Intel provides a number of [Code Samples for IPP][a], illustrating use of IPP. - -Read the full documentation on IPP on the [Intel website][b], in particular the [IPP Reference manual][c]. - -[a]: https://software.intel.com/en-us/articles/code-samples-for-intel-integrated-performance-primitives-library -[b]: http://software.intel.com/sites/products/search/search.php?q=&x=15&y=6&product=ipp&version=7.1&docos=lin -[c]: http://software.intel.com/sites/products/documentation/doclib/ipp_sa/71/ipp_manual/index.htm diff --git a/content/docs/software/intel/intel-suite/intel-mkl.mdx b/content/docs/software/intel/intel-suite/intel-mkl.mdx deleted file mode 100644 index dd8d13441aca28f0be9310a2b4faaf105111d6b9..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-mkl.mdx +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: "Intel MKL" ---- -## Introduction - -Intel Math Kernel Library (Intel MKL) is a library of math kernel subroutines, extensively threaded and optimized for maximum performance. Intel MKL provides these basic math kernels: - -* BLAS (level 1, 2, and 3) and LAPACK linear algebra routines, offering vector, vector-matrix, and matrix-matrix operations. -* The PARDISO direct sparse solver, an iterative sparse solver, and supporting sparse BLAS (level 1, 2, and 3) routines for solving sparse systems of equations. -* ScaLAPACK distributed processing linear algebra routines for Linux and Windows operating systems, as well as the Basic Linear Algebra Communications Subprograms (BLACS) and the Parallel Basic Linear Algebra Subprograms (PBLAS). -* Fast Fourier transform (FFT) functions in one, two, or three dimensions with support for mixed radices (not limited to sizes that are powers of 2), as well as distributed versions of these functions. -* Vector Math Library (VML) routines for optimized mathematical operations on vectors. -* Vector Statistical Library (VSL) routines, which offer high-performance vectorized random number generators (RNG) for several probability distributions, convolution and correlation routines, and summary statistics functions. -* Data Fitting Library, which provides capabilities for spline-based approximation of functions, derivatives and integrals of functions, and search. -* Extended Eigensolver, a shared memory version of an eigensolver based on the Feast Eigenvalue Solver. - -For details, see the [Intel MKL Reference Manual][a]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av imkl -``` - -The module sets up environment variables, required for linking and running MKL-enabled applications. The most important variables are the `$MKLROOT`, `$CPATH`, `$LD_LIBRARY_PATH`, and `$MKL_EXAMPLES`. - -The Intel MKL library may be linked using any compiler. With the Intel compiler, use the `-mkl` option to link default threaded MKL. - -### Interfaces - -The Intel MKL library provides a number of interfaces. The fundamental ones are LP64 and ILP64. The Intel MKL ILP64 libraries use the 64-bit integer type (necessary for indexing large arrays, with more than 231^-1 elements), whereas the LP64 libraries index arrays with the 32-bit integer type. - -| Interface | Integer type | -| --------- | -------------------------------------------- | -| LP64 | 32-bit, int, integer(kind=4), MPI_INT | -| ILP64 | 64-bit, long int, integer(kind=8), MPI_INT64 | - -### Linking - -Linking the Intel MKL libraries may be complex. Intel [mkl link line advisor][b] helps. See also [examples][1] below. - -You will need the `mkl` module loaded to run the MKL-enabled executable. This may be avoided, by compiling library search paths into the executable. Include `-rpath` on the compile line: - -```console -$ icc .... -Wl,-rpath=$LIBRARY_PATH ... -``` - -### Threading - -Advantage in using the Intel MKL library is that it brings threaded parallelization to applications that are otherwise not parallel. - -For this to work, the application must link the threaded MKL library (default). Number and behavior of MKL threads may be controlled via the OpenMP environment variables, such as `OMP_NUM_THREADS` and `KMP_AFFINITY`. `MKL_NUM_THREADS` takes precedence over `OMP_NUM_THREADS`. - -```console -$ export OMP_NUM_THREADS=24 -$ export KMP_AFFINITY=granularity=fine,compact,1,0 -``` - -The application will run with 24 threads with affinity optimized for fine grain parallelization. - -## Examples - -A number of examples demonstrating use of the Intel MKL library and its linking is available on clusters, in the $MKL_EXAMPLES directory. In the examples below, we demonstrate linking Intel MKL to Intel- and GNU-compiled program for multi-threaded matrix multiplication. - -### Working With Examples - -```console -$ ml intel/2020b -$ cp -a $MKL_EXAMPLES/cblas /tmp/ -$ cd /tmp/cblas -$ make sointel64 function=cblas_dgemm -``` - -In this example, we compile, link, and run the cblas_dgemm example, demonstrating use of the MKL example suite installed on clusters. - -### Example: MKL and Intel Compiler - -```console -$ ml intel/2020b -$ cp -a $MKL_EXAMPLES/cblas /tmp/ -$ cd /tmp/cblas -$ icc -w source/cblas_dgemmx.c source/common_func.c -mkl -o cblas_dgemmx.x -$ ./cblas_dgemmx.x data/cblas_dgemmx.d -``` - -In this example, we compile, link, and run the cblas_dgemm example, demonstrating use of MKL with the `icc -mkl` option. Using the `-mkl` option is equivalent to: - -```console -$ icc -w source/cblas_dgemmx.c source/common_func.c -o cblas_dgemmx.x -I$MKL_INC_DIR -L$MKL_LIB_DIR -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -``` - -In this example, we compile and link the cblas_dgemm example, using LP64 interface to threaded MKL and Intel OMP threads implementation. - -#### Karolina AMD Threading - -Threading on Karolina AMD processors requires [TBB][2]. - -**MKL threads** - -Example 1 - -```code -icpc -O2 -qopenmp -DMKL_ILP64 -I"${MKLROOT}/include" source.cpp -o program.x -L${MKLROOT}/lib/intel64 -lmkl_intel_ilp64 -lmkl_tbb_thread -lmkl_core -ltbb -lstdc++ -lp -thread -lm -ldl -``` - -Example 2 - -```code -icpc -qopenmp mkltest.cpp -o mkltest.x -lmkl_tbb_thread -ltbb -mkl -``` - -**Intel/GNU compilator** - -```code -[Monday 10:23 AM] Krupcik Lukas -g++ -fopenmp mkl_test.cpp -o test -lmkl_tbb_thread -lmkl_core -lmkl_intel_ilp64 -ltbb -``` - -## LAPACKE C Interface - -MKL includes LAPACKE C Interface to LAPACK. However, note that although Intel is the author of LAPACKE, the LAPACKE header files are not present in MKL. For this reason, we have prepared the LAPACKE module, which includes Intel's LAPACKE headers from official LAPACK, which you can use to compile code using the LAPACKE interface against MKL. - -## Further Reading - -Read more on [Intel website][c], in particular the [MKL user guide][d]. - -[1]: #examples -[2]: ../intel-tbb/ - -[a]: http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mklman/index.htm -[b]: http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor -[c]: http://software.intel.com/en-us/intel-mkl -[d]: https://software.intel.com/en-us/intel-mkl/documentation/linux diff --git a/content/docs/software/intel/intel-suite/intel-parallel-studio-introduction.mdx b/content/docs/software/intel/intel-suite/intel-parallel-studio-introduction.mdx deleted file mode 100644 index 1dba23aa3827138df578c067531c98f2900c6449..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-parallel-studio-introduction.mdx +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Intel Parallel Studio" ---- -All clusters provide following elements of the Intel Parallel Studio XE - -Intel Parallel Studio XE - -* Intel Compilers -* Intel Debugger -* Intel MKL Library -* Intel Integrated Performance Primitives Library -* Intel Threading Building Blocks Library -* Intel Trace Analyzer and Collector -* Intel Advisor -* Intel Inspector - -## Intel Compilers - -The Intel compilers are available via the intel module. The compilers include the icc C and C++ compiler and the ifort Fortran 77/90/95 compiler. - -```console -$ ml intel/2020b -$ icc -v -icc version 19.1.3.304 (gcc version 10.2.0 compatibility) -$ ifort -v -ifort version 19.1.3.304 -``` - -Read more at the [Intel Compilers][1] page. - -## Intel Math Kernel Library - -Intel Math Kernel Library (Intel MKL) is a library of math kernel subroutines, extensively threaded and optimized for maximum performance. Intel MKL unites and provides these basic components: BLAS, LAPACK, ScaLapack, PARDISO, FFT, VML, VSL, Data fitting, Feast Eigensolver, and many more. - -```console -$ ml imkl/2020.4.304-iimpi-2020b -``` - -Read more at the [Intel MKL][3] page. - -## Intel Integrated Performance Primitives - -Intel Integrated Performance Primitives, version 7.1.1, compiled for AVX is available via the `ipp` module. IPP is a library of highly optimized algorithmic building blocks for media and data applications. This includes signal, image, and frame processing algorithms, such as FFT, FIR, Convolution, Optical Flow, Hough transform, Sum, MinMax, and many more. - -```console -$ ml ipp/2020.3.304 -``` - -Read more at the [Intel IPP][4] page. - -## Intel Threading Building Blocks - -Intel Threading Building Blocks (Intel TBB) is a library that supports scalable parallel programming using standard ISO C++ code. It does not require special languages or compilers. It is designed to promote scalable data parallel programming. Additionally, it fully supports nested parallelism, so you can build larger parallel components from smaller parallel components. To use the library, you specify tasks, not threads, and let the library map tasks onto threads in an efficient manner. - -```console -$ ml tbb/2020.3-GCCcore-10.2.0 -``` - -Read more at the [Intel TBB][5] page. - -[1]: intel-compilers.md -[2]: intel-debugger.md -[3]: intel-mkl.md -[4]: intel-integrated-performance-primitives.md -[5]: intel-tbb.md diff --git a/content/docs/software/intel/intel-suite/intel-tbb.mdx b/content/docs/software/intel/intel-suite/intel-tbb.mdx deleted file mode 100644 index d62565524dbf789e294b524a7635f32ac62a4be0..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-tbb.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: "Intel TBB" ---- -## Introduction - -Intel Threading Building Blocks (Intel TBB) is a library that supports scalable parallel programming using standard ISO C++ code. It does not require special languages or compilers. To use the library, you specify tasks, not threads, and let the library map tasks onto threads in an efficient manner. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av tbb -``` - -The module sets up environment variables, required for linking and running TBB-enabled applications. - -Link the TBB library using `-ltbb`. - -## Examples - -A number of examples demonstrating use of TBB and its built-in scheduler is available in the $TBB_EXAMPLES directory. - -```console -$ ml intel/2020b tbb/2020.3-GCCcore-10.2.0 -$ cp -a $TBB_EXAMPLES/common $TBB_EXAMPLES/parallel_reduce /tmp/ -$ cd /tmp/parallel_reduce/primes -$ icc -O2 -DNDEBUG -o primes.x main.cpp primes.cpp -ltbb -$ ./primes.x -``` - -In this example, we compile, link, and run the primes example, demonstrating use of parallel task-based reduce in computation of prime numbers. - -You will need the `tbb` module loaded to run the TBB-enabled executable. This may be avoided by compiling library search paths into the executable. - -```console -$ icc -O2 -o primes.x main.cpp primes.cpp -Wl,-rpath=$LIBRARY_PATH -ltbb -``` - -## Further Reading - -Read more on Intel [website][a]. - -[a]: https://www.intel.com/content/www/us/en/developer/articles/guide/get-started-with-tbb.html?wapkw=tbb diff --git a/content/docs/software/intel/intel-suite/intel-trace-analyzer-and-collector.mdx b/content/docs/software/intel/intel-suite/intel-trace-analyzer-and-collector.mdx deleted file mode 100644 index dd19fc1fe5651e4dbe79832c73600d15eeb6d468..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/intel-trace-analyzer-and-collector.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Intel Trace Analyzer and Collector" ---- -## Introduction - -Intel Trace Analyzer and Collector (ITAC) is a tool to collect and graphically analyze behavior of MPI applications. It helps you to analyze communication patterns of your application, identify hotspots, perform correctness checking (identify deadlocks, data corruption, etc.), and simulate how your application would run on a different interconnect. - -ITAC is an offline analysis tool - first you run your application to collect a trace file, then you can open the trace in a GUI analyzer to view it. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av itac -``` - -## Collecting Traces - -ITAC can collect traces from applications that are using Intel MPI. To generate a trace, simply add the `-trace` option to your `mpirun` command: - -```console -$ ml itac/2020.3.036 -$ mpirun -trace myapp -``` - -The trace will be saved in the myapp.stf file in the current directory. - -## Viewing Traces - -To view and analyze the trace, open the ITAC GUI in a [graphical environment][1]: - -```console -$ ml itac/2020.3.036 -$ traceanalyzer -``` - -The GUI will launch and you can open the produced `*`.stf file. - - - -Refer to the Intel documenation about usage of the GUI tool. - -## References - -1. [Getting Started with Intel® Trace Analyzer and Collector][a] -1. [Intel® Trace Analyzer and Collector - Documentation][b] - -[1]: ../../../general/accessing-the-clusters/graphical-user-interface/x-window-system.md - -[a]: https://software.intel.com/en-us/get-started-with-itac-for-linux -[b]: https://software.intel.com/en-us/intel-trace-analyzer diff --git a/content/docs/software/intel/intel-suite/meta.json b/content/docs/software/intel/intel-suite/meta.json deleted file mode 100644 index e093e211147ab2420f1a5be184d29eb57cc6eeb3..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/intel-suite/meta.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Intel-suite", - "pages": [ - "intel-advisor", - "intel-compilers", - "intel-inspector", - "intel-integrated-performance-primitives", - "intel-mkl", - "intel-parallel-studio-introduction", - "intel-tbb", - "intel-trace-analyzer-and-collector" - ] -} diff --git a/content/docs/software/intel/meta.json b/content/docs/software/intel/meta.json deleted file mode 100644 index 130dfd403555256928496e828dbb611e435a4272..0000000000000000000000000000000000000000 --- a/content/docs/software/intel/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Intel", - "pages": [ - "intel-suite" - ] -} diff --git a/content/docs/software/isv_licenses.mdx b/content/docs/software/isv_licenses.mdx deleted file mode 100644 index 1d901b8609171f4c72e68d94a5792acc00b56f0f..0000000000000000000000000000000000000000 --- a/content/docs/software/isv_licenses.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "ISV Licenses" ---- -## Guide to Managing Independent Software Vendor Licenses - -On IT4I clusters, there are also installed commercial software applications, also known as ISV (Independent Software Vendor), which are subjects to licensing. Licenses are limited and their usage may be restricted only to some users or user groups, or based on other conditions. - -Currently, [Flex License Manager][c] based licensing is supported on the cluster for products ANSYS, Comsol, and MATLAB. More information about the applications can be found in the general software section. - -If an ISV application was purchased for educational (research) purposes and also for commercial purposes, then there are always two separate versions maintained and suffix "edu" is used in the name of the non-commercial version. - -## Overview of the Licenses Usage - -<Callout> - The overview is generated every minute and is accessible from the web or command line interface. -</Callout> - -### Web Interface - -For each license, there is a [table][a] providing the information about the name, number of available (purchased/licensed), number of used and number of free license features. - -### Command Line - -To check license usage via command line, use the `LicenseChecker` module with the `lmstat` utility: - -```console -ml LicenseChecker/1.0 -``` - -For example, to check usage of Ansys licenses, use: - -```console -lmstat -a -c 1055@license.it4i.cz -``` - -or for a specific module (e.g. HPC): - -```console -lmstat -f aa_r_hpc -c 1055@license.it4i.cz -``` - -To list all Ansys modules, use: - -```console -lmstat -i -c 1055@license.it4i.cz -``` - -For other applications' licenses, change the port number in the command according to the **Port** column on the [licelin website][b] (requires IT4I VPN). - -[1]: #Licence - -[a]: https://extranet.it4i.cz/rsweb/karolina/licenses -[b]: http://licelin.it4i.cz/list/ -[c]: https://www.revenera.com/software-monetization/products/software-licensing/flexnet-licensing diff --git a/content/docs/software/karolina-compilation.mdx b/content/docs/software/karolina-compilation.mdx deleted file mode 100644 index dc3d64463ed23af20f2a07d8ca73a06aa4012b40..0000000000000000000000000000000000000000 --- a/content/docs/software/karolina-compilation.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: "Karolina Compilation" ---- -Since Karolina's nodes are equipped with AMD Zen 2 and Zen 3 processors, -we recommend to follow these instructions in order to avoid degraded performance when compiling your code: - -## 1. Select Compilers Flags - -When compiling your code, it is important to select right compiler flags; -otherwise, the code will not be SIMD vectorized, resulting in severely degraded performance. -Depending on the compiler, you should use these flags: - -<Callout type=warn> - `-Ofast` optimization may result in unpredictable behavior (e.g. a floating point overflow). -</Callout> - -| Compiler | Module | Command | Flags | -| -------- |----------| --------|-------------------------| -| AOCC | ml AOCC | clang |-O3 -mavx2 -march=znver2 | -| INTEL | ml intel | icc |-O3 -xCORE-AVX2 | -| GCC | ml GCC | gcc |-O3 -mavx2 | - -The compiler flags and the resulting compiler performance may be verified with our benchmark, -see [Lorenz Compiler performance benchmark][a]. - -## 2. Use BLAS Library - -It is important to use the BLAS library that performs well on AMD processors. -To combine the optimizations for the general CPU code and have the most efficient BLAS routines we recommend the combination of lastest Intel Compiler suite, with Cray's Scientific Library bundle (LibSci). When using the Intel Compiler suite includes also support for efficient MPI implementation utilizing Intel MPI library over the Infiniband interconnect. - -For the compilation as well for the runtime of compiled code use: - -```code -ml PrgEnv-intel -ml cray-pmi/6.1.14 - -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CRAY_LD_LIBRARY_PATH:$CRAY_LIBSCI_PREFIX_DIR/lib:/opt/cray/pals/1.3.2/lib -``` - -There are usually two standard situation how to compile and run the code - -### OpenMP Without MPI - -To compile the code against the LibSci, without MPI, but still enabling OpenMP run over multiple cores use: - -```code -icx -qopenmp -L$CRAY_LIBSCI_PREFIX_DIR/lib -I$CRAY_LIBSCI_PREFIX_DIR/include -o BINARY.x SOURCE_CODE.c -lsci_intel_mp -``` - -To run the resulting binary use: - -```code -OMP_NUM_THREADS=128 OMP_PROC_BIND=true BINARY.x -``` - -This enables effective run over all 128 cores available on a single Karlina compute node. - -### OpenMP With MPI - -To compile the code against the LibSci, with MPI, use: - -```code -mpiicx -qopenmp -L$CRAY_LIBSCI_PREFIX_DIR/lib -I$CRAY_LIBSCI_PREFIX_DIR/include -o BINARY.x SOURCE_CODE.c -lsci_intel_mp -lsci_intel_mpi_mp -``` - -To run the resulting binary use: - -```code -OMP_NUM_THREADS=64 OMP_PROC_BIND=true mpirun -n 2 ${HOME}/BINARY.x -``` - -This example runs the BINARY.x, placed in ${HOME} as 2 MPI processes, each using 64 cores of a single socket of a single node. - -Another example would be to run a job on 2 full nodes, utilizing 128 cores on each (so 256 cores in total) and letting the LibSci efficiently placing the BLAS routines across the allocated CPU sockets: - -```code -OMP_NUM_THREADS=128 OMP_PROC_BIND=true mpirun -n 2 ${HOME}/BINARY.x -``` - -This assumes you have allocated 2 full nodes on Karolina using SLURM's directives, e. g. in a submission script: - -```code -#SBATCH --nodes 2 -#SBATCH --ntasks-per-node 128 -``` - -**Don't forget** before the run to ensure you have the correct modules and loaded and that you have set up the LD_LIBRARY_PATH environment variable set as shown above (e.g. part of your submission script for SLURM). - -<Callout> - Most MPI libraries do the binding automatically. The binding of MPI ranks can be inspected for any MPI by running `$ mpirun -n num_of_ranks numactl --show`. However, if the ranks spawn threads, binding of these threads should be done via the environment variables described above. -</Callout> - -The choice of BLAS library and its performance may be verified with our benchmark, -see [Lorenz BLAS performance benchmark](https://code.it4i.cz/jansik/lorenz/-/blob/main/README.md). diff --git a/content/docs/software/lang/conda.mdx b/content/docs/software/lang/conda.mdx deleted file mode 100644 index f9bce758887af54171eaa9a6f16167367633fa5f..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/conda.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Conda (Anaconda)" ---- -Conda is an open source package management system and environment management system that runs on Windows, macOS, and Linux. Conda quickly installs, runs, and updates packages and their dependencies. Conda easily creates, saves, loads, and switches between environments on your local computer. It was created for Python programs, but it can package and distribute software for any language. - -Conda as a package manager helps you find and install packages. If you need a package that requires a different version of Python, you do not need to switch to a different environment manager, because Conda is also an environment manager. With just a few commands, you can set up a completely separate environment to run that different version of Python, while continuing to run your usual version of Python in your normal environment. - -Conda treats Python the same as any other package, so it is easy to manage and update multiple installations. -Anaconda supports Python 3.X. Default Python is 3.8, depending on which installer you used. - -## Conda on the IT4Innovations Clusters - -On the clusters, we have the Anaconda3 software installed. How to use these modules is shown below. - -<Callout> - Use the `ml av conda` command to get up-to-date versions of the modules. -</Callout> - -```console -$ ml av conda - -------------- /apps/modules/lang --------------------------------- -Anaconda3/2021.05 -``` - -## Anaconda3 - -Default Python is 3.8.8. - -### First Usage Module Anaconda3 - -```console -$ ml Anaconda3/2021.05 -$ python --version -Python 3.8.8 -$ conda install numpy -Fetching package metadata ......... -Solving package specifications: . - -Package plan for installation in environment /apps/all/Anaconda3/2021.05: - -The following packages will be UPDATED: - -conda 4.10.1-py38h06a4308_1 --> 4.10.3-py38h06a4308_0 -... -... -... -CondaIOError: Missing write permissions in: /apps/all/Anaconda3/2021.05 -# -# You don't appear to have the necessary permissions to install packages -# into the install area '/apps/all/Anaconda3/2021.05'. -# However you can clone this environment into your home directory and -# then make changes to it. -# This may be done using the command: -# -# $ conda create -n my_root --clone="/apps/all/Anaconda3/2021.05" -$ -$ conda create -n anaconda3 --clone="/apps/all/Anaconda3/2021.05" -Source: /apps/all/Anaconda3/2021.05 -Destination: /home/user/.conda/envs/anaconda3 -The following packages cannot be cloned out of the root environment: - - defaults/linux-64::conda-env-2.6.0-1 - - defaults/linux-64::conda-4.10.3-py38h06a4308_0 - - defaults/noarch::conda-token-0.3.0-pyhd3eb1b0_0 - - defaults/linux-64::anaconda-navigator-2.0.3-py38_0 - - defaults/linux-64::conda-build-3.21.4-py38h06a4308_0 -Packages: 339 -Files: 50986 -... -... -... -# -# To activate this environment, use: -# > source activate anaconda3 -# -# To deactivate this environment, use: -# > source deactivate anaconda3 -# -$ source activate anaconda3 -(anaconda3) ~]$ -``` - -### Usage Module Anaconda3 - -```console -$ ml Anaconda3/2021.05 -$ source activate anaconda3 -(anaconda3) ~]$ -``` diff --git a/content/docs/software/lang/csc.mdx b/content/docs/software/lang/csc.mdx deleted file mode 100644 index 242aedce1acbe6b85ae75581da2f501614020920..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/csc.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "CSharp" ---- -C# is available on the cluster. - -```console -$ ml av mono - --------------------- /apps/modules/lang --------------- - Mono/6.12.0.122 -``` - -<Callout> - Use the `ml av mono` command to get up-to-date versions of the modules. -</Callout> - -Activate C# by loading the Mono module: - -```console -$ ml Mono/6.12.0.122 -``` - -## Examples - -### Hello World - -Copy this code to a new file hello.cs: - -```csc -using System; - -class HelloWorld { - static void Main() { - Console.WriteLine("Hello world!!!"); - } -} -``` - -Compile the program and make *Windows executable*. - -```console -$ mcs -out:hello.exe hello.cs -``` - -Now run the program: - -```console -$ mono hello.exe -Hello world!!! -``` - -### Interactive Console - -Type: - -```console -$ csharp -Mono C# Shell, type "help;" for help - -Enter statements below. -csharp> -``` - -Now you are in the interactive mode. You can try the following example: - -```csc -csharp> using System; -csharp> int a = 5; -csharp> double b = 1.5; -csharp> Console.WriteLine("{0}*{1} is equal to {2}", a,b,a*b); -5*1.5 is equal to 7.5 -csharp> a == b -false -``` - -Show all files modified in last 5 days: - -```csc -csharp> using System.IO; -csharp> from f in Directory.GetFiles ("mydirectory") - > let fi = new FileInfo (f) - > where fi.LastWriteTime > DateTime.Now-TimeSpan.FromDays(5) select f; -{ "mydirectory/mynewfile.cs", "mydirectory/script.sh" } -``` - -<!-- - -## MPI.NET - -MPI is available for mono: - -```csc -using System; -using MPI; - -class MPIHello -{ - static void Main(string[] args) - { - using (new MPI.Environment(ref args)) - { - Console.WriteLine("Greetings from node {0} of {1} running on {2}", - Communicator.world.Rank, Communicator.world.Size, - MPI.Environment.ProcessorName); - } - } -} -``` - -Compile and run the program: - -```console -$ qsub -I -A PROJECT_ID -q qexp -l select=2:ncpus=128,walltime=00:30:00 - -$ ml n.net - -$ mcs -out:csc.exe -reference:/apps/tools/mpi.net/1.0.0-mono-3.12.1/lib/MPI.dll csc.cs - -$ mpirun -n 4 mono csc.exe -Greetings from node 2 of 4 running on cn204 -Greetings from node 0 of 4 running on cn204 -Greetings from node 3 of 4 running on cn199 -Greetings from node 1 of 4 running on cn199 -``` - ---> - -For more information, see the [Mono documentation page][a]. - -[a]: http://www.mono-project.com/docs/ diff --git a/content/docs/software/lang/java.mdx b/content/docs/software/lang/java.mdx deleted file mode 100644 index e796821e28ab9ec660459045ff74170cca7163a6..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/java.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Java" ---- -Java is available on the cluster. Activate Java by loading the Java module: - -```console -$ ml Java/1.8.0_221 -``` - -Note that the Java module must be loaded on the compute nodes as well, in order to run Java on compute nodes. - -Check for Java version and path: - -```console -$ java -version -$ which java -``` - -With the module loaded, not only the runtime environment (JRE), but also the development environment (JDK) with the compiler is available. - -```console -$ javac -version -$ which javac -``` - -Java applications may use MPI for inter-process communication, in conjunction with OpenMPI. Read more [here][a]. This functionality is currently not supported. In case you require the Java interface to MPI, contact [support][b]. - -## Java With OpenMPI - -Because there is an increasing interest in using Java for HPC. In addition, MPI can benefit from Java because its widespread use makes it likely to find new uses beyond traditional HPC applications. - -Java bindings are integrated into OpenMPI starting from the v1.7 series. Beginning with the v2.0 series, Java bindings include coverage of MPI-3.1. - -### Example (Hello.java) - -```java -import mpi.*; - -class Hello { - static public void main(String[] args) throws MPIException { - - - MPI.Init(args); - - int myrank = MPI.COMM_WORLD.getRank(); - int size = MPI.COMM_WORLD.getSize() ; - System.out.println("Hello world from rank " + myrank + " of " + size); - - MPI.Finalize(); - } -} -``` - -```console -$ ml Java/1.8.0_221 OpenMPI/4.1.1-GCC-10.2.0-Java-1.8.0_221 -$ mpijavac Hello.java -$ mpirun java Hello -Hello world from rank 23 of 28 -Hello world from rank 25 of 28 -Hello world from rank 0 of 28 -Hello world from rank 4 of 28 -Hello world from rank 7 of 28 -Hello world from rank 8 of 28 -Hello world from rank 11 of 28 -Hello world from rank 12 of 28 -Hello world from rank 13 of 28 -Hello world from rank 18 of 28 -Hello world from rank 17 of 28 -Hello world from rank 24 of 28 -Hello world from rank 27 of 28 -Hello world from rank 2 of 28 -Hello world from rank 3 of 28 -Hello world from rank 1 of 28 -Hello world from rank 10 of 28 -Hello world from rank 14 of 28 -Hello world from rank 16 of 28 -Hello world from rank 19 of 28 -Hello world from rank 26 of 28 -Hello world from rank 6 of 28 -Hello world from rank 9 of 28 -Hello world from rank 15 of 28 -Hello world from rank 20 of 28 -Hello world from rank 5 of 28 -Hello world from rank 21 of 28 -Hello world from rank 22 of 28 -``` - -[a]: http://www.open-mpi.org/faq/?category=java -[b]: https://support.it4i.cz/rt/ diff --git a/content/docs/software/lang/julialang.mdx b/content/docs/software/lang/julialang.mdx deleted file mode 100644 index 95a7ccd52e0a15d040b8d8c73ecdcbc25de38dd4..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/julialang.mdx +++ /dev/null @@ -1,904 +0,0 @@ ---- -title: "JuliaLang" ---- -A set of unofficial examples of Julia the high-level, high-performance dynamic programming language for technical computing. - -Julia is available on the clusters. Activate Julia by loading the Julia module: - -```console -$ ml Julia/1.5.3-linux-x86_64 -``` - -Check for Java version and path: - -```console -$ julia -v -julia version 1.5.3 -``` - -Below are examples of common operations in Julia. They assume you already have Julia installed and working - -## Hello World - -The simplest possible script: - -```c -println("hello world") -``` - -With Julia [installed and added to your path](http://julialang.org/downloads/) -this script can be run by `julia hello_world.jl`, it can also be run from REPL by typing -`include("hello_world.jl")`, which will evaluate all valid expressions in that file and return the last output. - -## Simple Functions - -The example below shows two simple functions, how to call them and print the results. -Further examples of number formatting are shown below. - -```c -# [function](http://docs.julialang.org:8000/en/latest/manual/functions/#functions) to calculate the volume of a sphere -function sphere_vol(r) - # julia allows [Unicode names](http://docs.julialang.org/en/latest/manual/unicode-input/) (in UTF-8 encoding) - # so either "pi" or the symbol Ď€ can be used - return 4/3*pi*r^3 -end - -# functions can also be defined more succinctly -quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a - -# calculates x for 0 = a*x^2+b*x+c, [arguments types](TODO: links) can be defined in function definitions -function quadratic2(a::Float64, b::Float64, c::Float64) - # unlike other languages 2a is equivalent to 2*a - # a^2 is used instead of a**2 or pow(a,2) - sqr_term = sqrt(b^2-4a*c) - r1 = quadratic(a, sqr_term, b) - r2 = quadratic(a, -sqr_term, b) - # multiple values can be returned from a function using tuples - # if the [return](http://docs.julialang.org:8000/en/latest/manual/functions/#the-return-keyword) keyword is omitted, the last term is returned - r1, r2 -end - -vol = sphere_vol(3) -# @printf allows number formatting but does not automatically append the \n to statements, see below -@printf "volume = %0.3f\n" vol -#> volume = 113.097 - -quad1, quad2 = quadratic2(2.0, -2.0, -12.0) -println("result 1: ", quad1) -#> result 1: 3.0 -println("result 2: ", quad2) -#> result 2: -2.0 -``` - -## Strings Basics - -Collection of different string examples (string indexing is the same as array indexing, see below): - -```c -# strings are defined with double quotes -# like variables, strings can contain any unicode character -s1 = "The quick brown fox jumps over the lazy dog α,β,Îł" -println(s1) -#> The quick brown fox jumps over the lazy dog α,β,Îł - -# [println](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.println) adds a new line to the end of output -# [print](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.print) can be used if you dont want that: -print("this") -#> this -print(" and") -#> and -print(" that.\n") -#> that. - -# chars are defined with single quotes -c1 = 'a' -println(c1) -#> a -# the ascii value of a char can be found with Int(): -println(c1, " ascii value = ", Int(c1)) -#> a ascii value = 97 -println("Int('α') == ", Int('α')) -#> Int('α') == 945 - -# so be aware that -println(Int('1') == 1) -#> false - -# strings can be converted to upper case or lower case: -s1_caps = uppercase(s1) -s1_lower = lowercase(s1) -println(s1_caps, "\n", s1_lower) -#> THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG Α,Î’,Γ -#> the quick brown fox jumps over the lazy dog α,β,Îł - -# sub strings can be indexed like arrays: -# ([show](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.show) prints the raw value) -show(s1[11]); println() -#> 'b' - -# or sub strings can be created: -show(s1[1:10]); println() -#> "The quick " - -# end is used for the end of the array or string -show(s1[end-10:end]); println() -#> "dog α,β,Îł" - -# julia allows string [Interpolation](http://julia.readthedocs.org/en/latest/manual/strings/#interpolation): -a = "wolcome" -b = "julia" -println("$a to $b.") -#> wolcome to julia. - -# this can extend to evaluate statements: -println("1 + 2 = $(1 + 2)") -#> 1 + 2 = 3 - -# strings can also be concatenated using the * operator -# using * instead of + isn't intuitive when you start with Julia, -# however [people think it makes more sense](https://groups.google.com/forum/#!msg/julia-users/nQg_d_n0t1Q/9PSt5aya5TsJ) -s2 = "this" * " and" * " that" -println(s2) -#> this and that - -# as well as the string function -s3 = string("this", " and", " that") -println(s3) -#> this and that -``` - -## String: Converting and Formatting - -```c -# strings can be converted using [float](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.float) and [int](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.int): -e_str1 = "2.718" -e = float(e_str1) -println(5e) -#> 13.5914 -num_15 = parse(Int, "15") -println(3num_15) -#> 45 - -# numbers can be converted to strings and formatted using [printf](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.@printf) -@printf "e = %0.2f\n" e -#> 2.718 -# or to create another string [sprintf](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.@sprintf) -e_str2 = @sprintf("%0.3f", e) - -# to show that the 2 strings are the same -println("e_str1 == e_str2: $(e_str1 == e_str2)") -#> e_str1 == e_str2: true - -# available number format characters are [f, e, g, c, s, p, d](https://github.com/JuliaLang/julia/blob/master/base/printf.jl#L15): -# (pi is a predefined constant; however, since its type is -# "MathConst" it has to be converted to a float to be formatted) -@printf "fix trailing precision: %0.3f\n" float(pi) -#> fix trailing precision: 3.142 -@printf "scientific form: %0.6e\n" 1000pi -#> scientific form: 3.141593e+03 -# g is not implemented yet -@printf "a character: %c\n" 'α' -#> a character: α -@printf "a string: %s\n" "look I'm a string!" -#> a string: look I'm a string! -@printf "right justify a string: %50s\n" "width 50, text right justified!" -#> right justify a string: width 50, text right justified! -@printf "a pointer: %p\n" 100000000 -#> a pointer: 0x0000000005f5e100 -@printf "print a integer: %d\n" 1e10 -#> print an integer: 10000000000 -``` - -## String Manipulations - -```c -s1 = "The quick brown fox jumps over the lazy dog α,β,Îł" - -# [search](http://docs.julialang.org/en/latest/stdlib/base/#Base.search) returns the first index of a char -i = search(s1, 'b') -println(i) -#> 11 -# the second argument is equivalent to the second argument of split, see below - -# or a range if called with another string -r = search(s1, "brown") -println(r) -#> 11:15 - - -# string [replace](http://docs.julialang.org/en/latest/stdlib/base/#Base.replace) is done thus: -r = replace(s1, "brown", "red") -show(r); println() -#> "The quick red fox jumps over the lazy dog" - -# search and replace can also take a regular expressions by preceding the string with 'r' -r = search(s1, r"b[\w]*n") -println(r) -#> 11:15 - -# again with a regular expression -r = replace(s1, r"b[\w]*n", "red") -show(r); println() -#> "The quick red fox jumps over the lazy dog" - -# there are also functions for regular expressions that return RegexMatch types -# [match](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.match) scans left to right for the first match (specified starting index optional) -r = match(r"b[\w]*n", s1) -println(r) -#> RegexMatch("brown") - -# RegexMatch types have a property match that holds the matched string -show(r.match); println() -#> "brown" - -# [matchall](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.matchall) returns a vector with RegexMatches for each match -r = matchall(r"[\w]{4,}", s1) -println(r) -#> SubString{UTF8String}["quick","brown","jumps","over","lazy"] - -# [eachmatch](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.eachmatch) returns an iterator over all the matches -r = eachmatch(r"[\w]{4,}", s1) -for i in r print("\"$(i.match)\" ") end -println() -#> "quick" "brown" "jumps" "over" "lazy" - -# a string can be repeated using the [repeat](http://julia.readthedocs.org/en/latest/manual/strings/#common-operations) function, -# or more succinctly with the [^ syntax](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.^): -r = "hello "^3 -show(r); println() #> "hello hello hello " - -# the [strip](http://docs.julialang.org/en/latest/stdlib/base/#Base.strip) function works the same as python: -# e.g., with one argument it strips the outer whitespace -r = strip("hello ") -show(r); println() #> "hello" -# or with a second argument of an array of chars it strips any of them; -r = strip("hello ", ['h', ' ']) -show(r); println() #> "ello" -# (note the array is of chars and not strings) - -# similarly [split](http://docs.julialang.org/en/latest/stdlib/base/#Base.split) works in basically the same way as python: -r = split("hello, there,bob", ',') -show(r); println() #> ["hello"," there","bob"] -r = split("hello, there,bob", ", ") -show(r); println() #> ["hello","there,bob"] -r = split("hello, there,bob", [',', ' '], limit=0, keep=false) -show(r); println() #> ["hello","there","bob"] -# (the last two arguements are limit and include_empty, see docs) - -# the opposite of split: [join](http://docs.julialang.org/en/latest/stdlib/base/#Base.join) is simply -r = join(collect(1:10), ", ") -println(r) #> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 -``` - -## Arrays - -```c -function printsum(a) - # [summary](http://julia.readthedocs.org/en/latest/stdlib/base/#Base.summary) generates a summary of an object - println(summary(a), ": ", repr(a)) -end - -# arrays can be initialised directly: -a1 = [1,2,3] -printsum(a1) -#> 3-element Array{Int64,1}: [1,2,3] - -# or initialised empty: -a2 = [] -printsum(a2) -#> 0-element Array{None,1}: None[] - -# since this array has no type, functions like push! (see below) don't work -# instead arrays can be initialised with a type: -a3 = Int64[] -printsum(a3) -#> 0-element Array{Int64,1}: [] - -# ranges are different from arrays: -a4 = 1:20 -printsum(a4) -#> 20-element UnitRange{Int64}: 1:20 - -# however they can be used to create arrays thus: -a4 = collect(1:20) -printsum(a4) -#> 20-element Array{Int64,1}: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] - -# arrays can also be generated from [comprehensions](http://julia.readthedocs.org/en/latest/manual/arrays/#comprehensions): -a5 = [2^i for i = 1:10] -printsum(a5) -#> 10-element Array{Int64,1}: [2,4,8,16,32,64,128,256,512,1024] - -# arrays can be any type, so arrays of arrays can be created: -a6 = (Array{Int64, 1})[] -printsum(a6) -#> 0-element Array{Array{Int64,1},1}: [] -# (note this is a "jagged array" (i.e., an array of arrays), not a [multidimensional array](http://julia.readthedocs.org/en/latest/manual/arrays/), -# these are not covered here) - -# Julia provided a number of ["Dequeue"](http://docs.julialang.org/en/latest/stdlib/base/#dequeues) functions, the most common for appending to the end of arrays -# is [**push!**](http://docs.julialang.org/en/latest/stdlib/base/#Base.push!) -# ! at the end of a function name indicates that the first argument is updated. - -push!(a1, 4) -printsum(a1) -#> 4-element Array{Int64,1}: [1,2,3,4] - -# push!(a2, 1) would cause error: - -push!(a3, 1) -printsum(a3) #> 1-element Array{Int64,1}: [1] -#> 1-element Array{Int64,1}: [1] - -push!(a6, [1,2,3]) -printsum(a6) -#> 1-element Array{Array{Int64,1},1}: [[1,2,3]] - -# using repeat() to create arrays -# you must use the keywords "inner" and "outer" -# all arguments must be arrays (not ranges) -a7 = repeat(a1,inner=[2],outer=[1]) -printsum(a7) -#> 8-element Array{Int64,1}: [1,1,2,2,3,3,4,4] -a8 = repeat(collect(4:-1:1),inner=[1],outer=[2]) -printsum(a8) -#> 8-element Array{Int64,1}: [4,3,2,1,4,3,2,1] -``` - -## Error Handling - -```c -a=[] -# [try, catch](http://julia.readthedocs.org/en/latest/manual/control-flow/#the-try-catch-statement) can be used to deal with errors as with many other languages -try - push!(a,1) -catch err - showerror(STDOUT, err, backtrace());println() -end -println("Continuing after error") -``` - -## Multidimensional Arrays - -Julia has very good multidimensional array capabilities. -See [the manual](http://julia.readthedocs.org/en/latest/manual/arrays/). - -```c -# repeat can be useful to expand a grid -# as in R's expand.grid() function: - -# <hide> -function printsum(a) - println(summary(a), ": ", repr(a)) -end -# </hide> - -m1 = hcat(repeat([1,2],inner=[1],outer=[3*2]), - repeat([1,2,3],inner=[2],outer=[2]), - repeat([1,2,3,4],inner=[3],outer=[1])) -printsum(m1) -#> 12Ă—3 Array{Int64,2}: [1 1 1; 2 1 1; 1 2 1; 2 2 2; 1 3 2; 2 3 2; 1 1 3; 2 1 3; 1 2 3; 2 2 4; 1 3 4; 2 3 4] - -# for simple repetitions of arrays, -# use repmat -m2 = repmat(m1,1,2) # replicate a9 once into dim1 and twice into dim2 -println("size: ", size(m2)) -#> size: (12,6) - -m3 = repmat(m1,2,1) # replicate a9 twice into dim1 and once into dim2 -println("size: ", size(m3)) -#> size: (24,3) - -# Julia comprehensions are another way to easily create -# multidimensional arrays - -m4 = [i+j+k for i=1:2, j=1:3, k=1:2] # creates a 2x3x2 array of Int64 -m5 = ["Hi Im # $(i+2*(j-1 + 3*(k-1)))" for i=1:2, j=1:3, k=1:2] -# expressions are very flexible -# you can specify the type of the array by just -# placing it in front of the expression -Pkg.add("LegacyStrings") -import LegacyStrings -m5 = LegacyStrings.ASCIIString["Hi Im element # $(i+2*(j-1 + 3*(k-1)))" for i=1:2, j=1:3, k=1:2] -printsum(m5) -#> 2x3x2 Array{LegacyStrings.ASCIIString,3}: LegacyStrings.ASCIIString["Hi Im element # 7" -#> "Hi Im element # 9" "Hi Im element # 11" -#> "Hi Im element # 8" "Hi Im element # 10" "Hi Im element # 12"] -#> -#> LegacyStrings.ASCIIString["Hi Im element # 7" "Hi Im element # 9" "Hi Im element # 11" -#> "Hi Im element # 8" "Hi Im element # 10" "Hi Im element # 12"] - -# Array reductions -# many functions in Julia have an array method -# to be applied to specific dimensions of an array: - -sum(m4,3) # takes the sum over the third dimension -sum(m4,(1,3)) # sum over first and third dim - -maximum(m4,2) # find the max elt along dim 2 -findmax(m4,3) # find the max elt and its index along dim 3 (available only in very recent Julia versions) - -# Broadcasting -# when you combine arrays of different sizes in an operation, -# an attempt is made to "spread" or "broadcast" the smaller array -# so that the sizes match up. broadcast operators are preceded by a dot: - -m4 .+ 3 # add 3 to all elements -m4 .+ [1,2] # adds vector [1,2] to all elements along first dim - -# slices and views -m4=m4[:,:,1] # holds dim 3 fixed -m4[:,2,:] # that's a 2x1x2 array. not very intuititive to look at - -# get rid of dimensions with size 1: -squeeze(m4[:,2,:],2) # that's better - -# assign new values to a certain view -m4[:,:,1] = rand(1:6,2,3) -printsum(m4) -#> 2x3x2 Array{Int64,3}: [3 5 2 -#> 2 2 2] -#> -#> [4 5 6 -#> 5 6 7] - -# (for more examples of try, catch see Error Handling above) -try - # this will cause an error, you have to assign the correct type - m4[:,:,1] = rand(2,3) -catch err - println(err) -end -#> InexactError() - -try - # this will cause an error, you have to assign the right shape - m4[:,:,1] = rand(1:6,3,2) -catch err - println(err) -end -#> DimensionMismatch("tried to assign 3x2 array to 2x3x1 destination") -``` - -## Dictionaries - -Julia uses [Dicts](http://docs.julialang.org/en/latest/stdlib/base/#associative-collections) as -associative collections. Usage is similar to Python except for the `=>` definition syntax. - -```c -# <hide> -function printsum(a) - println(summary(a), ": ", repr(a)) -end -# </hide> - -# dicts can be initialised directly: -a1 = Dict(1=>"one", 2=>"two") -printsum(a1) #> Dict{Int64,String}: {2=>"two",1=>"one"} - -# then added to: -a1[3]="three" -printsum(a1) #> Dict{Int64,String}: {2=>"two",3=>"three",1=>"one"} -# (note dicts cannot be assumed to keep their original order) - -# dicts may also be created with the type explicitly set -a2 = Dict{Int64, AbstractString}() -a2[0]="zero" -printsum(a2) -#> Dict{Int64,AbstractString} with 1 entry: Dict{Int64,AbstractString}(Pair{Int64,AbstractString}(0,"zero")) - -# dicts, like arrays, may also be created from [comprehensions](http://julia.readthedocs.org/en/latest/manual/arrays/#comprehensions) -a3 = Dict([i => @sprintf("%d", i) for i = 1:10]) -printsum(a3) -#> Dict{Any,Any}: {5=>"5",4=>"4",6=>"6",7=>"7",2=>"2",10=>"10",9=>"9",8=>"8",3=>"3",1=>"1"} - -# as you would expect, Julia comes with all the normal helper functions -# for dicts, e.g., [haskey](http://docs.julialang.org/en/latest/stdlib/base/#Base.haskey) -println(haskey(a1,1)) #> true - -# which is equivalent to -println(1 in keys(a1)) #> true -# where [keys](http://docs.julialang.org/en/latest/stdlib/base/#Base.keys) creates an iterator over the keys of the dictionary - -# similar to keys, [values](http://docs.julialang.org/en/latest/stdlib/base/#Base.values) get iterators over the dict's values: -printsum(values(a1)) -#> Base.ValueIterator for a Dict{Int64,String} with 3 entries: String["two","three","one"] - -# use [collect](http://docs.julialang.org/en/latest/stdlib/base/#Base.collect) to get an array: -printsum(collect(values(a1))) -#> 3-element Array{String,1}: String["two","three","one"] -``` - -## Loops and Map - -[For loops](http://julia.readthedocs.org/en/latest/manual/control-flow/#repeated-evaluation-loops) -can be defined in a number of ways. - -```c -# <hide> -function printsum(a) - println(summary(a), ": ", repr(a)) -end -# </hide> -for i in 1:5 - print(i, ", ") -end -#> 1, 2, 3, 4, 5, -# In loop definitions "in" is equivilent to "=" (AFAIK, the two are interchangable in this context) -for i = 1:5 - print(i, ", ") -end -println() #> 1, 2, 3, 4, 5, - -# arrays can also be looped over directly: -a1 = [1,2,3,4] -for i in a1 - print(i, ", ") -end -println() #> 1, 2, 3, 4, - -# **continue** and **break** work in the same way as python -a2 = collect(1:20) -for i in a2 - if i % 2 != 0 - continue - end - print(i, ", ") - if i >= 8 - break - end -end -println() #> 2, 4, 6, 8, - -# if the array is being manipulated during evaluation a while loop shoud be used -# [pop](http://docs.julialang.org/en/latest/stdlib/base/#Base.pop!) removes the last element from an array -while !isempty(a1) - print(pop!(a1), ", ") -end -println() #> 4, 3, 2, 1, - -d1 = Dict(1=>"one", 2=>"two", 3=>"three") -# dicts may be looped through using the keys function: -for k in sort(collect(keys(d1))) - print(k, ": ", d1[k], ", ") -end -println() #> 1: one, 2: two, 3: three, - -# like python [enumerate](http://docs.julialang.org/en/latest/stdlib/base/#Base.enumerate) can be used to get both the index and value in a loop -a3 = ["one", "two", "three"] -for (i, v) in enumerate(a3) - print(i, ": ", v, ", ") -end -println() #> 1: one, 2: two, 3: three, - -# (note enumerate starts from 1 since Julia arrays are 1 indexed unlike python) - -# [map]() works as you might expect performing the given function on each member of an array or iter -# much like comprehensions -a4 = map((x) -> x^2, [1, 2, 3, 7]) -print(a4) #> [1, 4, 9, 49] -``` - -## Types - -Types are a key way of structuring data within Julia. - -```c -# <hide> -function printsum(a) - println(summary(a), ": ", repr(a)) -end -# </hide> - -# Type Definitions are probably most similar to tyepdefs in c? -# a simple type with no special constructor functions might look like this -type Person - name::AbstractString - male::Bool - age::Float64 - children::Int -end - -p = Person("Julia", false, 4, 0) -printsum(p) -#> Person: Person("Julia",false,4.0,0) - -people = Person[] -push!(people, Person("Steve", true, 42, 0)) -push!(people, Person("Jade", false, 17, 3)) -printsum(people) -#> 2-element Array{Person,1}: [Person("Steve",true,42.0,0),Person("Jade",false,17.0,3)] - -# types may also contains arrays and dicts -# constructor functions can be defined to easily create objects -type Family - name::AbstractString - members::Array{AbstractString, 1} - extended::Bool - # constructor that takes one argument and generates a default - # for the other two values - Family(name::AbstractString) = new(name, AbstractString[], false) - # constructor that takes two arguements and infers the third - Family(name::AbstractString, members) = new(name, members, length(members) > 3) -end - -fam1 = Family("blogs") -println(fam1) -#> Family("blogs",AbstractString[],false) -fam2 = Family("jones", ["anna", "bob", "charlie", "dick"]) -println(fam2) -#> Family("jones",AbstractString["anna","bob","charlie","dick"],true) -``` - -## Input & Output - -The basic syntax for reading and writing files in Julia is quite similar to Python. - -The `simple.dat` file used in this example is available -[from github](https://github.com/samuelcolvin/JuliaByExample/blob/master/src/simple.dat). - -```c -fname = "simple.dat" -# using [do](http://julia.readthedocs.org/en/latest/manual/functions/#block-syntax-for-function-arguments) means the file is closed automatically -# in the same way "with" does in python -open(fname,"r") do f - for line in eachline(f) - print(line) - end -end -#> this is a simple file containing -#> text and numbers: -#> 43.3 -#> 17 - -f = open(fname,"r") -showall(readlines(f)) -#> String["this is a simple file containing","text and numbers:","43.3","17"] -close(f) - -f = open(fname,"r") -fstring = readstring(f) -close(f) -println(summary(fstring)) -#> String -print(fstring) -#> this is a simple file containing -#> text and numbers: -#> 43.3 -#> 17 - -outfile = "outfile.dat" -# writing to files is very similar: -f = open(outfile, "w") -# both print and println can be used as usual but with f as their first arugment -println(f, "some content") -print(f, "more content") -print(f, " more on the same line") -close(f) - -# we can then check the content of the file written -# "do" above just creates an anonymous function and passes it to open -# we can use the same logic to pass readall and thereby succinctly -# open, read and close a file in one line -outfile_content = open(readstring, outfile, "r") -println(repr(outfile_content)) -#> "some content\nmore content more on the same line" -``` - -## Packages and Including of Files - -[Packages](http://docs.julialang.org/en/latest/packages/packagelist/) -extend the functionality of the Julia's standard library. - -```c -# You might not want to run this file completely, as the Pkg-commands can take a -# long time to complete. - -# list all available packages: -Pkg.available() - -# install one package (e.g. [Calculus](https://github.com/johnmyleswhite/Calculus.jl)) and all its dependencies: -Pkg.add("Calculus") - -# to list all installed packages -Pkg.installed() - -# to update all packages to their newest version -Pkg.update() - -# to use a package: -using Calculus -# will import all functions of that package into the current namespace, so that -# it is possible to call -derivative(x -> sin(x), 1.0) -# without specifing the package it is included in. - -import Calculus -# will enable you to specify which package the function is called from -Calculus.derivative(x -> cos(x), 1.0) - -# Using `import` is especially useful if there are conflicts in function/type-names -# between packages. -``` - -## Winston - -[Winston Package Page](https://github.com/nolta/Winston.jl) - -MATLAB-like plotting. Installed via `Pkg.add("Winston")` - -```c -using Winston - -# plot some data -pl = plot(cumsum(rand(500) .- 0.5), "r", cumsum(rand(500) .- 0.5), "b") -# display the plot (not done automatically!) -display(pl) - -# save the current figure -savefig("winston.svg") -# .eps, .pdf, & .png are also supported -# we used svg here because it respects the width and height specified above -``` - - - -## DataFrames - -The [DataFrames.jl package](https://github.com/JuliaStats/DataFrames.jl) provides a tool for working with tabular data. - -The `iris.csv` file used in this example is available -[from github](https://github.com/samuelcolvin/JuliaByExample/blob/master/common_usage/iris.csv). - -```c -using DataFrames -showln(x) = (show(x); println()) -# TODO: needs more links to docs. - -# A DataFrame is an in-memory database -df = DataFrame(A = [1, 2], B = [e, pi], C = ["xx", "xy"]) -showln(df) -#> 2x3 DataFrame -#> |-------|---|---------|------| -#> | Row # | A | B | C | -#> | 1 | 1 | 2.71828 | "xx" | -#> | 2 | 2 | 3.14159 | "xy" | - -# The columns of a DataFrame can be indexed using numbers or names -showln(df[1]) -#> [1,2] -showln(df[:A]) -#> [1,2] - -showln(df[2]) -#> [2.718281828459045,3.141592653589793] -showln(df[:B]) -#> [2.718281828459045,3.141592653589793] - -showln(df[3]) -#> String["xx","xy"] -showln(df[:C]) -#> String["xx","xy"] - -# The rows of a DataFrame can be indexed only by using numbers -showln(df[1, :]) -#> 1x3 DataFrame -#> |-------|---|---------|------| -#> | Row # | A | B | C | -#> | 1 | 1 | 2.71828 | "xx" | -showln(df[1:2, :]) -#> 2x3 DataFrame -#> |-------|---|---------|------| -#> | Row # | A | B | C | -#> | 1 | 1 | 2.71828 | "xx" | -#> | 2 | 2 | 3.14159 | "xy" | - -# importing data into DataFrames -# ------------------------------ - -# DataFrames can be loaded from CSV files using readtable() -iris = readtable("iris.csv") - -# the iris dataset (and plenty of others) is also available from -using RData, RDatasets -iris = dataset("datasets","iris") - -# you can directly import your own R .rda dataframe with -# mydf = DataFrame(read_rda("path/to/your/df.rda")["name_of_df"]), e.g. -diamonds = DataFrame(load(joinpath(Pkg.dir("RDatasets"),"data","ggplot2","diamonds.rda"))["diamonds"]) - -# showing DataFrames -# ------------------ - -# Check the names and element types of the columns of our new DataFrame -showln(names(iris)) -#> [:SepalLength,:SepalWidth,:PetalLength,:PetalWidth,:Species] -showln(eltypes(iris)) -#> Type[Float64,Float64,Float64,Float64,UTF8String] - -# Subset the DataFrame to only include rows for one species -showln(iris[iris[:Species] .== "setosa", :]) -#> 50x5 DataFrame -#> |-------|-------------|------------|-------------|------------|----------| -#> | Row # | SepalLength | SepalWidth | PetalLength | PetalWidth | Species | -#> | 1 | 5.1 | 3.5 | 1.4 | 0.2 | "setosa" | -#> | 2 | 4.9 | 3.0 | 1.4 | 0.2 | "setosa" | -#> | 3 | 4.7 | 3.2 | 1.3 | 0.2 | "setosa" | -#> | 4 | 4.6 | 3.1 | 1.5 | 0.2 | "setosa" | -#> | 5 | 5.0 | 3.6 | 1.4 | 0.2 | "setosa" | -#> | 6 | 5.4 | 3.9 | 1.7 | 0.4 | "setosa" | -#> | 7 | 4.6 | 3.4 | 1.4 | 0.3 | "setosa" | -#> | 8 | 5.0 | 3.4 | 1.5 | 0.2 | "setosa" | -#> | 9 | 4.4 | 2.9 | 1.4 | 0.2 | "setosa" | -#> â‹® -#> | 41 | 5.0 | 3.5 | 1.3 | 0.3 | "setosa" | -#> | 42 | 4.5 | 2.3 | 1.3 | 0.3 | "setosa" | -#> | 43 | 4.4 | 3.2 | 1.3 | 0.2 | "setosa" | -#> | 44 | 5.0 | 3.5 | 1.6 | 0.6 | "setosa" | -#> | 45 | 5.1 | 3.8 | 1.9 | 0.4 | "setosa" | -#> | 46 | 4.8 | 3.0 | 1.4 | 0.3 | "setosa" | -#> | 47 | 5.1 | 3.8 | 1.6 | 0.2 | "setosa" | -#> | 48 | 4.6 | 3.2 | 1.4 | 0.2 | "setosa" | -#> | 49 | 5.3 | 3.7 | 1.5 | 0.2 | "setosa" | -#> | 50 | 5.0 | 3.3 | 1.4 | 0.2 | "setosa" | - -# Count the number of rows for each species -showln(by(iris, :Species, df -> size(df, 1))) -#> 3x2 DataFrame -#> |-------|--------------|----| -#> | Row # | Species | x1 | -#> | 1 | "setosa" | 50 | -#> | 2 | "versicolor" | 50 | -#> | 3 | "virginica" | 50 | - -# Discretize entire columns at a time -iris[:SepalLength] = round.(Integer, iris[:SepalLength]) -iris[:SepalWidth] = round.(Integer, iris[:SepalWidth]) - - -# Tabulate data according to discretized columns to see "clusters" -tabulated = by( - iris, - [:Species, :SepalLength, :SepalWidth], - df -> size(df, 1) -) -showln(tabulated) -#> 17x4 DataFrame -#> |-------|--------------|-------------|------------|----| -#> | Row # | Species | SepalLength | SepalWidth | x1 | -#> | 1 | "setosa" | 4 | 3 | 4 | -#> | 2 | "setosa" | 5 | 2 | 1 | -#> | 3 | "setosa" | 5 | 3 | 23 | -#> | 4 | "setosa" | 5 | 4 | 17 | -#> | 5 | "setosa" | 6 | 4 | 5 | -#> | 6 | "versicolor" | 5 | 2 | 3 | -#> | 7 | "versicolor" | 5 | 3 | 3 | -#> | 8 | "versicolor" | 6 | 2 | 6 | -#> | 9 | "versicolor" | 6 | 3 | 29 | -#> | 10 | "versicolor" | 7 | 3 | 9 | -#> | 11 | "virginica" | 5 | 3 | 1 | -#> | 12 | "virginica" | 6 | 2 | 1 | -#> | 13 | "virginica" | 6 | 3 | 22 | -#> | 14 | "virginica" | 7 | 3 | 19 | -#> | 15 | "virginica" | 7 | 4 | 1 | -#> | 16 | "virginica" | 8 | 3 | 4 | -#> | 17 | "virginica" | 8 | 4 | 2 | - -# you can setup a grouped dataframe like this -gdf = groupby(iris,[:Species, :SepalLength, :SepalWidth]) - -# and then iterate over it -for idf in gdf - println(size(idf,1)) -end - -# Adding/Removing columns -# ----------------------- - -# insert!(df::DataFrame,index::Int64,item::AbstractArray{T,1},name::Symbol) -# insert random numbers at col 5: -insert!(iris, 5, rand(nrow(iris)), :randCol) - -# remove it -delete!(iris, :randCol) -``` diff --git a/content/docs/software/lang/meta.json b/content/docs/software/lang/meta.json deleted file mode 100644 index 7773a87cce3b98198aece7d70c935032d5bc9995..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Lang", - "pages": [ - "conda", - "csc", - "java", - "julialang", - "python" - ] -} diff --git a/content/docs/software/lang/python.mdx b/content/docs/software/lang/python.mdx deleted file mode 100644 index 870349da913032a10981bccc4bef9ec8fd673315..0000000000000000000000000000000000000000 --- a/content/docs/software/lang/python.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: "Python" ---- -Python is a widely used high-level programming language for general-purpose programming, created by Guido van Rossum and first released in 1991. An interpreted language, Python has a design philosophy that emphasizes code readability (notably using whitespace indentation to delimit code blocks rather than curly brackets or keywords), and a syntax that allows programmers to express concepts in fewer lines of code than might be used in languages such as C++ or Java. The language provides constructs intended to enable writing clear programs on both a small and large scale. - -Python features a dynamic type system and automatic memory management and supports multiple programming paradigms, including object-oriented, imperative, functional programming, and procedural styles. It has a large and comprehensive standard library. - -* [Documentation for Python 3.X][a] -* [PEP 8 -- Style Guide for Python Code][c] -* [Get into Python -- Tutorial][d] - -## Python on the IT4Innovations Clusters - -On the clusters, we have the Python 3.X software installed. How to use these modules is shown below. - -<Callout> - Use the `ml av python/` command to get up-to-date versions of the modules. -</Callout> - -<Callout type=error> - Python 2.7 is not supported - [EOL][b] January 1st, 2020. -</Callout> - -```console -$ ml av python/ - ------------------------------------------------------- /apps/modules/lang ------------------------------------------------------- - Python/3.8.2-GCCcore-9.3.0 Python/3.8.6-GCCcore-10.2.0 Python/3.9.5-GCCcore-10.3.0 (D) - - Where: - D: Default Module - - If you need software that is not listed, request it at support@it4i.cz. -``` - -## Python 3.X - -Python 3.0 (a.k.a. "Python 3000" or "Py3k") is a new version of the language that is incompatible with the 2.x line of releases. The language is mostly the same, but many details, especially how built-in objects like dictionaries and strings work, have changed considerably, and many deprecated features have been removed. In addition, the standard library has been reorganized in a few prominent places. - -```console -$ ml av python3/ - ------------------------------------------------------- /apps/modules/lang ------------------------------------------------------- - Python/3.8.2-GCCcore-9.3.0 Python/3.8.6-GCCcore-10.2.0 Python/3.9.5-GCCcore-10.3.0 (D) - - Where: - D: Default Module - - If you need software that is not listed, request it at support@it4i.cz. - -``` - -### Used Module Python/3.x - -```console -$ python --version -Python 2.7.5 -$ ml Python/3.8.6-GCCcore-10.2.0 -$ python --version -Python 3.8.6 -``` - -### Packages in Python/3.x - -```console -$ pip3 list -Package Version ------------------------------ ---------- -alabaster 0.7.12 -appdirs 1.4.4 -ase 3.22.0 -asn1crypto 1.4.0 -atomicwrites 1.4.0 -attrs 20.2.0 -Babel 2.8.0 -... -... -$ pip3 list | wc -l -138 -``` - -### How to Install New Package to Python/3.x - -```console -$ ml ml Python/3.8.6-GCCcore-10.2.0 -$ python --version -Python 3.8.6 -$ pip3 install pandas --user -Collecting pandas - Downloading pandas-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB) - |â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–| 11.5 MB 4.8 MB/s -... -Installing collected packages: pandas -Successfully installed pandas-1.3.3 -``` - -### How to Update Package in Python/3.x? - -```console -$ pip3 install setuptools --upgrade --user -Collecting setuptools - Downloading setuptools-58.0.4-py3-none-any.whl (816 kB) - |â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–Ž| 798 kB 5.4 MB/s eta 0:00:01 - |â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–Š| 808 kB 5.4 MB/s eta 0:00:01 - |â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–| 816 kB 5.4 MB/s -Installing collected packages: setuptools -Successfully installed setuptools-58.0.4 -``` - -[a]: https://docs.python.org/3/ -[b]: https://www.python.org/doc/sunset-python-2/ -[c]: https://www.python.org/dev/peps/pep-0008/ -[d]: https://jobtensor.com/Tutorial/Python/en/Introduction diff --git a/content/docs/software/machine-learning/alphafold.mdx b/content/docs/software/machine-learning/alphafold.mdx deleted file mode 100644 index 85394cc477db4ba0584c181632c1d4bb94c647cd..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/alphafold.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "AlphaFold" ---- -[AlphaFold][1] is an AI program designed as a deep learning system -developed by DeepMind, a subsidiary of Alphabet, -which performs predictions of protein structure. - -## Installed Versions - -AlphaFold is available on the Karolina cluster. -For the current list of installed versions, use: - -```console -ml av alphafold -``` - -## Loading Databases - -AlphaFold needs multiple genetic databases to run. -These can be downloaded using AlphaFold scripts located in the `apps/all/AlphaFold/2.1.2-fosscuda-2020b-TensorFlow-2.5.0/scripts` directory. -This step requires the `aria2c` program available as the `aria2/1.35.0-GCCcore-10.3.0` module. - -Once downloaded, you must specify the path to the directory on `/scratch` containing the databases. - -For more information, see the [AlphaFold documentation][2]. - -[1]: https://www.deepmind.com/research/highlighted-research/alphafold -[2]: https://github.com/deepmind/alphafold#genetic-databases diff --git a/content/docs/software/machine-learning/deepdock.mdx b/content/docs/software/machine-learning/deepdock.mdx deleted file mode 100644 index bf40a7ab91941eec3a1d27a1edfb1a63449ce449..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/deepdock.mdx +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: "DeepDock" ---- -Adapted from [https://github.com/OptiMaL-PSE-Lab/DeepDock](https://github.com/OptiMaL-PSE-Lab/DeepDock) - -Code related to: [O. Mendez-Lucio, M. Ahmad, E.A. del Rio-Chanona, J.K. Wegner, A Geometric Deep Learning Approach to Predict Binding Conformations of Bioactive Molecules, Nature Machine Intelligence volume 3, pages1033–1039 (2021)](https://rdcu.be/cDy5f) - -Open access preprint [available here](https://doi.org/10.26434/chemrxiv.14453106.v1) - -## Getting Started - -### Main Requirements: - -* PyTorch = 1.10.0 -* CUDA Toolkit = 11.3 -* Python = 3.6.9 -* RDKIT = 2019.09.1 - -### Prerequisites - -* create Conda environment - - ```sh - conda create -n "current" python=3.6.9 - ``` - -* activate newly created Conda environment - - ```sh - conda activate current - ``` - -* install PyTorch 1.10.0 and other dependencies (more info at [https://pytorch.org/get-started/previous-versions/](https://pytorch.org/get-started/previous-versions/)) - - ```sh - conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge - ``` - -* if not yet available in your system, load CUDA 11.3 - - ```sh - ml load CUDA/11.3.1 - ``` - -* install PyTorch scatter, sparse and geometric - - ```sh - pip install torch-scatter -f https://data.pyg.org/whl/torch-1.10.0+cu113.html - pip install torch-sparse -f https://data.pyg.org/whl/torch-1.10.0+cu113.html - pip install torch-geometric - ``` - -* uninstall PyTorch spline - - ```sh - pip uninstall torch-spline-conv - ``` - -* uninstall PyMesh (necessary to generate `.ply` files) - - ```sh - wget --no-check-certificate https://github.com/PyMesh/PyMesh/releases/download/v0.2.0/pymesh2-0.2.0-cp36-cp36m-linux_x86_64.whl - pip install pymesh2-0.2.0-cp36-cp36m-linux_x86_64.whl - git clone https://github.com/shenwanxiang/ChemBench.git - cd ChemBench - pip install -e . - ``` - -* install Trimesh - - ```sh - conda install -c conda-forge trimesh - ``` - -* if not yet available in your system, fixed issues with the version of `libstdc` - - ```sh - module load GCC/9.3.0 - ``` - -* install other dependencies - - ```sh - conda install Biopython - conda install cmake - conda install automake - conda install bison - conda install flex - conda install -c anaconda swig - conda install -c conda-forge apbs - conda install -c conda-forge pdb2pqry - ``` - -* install AmberTools to replace reduce3.34 (for protonation) - since it is deprecated and no longer available, it is now included in AmberTools - - ```sh - conda install -c conda-forge ambertools - ``` - -* install requirements.txt - - ```sh - pip install -r requirements.txt - ``` - -* install RDKIT - - ```sh - conda install -c conda-forge rdkit=2019.09.1 - ``` - -### Installation - -1. Clone the repo - - ```sh - git clone https://github.com/paulo308/deepdock - ``` - -2. Move into the project folder and update submodules - - ```sh - cd DeepDock - git submodule update --init --recursive - ``` - -3. Install prerequisite packages - - ```sh - pip install -r requirements.txt - ``` - -4. Install DeepDock pacakge - - ```sh - pip install -e . - ``` - -### Configuration - -* navigate to the location of your `apbs-pdb2pqr/pdb2pqr` installation and run the Python (2.7) script to link with your current Conda environment. For more information, refer to the Dockerfile (lines 60 to 72) - - ```sh - [your conda environment WORK DIRECTORY]/install/apbs-pdb2pqr/pdb2pqr - python2.7 scons/scons.py install PREFIX="[your conda ENVIRONMENT PATH]/bin/pdb2pqr" - ``` - -* move the "multivalue" file to your Conda envirnoment path - - ```sh - cp multivalue [your conda environment path]/share/apbs/tools/mesh/multivalue - ``` - -* setup necessary environment variables with the tools and respective paths - - ```sh - export MSMS_BIN=[your conda environment path]/bin/msms - export APBS_BIN=[your conda environment path]/bin/apbs - export PDB2PQR_BIN=[your conda environment path]/bin/pdb2pqr/pdb2pqr.py - export MULTIVALUE_BIN=[your conda environment path]/share/apbs/tools/mesh/multivalue - ``` - -## Data - -You can get training and testing data following the next steps. - -1. Move into the project data folder - - ```sh - cd DeepDock/data - ``` - -2. Use the following line to download the preprocessed data used to train and test the model. This will download two files, one containing PDBbind (2.3 GB) used for training and another containing CASF-2016 (32 MB) used for testing. These two files are enough to run all [examples](https://github.com/OptiMaL-PSE-Lab/DeepDock/blob/main/examples). - - ```sh - source get_deepdock_data.sh - ``` - -2. In case you want to reproduce all results of the paper you will need to download the complete CASF-2016 set (~1.5 GB). You can do so with this command line from the data folder. - - ```sh - source get_CASF_2016.sh - ``` - -## Example Usage - -Usage examples can be seen directly in the Jupyter Notebooks included in the repo. We added examples for: - -* [Training the model](https://github.com/OptiMaL-PSE-Lab/DeepDock/blob/main/examples/Train_DeepDock.ipynb) -* [Score molecules](https://github.com/OptiMaL-PSE-Lab/DeepDock/blob/main/examples/Score_example.ipynb) -* [Predict binding conformation (docking)](https://github.com/OptiMaL-PSE-Lab/DeepDock/blob/main/examples/Docking_example.ipynb) diff --git a/content/docs/software/machine-learning/introduction.mdx b/content/docs/software/machine-learning/introduction.mdx deleted file mode 100644 index 9dd56ffa0612da68f4f1ca7a00663c6c5dc6b523..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/introduction.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Machine Learning" ---- -This section overviews machine learning frameworks and libraries available on the clusters. - -## Keras - -Keras is an API designed for human beings, not machines. Keras follows best practices for reducing cognitive load: it offers consistent & simple APIs, it minimizes the number of user actions required for common use cases, and it provides clear & actionable error messages. It also has extensive documentation and developer guides. For more information, see the [official website][c]. - -For the list of available versions, type: - -```console -$ ml av Keras -``` - -## NetKet - -NetKet is an open-source project for the development of machine intelligence for many-body quantum systems. -For more information, see the [official website][d] or [GitHub][e]. - -## TensorFlow - -TensorFlow is an end-to-end open source platform for machine learning. It has a comprehensive, flexible ecosystem of tools, libraries, and community resources that lets researchers push the state-of-the-art in ML and developers easily build and deploy ML powered applications. For more information, see the [official website][a]. - -For more information see the [TensorFlow][1] section. - -## Theano - -Theano is a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently. It can use GPUs and perform efficient symbolic differentiation. For more information, see the [official webpage][b] (GitHub). - -For the list of available versions, type: - -```console -$ ml av Theano -``` - -[1]: tensorflow.md - -[a]: https://www.tensorflow.org/ -[b]: https://github.com/Theano/ -[c]: https://keras.io/ -[d]: http://www.netket.org -[e]: https://github.com/netket - -<!--- -2021-04-08 -It is necessary to load the correct NumPy / SciPy modules along with the Tensorflow one. - -Obsolete 2021-03-31 -## Todo -Salomon -> Theano/0.9.0-Python-3.6.1 does NOT include several mandatory modules, like NumPy and SciPy -Salomon -> Keras/2.0.5-Theano-1.2.0-Python-3.6.1 loads Theano/0.9.0-Python-3.6.1, meaning it also does not include mandatory librarie - -Salomon -> /apps/modules/math/Keras/2.3.0-Tensorflow-1.13.1-Python-3.7.2 works, others miss NumPy or other libraries - -What seems to work on Salomon: -for theano: -/apps/modules/python/Theano/1.0.1-Py-3.6, and Keras with this backend - -for keras: -/apps/modules/math/Keras/2.3.0-Tensorflow-1.13.1-Python-3.7.2 -/apps/modules/python/Keras/2.1.4-Py-3.6-Tensorflow-1.6.0rc0 ---> diff --git a/content/docs/software/machine-learning/meta.json b/content/docs/software/machine-learning/meta.json deleted file mode 100644 index 7a6ea8f6096e1b22df088599b8e9a091e94450c3..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Machine-learning", - "pages": [ - "alphafold", - "deepdock", - "introduction", - "netket", - "tensorflow" - ] -} diff --git a/content/docs/software/machine-learning/netket.mdx b/content/docs/software/machine-learning/netket.mdx deleted file mode 100644 index 51066052f92682fd78b7986afd2fe3e10077f693..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/netket.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: "NetKet" ---- -Open-source project for the development of machine intelligence for many-body quantum systems. - -## Introduction - -NetKet is a numerical framework written in Python to simulate many-body quantum systems using variational methods. In general, NetKet allows the user to parametrize quantum states using arbitrary functions, be it simple mean-field ansatz, Jastrow, MPS ansatz or convolutional neural networks. Those states can be sampled efficiently in order to estimate observables or other quantities. Stochastic optimization of the energy or a time-evolution are implemented on top of those samplers. - -NetKet tries to follow the functional programming paradigm, and is built around jax. While it is possible to run the examples without knowledge of jax, it is recommended that the users get familiar with it if they wish to extend NetKet. - -For more information, see the [NetKet documentation][1]. - -## Running NetKet - -Load the `Python/3.8.6-GCC-10.2.0-NetKet` and `intel/2020b` modules. - -### Example for Multi-GPU Node - -<Callout type=warn> - Set the visible device in the environment variable before loading jax and NetKet, as NetKet loads jax. -</Callout> - -```code -# J1-J2 model -# Version with complex Hamiltonian -# -################################################################################ - -import os -import sys - -# detect MPI rank -from mpi4py import MPI -rank = MPI.COMM_WORLD.Get_rank() - -# set only one visible device -os.environ["CUDA_VISIBLE_DEVICES"] = f"{rank}" -# force to use gpu -os.environ["JAX_PLATFORM_NAME"] = "gpu" - -import jax -import netket as nk -import numpy as np -import json -import mpi4jax - -print("NetKet version: {}".format(nk.__version__)) -print("Jax devices: {}".format(jax.devices())) -print("Jax version: {}".format(jax.__version__)) -print("MPI utils available: {}".format(nk.utils.mpi.available)) - -# Parameters -L = 12 # length -J1 = 1.0 # nearest-neighbours exchange interaction -J2 = .50 # next-nearest-neighbours exchange interaction - -MSR = 1 # Marshall sign rule (+1/-1) - -# ## Hamiltonian - -# Hilbert space -g = nk.graph.Chain(L, pbc=True) -hilbert = nk.hilbert.Spin(s=0.5, total_sz=0.0, N=g.n_nodes) - -print("Number of graph nodes: {:d}".format(g.n_nodes)) -print("Hilbert size: {:d}".format(hilbert.size)) - -# Pauli matrices -def sigx(i): - return nk.operator.spin.sigmax(hilbert, i, dtype=np.complex128) - -def sigy(i): - return nk.operator.spin.sigmay(hilbert, i, dtype=np.complex128) - -def sigz(i): - return nk.operator.spin.sigmaz(hilbert, i, dtype=np.complex128) - -def heisenberg(i, j, sgn=1): - """Heisenberg two spin interaction including Marshall sign rule.""" - return sgn * (sigx(i)*sigx(j) + sigy(i)*sigy(j)) + sigz(i)*sigz(j) - -# setup local Hamiltonian -Ha = nk.operator.LocalOperator(hilbert, dtype=np.complex128) # Hamiltonian - -# nearest neighbours -for i in range(L - 1): - Ha += J1 * heisenberg(i, i+1, MSR) - -Ha += J1 * heisenberg(L-1, 0, MSR) - -# next nearest neighbours -for i in range(L - 2): - Ha += J2 * heisenberg(i, i+2) - -Ha += J2 * ( heisenberg(L-1, 1) + heisenberg(L-2, 0) ) - -# check Hamiltonian -print("Hamiltonian is hemitian: {}".format(Ha.is_hermitian)) -print("Number of local operators: {:d}".format(len(Ha.operators))) -print("Hamiltonian size: {}".format(Ha.to_dense().shape)) - -# ## Exact diagonalization - -ED = nk.exact.lanczos_ed(Ha, compute_eigenvectors=False) -E0 = ED[0] -print("Exact ground state energy: {:.5f}".format(E0)) - -# ## Restricted Boltzmann Machine - -# setup model -model = nk.models.RBM(alpha=1,dtype=np.complex128) - -sa = nk.sampler.MetropolisExchange(hilbert, graph=g, d_max=2, n_chains_per_rank=1) -vs = nk.vqs.MCState(sa, model, n_samples=3000) -opt = nk.optimizer.Sgd(learning_rate=0.01) -sr = nk.optimizer.SR(diag_shift=0.01) - -gs = nk.VMC(hamiltonian=Ha, optimizer=opt, variational_state=vs, preconditioner=sr) - -# run simulations -output_files = "J1J2cplx_L{:d}_J{:.2f}_rbm".format(L, J2) -gs.run(out=output_files, n_iter=3000) - -# print energy -Data = json.load(open("{:s}.log".format(output_files))) -E0rbm = np.mean(Data["Energy"]["Mean"]["real"][-500:-1]) -print("RBM ground state energy: {:.5f}".format(E0rbm)) -``` - -[1]: https://www.netket.org/docs/getting_started.html#installation-and-requirements diff --git a/content/docs/software/machine-learning/tensorflow.mdx b/content/docs/software/machine-learning/tensorflow.mdx deleted file mode 100644 index 2bf00ecbd311c5f381a008fa29d63cf1a1d90d7b..0000000000000000000000000000000000000000 --- a/content/docs/software/machine-learning/tensorflow.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: "TensorFlow" ---- -TensorFlow (TF) is an open-source software library which can compile tensor operations to execute -very quickly on both CPUs and GPUs. It is often used as a backend for machine learning libraries -and models. - -We heavily recommend the usage of `TensorFlow 2.x`. TensorFlow 1 has been long deprecated and it -will probably be difficult to make it run on GPUs on our clusters. - -## Installation - -For TensorFlow to work with GPUs, you have to use several libraries (CUDA, cuDNN, NCCL etc.) -with versions that are compatible together. - -You can load the correct modules with the following command: - -```console -$ ml TensorFlow -``` - -If you want to upgrade the TensorFlow version used in this package or install additional Python -modules, you can simply create a virtual environment and install a different TensorFlow version -inside it: - -```console -$ python3 -m venv venv -$ source venv/bin/activate -(venv) $ python3 -m pip install -U setuptools wheel pip -(venv) $ python3 -m pip install tensorflow -``` - -However, if you use a newer TensorFlow version than the one included in the `TensorFlow` module, -you should make sure that it is still compatible with the CUDA version provided by the module. -You can find the required `CUDA`/`cuDNN` versions for the latest TF -[here](https://www.tensorflow.org/install/pip). - -## TensorFlow Example - -After loading TensorFlow, you can check its functionality by running the following Python script. - -```python -import tensorflow as tf - -a = tf.constant([1, 2, 3]) -b = tf.constant([2, 4, 6]) -c = a + b -print(c.numpy()) -``` - -## Using TensorFlow With GPUs - -With TensorFlow, you can leverage either a single GPU or multiple GPUs in a single process, to e.g. -train neural networks much faster. - -Using the available `TensorFlow` module should make sure that these modules will be loaded correctly. - -### Selecting GPUs - -You can select how many and which (NVIDIA) GPUs will be used by TensorFlow with the -`CUDA_VISIBLE_DEVICES` environment variable. - -```console -# Do not use any GPUs -$ CUDA_VISIBLE_DEVICES=-1 python3 my_script.py -# Use a single GPU with ID 0 -$ CUDA_VISIBLE_DEVICES=0 python3 my_script.py -# Use multiple GPUs -$ CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3 my_script.py -``` - -By default, if you do not specify the environment variable, all available GPUs will be used by -TensorFlow. - -### Multi-GPU TensorFlow Example - -This script uses `keras` and `TensorFlow` to train a simple neural network on the -[MNIST](https://en.wikipedia.org/wiki/MNIST_database) dataset. It assumes that you have -`tensorflow` (2.x), `keras` and `tensorflow_datasets` Python packages installed. The training -is performed on multiple GPUs. - -```python -import tensorflow_datasets as tfds -import tensorflow as tf - -datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True) - -mnist_train, mnist_test = datasets['train'], datasets['test'] - -# Use NCCL reduction if NCCL is available, it should be the most efficient strategy -strategy = tf.distribute.MirroredStrategy(cross_device_ops=tf.distribute.NcclAllReduce()) - -# Different reduction strategy, use if NCCL causes errors -# strategy = tf.distribute.MirroredStrategy(cross_device_ops=tf.distribute.ReductionToOneDevice()) -print('Number of devices: {}'.format(strategy.num_replicas_in_sync)) - -num_train_examples = info.splits['train'].num_examples -num_test_examples = info.splits['test'].num_examples - -BUFFER_SIZE = 10000 - -BATCH_SIZE_PER_REPLICA = 64 -BATCH_SIZE = BATCH_SIZE_PER_REPLICA * strategy.num_replicas_in_sync - -def scale(image, label): - image = tf.cast(image, tf.float32) - image /= 255 - - return image, label - - -train_dataset = mnist_train.map(scale).cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE) -eval_dataset = mnist_test.map(scale).batch(BATCH_SIZE) - -# The following line makes sure that the model will run on multiple GPUs (if they are available) -# Without `strategy.scope()`, the model would only be trained on a single GPU -with strategy.scope(): - model = tf.keras.Sequential([ - tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)), - tf.keras.layers.MaxPooling2D(), - tf.keras.layers.Flatten(), - tf.keras.layers.Dense(64, activation='relu'), - tf.keras.layers.Dense(10) - ]) - - model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), - optimizer=tf.keras.optimizers.Adam(), - metrics=['accuracy']) - -model.fit(train_dataset, epochs=100) -``` - -<Callout> - If using the `NCCL` strategy causes runtime errors, try to run your application with the - environment variable `TF_FORCE_GPU_ALLOW_GROWTH` set to `true`. -</Callout> - -<Callout> - For real-world multi-GPU training, it might be better to use a dedicated multi-GPU framework such - as [Horovod](https://github.com/horovod/horovod). -</Callout> - -<!--- - -2022-10-14 -Add multi-GPU example script. - -2021-04-08 -It's necessary to load the correct NumPy module along with the Tensorflow one. - -2021-03-31 -## Notes -As of 2021-03-23, TensorFlow is made available only on the Salomon cluster - -Tensorflow-tensorboard/1.5.1-Py-3.6 has not been not tested. - ---> diff --git a/content/docs/software/meta.json b/content/docs/software/meta.json deleted file mode 100644 index cbddc62a2291256fba722a5f449ab64d9ff170e3..0000000000000000000000000000000000000000 --- a/content/docs/software/meta.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "title": "Software", - "pages": [ - "bio", - "cae", - "chemistry", - "compilers", - "data-science", - "debuggers", - "eessi", - "intel", - "isv_licenses", - "karolina-compilation", - "lang", - "machine-learning", - "modules", - "mpi", - "numerical-languages", - "numerical-libraries", - "nvidia-cuda", - "nvidia-cuda-q", - "nvidia-hip", - "sdk", - "tools", - "viz" - ] -} diff --git a/content/docs/software/modules/lmod.mdx b/content/docs/software/modules/lmod.mdx deleted file mode 100644 index b964446acf25013fcbf934f15072b30a914d9336..0000000000000000000000000000000000000000 --- a/content/docs/software/modules/lmod.mdx +++ /dev/null @@ -1,335 +0,0 @@ ---- -title: "Lmod Environment" ---- -Lmod is a modules tool, a modern alternative to the outdated & no longer actively maintained Tcl-based environment modules tool. - -Detailed documentation on Lmod is available [here][a]. - -## Benefits - -* significantly more responsive module commands, in particular `ml av` -* easier to use interface -* module files can be written in either the Tcl or Lua syntax (and both types of modules can be mixed together) - -## Introduction - -Below you will find more details and examples. - -| command | equivalent/explanation | -| ------------------------ | ---------------------------------------------------------------- | -| ml | module list | -| ml GCC/6.2.0-2.27 | ml GCC/6.2.0-2.27 | -| ml -GCC/6.2.0-2.27 | module unload GCC/6.2.0-2.27 | -| ml purge | module unload all modules | -| ml av | ml av | -| ml show GCC/6.2.0-2.27 | module show GCC | -| ml spider gcc | searches (case-insensitive) for gcc in all available modules | -| ml spider GCC/6.2.0-2.27 | show all information about the module GCC/6.2.0-2.27 | -| ml save mycollection | stores the currently loaded modules to a collection | -| ml restore mycollection | restores a previously stored collection of modules | - -## Listing Loaded Modules - -To get an overview of the currently loaded modules, use `module list` or `ml` (without specifying extra arguments): - -```console -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) 2) lmod/7.2.2 - Where: - S: Module is Sticky, requires --force to unload or purge -``` - -<Callout> - For more details on sticky modules, see the section on [ml purge][1]. -</Callout> - -## Searching for Available Modules - -To get an overview of all available modules, you can use `ml avail` or simply `ml av`: - -```console -$ ml av ----------------------------------------- /apps/modules/compiler ---------------------------------------------- - GCC/5.2.0 GCCcore/6.2.0 (D) icc/2013.5.192 ifort/2013.5.192 LLVM/3.9.0-intel-2017.00 (D) - ... ... - ----------------------------------------- /apps/modules/devel ------------------------------------------------- - Autoconf/2.69-foss-2015g CMake/3.0.0-intel-2016.01 M4/1.4.17-intel-2016.01 pkg-config/0.27.1-foss-2015g - Autoconf/2.69-foss-2016a CMake/3.3.1-foss-2015g M4/1.4.17-intel-2017.00 pkg-config/0.27.1-intel-2015b - ... ... -``` - -In the current module naming scheme, each module name consists of two parts: - -* the part before the first /, corresponding to the software name -* the remainder, corresponding to the software version, the compiler toolchain that was used to install the software, and a possible version suffix - -<Callout> - `(D)` indicates that this particular version of the module is the default, but we strongly recommend to not rely on this, as the default can change at any point. Usually, the default points to the latest version available. -</Callout> - -## Searching for Modules - -If you just provide a software name, for example `gcc`, it prints an overview of all available modules for GCC. - -```console -$ ml spider gcc ---------------------------------------------------------------------------------- - GCC: ---------------------------------------------------------------------------------- - Description: - The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/ - - Versions: - GCC/4.4.7-system - GCC/4.7.4 - GCC/4.8.3 - GCC/4.9.2-binutils-2.25 - GCC/4.9.2 - GCC/4.9.3-binutils-2.25 - GCC/4.9.3 - GCC/4.9.3-2.25 - GCC/5.1.0-binutils-2.25 - GCC/5.2.0 - GCC/5.3.0-binutils-2.25 - GCC/5.3.0-2.25 - GCC/5.3.0-2.26 - GCC/5.3.1-snapshot-20160419-2.25 - GCC/5.4.0-2.26 - GCC/6.2.0-2.27 - - Other possible modules matches: - GCCcore ---------------------------------------------------------------------------------- - To find other possible module matches do: - module -r spider '.*GCC.*' ---------------------------------------------------------------------------------- - For detailed information about a specific "GCC" module (including how to load the modules) use the module's full name. - For example: - $ module spider GCC/6.2.0-2.27 ---------------------------------------------------------------------------------- -``` - -<Callout> - `spider` is case-insensitive. -</Callout> - -If you use `spider` on a full module name like `GCC/6.2.0-2.27`, it will tell on which cluster(s) that module is available: - -```console -$ module spider GCC/6.2.0-2.27 --------------------------------------------------------------------------------------------------------------- - GCC: GCC/6.2.0-2.27 --------------------------------------------------------------------------------------------------------------- - Description: - The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdc++, libgcj...). - Homepage: http://gcc.gnu.org/ - - This module can be loaded directly: ml GCC/6.2.0-2.27 - - Help: - The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, - as well as libraries for these languages (libstdc++, libgcj,...). - Homepage: http://gcc.gnu.org/ -``` - -This tells you what the module contains and what the URL to the homepage of the software is. - -## Available Modules for a Particular Software Package - -To check which modules are available for a particular software package, you can provide the software name to `ml av`. -For example, to check which versions of Git are available: - -```console -$ ml av git - --------------------------------------- /apps/modules/tools ---------------------------------------- - git/2.8.0-GNU-4.9.3-2.25 git/2.8.0-intel-2017.00 git/2.9.0 git/2.9.2 git/2.11.0 (D) - - Where: - D: Default Module - -Use "module spider" to find all possible modules. -Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". -``` - -<Callout> - The specified software name is case-insensitive. -</Callout> - -Lmod does a partial match on the module name, so sometimes you need to specify the end of the software name you are interested in: - -```console -$ ml av GCC/ - ------------------------------------------- /apps/modules/compiler ------------------------------------------- -GCC/4.4.7-system GCC/4.8.3 GCC/4.9.2 GCC/4.9.3 GCC/5.1.0-binutils-2.25 GCC/5.3.0-binutils-2.25 GCC/5.3.0-2.26 GCC/5.4.0-2.26 GCC/4.7.4 GCC/4.9.2-binutils-2.25 GCC/4.9.3-binutils-2.25 GCC/4.9.3-2.25 GCC/5.2.0 GCC/5.3.0-2.25 GCC/6.2.0-2.27 (D) - - Where: - D: Default Module - -Use "module spider" to find all possible modules. -Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". -``` - -## Inspecting a Module - -To see how a module would change the environment, use `ml show`: - -```console -$ ml show Python/3.5.2 - -help([[Python is a programming language that lets you work more quickly and integrate your systems more effectively. - Homepage: http://python.org/]]) -whatis("Description: Python is a programming language that lets you work more quickly and integrate your systems more effectively. - Homepage: http://python.org/") -conflict("Python") -load("bzip2/1.0.6") -load("zlib/1.2.8") -load("libreadline/6.3") -load("ncurses/5.9") -load("SQLite/3.8.8.1") -load("Tk/8.6.3") -load("GMP/6.0.0a") -load("XZ/5.2.2") -prepend_path("CPATH","/apps/all/Python/3.5.2/include") -prepend_path("LD_LIBRARY_PATH","/apps/all/Python/3.5.2/lib") -prepend_path("LIBRARY_PATH","/apps/all/Python/3.5.2/lib") -prepend_path("MANPATH","/apps/all/Python/3.5.2/share/man") -prepend_path("PATH","/apps/all/Python/3.5.2/bin") -prepend_path("PKG_CONFIG_PATH","/apps/all/Python/3.5.2/lib/pkgconfig") -setenv("EBROOTPYTHON","/apps/all/Python/3.5.2") -setenv("EBVERSIONPYTHON","3.5.2") -setenv("EBDEVELPYTHON","/apps/all/Python/3.5.2/easybuild/Python-3.5.2-easybuild-devel") -setenv("EBEXTSLISTPYTHON","setuptools-20.1.1,pip-8.0.2,nose-1.3.7") -``` - -<Callout> - Note that both the direct changes to the environment as well as other modules that will be loaded are shown. -</Callout> - -## Loading Modules - -<Callout type=warn> - Always specify the name **and** the version when loading a module. - Loading a default module in your script (e.g. `$ ml intel`) will cause divergent results in the case the default module is upgraded. - **IT4Innovations is not responsible for any loss of allocated core- or node-hours resulting from the use of improper modules in your calculations.** -</Callout> - -To effectively apply the changes to the environment that are specified by a module, use `ml` and specify the name of the module. -For example, to set up your environment to use Intel: - -```console -$ ml intel/2017.00 -$ ml -Currently Loaded Modules: - 1) GCCcore/5.4.0 - 2) binutils/2.26-GCCcore-5.4.0 (H) - 3) icc/2017.0.098-GCC-5.4.0-2.26 - 4) ifort/2017.0.098-GCC-5.4.0-2.26 - 5) iccifort/2017.0.098-GCC-5.4.0-2.26 - 6) impi/2017.0.098-iccifort-2017.0.098-GCC-5.4.0-2.26 - 7) iimpi/2017.00-GCC-5.4.0-2.26 - 8) imkl/2017.0.098-iimpi-2017.00-GCC-5.4.0-2.26 - 9) intel/2017.00 - - Where: - H: Hidden Module -``` - -<Callout> - Note that even though we only loaded a single module, the output of `ml` shows that a whole set of modules was loaded. These are required dependencies for `intel/2017.00`. -</Callout> - -## Conflicting Modules - -<Callout type=warn> - It is important to note that **only modules that are compatible with each other can be loaded together. In particular, modules must be installed either with the same toolchain as the modules that are already loaded, or with a compatible (sub)toolchain**. -</Callout> - -For example, once you have loaded one or more modules that were installed with the `intel/2017.00` toolchain, all other modules that you load should have been installed with the same toolchain. - -In addition, only **one single version** of each software package can be loaded at a particular time. For example, once you have the `Python/3.5.2-intel-2017.00` module loaded, you cannot load a different version of Python in the same session/job script, neither directly, nor indirectly as a dependency of another module you want to load. - -## Unloading Modules - -To revert the changes to the environment that were made by a particular module, you can use `ml -<modname>`. -For example: - -```console -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) 2) lmod/7.2.2 -$ which gcc -/usr/bin/gcc -$ ml GCC/ -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) 2) lmod/7.2.2 3) GCCcore/6.2.0 4) binutils/2.27-GCCcore-6.2.0 (H) 5) GCC/6.2.0-2.27 -$ which gcc -/apps/all/GCCcore/6.2.0/bin/gcc -$ ml -GCC -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) 2) lmod/7.2.2 3) GCCcore/6.2.0 4) binutils/2.27-GCCcore-6.2.0 (H) -$ which gcc -/usr/bin/gcc -``` - -## Resetting by Unloading All Modules - -To reset your environment back to a clean state, you can use `ml purge` or `ml purge --force`: - -```console -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) 2) lmod/7.2.2 3) GCCcore/6.2.0 4) binutils/2.27-GCCcore-6.2.0 (H) -$ ml purge -The following modules were not unloaded: - (Use "module --force purge" to unload all): - 1) EasyBuild/3.0.0 -$ ml -Currently Loaded Modules: - 1) EasyBuild/3.0.0 (S) -$ ml purge --force -$ ml -No modules loaded -``` - -As such, you should not (re)load the cluster module anymore after running `ml purge`. - -## Module Collections - -If you have a set of modules that you need to load often, you can save these in a collection (only works with Lmod). - -First, load all the modules you need, for example: - -```console -$ ml intel/2017.00 Python/3.5.2-intel-2017.00 -``` - -Now store them in a collection using `ml save`: - -```console -$ ml save my-collection -``` - -Later, for example in a job script, you can reload all these modules with `ml restore`: - -```console -$ ml restore my-collection -``` - -With `ml savelist`, you can get a list of all saved collections: - -```console -$ ml savelist -Named collection list: - 1) my-collection - 2) my-test-collection -``` - -To inspect a collection, use `ml describe`. - -To remove a module collection, remove the corresponding entry in $HOME/.lmod.d. - -[1]: #resetting-by-unloading-all-modules - -[a]: http://lmod.readthedocs.io diff --git a/content/docs/software/modules/meta.json b/content/docs/software/modules/meta.json deleted file mode 100644 index 1b652db6e67b687f2c8db509c21e199eb6113826..0000000000000000000000000000000000000000 --- a/content/docs/software/modules/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Modules", - "pages": [ - "lmod", - "new-software" - ] -} diff --git a/content/docs/software/modules/new-software.mdx b/content/docs/software/modules/new-software.mdx deleted file mode 100644 index dc1487a9910fabbb47627e60fe891b8d617a8b45..0000000000000000000000000000000000000000 --- a/content/docs/software/modules/new-software.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "New Software Installation Request" ---- -If you need to install new software on IT4Innovations' clusters, send your request to [support\[at\]it4i.cz][a]. -In the request, provide the following information: - -1. Software name **(required)**; -1. Website **(required)**; -1. Type of software (e.g. open-source, commercial, ...) **(required)**; -1. Required software version (specific version or 'latest') **(required)**; -1. Dependencies (both required and optional ones that are required for your use case); -1. Pointer to installation guide **(required)**; -1. Pointer to documentation on how to test installation; -1. Details of license server, hostname and port(s) (if any); -1. Instructions to run test case; -1. Short motivation describing why you want to use this software **(required)**; -1. When would you like to use this software? **(required)**; -1. Toolchain preference (e.g. intel/2020a, ...); -1. Does this software need to be made available to only a particular group of users? **(required)** - - No, installation can be public; - - Yes (specify the group of users). - -[a]: mailto:support@it4i.cz diff --git a/content/docs/software/mpi/jupyter_mpi.mdx b/content/docs/software/mpi/jupyter_mpi.mdx deleted file mode 100644 index 96933b7c7eeac698b9361ee4667c66539f94bcf6..0000000000000000000000000000000000000000 --- a/content/docs/software/mpi/jupyter_mpi.mdx +++ /dev/null @@ -1,333 +0,0 @@ ---- -title: "SLURM and Parallel Processing in Jupyter-Lab via OOD" ---- -When working in Jupyter Lab, you can leverage session outputs or run parallel tasks, which is beneficial for efficient computation across multiple nodes. This guide shows way to run SLURM tasks from a Jupyter notebook using Open OnDemand (OOD). - -## Accessing OOD - -1. Open [this link to start a new OOD Jupyter Lab session](https://ood-karolina.it4i.cz/pun/sys/dashboard/batch_connect/sys/bc_it4i_jupyter/session_contexts/new). - -2. Start a job with 2 nodes and 256 cores. - - - -3. A window with Jupyter Lab will open, where you can continue working. - -## Setting Up Jupyter Lab - -1. Once Jupyter Lab opens, select **File** → **New Launcher**. -2. Select **Notebook** → **Python 3 (ipykernel)** to create a new notebook. - - - - -## Inserting the Sample Code - -Paste the following sample code into your new notebook to run a parallel task using MPI: - -```python -import ipyparallel as ipp - -def mpi_example(): - from mpi4py import MPI - comm = MPI.COMM_WORLD - return f"Hello World from rank {comm.Get_rank()}. total ranks={comm.Get_size()}. host={MPI.Get_processor_name()}" - -# Request an MPI cluster with 256 engines -with ipp.Cluster(controller_ip="*", engines="mpi", n=256) as rc: - # Get a broadcast_view on the cluster which is best suited for MPI style computation - view = rc.broadcast_view() - - # Run the mpi_example function on all engines in parallel - r = view.apply_sync(mpi_example) - - # Retrieve and print the result from the engines - print("\n".join(r)) -# At this point, the cluster processes have been shutdown -``` - - - -## Explanation of the Code - -* ipyparallel: Used for parallel computations with multiple processes. -* mpi4py: A library for working with MPI (Message Passing Interface), which is a method for efficient parallel processing across multiple nodes. -* The function mpi_example() returns information about each process, such as its rank, total number of processes, and host name. -* Using ipp.Cluster, we request a cluster with 256 cores and run the function on all nodes concurrently. - -## Job Output - -### After Execution - -When the code is executed, you will see an output similar to this - -```console -Starting 256 engines with <class 'ipyparallel.cluster.launcher.MPIEngineSetLauncher'> -  0% - 0/256 [00:00<?, ?engine/s] -``` - -### After Completing the Calculation - -```console -Starting 256 engines with <class 'ipyparallel.cluster.launcher.MPIEngineSetLauncher'> -100% - 256/256 [00:27<00:00,  2.64engine/s] -Hello World from rank 0. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 1. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 2. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 3. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 4. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 5. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 6. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 7. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 8. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 9. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 10. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 11. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 12. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 13. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 14. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 15. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 16. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 17. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 18. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 19. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 20. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 21. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 22. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 23. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 24. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 25. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 26. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 27. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 28. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 29. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 30. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 31. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 32. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 33. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 34. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 35. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 36. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 37. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 38. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 39. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 40. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 41. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 42. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 43. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 44. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 45. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 46. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 47. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 48. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 49. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 50. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 51. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 52. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 53. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 54. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 55. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 56. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 57. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 58. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 59. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 60. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 61. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 62. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 63. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 64. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 65. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 66. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 67. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 68. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 69. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 70. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 71. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 72. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 73. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 74. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 75. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 76. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 77. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 78. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 79. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 80. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 81. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 82. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 83. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 84. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 85. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 86. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 87. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 88. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 89. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 90. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 91. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 92. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 93. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 94. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 95. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 96. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 97. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 98. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 99. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 100. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 101. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 102. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 103. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 104. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 105. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 106. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 107. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 108. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 109. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 110. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 111. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 112. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 113. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 114. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 115. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 116. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 117. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 118. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 119. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 120. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 121. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 122. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 123. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 124. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 125. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 126. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 127. total ranks=256. host=cn090.karolina.it4i.cz -Hello World from rank 128. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 129. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 130. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 131. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 132. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 133. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 134. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 135. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 136. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 137. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 138. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 139. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 140. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 141. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 142. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 143. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 144. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 145. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 146. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 147. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 148. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 149. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 150. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 151. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 152. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 153. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 154. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 155. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 156. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 157. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 158. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 159. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 160. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 161. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 162. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 163. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 164. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 165. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 166. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 167. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 168. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 169. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 170. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 171. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 172. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 173. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 174. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 175. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 176. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 177. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 178. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 179. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 180. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 181. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 182. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 183. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 184. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 185. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 186. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 187. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 188. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 189. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 190. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 191. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 192. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 193. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 194. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 195. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 196. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 197. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 198. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 199. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 200. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 201. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 202. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 203. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 204. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 205. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 206. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 207. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 208. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 209. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 210. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 211. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 212. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 213. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 214. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 215. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 216. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 217. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 218. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 219. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 220. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 221. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 222. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 223. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 224. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 225. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 226. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 227. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 228. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 229. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 230. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 231. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 232. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 233. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 234. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 235. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 236. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 237. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 238. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 239. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 240. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 241. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 242. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 243. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 244. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 245. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 246. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 247. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 248. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 249. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 250. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 251. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 252. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 253. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 254. total ranks=256. host=cn091.karolina.it4i.cz -Hello World from rank 255. total ranks=256. host=cn091.karolina.it4i.cz -Stopping engine(s): 1733739848 -``` diff --git a/content/docs/software/mpi/meta.json b/content/docs/software/mpi/meta.json deleted file mode 100644 index 496faf259ad3c27bceb915cc50b1558987aea73c..0000000000000000000000000000000000000000 --- a/content/docs/software/mpi/meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Mpi", - "pages": [ - "jupyter_mpi", - "mpi", - "mpi4py-mpi-for-python", - "ompi-examples" - ] -} diff --git a/content/docs/software/mpi/mpi.mdx b/content/docs/software/mpi/mpi.mdx deleted file mode 100644 index 7b0bca08ed4f80d8d3eedfcf0f9bcb157213c9d4..0000000000000000000000000000000000000000 --- a/content/docs/software/mpi/mpi.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: "MPI" ---- -## Setting Up MPI Environment - -The Karolina cluster provides several implementations of the MPI library: - -* OpenMPI -* Intel MPI (impi) -* MPICH - -MPI libraries are activated via the environment modules. - -<Callout> - All OpenMPI modules are configured with `setenv("SLURM_MPI_TYPE", "pmix_v4")`. -</Callout> - -Look up the modulefiles/mpi section in `ml av`: - -```console -$ ml av -------------------------------------------------------- /apps/modules/mpi ------------------------------------------------------- - OpenMPI/3.1.4-GCC-6.3.0-2.27 OpenMPI/4.1.1-GCC-10.2.0 - OpenMPI/4.0.3-GCC-9.3.0 OpenMPI/4.1.1-GCC-10.3.0 (D) - OpenMPI/4.0.5-GCC-10.2.0 impi/2017.4.239-iccifort-2017.8.262-GCC-6.3.0-2.27 - OpenMPI/4.0.5-gcccuda-2020b impi/2018.4.274-iccifort-2018.5.274-GCC-8.3.0-2.32 - OpenMPI/4.0.5-iccifort-2020.4.304 impi/2018.4.274-iccifort-2019.1.144-GCC-8.2.0-2.31.1 - OpenMPI/4.0.5-NVHPC-21.2-CUDA-11.2.2 impi/2019.9.304-iccifort-2020.1.217 - OpenMPI/4.0.5-NVHPC-21.2-CUDA-11.3.0 impi/2019.9.304-iccifort-2020.4.304 - OpenMPI/4.1.1-GCC-10.2.0-Java-1.8.0_221 impi/2021.2.0-intel-compilers-2021.2.0 (D) - MPICH/3.3.2-GCC-10.2.0 -``` - -There are default compilers associated with any particular MPI implementation. The defaults may be changed; the MPI libraries may be used in conjunction with any compiler. - -Examples: - -```console -$ ml gompi/2020b -``` - -In this example, we activate the OpenMPI with the GNU compilers (OpenMPI 4.0.5 and GCC 10.2.0). For more information about toolchains, see the [Environment and Modules][1] section. - -To use OpenMPI with the Intel compiler suite, use: - -```console -$ ml iompi/2020b -``` - -In this example, the OpenMPI 4.0.5 using the Intel compilers 2020.4.304 is activated. It uses the `iompi` toolchain. - -## Compiling MPI Programs - -After setting up your MPI environment, compile your program using one of the MPI wrappers: - -For module `gompi/2020b` - -```console -$ mpicc -v -Using built-in specs. -COLLECT_GCC=/apps/all/GCCcore/10.2.0/bin/gcc -COLLECT_LTO_WRAPPER=/apps/all/GCCcore/10.2.0/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -OFFLOAD_TARGET_NAMES=nvptx-none -Target: x86_64-pc-linux-gnu -Configured with: ../configure --enable-languages=c,c++,fortran --without-cuda-driver --enable-offload-targets=nvptx-none --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-plugins --enable-gold=default --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/all/GCCcore/10.2.0 --with-local-prefix=/apps/all/GCCcore/10.2.0 --enable-bootstrap --with-isl=/dev/shm/easybuild/build/GCCcore/10.2.0/system-system/gcc-10.2.0/stage2_stuff -Thread model: posix -Supported LTO compression algorithms: zlib -gcc version 10.2.0 (GCC) -$ mpif77 -v -Using built-in specs. -COLLECT_GCC=/apps/all/GCCcore/10.2.0/bin/gfortran -COLLECT_LTO_WRAPPER=/apps/all/GCCcore/10.2.0/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -OFFLOAD_TARGET_NAMES=nvptx-none -Target: x86_64-pc-linux-gnu -Configured with: ../configure --enable-languages=c,c++,fortran --without-cuda-driver --enable-offload-targets=nvptx-none --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-plugins --enable-gold=default --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/all/GCCcore/10.2.0 --with-local-prefix=/apps/all/GCCcore/10.2.0 --enable-bootstrap --with-isl=/dev/shm/easybuild/build/GCCcore/10.2.0/system-system/gcc-10.2.0/stage2_stuff -Thread model: posix -Supported LTO compression algorithms: zlib -gcc version 10.2.0 (GCC) -~$ mpif90 -v -Using built-in specs. -COLLECT_GCC=/apps/all/GCCcore/10.2.0/bin/gfortran -COLLECT_LTO_WRAPPER=/apps/all/GCCcore/10.2.0/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -OFFLOAD_TARGET_NAMES=nvptx-none -Target: x86_64-pc-linux-gnu -Configured with: ../configure --enable-languages=c,c++,fortran --without-cuda-driver --enable-offload-targets=nvptx-none --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-plugins --enable-gold=default --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/all/GCCcore/10.2.0 --with-local-prefix=/apps/all/GCCcore/10.2.0 --enable-bootstrap --with-isl=/dev/shm/easybuild/build/GCCcore/10.2.0/system-system/gcc-10.2.0/stage2_stuff -Thread model: posix -Supported LTO compression algorithms: zlib -gcc version 10.2.0 (GCC) -``` - -When using Intel MPI, use the following MPI wrappers: - -For module `intel/2020b` - -```console -$ mpiicc -v -mpiicc for the Intel(R) MPI Library 2019 Update 9 for Linux* -Copyright 2003-2020, Intel Corporation. -icc version 19.1.3.304 (gcc version 10.2.0 compatibility) -ld /lib/../lib64/crt1.o /lib/../lib64/crti.o /apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbegin.o --eh-frame-hdr --build-id -dynamic-linker /lib64/ld-linux-x86-64.so.2 -m elf_x86_64 -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -o a.out -L/apps/all/imkl/2020.4.304-iimpi-2020b/mkl/lib/intel64 -L/apps/all/imkl/2020.4.304-iimpi-2020b/lib/intel64 -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/libfabric/lib -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/tbb/lib/intel64/gcc4.8 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/../lib64 -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/../lib64 -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/../lib64 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/../lib64 -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64 -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/ -L/lib/../lib64 -L/lib/../lib64/ -L/usr/lib/../lib64 -L/usr/lib/../lib64/ -L/apps/all/imkl/2020.4.304-iimpi-2020b/mkl/lib/intel64/ -L/apps/all/imkl/2020.4.304-iimpi-2020b/lib/intel64/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/libfabric/lib/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/ -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib64 -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/ -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib64 -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/ -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/tbb/lib/intel64/gcc4.8/ -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib64 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/ -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib64 -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../ -L/lib64 -L/lib/ -L/usr/lib64 -L/usr/lib --enable-new-dtags -rpath /apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -rpath /apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -lmpifort -lmpi -ldl -lrt -lpthread -Bdynamic -Bstatic -limf -lsvml -lirng -Bdynamic -lm -Bstatic -lipgo -ldecimal --as-needed -Bdynamic -lcilkrts -lstdc++ --no-as-needed -lgcc -lgcc_s -Bstatic -lirc -lsvml -Bdynamic -lc -lgcc -lgcc_s -Bstatic -lirc_s -Bdynamic -ldl -lc /apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtend.o /lib/../lib64/crtn.o -$ mpiifort -v -mpiifort for the Intel(R) MPI Library 2019 Update 9 for Linux* -Copyright 2003-2020, Intel Corporation. -ifort version 19.1.3.304 -ld /lib/../lib64/crt1.o /lib/../lib64/crti.o /apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbegin.o --eh-frame-hdr --build-id -dynamic-linker /lib64/ld-linux-x86-64.so.2 -m elf_x86_64 -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -o a.out /apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/for_main.o -L/apps/all/imkl/2020.4.304-iimpi-2020b/mkl/lib/intel64 -L/apps/all/imkl/2020.4.304-iimpi-2020b/lib/intel64 -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/libfabric/lib -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/tbb/lib/intel64/gcc4.8 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/../lib64 -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/../lib64 -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/../lib64 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/../lib64 -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/../lib64/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64 -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/ -L/lib/../lib64 -L/lib/../lib64/ -L/usr/lib/../lib64 -L/usr/lib/../lib64/ -L/apps/all/imkl/2020.4.304-iimpi-2020b/mkl/lib/intel64/ -L/apps/all/imkl/2020.4.304-iimpi-2020b/lib/intel64/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/libfabric/lib/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release/ -L/apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/ -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib64 -L/apps/all/UCX/1.9.0-GCCcore-10.2.0/lib/ -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib64 -L/apps/all/numactl/2.0.13-GCCcore-10.2.0/lib/ -L/apps/all/iccifort/2020.4.304/compilers_and_libraries_2020.4.304/linux/tbb/lib/intel64/gcc4.8/ -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib64 -L/apps/all/binutils/2.35-GCCcore-10.2.0/lib/ -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib64 -L/apps/all/zlib/1.2.11-GCCcore-10.2.0/lib/ -L/apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../ -L/lib64 -L/lib/ -L/usr/lib64 -L/usr/lib --enable-new-dtags -rpath /apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib/release -rpath /apps/all/impi/2019.9.304-iccifort-2020.4.304/intel64/lib -lmpifort -lmpi -ldl -lrt -lpthread -Bdynamic -Bstatic -lifport -lifcoremt -limf -lsvml -Bdynamic -lm -Bstatic -lipgo -lirc -Bdynamic -lpthread -Bstatic -lsvml -Bdynamic -lc -lgcc -lgcc_s -Bstatic -lirc_s -Bdynamic -ldl -lc /apps/all/GCCcore/10.2.0/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtend.o /lib/../lib64/crtn.o -``` - -Wrappers `mpif90` and `mpif77` provided by Intel MPI are designed for GCC and GFortran. You might be able to compile MPI code by them even with Intel compilers, but you might run into problems. - -Example program: - -```cpp -// helloworld_mpi.c -#include <stdio.h> - -#include<mpi.h> - -int main(int argc, char **argv) { - -int len; -int rank, size; -char node[MPI_MAX_PROCESSOR_NAME]; - -// Initiate MPI -MPI_Init(&argc, &argv); -MPI_Comm_rank(MPI_COMM_WORLD,&rank); -MPI_Comm_size(MPI_COMM_WORLD,&size); - -// Get hostame and print -MPI_Get_processor_name(node,&len); -printf("Hello world! from rank %d of %d on host %sn",rank,size,node); - -// Finalize and exit -MPI_Finalize(); - -return 0; -} -``` - -Compile the above example with: - -```console -$ mpicc helloworld_mpi.c -o helloworld_mpi.x -``` - -## Running MPI Programs - -The MPI program executable must be compatible with the loaded MPI module. -Always compile and execute using the very same MPI module. - -It is strongly discouraged to mix MPI implementations. Linking an application with one MPI implementation and running `mpirun`/`mpiexec` from another implementation may result in unexpected errors. - -The MPI program executable must be available within the same path on all nodes. This is automatically fulfilled on the /home and /scratch filesystem. You need to preload the executable if running on the local scratch /lscratch filesystem. - -### Ways to Run MPI Programs - -The optimal way to run an MPI program depends on its memory requirements, memory access pattern and communication pattern. - -<Callout> - Consider these ways to run an MPI program: - 1. One MPI process per node, 128 threads per process - 2. Two MPI processes per node, 64 threads per process - 3. 128 MPI processes per node, 1 thread per process. -</Callout> - -**One MPI** process per node, using 128 threads, is most useful for memory demanding applications that make good use of processor cache memory and are not memory-bound. This is also a preferred way for communication intensive applications as one process per node enjoys full bandwidth access to the network interface. - -**Two MPI** processes per node, using 64 threads each, bound to processor socket is most useful for memory bandwidth-bound applications such as BLAS1 or FFT with scalable memory demand. However, note that the two processes will share access to the network interface. The 64 threads and socket binding should ensure maximum memory access bandwidth and minimize communication, migration, and NUMA effect overheads. - -<Callout type=warn> - Important! Bind every OpenMP thread to a core! -</Callout> - -In the previous two cases with one or two MPI processes per node, the operating system might still migrate OpenMP threads between cores. You want to avoid this by setting the `KMP_AFFINITY` or `GOMP_CPU_AFFINITY` environment variables. - -**128 MPI** processes per node, using 1 thread each bound to a processor core is most suitable for highly scalable applications with low communication demand. - -[1]: ../../modules-matrix.md - -[a]: http://www.open-mpi.org/ diff --git a/content/docs/software/mpi/mpi4py-mpi-for-python.mdx b/content/docs/software/mpi/mpi4py-mpi-for-python.mdx deleted file mode 100644 index 24c28dd79f2ea375c99e82f3123e81d6d2542a61..0000000000000000000000000000000000000000 --- a/content/docs/software/mpi/mpi4py-mpi-for-python.mdx +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: "MPI4Py (MPI for Python)" ---- -## Introduction - -MPI for Python provides bindings of the Message Passing Interface (MPI) standard for the Python programming language, allowing any Python program to exploit multiple processors. - -This package is constructed on top of the MPI-1/2 specifications and provides an object-oriented interface, which closely follows MPI-2 C++ bindings. It supports point-to-point (sends, receives) and collective (broadcasts, scatters, gathers) communications of any picklable Python object, as well as optimized communications of Python object exposing the single-segment buffer interface (NumPy arrays, builtin bytes/string/array objects). - -MPI4Py is available in standard Python modules on the clusters. - -## Modules - -MPI4Py is built for OpenMPI or Intel MPI. Before you start with MPI4Py, you need to load the mpi4py module. - -```console -$ ml av mpi4py - --------------------------------------- /apps/modules/lib --------------------------------------- - mpi4py/3.1.4-gompi-2022b mpi4py/3.1.4-gompi-2023a mpi4py/3.1.5-gompi-2023b (D) -``` - -## Execution - -You need to import MPI to your Python program. Include the following line to the Python script: - -```python -from mpi4py import MPI -``` - -The MPI4Py-enabled Python programs execute as any other OpenMPI code. The simpliest way is to run: - -```console -$ mpirun python <script>.py -``` - -For example: - -```console -$ mpirun python hello_world.py -``` - -## Examples - -Execute the above code as: - -```console -$ salloc -p qcpu -A PROJECT_ID --nodes=4 --ntasks-per-node=128 --cpus-per-task=1 -$ ml mpi4py/3.1.5-gompi-2023b -``` - -### Hello World! - -```python -#!/usr/bin/env python -""" -Parallel Hello World -""" - -from mpi4py import MPI -import sys - -size = MPI.COMM_WORLD.Get_size() -rank = MPI.COMM_WORLD.Get_rank() -name = MPI.Get_processor_name() - -sys.stdout.write( - "Hello, World! I am process %d of %d on %s.\n" - % (rank, size, name)) -``` - -```console -mpirun python ./hello_world.py -... -Hello, World! I am process 81 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 91 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 15 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 105 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 112 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 11 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 83 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 58 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 103 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 4 of 512 on cn041.karolina.it4i.cz. -Hello, World! I am process 28 of 512 on cn041.karolina.it4i.cz. -``` - -### Mandelbrot - -```python -from mpi4py import MPI -import numpy as np - -tic = MPI.Wtime() - -x1 = -2.0 -x2 = 1.0 -y1 = -1.0 -y2 = 1.0 - -w = 150 -h = 100 -maxit = 127 - -def mandelbrot(x, y, maxit): - c = x + y*1j - z = 0 + 0j - it = 0 - while abs(z) < 2 and it < maxit: - z = z**2 + c - it += 1 - return it - -comm = MPI.COMM_WORLD -size = comm.Get_size() -rank = comm.Get_rank() - -rmsg = np.empty(4, dtype='f') -imsg = np.empty(3, dtype='i') - -if rank == 0: - rmsg[:] = [x1, x2, y1, y2] - imsg[:] = [w, h, maxit] - -comm.Bcast([rmsg, MPI.FLOAT], root=0) -comm.Bcast([imsg, MPI.INT], root=0) - -x1, x2, y1, y2 = [float(r) for r in rmsg] -w, h, maxit = [int(i) for i in imsg] -dx = (x2 - x1) / w -dy = (y2 - y1) / h - -# number of lines to compute here -N = h // size + (h % size > rank) -N = np.array(N, dtype='i') -# indices of lines to compute here -I = np.arange(rank, h, size, dtype='i') -# compute local lines -C = np.empty([N, w], dtype='i') -for k in np.arange(N): - y = y1 + I[k] * dy - for j in np.arange(w): - x = x1 + j * dx - C[k, j] = mandelbrot(x, y, maxit) -# gather results at root -counts = 0 -indices = None -cdata = None -if rank == 0: - counts = np.empty(size, dtype='i') - indices = np.empty(h, dtype='i') - cdata = np.empty([h, w], dtype='i') -comm.Gather(sendbuf=[N, MPI.INT], - recvbuf=[counts, MPI.INT], - root=0) -comm.Gatherv(sendbuf=[I, MPI.INT], - recvbuf=[indices, (counts, None), MPI.INT], - root=0) -comm.Gatherv(sendbuf=[C, MPI.INT], - recvbuf=[cdata, (counts*w, None), MPI.INT], - root=0) -# reconstruct full result at root -if rank == 0: - M = np.zeros([h,w], dtype='i') - M[indices, :] = cdata - -toc = MPI.Wtime() -wct = comm.gather(toc-tic, root=0) -if rank == 0: - for task, time in enumerate(wct): - print('wall clock time: %8.2f seconds (task %d)' % (time, task)) - def mean(seq): return sum(seq)/len(seq) - print ('all tasks, mean: %8.2f seconds' % mean(wct)) - print ('all tasks, min: %8.2f seconds' % min(wct)) - print ('all tasks, max: %8.2f seconds' % max(wct)) - print ('all tasks, sum: %8.2f seconds' % sum(wct)) - -# eye candy (requires matplotlib) -if rank == 0: - try: - from matplotlib import pyplot as plt - plt.imshow(M, aspect='equal') - plt.spectral() - try: - import signal - def action(*args): raise SystemExit - signal.signal(signal.SIGALRM, action) - signal.alarm(2) - except: - pass - plt.show() - except: - pass -MPI.COMM_WORLD.Barrier() -``` - -```console -mpirun python mandelbrot.py -... -wall clock time: 0.26 seconds (task 505) -wall clock time: 0.25 seconds (task 506) -wall clock time: 0.24 seconds (task 507) -wall clock time: 0.25 seconds (task 508) -wall clock time: 0.25 seconds (task 509) -wall clock time: 0.26 seconds (task 510) -wall clock time: 0.25 seconds (task 511) -all tasks, mean: 0.19 seconds -all tasks, min: 0.00 seconds -all tasks, max: 0.73 seconds -all tasks, sum: 96.82 seconds -``` - -In this example, we run MPI4Py-enabled code on 4 nodes, 128 cores per node (total of 512 processes), each Python process is bound to a different core. More examples and documentation can be found on [MPI for Python webpage][a]. - -You can increase `n` and watch the time lowering. - -[a]: https://pypi.python.org/pypi/mpi4py diff --git a/content/docs/software/mpi/ompi-examples.mdx b/content/docs/software/mpi/ompi-examples.mdx deleted file mode 100644 index f7101f0c94f92688263d4712dd336fddcea6b895..0000000000000000000000000000000000000000 --- a/content/docs/software/mpi/ompi-examples.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -title: "OpenMPI Sample Applications" ---- -Sample MPI applications provided both as a trivial primer to MPI as well as simple tests to ensure that your OpenMPI installation is working properly. - -## Examples - -There are two MPI examples, each using one of six different MPI interfaces: - -### Hello World - -``` -/* - * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana - * University Research and Technology - * Corporation. All rights reserved. - * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. - * - * Sample MPI "hello world" application in C - */ - -<!-- markdownlint-disable MD018 MD025 --> -#include <stdio.h> -#include "mpi.h" - -int main(int argc, char* argv[]) -{ - int rank, size, len; - char version[MPI_MAX_LIBRARY_VERSION_STRING]; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - MPI_Get_library_version(version, &len); - printf("Hello, world, I am %d of %d, (%s, %d)\n", - rank, size, version, len); - MPI_Finalize(); - - return 0; -} -``` - -``` -// -// Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -// University Research and Technology -// Corporation. All rights reserved. -// Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. -// -// Sample MPI "hello world" application in C++ -// -// NOTE: The MPI C++ bindings were deprecated in MPI-2.2 and removed -// from the standard in MPI-3. Open MPI still provides C++ MPI -// bindings, but they are no longer built by default (and may be -// removed in a future version of Open MPI). You must -// --enable-mpi-cxx when configuring Open MPI to enable the MPI C++ -// bindings. -// - -<!-- markdownlint-disable MD018 MD025 --> -#include "mpi.h" -<!-- markdownlint-disable MD022 --> -#include <iostream> - -int main(int argc, char **argv) -{ - int rank, size, len; - char version[MPI_MAX_LIBRARY_VERSION_STRING]; - - MPI::Init(); - rank = MPI::COMM_WORLD.Get_rank(); - size = MPI::COMM_WORLD.Get_size(); - MPI_Get_library_version(version, &len); - std::cout << "Hello, world! I am " << rank << " of " << size - << "(" << version << ", " << len << ")" << std::endl; - MPI::Finalize(); - - return 0; -} -``` - -``` -C -C Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -C University Research and Technology -C Corporation. All rights reserved. -C Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -C $COPYRIGHT$ -C -C Sample MPI "hello world" application using the Fortran mpif.h -C bindings. -C - program main - implicit none - include 'mpif.h' - integer ierr, rank, size, len - character(len=MPI_MAX_LIBRARY_VERSION_STRING) version - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - call MPI_GET_LIBRARY_VERSION(version, len, ierr) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": ", a)') - & rank, size, version - - call MPI_FINALIZE(ierr) - - end -``` - -``` -! -! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -! University Research and Technology -! Corporation. All rights reserved. -! Copyright (c) 2004-2005 The Regents of the University of California. -! All rights reserved. -! Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -! $COPYRIGHT$ -! -! Sample MPI "hello world" application using the Fortran mpi module -! bindings. -! -program main - use mpi - implicit none - integer :: ierr, rank, size, len - character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: version - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - call MPI_GET_LIBRARY_VERSION(version, len, ierr) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": ", a)') & - rank, size, version - - call MPI_FINALIZE(ierr) -end -``` - -``` -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -/* - * Author of revised version: Franklyn Pinedo - * - * Adapted from Source Code in C of Tutorial/User's Guide for MPI by - * Peter Pacheco. - */ -/* - * Copyright (c) 2011 Cisco Systems, Inc. All rights reserved. - * - */ - -import mpi.*; - -class Hello { - static public void main(String[] args) throws MPIException { - - MPI.Init(args); - - int myrank = MPI.COMM_WORLD.getRank(); - int size = MPI.COMM_WORLD.getSize() ; - System.out.println("Hello world from rank " + myrank + " of " + size); - - MPI.Finalize(); - } -} -``` - -* C: [hello_c.c](/it4i/src/ompi/hello_c.c) -* C++: [hello_cxx.cc](/it4i/src/ompi/hello_cxx.cc) -* Fortran mpif.h: [hello_mpifh.f](/it4i/src/ompi/hello_mpifh.f) -* Fortran use mpi: [hello_usempi.f90](/it4i/src/ompi/hello_usempi.f90) -* Fortran use mpi_f08: [hello_usempif08.f90](/it4i/src/ompi/hello_usempif08.f90) -* Java: [Hello.java](/it4i/src/ompi/Hello.java) -* C shmem.h: [hello_oshmem_c.c](/it4i/src/ompi/hello_oshmem_c.c) -* Fortran shmem.fh: [hello_oshmemfh.f90](/it4i/src/ompi/hello_oshmemfh.f90) - -<!-- markdownlint-disable MD001 --> -### Send a Trivial Message Around in a Ring - -* C: [ring_c.c](/it4i/src/ompi/ring_c.c) -* C++: [ring_cxx.cc](/it4i/src/ompi/ring_cxx.cc) -* Fortran mpif.h: [ring_mpifh.f](/it4i/src/ompi/ring_mpifh.f) -* Fortran use mpi: [ring_usempi.f90](/it4i/src/ompi/ring_usempi.f90) -* Fortran use mpi_f08: [ring_usempif08.f90](/it4i/src/ompi/ring_usempif08.f90) -* Java: [Ring.java](/it4i/src/ompi/Ring.java) -* C shmem.h: [ring_oshmem_c.c](/it4i/src/ompi/ring_oshmem_c.c) -* Fortran shmem.fh: [ring_oshmemfh.f90](/it4i/src/ompi/ring_oshmemfh.f90) - -Additionally, there's one further example application, but this one only uses the MPI C bindings: - -<!-- markdownlint-disable MD001 --> -### Test the Connectivity Between All Pross - -* C: [connectivity_c.c](/it4i/src/ompi/connectivity_c.c) - -## Build Examples - -Download [examples](/it4i/src/ompi/ompi.tar.gz). - -The Makefile in this directory will build the examples for the supported languages (e.g., if you do not have the Fortran "use mpi" bindings compiled as part of OpenMPI, those examples will be skipped). - -The Makefile assumes that the wrapper compilers mpicc, mpic++, and mpifort are in your path. - -Although the Makefile is tailored for OpenMPI (e.g., it checks the *mpi_info* command to see if you have support for C++, mpif.h, use mpi, and use mpi_f08 F90), all of the example programs are pure MPI, and therefore not specific to OpenMPI. Hence, you can use a different MPI implementation to compile and run these programs if you wish. - -```console -$ tar xvf ompi.tar.gz -ompi/ -ompi/ring_usempif08.f90 -ompi/hello_c.c -ompi/oshmem_max_reduction.c -... -... -ompi/hello_usempi.f90 -$ cd ompi -$ ml OpenMPI/4.1.4-GCC-11.3.0 -$ make -mpicc -g hello_c.c -o hello_c -mpicc -g ring_c.c -o ring_c -mpicc -g connectivity_c.c -o connectivity_c -mpicc -g spc_example.c -o spc_example -mpic++ -g hello_cxx.cc -o hello_cxx -mpic++ -g ring_cxx.cc -o ring_cxx -mpifort -g hello_mpifh.f -o hello_mpifh -mpifort -g ring_mpifh.f -o ring_mpifh -mpifort -g hello_usempi.f90 -o hello_usempi -mpifort -g ring_usempi.f90 -o ring_usempi -mpifort -g hello_usempif08.f90 -o hello_usempif08 -mpifort -g ring_usempif08.f90 -o ring_usempif08 -mpijavac Hello.java -mpijavac Ring.java -shmemcc -g hello_oshmem_c.c -o hello_oshmem -shmemc++ -g hello_oshmem_cxx.cc -o hello_oshmemcxx -shmemcc -g ring_oshmem_c.c -o ring_oshmem -shmemcc -g oshmem_shmalloc.c -o oshmem_shmalloc -shmemcc -g oshmem_circular_shift.c -o oshmem_circular_shift -shmemcc -g oshmem_max_reduction.c -o oshmem_max_reduction -shmemcc -g oshmem_strided_puts.c -o oshmem_strided_puts -shmemcc -g oshmem_strided_puts.c -o oshmem_strided_puts -shmemcc -g oshmem_symmetric_data.c -o oshmem_symmetric_data -shmemfort -g hello_oshmemfh.f90 -o hello_oshmemfh -shmemfort -g ring_oshmemfh.f90 -o ring_oshmemfh -$ find . -executable -type f -./hello_oshmem -./dtrace/myppriv.sh -./dtrace/partrace.sh -./oshmem_shmalloc -./ring_cxx -./ring_usempi -./hello_mpifh -./hello_cxx -./oshmem_max_reduction -./oshmem_symmetric_data -./oshmem_strided_puts -./hello_usempif08 -./ring_usempif08 -./spc_example -./hello_oshmemfh -./ring_oshmem -./oshmem_circular_shift -./hello_c -./ring_c -./hello_usempi -./ring_oshmemfh -./connectivity_c -./ring_mpifh -``` diff --git a/content/docs/software/numerical-languages/introduction.mdx b/content/docs/software/numerical-languages/introduction.mdx deleted file mode 100644 index c9df267202b51d90db2b55a6ebd8f5c66240e797..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/introduction.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Numerical Languages" ---- -Interpreted languages for numerical computations and analysis - -## Introduction - -This section contains a collection of high-level interpreted languages, primarily intended for numerical computations. - -## MATLAB - -MATLAB® is a high-level language and interactive environment for numerical computation, visualization, and programming. - -```console -$ ml av MATLAB --------------- /apps/modules/math -------------- - MATLAB/2021a -$ ml MATLAB/2021a -$ matlab -``` - -Read more at the [MATLAB page][1]. - -## Octave - -GNU Octave is a high-level interpreted language, primarily intended for numerical computations. The Octave language is quite similar to MATLAB so that most programs are easily portable. - -```console -$ ml av Octave --------------- /apps/modules/math -------------- -Octave/6.3.0-intel-2020b-without-X11 -$ ml Octave/6.3.0-intel-2020b-without-X11 -$ octave -``` - -Read more at the [Octave page][2]. - -## R - -The R is an interpreted language and environment for statistical computing and graphics. - -```console -$ ml av R/ --------------- /apps/modules/math -------------- - -$ ml R -$ R -``` - -Read more at the [R page][3]. - -[1]: matlab.md -[2]: octave.md -[3]: r.md diff --git a/content/docs/software/numerical-languages/matlab.mdx b/content/docs/software/numerical-languages/matlab.mdx deleted file mode 100644 index 95725c12b5f486dc8d16fc7b5815d00477707189..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/matlab.mdx +++ /dev/null @@ -1,359 +0,0 @@ ---- -title: "MATLAB" ---- -## Introduction - -MATLAB (an abbreviation of "MATrix LABoratory") is a proprietary multi-paradigm programming language -and numeric computing environment developed by MathWorks. -MATLAB allows matrix manipulations, plotting of functions and data, implementation of algorithms, -creation of user interfaces, and interfacing with programs written in other languages. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av MATLAB -``` - -## MATLAB GUI - -If you need to use the MATLAB GUI to prepare your MATLAB programs, you can use MATLAB directly on the login nodes. -However, for all computations, use MATLAB on the compute nodes via Slurm workload manager. - -If you require the MATLAB GUI, follow the general information about [running graphical applications][1]. - -MATLAB GUI is quite slow using the X forwarding built in the Slurm (`srun --x11`), -so using X11 display redirection either via SSH or directly by `xauth` -(see the [GUI Applications on Compute Nodes over VNC][1] section) is recommended. - -To run MATLAB with GUI, use: - -```console -$ matlab -``` - -To run MATLAB in text mode, without the MATLAB Desktop GUI environment, use: - -```console -$ matlab -nodesktop -nosplash -``` - -plots, images, etc. will be still available. - -## MATLAB Configuration - -### Client Configuration - -After logging into the cluster, start MATLAB. -On the Home tab, click Parallel > Discover Clusters… to discover the profile. - - - -Jobs will now default to the cluster rather than submit to the local machine. - -### Job Configuration - -Prior to submitting the job, various parameters can be assigned, such as queue, e-mail,walltime, etc. -The following is a partial list of parameters. -See `AdditionalProperties` for the complete list. -Only the `ProjectName` is required. - -``` ->> % Get a handle to the cluster ->> c = parcluster; - -[REQUIRED] - ->> % Specify the project name ->> c.AdditionalProperties.ProjectName = 'project-name'; - -[OPTIONAL] - ->> % Specify a constraint ->> c.AdditionalProperties.Constraint = 'feature-name'; - ->> % Request email notification of job status ->> c.AdditionalProperties.EmailAddress = 'user-id@university.edu'; - - ->> % Specify number of GPUs ->> c.AdditionalProperties.GpusPerNode = 1; ->> c.AdditionalProperties.GpuCard = 'gpu-card'; - ->> % Specify memory to use, per core (default: 4gb) [FOR GPU NODES] ->> c.AdditionalProperties.MemPerCPU = '6gb'; - ->> % Specify the partition ->> c.AdditionalProperties.Partition = 'partition-name'; - ->> % Specify cores per node ->> c.AdditionalProperties.ProcsPerNode = 4; - ->> % Specify QoS ->> c.AdditionalProperties.QoS = 'qos-name'; - ->> % Use reservation ->> c.AdditionalProperties.Reservation = 'reservation-name'; - ->> % Specify the wall time (e.g., 1 day, 5 hours, 30 minutes) ->> c.AdditionalProperties.WallTime = '1-05:30'; -``` - -Save changes after modifying AdditionalProperties for the above changes to persist between MATLAB sessions. - -``` ->> c.saveProfile -``` - -To see the values of the current configuration options, display AdditionalProperties. - -``` ->> % To view current properties ->> c.AdditionalProperties -``` - -Unset a value when no longer needed. - -``` ->> % Turn off email notifications ->> c.AdditionalProperties.EmailAddress = ''; ->> c.saveProfile -``` - -## Running Job - -### Interactive Jobs - -To run an interactive pool job on the cluster, continue to use `parpool` as before. - -``` ->> % Get a handle to the cluster ->> c = parcluster; - ->> % Open a pool of 64 workers on the cluster ->> pool = c.parpool(64); -``` - -Rather than running local on the local machine, the pool can now run across multiple nodes on the cluster. - -``` ->> % Run a parfor over 1000 iterations ->> parfor idx = 1:1000 - a(idx) = rand; - end -``` - -Delete the pool when it’s no longer needed. - -``` ->> % Delete the pool ->> pool.delete -``` - -### Independent Batch Job - -Use the batch command to submit asynchronous jobs to the cluster. -The batch command will return a job object which is used to access the output of the submitted job. -See the MATLAB documentation for more help on batch. - -``` ->> % Get a handle to the cluster ->> c = parcluster; - ->> % Submit job to query where MATLAB is running on the cluster ->> job = c.batch(@pwd, 1, {}); - ->> % Query job for state ->> job.State - ->> % If state is finished, fetch the results ->> job.fetchOutputs{:} - ->> % Delete the job after results are no longer needed ->> job.delete -``` - -To retrieve a list of running or completed jobs, call `parcluster` to return the cluster object. -The cluster object stores an array of jobs that are queued to run, are running, have run, or have failed. -Retrieve and view the list of jobs as shown below. - -``` ->> c = parcluster; ->> jobs = c.Jobs ->> ->> % Get a handle to the second job in the list ->> job2 = c.Jobs(2); -``` - -Once the job has been selected, fetch the results as previously done. - -`fetchOutputs` is used to retrieve function output arguments; if calling `batch` with a script, use `load` instead. -Data that has been written to files on the cluster needs be retrieved directly from the file system (e.g., via SFTP). - -``` ->> % Fetch all results from the second job in the list ->> job2.fetchOutputs{:} -``` - -### Parallel Batch Job - -`batch` can also submit parallel workflows. -Let’s use the following example for a parallel job, which is saved as `parallel_example.m`. - -``` -function [sim_t, A] = parallel_example(iter) - -if nargin==0 - iter = 8; -end - -disp('Start sim') - -t0 = tic; -parfor idx = 1:iter - A(idx) = idx; - pause(2) - idx -end -sim_t = toc(t0); - -disp('Sim completed') - -save RESULTS A - -end -``` - -This time when using the `batch` command, also specify a MATLAB `Pool` argument. - -``` ->> % Get a handle to the cluster ->> c = parcluster; - ->> % Submit a batch pool job using 4 workers for 16 simulations ->> job = c.batch(@parallel_example, 1, {16}, 'Pool',4); - ->> % View current job status ->> job.State - ->> % Fetch the results after a finished state is retrieved ->> job.fetchOutputs{:} - -ans = - 8.8872 -``` - -The job ran in 8.89 seconds using four workers. -Note that these jobs will always request N+1 CPU cores, since one worker is required to manage the batch job and pool of workers. -For example, a job that needs eight workers will request nine CPU cores. - -Run the same simulation but increase the Pool size. This time, to retrieve the results later, keep track of the job ID. - -<Callout> - For some applications, there will be a diminishing return when allocating too many workers, - as the overhead may exceed computation time. -</Callout> - -``` ->> % Get a handle to the cluster ->> c = parcluster; - ->> % Submit a batch pool job using 8 workers for 16 simulations ->> job = c.batch(@parallel_example, 1, {16}, 'Pool',8); - ->> % Get the job ID ->> id = job.ID -id = - 4 ->> % Clear job from workspace (as though MATLAB exited) ->> clear job -``` - -With a handle to the cluster, the `findJob` method searches for the job with the specified job ID. - -``` ->> % Get a handle to the cluster ->> c = parcluster; - ->> % Find the old job ->> job = c.findJob('ID', 4); - ->> % Retrieve the state of the job ->> job.State - -ans = -finished - ->> % Fetch the results ->> job.fetchOutputs{:}; - -ans = -4.7270 -``` - -The job now runs in 4.73 seconds using eight workers. -Run code with different number of workers to determine the ideal number to use. - -Alternatively, to retrieve job results via a graphical user interface, use the Job Monitor (Parallel > Monitor Jobs). - - - -## Helper Functions - -| Function | Description | -| --------------------- | ------------------------------------ | -| clusterFeatures | List of cluster features/constraints | -| clusterGpuCards | List of cluster GPU cards | -| clusterPartitionNames | List of cluster partition | -| willRun | Explain why job is queued | - -### Debugging - -If a serial job produces an error, call the `getDebugLog` method to view the error log file. -When submitting an independent job, specify the task. - -``` ->> c.getDebugLog(job.Tasks) -``` - -For Pool jobs, only specify the job object. - -``` ->> c.getDebugLog(job) -``` - -When troubleshooting a job, the cluster admin may request the scheduler ID of the job. -This can be derived by calling `getTaskSchedulerIDs`). - -``` ->> job.getTaskSchedulerIDs() -ans = -25539 -``` - -## Additional Information - -For more information about the MATLAB Parallel Computing Toolbox, -see the following resources: - -* [Parallel Computing Overview][c] -* [Parallel Computing Documentation][d] -* [Parallel Computing Coding Examples][e] -* [Parallel Computing Tutorials][f] -* [Parallel Computing Videos][g] -* [Parallel Computing Webinars][h] - -[1]: ../../general/accessing-the-clusters/graphical-user-interface/vnc.md#gui-applications-on-compute-nodes-over-vnc -[2]: #running-parallel-matlab-using-distributed-computing-toolbox---engine -[3]: ../isv_licenses.md -[4]: #parallel-matlab-batch-job-in-local-mode - -[a]: https://www.mathworks.com/help/parallel-computing/release-notes.html -[b]: https://www.e-infra.cz/en -[c]: https://www.mathworks.com/products/parallel-computing.html -[d]: https://www.mathworks.com/help/parallel-computing/index.html -[e]: https://www.mathworks.com/help/parallel-computing/examples.html -[f]: https://www.mathworks.com/videos/series/parallel-and-gpu-computing-tutorials-97719.html -[g]: https://www.mathworks.com/videos/search.html?q=&fq%5B%5D=product:DM&page=1 -[h]: https://www.mathworks.com/videos/search.html?q=&fq%5B%5D=product:DM&fq%5B%5D=video-external-category:recwebinar&page=1 diff --git a/content/docs/software/numerical-languages/meta.json b/content/docs/software/numerical-languages/meta.json deleted file mode 100644 index 6b9c5e4264632ba53ff805b46ecb5ab6c54cfadc..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Numerical-languages", - "pages": [ - "introduction", - "matlab", - "octave", - "opencoarrays", - "r" - ] -} diff --git a/content/docs/software/numerical-languages/octave.mdx b/content/docs/software/numerical-languages/octave.mdx deleted file mode 100644 index 1c77658cc75b4600be0181588673d4809bacfec5..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/octave.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "Octave" ---- -## Introduction - -GNU Octave is a high-level interpreted language, primarily intended for numerical computations. It provides capabilities for the numerical solution of linear and nonlinear problems, and for performing other numerical experiments. It also provides extensive graphics capabilities for data visualization and manipulation. Octave is normally used through its interactive command line interface, but it can also be used to write non-interactive programs. The Octave language is quite similar to Matlab so that most programs are easily portable. Read more [here][a]. - -For a list of available modules, type: - -```console -$ ml av octave -------------------------------- /apps/modules/math ------------------------------- - Octave/6.3.0-intel-2020b-without-X11 -``` - -## Modules and Execution - -To load the latest version of Octave load the module: - -```console -$ ml Octave -``` - -Octave on clusters is linked to a highly optimized MKL mathematical library. This provides threaded parallelization to many Octave kernels, notably the linear algebra subroutines. Octave runs these heavy calculation kernels without any penalty. By default, Octave would parallelize to 128 threads on Karolina. You may control the threads by setting the `OMP_NUM_THREADS` environment variable. - -To run Octave interactively, log in with the `ssh -X` parameter for X11 forwarding. Run Octave: - -```console -$ octave -``` - -To run Octave in batch mode, write an Octave script, then write a bash jobscript and execute via the `salloc` command. By default, Octave will use 128 threads on Karolina when running MKL kernels. - -```bash -#!/bin/bash - -# change to local scratch directory -DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID -mkdir -p "$DIR" -cd "$DIR" || exit - -# copy input file to scratch -cp $SLURM_SUBMIT_DIR/octcode.m . - -# load octave module -ml Octave/6.3.0-intel-2020b-without-X11 - -# execute the calculation -octave -q --eval octcode > output.out - -# copy output file to home -cp output.out $SLURM_SUBMIT_DIR/. - -#exit -exit -``` - -This script may be submitted directly to Slurm via the `salloc` command. The inputs are in the octcode.m file, outputs in the output.out file. See the single node jobscript example in the [Job execution section][1]. - -The Octave c compiler `mkoctfile` calls the GNU GCC 6.3.0 for compiling native C code. This is very useful for running native C subroutines in Octave environment. - -```console -$ mkoctfile -v -mkoctfile, version 6.3.0 -``` - -Octave may use MPI for interprocess communication This functionality is currently not supported on the clusters. In case you require the Octave interface to MPI, contact [support][b]. - -[1]: ../../general/job-submission-and-execution.md - -[a]: https://www.gnu.org/software/octave/ -[b]: https://support.it4i.cz/rt/ -[c]: https://octave.sourceforge.net/parallel/ diff --git a/content/docs/software/numerical-languages/opencoarrays.mdx b/content/docs/software/numerical-languages/opencoarrays.mdx deleted file mode 100644 index 4414201f6a83bc5ad1b812b06be29cf2fbb7764f..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/opencoarrays.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "OpenCoarrays" ---- -## Introduction - -Coarray Fortran (CAF) is an extension of Fortran language and offers a simple interface for parallel processing and memory sharing. -The advantage is that only small changes are required to convert existing Fortran code to support a robust and potentially efficient parallelism. - -A CAF program is interpreted as if it was replicated a number of times and all copies were executed asynchronously. -The number of copies is decided at execution time. Each copy (called *image*) has its own private variables. -The variable syntax of Fortran language is extended with indexes in square brackets (called *co-dimension*) representing a reference to data distributed across images. - -By default, the CAF is using Message Passing Interface (MPI) for lower-level communication, so there are some similarities with MPI. - -Read more [here][a]. - -## Coarray Basics - -### Indexing of Coarray Images - -Indexing of individual images can be shown on the simple *Hello World* program: - -```fortran -program hello_world - implicit none - print *, 'Hello world from image ', this_image() , 'of', num_images() -end program hello_world -``` - -* `num_images()` - returns the number of all images -* `this_image()` - returns the image index - numbered from 1 to `num_images()` - -### Co-Dimension Variables Declaration - -Coarray variables can be declared with the `codimension[*]` attribute or by adding a trailing index `[*]` after the variable name. -Notice, the `*` character always has to be in the square brackets. - -```fortran -integer, codimension[*] :: scalar -integer :: scalar[*] -real, dimension(64), codimension[*] :: vector -real :: vector(64)[*] -``` - -### Images Synchronization - -Because each image is running on its own, the image synchronization is needed to ensure, that all altered data is distributed to all images. -Synchronization can be done across all images or only between selected images. Be aware, that selective synchronization can lead to the race condition problems like deadlock. - -Example program: - -```fortran -program synchronization_test - implicit none - integer :: i ! Local variable - integer :: numbers[*] ! Scalar coarray - - ! Genereate random number on image 1 - if (this_image() == 1) then - numbers = floor(rand(1) * 1000) - ! Distribute information to other images - do i = 2, num_images() - numbers[i] = numbers - end do - end if - - sync all ! Barrier to synchronize all images - - print *, 'The random number is', numbers -end program synchronization_test -``` - -* `sync all` - Synchronize all images between each other -* `sync images(*)` - Synchronize this image to all other -* `sync images(index)` - Synchronize this image to image with `index` - -<Callout> - `number` is the local variable while `number[index]` accesses the variable in the specific image. - `number[this_image()]` is the same as `number`. -</Callout> - -## Compile and Run - -Currently, version 2.9.2 compiled with the OpenMPI 4.0.5 library is installed on the cluster. To load the `OpenCoarrays` module, type: - -```console -$ ml OpenCoarrays/2.9.2-gompi-2020b -``` - -### Compile CAF Program - -The preferred method for compiling a CAF program is by invoking the `caf` compiler wrapper. -The above mentioned *Hello World* program can be compiled as follows: - -```console -$ caf hello_world.f90 -o hello_world.x -``` - -<Callout type=warn> - The input file extension **.f90** or **.F90** are to be interpreted as *Fortran 90*. - If the input file extension is **.f** or **.F** the source code will be interpreted as *Fortran 77*. -</Callout> - -Another method for compiling is by invoking the `mpif90` compiler wrapper directly: - -```console -$ mpif90 hello_world.f90 -o hello_world.x -fcoarray=lib -lcaf_mpi -``` - -### Run CAF Program - -A CAF program can be run by invoking the `cafrun` wrapper or directly by the `mpirun`: - -```console -$ cafrun -np 4 ./hello_world.x - Hello world from image 1 of 4 - Hello world from image 2 of 4 - Hello world from image 3 of 4 - Hello world from image 4 of 4 - -$ mpirun -np 4 ./synchronization_test.x - The random number is 242 - The random number is 242 - The random number is 242 - The random number is 242 -``` - -`-np 4` is the number of images to run. The parameters of `cafrun` and `mpirun` are the same. - -[a]: http://www.opencoarrays.org/ diff --git a/content/docs/software/numerical-languages/r.mdx b/content/docs/software/numerical-languages/r.mdx deleted file mode 100644 index b39721ad5980b477dde2f363b5c59a4ead0a2c09..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-languages/r.mdx +++ /dev/null @@ -1,406 +0,0 @@ ---- -title: "R" ---- -## Introduction - -R is a language and environment for statistical computing and graphics. R provides a wide variety of statistical (linear and nonlinear modelling, classical statistical tests, time-series analysis, classification, clustering, etc.) and graphical techniques, and is highly extensible. - -One of R's strengths is the ease with which well-designed publication-quality plots can be produced, including mathematical symbols and formulae where needed. Great care has been taken over the defaults for the minor design choices in graphics, but the user retains full control. - -Another convenience is the ease with which the C code or third party libraries may be integrated within R. - -Extensive support for parallel computing is available within R. - -Read more on [http://www.r-project.org/][a] and [http://cran.r-project.org/doc/manuals/r-release/R-lang.html][b]. - -## Modules - -R version 3.1.1 is available on the cluster, along with GUI interface RStudio - -| Application | Version | module | -| ----------- | ----------------- | ------------------- | -| **R** | R 3.1.1 | R/3.1.1-intel-2015b | - -```console -$ ml R -``` - -## Execution - -R on cluster is linked to a highly optimized MKL mathematical library. This provides threaded parallelization to many R kernels, notably the linear algebra subroutines. R runs these heavy calculation kernels without any penalty. You may control the threads by setting the `OMP_NUM_THREADS` environment variable. - -### Interactive Execution - -To run R interactively, using RStudio GUI, log in with the `ssh -X` parameter for X11 forwarding. Run RStudio: - -```console -$ ml RStudio -$ rstudio -``` - -### Batch Execution - -To run R in batch mode, write an R script, then write a bash jobscript and execute via the `sbatch` command. By default, R will use 24 threads on Salomon when running MKL kernels. - -Example jobscript: - -```bash -#!/bin/bash - -# change to local scratch directory -DIR=/scratch/project/PROJECT_ID/$SLURM_JOBID -mkdir -p "$DIR" -cd "$DIR" || exit - -# copy input file to scratch -cp $SLURM_SUBMIT_DIR/rscript.R . - -# load R module -ml R - -# execute the calculation -R CMD BATCH rscript.R routput.out - -# copy output file to home -cp routput.out $SLURM_SUBMIT_DIR/. - -#exit -exit -``` - -The inputs are in the `rscript.R` file, the outputs in the `routput.out` file. -See the single node jobscript example in the [Job execution section][1]. - -## Parallel R - -Parallel execution of R may be achieved in many ways. One approach is the implied parallelization due to linked libraries or specially enabled functions, as [described above][2]. In the following sections, we focus on explicit parallelization, where parallel constructs are directly stated within the R script. - -## Package Parallel - -The package parallel provides support for parallel computation, including by forking (taken from package multicore), by sockets (taken from package snow) and random-number generation. - -The package is activated this way: - -```console -$ R -> library(parallel) -``` - -More information and examples may be obtained directly by reading the documentation available in R: - -```r -> ?parallel -> library(help = "parallel") -> vignette("parallel") -``` - -Forking is the most simple to use. Forking family of functions provide parallelized, drop-in replacement for the serial `apply()` family of functions. - -<Callout type=warn> - Forking via package parallel provides functionality similar to OpenMP construct omp parallel for - - Only cores of single node can be utilized this way! - -Forking example: - -```r -library(parallel) - -#integrand function -f <- function(i,h) { -x <- h*(i-0.5) -return (4/(1 + x*x)) -} - -#initialize -size <- detectCores() - -while (TRUE) -{ - #read number of intervals - cat("Enter the number of intervals: (0 quits) ") - fp<-file("stdin"); n<-scan(fp,nmax=1); close(fp) - - if(n<=0) break - - #run the calculation - n <- max(n,size) - h <- 1.0/n - - i <- seq(1,n); - pi3 <- h*sum(simplify2array(mclapply(i,f,h,mc.cores=size))); - - #print results - cat(sprintf("Value of PI %16.14f, diff= %16.14fn",pi3,pi3-pi)) -} -``` - -The above example is the classic parallel example for calculating the number Ď€. Note the `detectCores()` and `mclapply()` functions. Execute the example as: - -```console -$ R --slave --no-save --no-restore -f pi3p.R -``` - -Every evaluation of the integrad function runs in parallel on different process. - -## Package Rmpi - -The Rmpi package provides an interface (wrapper) to MPI APIs. - -It also provides interactive R slave environment. On the cluster, Rmpi provides interface to the [OpenMPI][3]. - -Read more on Rmpi [here][c], reference manual is available [here][d]. - -When using the Rmpi package, both the `openmpi` and `R` modules must be loaded: - -```console -$ ml OpenMPI -$ ml R -``` - -Rmpi may be used in three basic ways. The static approach is identical to executing any other MPI program. In addition, there is the Rslaves dynamic MPI approach and the mpi.apply approach. In the following section, we will use the number Ď€ integration example, to illustrate all these concepts. - -### Static Rmpi - -Static Rmpi programs are executed via `mpiexec`, as any other MPI programs. The number of processes is static - given at the launch time. - -Static Rmpi example: - -```r -library(Rmpi) - -#integrand function -f <- function(i,h) { -x <- h*(i-0.5) -return (4/(1 + x*x)) -} - -#initialize -invisible(mpi.comm.dup(0,1)) -rank <- mpi.comm.rank() -size <- mpi.comm.size() -n<-0 - -while (TRUE) -{ - #read number of intervals - if (rank==0) { - cat("Enter the number of intervals: (0 quits) ") - fp<-file("stdin"); n<-scan(fp,nmax=1); close(fp) - } - - #broadcat the intervals - n <- mpi.bcast(as.integer(n),type=1) - - if(n<=0) break - - #run the calculation - n <- max(n,size) - h <- 1.0/n - - i <- seq(rank+1,n,size); - mypi <- h*sum(sapply(i,f,h)); - - pi3 <- mpi.reduce(mypi) - - #print results - if (rank==0) cat(sprintf("Value of PI %16.14f, diff= %16.14fn",pi3,pi3-pi)) -} - -mpi.quit() -``` - -The above is the static MPI example for calculating the number Ď€. Note the `library(Rmpi)` and `mpi.comm.dup()` function calls. Execute the example as: - -```console -$ mpirun R --slave --no-save --no-restore -f pi3.R -``` - -### Dynamic Rmpi - -Dynamic Rmpi programs are executed by calling the R directly. The `OpenMPI` module must still be loaded. The R slave processes will be spawned by a function call within the Rmpi program. - -Dynamic Rmpi example: - -```r -#integrand function -f <- function(i,h) { -x <- h*(i-0.5) -return (4/(1 + x*x)) -} - -#the worker function -workerpi <- function() -{ -#initialize -rank <- mpi.comm.rank() -size <- mpi.comm.size() -n<-0 - -while (TRUE) -{ - #read number of intervals - if (rank==0) { - cat("Enter the number of intervals: (0 quits) ") - fp<-file("stdin"); n<-scan(fp,nmax=1); close(fp) - } - - #broadcat the intervals - n <- mpi.bcast(as.integer(n),type=1) - - if(n<=0) break - - #run the calculation - n <- max(n,size) - h <- 1.0/n - - i <- seq(rank+1,n,size); - mypi <- h*sum(sapply(i,f,h)); - - pi3 <- mpi.reduce(mypi) - - #print results - if (rank==0) cat(sprintf("Value of PI %16.14f, diff= %16.14fn",pi3,pi3-pi)) -} -} - -#main -library(Rmpi) - -cat("Enter the number of slaves: ") -fp<-file("stdin"); ns<-scan(fp,nmax=1); close(fp) - -mpi.spawn.Rslaves(nslaves=ns) -mpi.bcast.Robj2slave(f) -mpi.bcast.Robj2slave(workerpi) - -mpi.bcast.cmd(workerpi()) -workerpi() - -mpi.quit() -``` - -The above example is the dynamic MPI example for calculating the number Ď€. Both master and slave processes carry out the calculation. Note the `mpi.spawn.Rslaves()`, `mpi.bcast.Robj2slave()`, **and the `mpi.bcast.cmd()`** function calls. - -Execute the example as: - -```console -$ mpirun -np 1 R --slave --no-save --no-restore -f pi3Rslaves.R -``` - -Note that this method uses `MPI_Comm_spawn` (Dynamic process feature of MPI-2) to start the slave processes - the master process needs to be launched with MPI. In general, Dynamic processes are not well supported among MPI implementations, some issues might arise. In addition, environment variables are not propagated to spawned processes, so they will not see paths from modules. - -### mpi.apply Rmpi - -`mpi.apply` is a specific way of executing Dynamic Rmpi programs. - -`mpi.apply()` family of functions provide MPI parallelized, drop in replacement for the serial `apply()` family of functions. - -Execution is identical to other dynamic Rmpi programs. - -mpi.apply Rmpi example: - -```r -#integrand function -f <- function(i,h) { -x <- h*(i-0.5) -return (4/(1 + x*x)) -} - -#the worker function -workerpi <- function(rank,size,n) -{ - #run the calculation - n <- max(n,size) - h <- 1.0/n - - i <- seq(rank,n,size); - mypi <- h*sum(sapply(i,f,h)); - - return(mypi) -} - -#main -library(Rmpi) - -cat("Enter the number of slaves: ") -fp<-file("stdin"); ns<-scan(fp,nmax=1); close(fp) - -mpi.spawn.Rslaves(nslaves=ns) -mpi.bcast.Robj2slave(f) -mpi.bcast.Robj2slave(workerpi) - -while (TRUE) -{ - #read number of intervals - cat("Enter the number of intervals: (0 quits) ") - fp<-file("stdin"); n<-scan(fp,nmax=1); close(fp) - if(n<=0) break - - #run workerpi - i=seq(1,2*ns) - pi3=sum(mpi.parSapply(i,workerpi,2*ns,n)) - - #print results - cat(sprintf("Value of PI %16.14f, diff= %16.14fn",pi3,pi3-pi)) -} - -mpi.quit() -``` - -The above is the mpi.apply MPI example for calculating the number Ď€. Only the slave processes carry out the calculation. Note the `mpi.parSapply()`, function call. The package parallel example above may be trivially adapted (for much better performance) to this structure using the `mclapply()` in place of `mpi.parSapply()`. - -Execute the example as: - -```console -$ mpirun -np 1 R --slave --no-save --no-restore -f pi3parSapply.R -``` - -## Combining Parallel and Rmpi - -Currently, the two packages cannot be combined for hybrid calculations. - -## Parallel Execution - -R parallel jobs are executed via the SLURM partition system exactly as any other parallel jobs. The user must create an appropriate jobscript and submit it via `sbatch` - -An example jobscript for [static Rmpi][4] parallel R execution, running 1 process per core: - -```bash -#!/bin/bash -#SBATCH -q qprod -#SBATCH -N Rjob -#SBATCH --nodes=100 --ntasks-per-node=24 --cpus-per-task=1 - -# change to scratch directory -DIR=/scratch/project/PROJECT_ID/$SLURM_JOBID -mkdir -p "$DIR" -cd "$DIR" || exit - -# copy input file to scratch -cp $SLURM_SUBMIT_DIR/rscript.R . - -# load R and openmpi module -ml R OpenMPI - -# execute the calculation -mpirun -bycore -bind-to-core R --slave --no-save --no-restore -f rscript.R - -# copy output file to home -cp routput.out $SLURM_SUBMIT_DIR/. - -#exit -exit -``` - -For more information about jobscripts and MPI execution, refer to the [Job submission][1] and general [MPI][5] sections. - -[1]: ../../general/job-submission-and-execution.md -[2]: #interactive-execution -[4]: #static-rmpi -[5]: ../mpi/mpi.md - -[a]: http://www.r-project.org/ -[b]: http://cran.r-project.org/doc/manuals/r-release/R-lang.html -[c]: http://cran.r-project.org/web/packages/Rmpi/ -[d]: http://cran.r-project.org/web/packages/Rmpi/Rmpi.pdf diff --git a/content/docs/software/numerical-libraries/fftw.mdx b/content/docs/software/numerical-libraries/fftw.mdx deleted file mode 100644 index c5bfef911a5c8845a67e1cabc97e6d2d4507f4e4..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/fftw.mdx +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "FFTW" ---- -The discrete Fourier transform in one or more dimensions, MPI parallel - -FFTW is a C subroutine library for computing the discrete Fourier transform in one or more dimensions, of arbitrary input size, and of both real and complex data (as well as of even/odd data, e.g. the discrete cosine/sine transforms or DCT/DST). The FFTW library allows for MPI parallel, in-place discrete Fourier transform, with data distributed over number of nodes. - -```console -$ ml av FFTW - ----------------------------------------------------- /apps/modules/numlib ----------------------------------------------------- - FFTW/3.3.7-gompi-2018a FFTW/3.3.8-gompi-2020a FFTW/3.3.8-gompic-2020b FFTW/3.3.8 - FFTW/3.3.8-gompi-2020a-amd FFTW/3.3.8-gompi-2020b FFTW/3.3.8-iccifort-2020.4.304 FFTW/3.3.9-gompi-2021a (D) -``` - -To load the latest version of Octave load the module: - -```console -$ ml FFTW -``` - -The module sets up environment variables, required for linking and running FFTW enabled applications. Make sure that the choice of FFTW module is consistent with your choice of MPI library. Mixing MPI of different implementations may have unpredictable results. - -## Example - -```cpp - #include <fftw3-mpi.h> - int main(int argc, char **argv) - { - const ptrdiff_t N0 = 100, N1 = 1000; - fftw_plan plan; - fftw_complex *data; - ptrdiff_t alloc_local, local_n0, local_0_start, i, j; - - MPI_Init(&argc, &argv); - fftw_mpi_init(); - - /* get local data size and allocate */ - alloc_local = fftw_mpi_local_size_2d(N0, N1, MPI_COMM_WORLD, - &local_n0, &local_0_start); - data = fftw_alloc_complex(alloc_local); - - /* create plan for in-place forward DFT */ - plan = fftw_mpi_plan_dft_2d(N0, N1, data, data, MPI_COMM_WORLD, - FFTW_FORWARD, FFTW_ESTIMATE); - - /* initialize data */ - for (i = 0; i < local_n0; ++i) for (j = 0; j < N1; ++j) - { data[i*N1 + j][0] = i; - data[i*N1 + j][1] = j; } - - /* compute transforms, in-place, as many times as desired */ - fftw_execute(plan); - - fftw_destroy_plan(plan); - - MPI_Finalize(); - } -``` - -Load modules and compile: - -```console -$ ml intel/2020b 3.3.8-iccifort-2020.4.304 -$ mpicc testfftw3mpi.c -o testfftw3mpi.x -Wl,-rpath=$LIBRARY_PATH -lfftw3_mpi -``` - -Read more on FFTW usage on the [FFTW website][a]. - -[a]: http://www.fftw.org/fftw3_doc/ \ No newline at end of file diff --git a/content/docs/software/numerical-libraries/gsl.mdx b/content/docs/software/numerical-libraries/gsl.mdx deleted file mode 100644 index 7a50cd12ae9ab4aea94e491b046345af70cbee95..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/gsl.mdx +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: "GSL" ---- -The GNU Scientific Library. Provides a wide range of mathematical routines. - -## Introduction - -The GNU Scientific Library (GSL) provides a wide range of mathematical routines such as random number generators, special functions and least-squares fitting. There are over 1000 functions in total. The routines have been written from scratch in C, and present a modern API for C programmers, allowing wrappers to be written for very high level languages. - -The library covers a wide range of topics in numerical computing. Routines are available for the following areas: - -Complex Numbers Roots of Polynomials - -Special Functions Vectors and Matrices - -Permutations Combinations - -Sorting BLAS Support - -Linear Algebra CBLAS Library - -Fast Fourier Transforms Eigensystems - -Random Numbers Quadrature - -Random Distributions Quasi-Random Sequences - -Histograms Statistics - -Monte Carlo Integration N-Tuples - -Differential Equations Simulated Annealing - -Numerical Differentiation Interpolation - -Series Acceleration Chebyshev Approximations - -Root-Finding Discrete Hankel Transforms - -Least-Squares Fitting Minimization - -IEEE Floating-Point Physical Constants - -Basis Splines Wavelets - -## Modules - -For the list of available gsl modules, use the command: - -```console -$ ml av gsl ----------------- /apps/modules/numlib ------------------- - GSL/2.5-intel-2017c GSL/2.6-iccifort-2020.1.217 GSL/2.7-GCC-10.3.0 (D) - GSL/2.6-GCC-10.2.0 GSL/2.6-iccifort-2020.4.304 -``` - -## Linking - -Load an appropriate `gsl` module. Use the `-lgsl` switch to link your code against GSL. The GSL depends on cblas API to BLAS library, which must be supplied for linking. The BLAS may be provided, for example from the MKL library, as well as from the BLAS GSL library (`-lgslcblas`). Using the MKL is recommended. - -### Compiling and Linking With Intel Compilers - -```console -$ ml intel/2020b gsl/2.6-iccifort-2020.4.304 -$ icc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -mkl -lgsl -``` - -### Compiling and Linking With GNU Compilers - -```console -$ ml ml GCC/10.2.0 imkl/2020.4.304-iimpi-2020b GSL/2.6-iccifort-2020.4.304 -$ gcc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lgsl -``` - -## Example - -Following is an example of a discrete wavelet transform implemented by GSL: - -```cpp - #include <stdio.h> - #include <math.h> - #include <gsl/gsl_sort.h> - #include <gsl/gsl_wavelet.h> - - int - main (int argc, char **argv) - { - int i, n = 256, nc = 20; - double *data = malloc (n * sizeof (double)); - double *abscoeff = malloc (n * sizeof (double)); - size_t *p = malloc (n * sizeof (size_t)); - - gsl_wavelet *w; - gsl_wavelet_workspace *work; - - w = gsl_wavelet_alloc (gsl_wavelet_daubechies, 4); - work = gsl_wavelet_workspace_alloc (n); - - for (i=0; i<n; i++) - data[i] = sin (3.141592654*(double)i/256.0); - - gsl_wavelet_transform_forward (w, data, 1, n, work); - - for (i = 0; i < n; i++) - { - abscoeff[i] = fabs (data[i]); - } - - gsl_sort_index (p, abscoeff, 1, n); - - for (i = 0; (i + nc) < n; i++) - data[p[i]] = 0; - - gsl_wavelet_transform_inverse (w, data, 1, n, work); - - for (i = 0; i < n; i++) - { - printf ("%gn", data[i]); - } - - gsl_wavelet_free (w); - gsl_wavelet_workspace_free (work); - - free (data); - free (abscoeff); - free (p); - return 0; - } -``` - -Load modules and compile: - -```console -$ ml intel/2020b gsl/GSL/2.6-iccifort-2020.4.304 -$ icc dwt.c -o dwt.x -Wl,-rpath=$LIBRARY_PATH -mkl -lgsl -``` - -In this example, we compile the dwt.c code using the Intel compiler and link it to the MKL and GSL library, note the `-mkl` and `-lgsl` options. The library search path is compiled in, so that no modules are necessary to run the code. diff --git a/content/docs/software/numerical-libraries/hdf5.mdx b/content/docs/software/numerical-libraries/hdf5.mdx deleted file mode 100644 index 3dceb2f1653518dd9bb70509ceb3489242c8c7d5..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/hdf5.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "HDF5" ---- -Hierarchical Data Format library. Serial and MPI parallel version. - -[HDF5 (Hierarchical Data Format)][a] is a general purpose library and file format for storing scientific data. HDF5 can store two primary objects: datasets and groups. A dataset is essentially a multidimensional array of data elements, and a group is a structure for organizing objects in an HDF5 file. Using these two basic objects, one can create and store almost any kind of scientific data structure, such as images, arrays of vectors, and structured and unstructured grids. You can also mix and match them in HDF5 files according to your needs. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av HDF5 ------------------------------------------------------ /apps/modules/data ------------------------------------------------------ - HDF5/1.10.6-foss-2020b-parallel HDF5/1.10.6-intel-2020a HDF5/1.10.7-gompi-2021a - HDF5/1.10.6-iimpi-2020a HDF5/1.10.6-intel-2020b-parallel HDF5/1.10.7-gompic-2020b - HDF5/1.10.6-intel-2020a-parallel HDF5/1.10.7-gompi-2020b HDF5/1.10.7-iimpi-2020b (D) - -``` - -To load the module, use the `ml` command. - -The module sets up environment variables required for linking and running HDF5 enabled applications. Make sure that the choice of the HDF5 module is consistent with your choice of the MPI library. Mixing MPI of different implementations may cause unexpected results. - -## Example - -```cpp - #include "hdf5.h" - #define FILE "dset.h5" - - int main() { - - hid_t file_id, dataset_id, dataspace_id; /* identifiers */ - hsize_t dims[2]; - herr_t status; - int i, j, dset_data[4][6]; - - /* Create a new file using default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - /* Create the data space for the dataset. */ - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - /* Initialize the dataset. */ - for (i = 0; i < 4; i++) - for (j = 0; j < 6; j++) - dset_data[i][j] = i * 6 + j + 1; - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id, - H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - - /* Write the dataset. */ - status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, - dset_data); - - status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, - dset_data); - - /* End access to the dataset and release resources used by it. */ - status = H5Dclose(dataset_id); - - /* Terminate access to the data space. */ - status = H5Sclose(dataspace_id); - - /* Close the file. */ - status = H5Fclose(file_id); - } -``` - -Load modules and compile: - -```console -$ ml intel/2020b HDF5/1.10.6-intel-2020b-parallel -$ mpicc hdf5test.c -o hdf5test.x -Wl,-rpath=$LIBRARY_PATH $HDF5_INC $HDF5_SHLIB -``` - -For further information, see the [website][a]. - -[a]: http://www.hdfgroup.org/HDF5/ diff --git a/content/docs/software/numerical-libraries/intel-numerical-libraries.mdx b/content/docs/software/numerical-libraries/intel-numerical-libraries.mdx deleted file mode 100644 index fb1755c54cca03d7f407f6bdacee7798bce10534..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/intel-numerical-libraries.mdx +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Intel Numerical Libraries" ---- -Intel libraries for high performance in numerical computing. - -## Intel Math Kernel Library - -Intel Math Kernel Library (Intel MKL) is a library of math kernel subroutines, extensively threaded and optimized for maximum performance. Intel MKL unites and provides these basic components: BLAS, LAPACK, ScaLapack, PARDISO, FFT, VML, VSL, Data fitting, Feast Eigensolver, and many more. - -```console -$ ml av mkl -------------------- /apps/modules/numlib ------------------- - imkl/2017.4.239-iimpi-2017c imkl/2020.1.217-iimpi-2020a imkl/2021.2.0-iimpi-2021a (D) - imkl/2018.4.274-iimpi-2018a imkl/2020.4.304-iimpi-2020b (L) mkl/2020.4.304 - imkl/2019.1.144-iimpi-2019a imkl/2020.4.304-iompi-2020b -``` - -<Callout> - `imkl` ... with intel toolchain. `mkl` with system toolchain. -</Callout> - -For more information, see the [Intel MKL][1] section. - -## Intel Integrated Performance Primitives - -Intel Integrated Performance Primitives version 7.1.1, compiled for AVX is available via the `ipp` module. IPP is a library of highly optimized algorithmic building blocks for media and data applications. This includes signal, image, and frame processing algorithms, such as FFT, FIR, Convolution, Optical Flow, Hough transform, Sum, MinMax, and many more. - -```console -$ ml av ipp -------------------- /apps/modules/perf ------------------- - ipp/2020.3.304 -``` - -For more information, see the [Intel IPP][2] section. - -## Intel Threading Building Blocks - -Intel Threading Building Blocks (Intel TBB) is a library that supports scalable parallel programming using standard ISO C++ code. It does not require special languages or compilers. It is designed to promote scalable data parallel programming. Additionally, it fully supports nested parallelism, so you can build larger parallel components from smaller parallel components. To use the library, you specify tasks, not threads, and let the library map tasks onto threads in an efficient manner. - -```console -$ ml av tbb -------------------- /apps/modules/lib ------------------- - tbb/2020.3-GCCcore-10.2.0 - -``` - -Read more at the [Intel TBB][3]. - -## Python Hooks for Intel Math Kernel Library - -Python hooks for Intel(R) Math Kernel Library runtime control settings. - -```console -$ ml av mkl-service -------------------- /apps/modules/data ------------------- - mkl-service/2.3.0-intel-2020b -``` - -Read more at the [hooks][a]. - -[1]: ../intel/intel-suite/intel-mkl.md -[2]: ../intel/intel-suite/intel-integrated-performance-primitives.md -[3]: ../intel/intel-suite/intel-tbb.md - -[a]: https://github.com/IntelPython/mkl-service diff --git a/content/docs/software/numerical-libraries/meta.json b/content/docs/software/numerical-libraries/meta.json deleted file mode 100644 index 579610ec6acd9136e2ed1ffbfe34618e2865da93..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "title": "Numerical-libraries", - "pages": [ - "fftw", - "gsl", - "hdf5", - "intel-numerical-libraries", - "petsc" - ] -} diff --git a/content/docs/software/numerical-libraries/petsc.mdx b/content/docs/software/numerical-libraries/petsc.mdx deleted file mode 100644 index fd6d6d0136e5bbb46d03d566d4da7d894b1a7fec..0000000000000000000000000000000000000000 --- a/content/docs/software/numerical-libraries/petsc.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "PETSc" ---- -PETSc is a suite of building blocks for the scalable solution of scientific and engineering applications modeled by partial differential equations. It supports MPI, shared memory, and GPU through CUDA or OpenCL, as well as hybrid MPI-shared memory or MPI-GPU parallelism. - -## Introduction - -PETSc (Portable, Extensible Toolkit for Scientific Computation) is a suite of building blocks (data structures and routines) for the scalable solution of scientific and engineering applications modelled by partial differential equations. It allows thinking in terms of high-level objects (matrices) instead of low-level objects (raw arrays). Written in C language but can also be called from FORTRAN, C++, Python, and Java codes. It supports MPI, shared memory, and GPUs through CUDA or OpenCL, as well as hybrid MPI-shared memory or MPI-GPU parallelism. - -## Resources - -* [project webpage][a] -* [documentation][b] - * [PETSc Users Manual (PDF)][c] - * [index of all manual pages][d] -* PRACE Video Tutorial [part1][e], [part2][f], [part3][g], [part4][h], [part5][i] - -## Modules - -For the current list of installed versions, use: - -```console -$ ml av petsc - -``` - -## External Libraries - -PETSc needs at least MPI, BLAS, and LAPACK. These dependencies are currently satisfied with Intel MPI and Intel MKL in `petsc` modules. - -PETSc can be linked with a plethora of [external numerical libraries][k], extending PETSc functionality, e.g. direct linear system solvers, preconditioners, or partitioners. See below the list of libraries currently included in `petsc` modules. - -All these libraries can also be used alone, without PETSc. Their static or shared program libraries are available in -`$PETSC_DIR/$PETSC_ARCH/lib` and header files in `$PETSC_DIR/$PETSC_ARCH/include`. `PETSC_DIR` and `PETSC_ARCH` are environment variables pointing to a specific PETSc instance based on the PETSc module loaded. - -* dense linear algebra - * [Elemental][l] -* sparse linear system solvers - * [Intel MKL Pardiso][m] - * [MUMPS][n] - * [PaStiX][o] - * [SuiteSparse][p] - * [SuperLU][q] - * [SuperLU_Dist][r] -* input/output - * [ExodusII][s] - * [HDF5][t] - * [NetCDF][u] -* partitioning - * [Chaco][v] - * [METIS][w] - * [ParMETIS][x] - * [PT-Scotch][y] -* preconditioners & multigrid - * [Hypre][z] - * [SPAI - Sparse Approximate Inverse][aa] - -[a]: http://www.mcs.anl.gov/petsc/ -[b]: http://www.mcs.anl.gov/petsc/documentation/ -[c]: http://www.mcs.anl.gov/petsc/petsc-current/docs/manual.pdf -[d]: http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/singleindex.html -[e]: http://www.youtube.com/watch?v=asVaFg1NDqY -[f]: http://www.youtube.com/watch?v=ubp_cSibb9I -[g]: http://www.youtube.com/watch?v=vJAAAQv-aaw -[h]: http://www.youtube.com/watch?v=BKVlqWNh8jY -[i]: http://www.youtube.com/watch?v=iXkbLEBFjlM -[j]: https://www.mcs.anl.gov/petsc/miscellaneous/petscthreads.html -[k]: http://www.mcs.anl.gov/petsc/miscellaneous/external.html -[l]: http://libelemental.org/ -[m]: https://software.intel.com/en-us/node/470282 -[n]: http://mumps.enseeiht.fr/ -[o]: http://pastix.gforge.inria.fr/ -[p]: http://faculty.cse.tamu.edu/davis/suitesparse.html -[q]: http://crd.lbl.gov/~xiaoye/SuperLU/#superlu -[r]: http://crd.lbl.gov/~xiaoye/SuperLU/#superlu_dist -[s]: http://sourceforge.net/projects/exodusii/ -[t]: http://www.hdfgroup.org/HDF5/ -[u]: http://www.unidata.ucar.edu/software/netcdf/ -[v]: http://www.cs.sandia.gov/CRF/chac.html -[w]: http://glaros.dtc.umn.edu/gkhome/metis/metis/overview -[x]: http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview -[y]: http://www.labri.fr/perso/pelegrin/scotch/ -[z]: http://www.nersc.gov/users/software/programming-libraries/math-libraries/petsc/ -[aa]: https://bitbucket.org/petsc/pkg-spai diff --git a/content/docs/software/nvidia-cuda-q.mdx b/content/docs/software/nvidia-cuda-q.mdx deleted file mode 100644 index c622052799a38560f20290cede068d7af5f30bcf..0000000000000000000000000000000000000000 --- a/content/docs/software/nvidia-cuda-q.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "CUDA Quantum for Python" ---- -## What Is CUDA Quantum? - -CUDA Quantum streamlines hybrid application development and promotes productivity and scalability in quantum computing. It offers a unified programming model designed for a hybrid setting—that is, CPUs, GPUs, and QPUs working together. - -For more information, see the [official documentation][1]. - -## How to Install Version Without GPU Acceleration - -Use (preferably in conda environment) - -```bash -pip install cuda-quantum -``` - -## How to Install Version With GPU Acceleration Using Conda - -Run: - -```bash -conda create -y -n cuda-quantum python=3.10 pip -conda install -y -n cuda-quantum -c "nvidia/label/cuda-11.8.0" cuda -conda install -y -n cuda-quantum -c conda-forge mpi4py openmpi cxx-compiler cuquantum -conda env config vars set -n cuda-quantum -LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$CONDA_PREFIX/envs/cuda-quantum/lib" -conda env config vars set -n cuda-quantum -MPI_PATH=$CONDA_PREFIX/envs/cuda-quantum -conda run -n cuda-quantum pip install cuda-quantum -conda activate cuda-quantum -source $CONDA_PREFIX/lib/python3.10/site-packages/distributed_interfaces/activate_custom_mpi.sh -``` - -Then configure the MPI: - -``` bash -export OMPI_MCA_opal_cuda_support=true OMPI_MCA_btl='^openib' -``` - -## How to Test Your Installation? - -You can test your installation by running the following script: - -```bash -import cudaq - -kernel = cudaq.make_kernel() -qubit = kernel.qalloc() -kernel.x(qubit) -kernel.mz(qubit) - -result = cudaq.sample(kernel) -``` - -## Further Questions Considering the Installation? - -See the Cuda Quantum PyPI website at [https://pypi.org/project/cuda-quantum/][2]. - -## Example QNN - -In the *qnn_example.py* you find a script that loads FashionMNIST dataset, chooses two data type (shirts and pants), then we create a Neural Network with quantum layer.This network is then trained on our data and later tested on the test dataset. You are free to try it on your own. Download the [QNN example][a] and rename it to `qnn_example.py`. - - - -[1]: https://nvidia.github.io/cuda-quantum/latest/index.html -[2]: https://pypi.org/project/cuda-quantum/ - -[a]: ../src/qnn_example.txt diff --git a/content/docs/software/nvidia-cuda.mdx b/content/docs/software/nvidia-cuda.mdx deleted file mode 100644 index 7d5433be10b98f888ac375b9906fda05327207bf..0000000000000000000000000000000000000000 --- a/content/docs/software/nvidia-cuda.mdx +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: "NVIDIA CUDA" ---- -## Introduction - -CUDA® is a parallel computing platform and programming model developed by NVIDIA for general computing on graphical processing units (GPUs). - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av CUDA -``` - -## CUDA Programming - -The default programming model for GPU accelerators is NVIDIA CUDA. To set up the environment for CUDA, use: - -```console -$ ml CUDA -``` - -CUDA code can be compiled directly on login nodes. The user does not have to use compute nodes with GPU accelerators for compilation. To compile CUDA source code, use the NVCC compiler: - -```console -$ nvcc --version -``` - -The CUDA Toolkit comes with a large number of examples, which can be a helpful reference to start with. To compile and test these examples, users should copy them to their home directory: - -```console -$ cd ~ -$ mkdir cuda-samples -$ cp -R /apps/nvidia/cuda/VERSION_CUDA/samples/* ~/cuda-samples/ -``` - -To compile examples, change directory to the particular example (here the example used is deviceQuery) and run `make` to start the compilation; - -```console -$ cd ~/cuda-samples/1_Utilities/deviceQuery -$ make -``` - -Request an interactive session on the `qgpu` queue and execute the binary file: - -```console -$ salloc -p qgpu -A PROJECT_ID -$ ml CUDA -$ ~/cuda-samples/1_Utilities/deviceQuery/deviceQuery -``` - -The expected output of the deviceQuery example executed on a node with a Tesla K20m is: - -```console - CUDA Device Query (Runtime API) version (CUDART static linking) - - Detected 1 CUDA Capable device(s) - - Device 0: "Tesla K20m" - CUDA Driver Version / Runtime Version 5.0 / 5.0 - CUDA Capability Major/Minor version number: 3.5 - Total amount of global memory: 4800 MBytes (5032706048 bytes) - (13) Multiprocessors x (192) CUDA Cores/MP: 2496 CUDA Cores - GPU Clock rate: 706 MHz (0.71 GHz) - Memory Clock rate: 2600 Mhz - Memory Bus Width: 320-bit - L2 Cache Size: 1310720 bytes - Max Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096) - Max Layered Texture Size (dim) x layers 1D=(16384) x 2048, 2D=(16384,16384) x 2048 - Total amount of constant memory: 65536 bytes - Total amount of shared memory per block: 49152 bytes - Total number of registers available per block: 65536 - Warp size: 32 - Maximum number of threads per multiprocessor: 2048 - Maximum number of threads per block: 1024 - Maximum sizes of each dimension of a block: 1024 x 1024 x 64 - Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535 - Maximum memory pitch: 2147483647 bytes - Texture alignment: 512 bytes - Concurrent copy and kernel execution: Yes with 2 copy engine(s) - Run time limit on kernels: No - Integrated GPU sharing Host Memory: No - Support host page-locked memory mapping: Yes - Alignment requirement for Surfaces: Yes - Device has ECC support: Enabled - Device supports Unified Addressing (UVA): Yes - Device PCI Bus ID / PCI location ID: 2 / 0 - Compute Mode: - < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > - deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.0, CUDA Runtime Version = 5.0, NumDevs = 1, Device0 = Tesla K20m -``` - -### Code Example - -In this section, we provide a basic CUDA based vector addition code example. You can directly copy and paste the code to test it: - -```cpp -$ vim test.cu - -#define N (2048*2048) -#define THREADS_PER_BLOCK 512 - -#include <stdio.h> -#include <stdlib.h> - -// GPU kernel function to add two vectors -__global__ void add_gpu( int *a, int *b, int *c, int n){ - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) - c[index] = a[index] + b[index]; -} - -// CPU function to add two vectors -void add_cpu (int *a, int *b, int *c, int n) { - for (int i=0; i < n; i++) - c[i] = a[i] + b[i]; -} - -// CPU function to generate a vector of random integers -void random_ints (int *a, int n) { - for (int i = 0; i < n; i++) - a[i] = rand() % 10000; // random number between 0 and 9999 -} - -// CPU function to compare two vectors -int compare_ints( int *a, int *b, int n ){ - int pass = 0; - for (int i = 0; i < N; i++){ - if (a[i] != b[i]) { - printf("Value mismatch at location %d, values %d and %dn",i, a[i], b[i]); - pass = 1; - } - } - if (pass == 0) printf ("Test passedn"); else printf ("Test Failedn"); - return pass; -} - -int main( void ) { - - int *a, *b, *c; // host copies of a, b, c - int *dev_a, *dev_b, *dev_c; // device copies of a, b, c - int size = N * sizeof( int ); // we need space for N integers - - // Allocate GPU/device copies of dev_a, dev_b, dev_c - cudaMalloc( (void**)&dev_a, size ); - cudaMalloc( (void**)&dev_b, size ); - cudaMalloc( (void**)&dev_c, size ); - - // Allocate CPU/host copies of a, b, c - a = (int*)malloc( size ); - b = (int*)malloc( size ); - c = (int*)malloc( size ); - - // Fill input vectors with random integer numbers - random_ints( a, N ); - random_ints( b, N ); - - // copy inputs to device - cudaMemcpy( dev_a, a, size, cudaMemcpyHostToDevice ); - cudaMemcpy( dev_b, b, size, cudaMemcpyHostToDevice ); - - // launch add_gpu() kernel with blocks and threads - add_gpu<<< N/THREADS_PER_BLOCK, THREADS_PER_BLOCK >>( dev_a, dev_b, dev_c, N ); - - // copy device result back to host copy of c - cudaMemcpy( c, dev_c, size, cudaMemcpyDeviceToHost ); - - //Check the results with CPU implementation - int *c_h; c_h = (int*)malloc( size ); - add_cpu (a, b, c_h, N); - compare_ints(c, c_h, N); - - // Clean CPU memory allocations - free( a ); free( b ); free( c ); free (c_h); - - // Clean GPU memory allocations - cudaFree( dev_a ); - cudaFree( dev_b ); - cudaFree( dev_c ); - - return 0; -} -``` - -This code can be compiled using the following command: - -```console -$ nvcc test.cu -o test_cuda -``` - -To run the code, request an interactive session to get access to one of the GPU accelerated nodes: - -```console -$ salloc -p qgpu -A PROJECT_ID -$ ml cuda -$ ./test.cuda -``` - -## CUDA Libraries - -### cuBLAS - -The NVIDIA CUDA Basic Linear Algebra Subroutines (cuBLAS) library is a GPU-accelerated version of the complete standard BLAS library with 152 standard BLAS routines. A basic description of the library together with basic performance comparisons with MKL can be found [here][a]. - -#### cuBLAS Example: SAXPY - -The SAXPY function multiplies the vector x by the scalar alpha and adds it to the vector y, overwriting the latest vector with the result. A description of the cuBLAS function can be found in the [NVIDIA CUDA documentation][b]. The code can be pasted in the file and compiled without any modification: - -```cpp -/* Includes, system */ -#include <stdio.h> -#include <stdlib.h> - -/* Includes, cuda */ -#include <cuda_runtime.h> -#include <cublas_v2.h> - -/* Vector size */ -#define N (32) - -/* Host implementation of a simple version of saxpi */ -void saxpy(int n, float alpha, const float *x, float *y) -{ - for (int i = 0; i < n; ++i) - y[i] = alpha*x[i] + y[i]; -} - -/* Main */ -int main(int argc, char **argv) -{ - float *h_X, *h_Y, *h_Y_ref; - float *d_X = 0; - float *d_Y = 0; - - const float alpha = 1.0f; - int i; - - cublasHandle_t handle; - - /* Initialize CUBLAS */ - printf("simpleCUBLAS test running..n"); - cublasCreate(&handle); - - /* Allocate host memory for the matrices */ - h_X = (float *)malloc(N * sizeof(h_X[0])); - h_Y = (float *)malloc(N * sizeof(h_Y[0])); - h_Y_ref = (float *)malloc(N * sizeof(h_Y_ref[0])); - - /* Fill the matrices with test data */ - for (i = 0; i < N; i++) - { - h_X[i] = rand() / (float)RAND_MAX; - h_Y[i] = rand() / (float)RAND_MAX; - h_Y_ref[i] = h_Y[i]; - } - - /* Allocate device memory for the matrices */ - cudaMalloc((void **)&d_X, N * sizeof(d_X[0])); - cudaMalloc((void **)&d_Y, N * sizeof(d_Y[0])); - - /* Initialize the device matrices with the host matrices */ - cublasSetVector(N, sizeof(h_X[0]), h_X, 1, d_X, 1); - cublasSetVector(N, sizeof(h_Y[0]), h_Y, 1, d_Y, 1); - - /* Performs operation using plain C code */ - saxpy(N, alpha, h_X, h_Y_ref); - - /* Performs operation using cublas */ - cublasSaxpy(handle, N, &alpha, d_X, 1, d_Y, 1); - - /* Read the result back */ - cublasGetVector(N, sizeof(h_Y[0]), d_Y, 1, h_Y, 1); - - /* Check result against reference */ - for (i = 0; i < N; ++i) - printf("CPU res = %f t GPU res = %f t diff = %f n", h_Y_ref[i], h_Y[i], h_Y_ref[i] - h_Y[i]); - - /* Memory clean up */ - free(h_X); free(h_Y); free(h_Y_ref); - cudaFree(d_X); cudaFree(d_Y); - - /* Shutdown */ - cublasDestroy(handle); -} -``` - -<Callout> - cuBLAS has its own function for data transfers between CPU and GPU memory: - - [cublasSetVector][c] - transfers data from CPU to GPU memory - - [cublasGetVector][d] - transfers data from GPU to CPU memory -</Callout> - -To compile the code using the NVCC compiler, the `-lcublas` compiler flag has to be specified: - -```console -$ ml cuda -$ nvcc -lcublas test_cublas.cu -o test_cublas_nvcc -``` - -To compile the same code with GCC: - -```console -$ ml cuda -$ gcc -std=c99 test_cublas.c -o test_cublas_icc -lcublas -lcudart -``` - -To compile the same code with the Intel compiler: - -```console -$ ml cuda -$ ml intel -$ icc -std=c99 test_cublas.c -o test_cublas_icc -lcublas -lcudart -``` - -[a]: https://developer.nvidia.com/cublas -[b]: http://docs.nvidia.com/cuda/cublas/index.html#cublas-lt-t-gt-axpy -[c]: http://docs.nvidia.com/cuda/cublas/index.html#cublassetvector -[d]: http://docs.nvidia.com/cuda/cublas/index.html#cublasgetvector diff --git a/content/docs/software/nvidia-hip.mdx b/content/docs/software/nvidia-hip.mdx deleted file mode 100644 index d7223a2cdb2c14d11ec6429191daca06c3afb653..0000000000000000000000000000000000000000 --- a/content/docs/software/nvidia-hip.mdx +++ /dev/null @@ -1,225 +0,0 @@ ---- -title: "ROCm HIP" ---- -## Introduction - -ROCm HIP allows developers to convert [CUDA code][a] to portable C++. The same source code can be compiled to run on NVIDIA or AMD GPUs. - -This page documents the use of pre-built Apptainer (previously Singularity) image on Karolina Accelerated nodes (acn). - -## Get Into GPU Node - -```console -$ salloc -p qgpu -A PROJECT_ID -t 01:00:00 -salloc: Granted job allocation 1543777 -salloc: Waiting for resource configuration -salloc: Nodes acn41 are ready for job -``` - -## Installed Versions of Apptainer - -For the current list of installed versions, use: - -```console -module avail apptainer -# ----------------- /apps/modules/tools ------------------ -# apptainer-wrappers/1.0 (A) apptainer/1.1.5 -``` - -Load the required module: - -```console -module load apptainer/1.1.5 -``` - -## Launch Apptainer - -Run the container: - -```console -singularity shell /home/username/rocm/centos7-nvidia-rocm.sif -``` - -The above gives you Apptainer shell prompt: - -```console -Singularity> -``` - -## Inside Container - -Verify that you have GPUs active and accessible on the given node: - -```console -nvidia-smi -``` - -You should get output similar to: - -```console -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 515.65.07 Driver Version: 515.65.07 CUDA Version: 11.7 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|===============================+======================+======================| -| 0 NVIDIA A100-SXM... Off | 00000000:07:00.0 Off | 0 | -| N/A 26C P0 50W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 1 NVIDIA A100-SXM... Off | 00000000:0B:00.0 Off | 0 | -| N/A 26C P0 51W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 2 NVIDIA A100-SXM... Off | 00000000:48:00.0 Off | 0 | -| N/A 22C P0 51W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 3 NVIDIA A100-SXM... Off | 00000000:4C:00.0 Off | 0 | -| N/A 25C P0 52W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 4 NVIDIA A100-SXM... Off | 00000000:88:00.0 Off | 0 | -| N/A 22C P0 51W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 5 NVIDIA A100-SXM... Off | 00000000:8B:00.0 Off | 0 | -| N/A 26C P0 54W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 6 NVIDIA A100-SXM... Off | 00000000:C8:00.0 Off | 0 | -| N/A 25C P0 52W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ -| 7 NVIDIA A100-SXM... Off | 00000000:CB:00.0 Off | 0 | -| N/A 26C P0 51W / 400W | 0MiB / 40960MiB | 0% Default | -| | | Disabled | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=============================================================================| -| No running processes found | -+-----------------------------------------------------------------------------+ -``` - -### Code Example - -In this section, we show a basic code example. You can directly copy and paste the code to test it: - -```cpp -// filename : /tmp/sample.cu - -#include <stdio.h> -#include <cuda_runtime.h> - -#define CHECK(cmd) \ -{\ - cudaError_t error = cmd;\ - if (error != cudaSuccess) { \ - fprintf(stderr, "error: '%s'(%d) at %s:%d\n", cudaGetErrorString(error), error,__FILE__, __LINE__); \ - exit(EXIT_FAILURE);\ - }\ -} - - -/* - * Square each element in the array A and write to array C. - */ -template <typename T> -__global__ void -vector_square(T *C_d, T *A_d, size_t N) -{ - size_t offset = (blockIdx.x * blockDim.x + threadIdx.x); - size_t stride = blockDim.x * gridDim.x ; - - for (size_t i=offset; i<N; i+=stride) { - C_d[i] = A_d[i] * A_d[i]; - } -} - - -int main(int argc, char *argv[]) -{ - float *A_d, *C_d; - float *A_h, *C_h; - size_t N = 1000000; - size_t Nbytes = N * sizeof(float); - - cudaDeviceProp props; - CHECK(cudaGetDeviceProperties(&props, 0/*deviceID*/)); - printf ("info: running on device %s\n", props.name); - - printf ("info: allocate host mem (%6.2f MB)\n", 2*Nbytes/1024.0/1024.0); - A_h = (float*)malloc(Nbytes); - CHECK(A_h == 0 ? cudaErrorMemoryAllocation : cudaSuccess ); - C_h = (float*)malloc(Nbytes); - CHECK(C_h == 0 ? cudaErrorMemoryAllocation : cudaSuccess ); - // Fill with Phi + i - for (size_t i=0; i<N; i++) - { - A_h[i] = 1.618f + i; - } - - printf ("info: allocate device mem (%6.2f MB)\n", 2*Nbytes/1024.0/1024.0); - CHECK(cudaMalloc(&A_d, Nbytes)); - CHECK(cudaMalloc(&C_d, Nbytes)); - - - printf ("info: copy Host2Device\n"); - CHECK ( cudaMemcpy(A_d, A_h, Nbytes, cudaMemcpyHostToDevice)); - - const unsigned blocks = 512; - const unsigned threadsPerBlock = 256; - - printf ("info: launch 'vector_square' kernel\n"); - vector_square <<<blocks, threadsPerBlock>>> (C_d, A_d, N); - - printf ("info: copy Device2Host\n"); - CHECK ( cudaMemcpy(C_h, C_d, Nbytes, cudaMemcpyDeviceToHost)); - - printf ("info: check result\n"); - for (size_t i=0; i<N; i++) { - if (C_h[i] != A_h[i] * A_h[i]) { - CHECK(cudaErrorUnknown); - } - } - printf ("PASSED!\n"); -} -``` - -First convert the CUDA sample code into HIP code: - -```console -cd /tmp -/opt/rocm/hip/bin/hipify-perl sample.cu > sample.cpp -``` - -This code can then be compiled using the following commands: - -```console -cd /tmp -export HIP_PLATFORM=$( /opt/rocm/hip/bin/hipconfig --platform ) -export HIPCC=/opt/rocm/hip/bin/hipcc -$HIPCC sample.cpp -o sample -``` - -Running it, you should get the following output: - -```console -Singularity> cd /tmp -Singularity> ./sample -info: running on device NVIDIA A100-SXM4-40GB -info: allocate host mem ( 7.63 MB) -info: allocate device mem ( 7.63 MB) -info: copy Host2Device -info: launch 'vector_square' kernel -info: copy Device2Host -info: check result -PASSED! -``` - -[a]: nvidia-cuda.md diff --git a/content/docs/software/sdk/meta.json b/content/docs/software/sdk/meta.json deleted file mode 100644 index 4f36824f68fdce64a2ff491574026ff6060a53db..0000000000000000000000000000000000000000 --- a/content/docs/software/sdk/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Sdk", - "pages": [ - "nvhpc", - "openacc-mpi" - ] -} diff --git a/content/docs/software/sdk/nvhpc.mdx b/content/docs/software/sdk/nvhpc.mdx deleted file mode 100644 index a56cf986aa2b3144b13a5e0796df07a495f35612..0000000000000000000000000000000000000000 --- a/content/docs/software/sdk/nvhpc.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "NVIDIA HPC SDK" ---- -<style type="text/css"> -.tg {border-collapse:collapse;border-spacing:0;} -.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:12px; - overflow:hidden;padding:10px 5px;word-break:normal;} -.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:12px; - font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} -.tg .tg-lzqt{background-color:#656565;border-color:inherit;color:#ffffff;font-weight:bold;text-align:center;vertical-align:top} -.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top} -.tg .tg-7btt{border-color:inherit;font-weight:bold;text-align:center;vertical-align:top} -</style> -The NVIDIA HPC Software Development Kit includes the proven compilers, libraries, and software tools -essential to maximizing developer productivity and the performance and portability of HPC applications. - -## Installed Versions - -Different versions are available on Karolina, Barbora, and DGX-2. -For the current version use the command: - -```console -ml av nvhpc -``` - -## Components - -Below is the list of components in the NVIDIA HPC SDK. - -<table class="tg"> -<thead> - <tr> - <th class="tg-lzqt" colspan="7">Development</th> - <th class="tg-lzqt" colspan="2">Analysis</th> - </tr> -</thead> -<tbody> - <tr> - <td class="tg-7btt">Programming<br>Models</td> - <td class="tg-7btt" colspan="2">Compilers</td> - <td class="tg-7btt">Core<br>Libraries</td> - <td class="tg-7btt" colspan="2">Math<br>Libraries</td> - <td class="tg-7btt">Communication<br>Libraries</td> - <td class="tg-7btt">Profilers</td> - <td class="tg-7btt">Debuggers</td> - </tr> - <tr> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/hpc-sdk/compilers/c++-parallel-algorithms/index.html" target="blank">Standard C++</a> & <a href="https://docs.nvidia.com/hpc-sdk/compilers/cuda-fortran-prog-guide/index.html" target="">Fortran</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html" target="blank">nvcc</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html" target="blank">nvc</a></td> - <td class="tg-c3ow"><a href="https://nvidia.github.io/libcudacxx/" target="blank">libcu++</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cublas/index.html#abstract" target="blank">cuBLAS</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cutensor/index.html" target="blank">cuTENSOR</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html#mpi-use" target="blank">Open MPI</a></td> - <td class="tg-c3ow">Nsight</td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cuda-gdb/index.html" target="blank">Cuda-gdb</a></td> - </tr> - <tr> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/hpc-sdk/compilers/openacc-gs/index.html" target="blank">OpenACC</a> & <a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html#openmp-use" target="blank">OpenMP</a></td> - <td class="tg-c3ow" colspan="2"><a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html" target="blank">nvc++</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/thrust/" target="blank">Thrust</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cusparse/index.html#abstract" target="blank">cuSPARSE</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cusolver/index.html#abstract" target="blank">cuSOLVER</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/nvshmem/" target="blank">NVSHMEM</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/nsight-systems/" target="blank">Systems</a></td> - <td class="tg-c3ow">Host</td> - </tr> - <tr> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html" target="blank">CUDA</a></td> - <td class="tg-c3ow" colspan="2"><a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-user-guide/index.html" target="blank">nvfortran</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cub/index.html" target="blank">CUB</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/cufft/index.html#abstract" target="blank">cuFFT</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/cuda/curand/index.html" target="blank">cuRAND</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/index.html" target="blank">NCCL</a></td> - <td class="tg-c3ow"><a href="https://docs.nvidia.com/nsight-compute/" target="blank">Compute</a></td> - <td class="tg-c3ow">Device</td> - </tr> -</tbody> -</table> - -## References - -[NVIDIA HPC SDK homepage][1]<br> -[Documentation][2] - -[1]: https://developer.nvidia.com/hpc-sdk -[2]: https://docs.nvidia.com/hpc-sdk/index.html diff --git a/content/docs/software/sdk/openacc-mpi.mdx b/content/docs/software/sdk/openacc-mpi.mdx deleted file mode 100644 index 0886b28bd7df11f23c27dcf7c35e5d8faf777850..0000000000000000000000000000000000000000 --- a/content/docs/software/sdk/openacc-mpi.mdx +++ /dev/null @@ -1,531 +0,0 @@ ---- -title: "OpenACC MPI Tutorial" ---- -This tutorial is an excerpt from Nvidia's [5Ă— in 5 Hours: Porting a 3D Elastic Wave Simulator to GPUs Using OpenACC][1] tutorial. -All source code for this tutorial can be downloaded as part of this [tarball][2]. -`SEISMIC_CPML`, developed by Dimitri Komatitsch and Roland Martin from University of Pau, France, -is a set of ten open-source Fortran 90 programs. - -<Callout> - Before building and running each step, - make sure that the compiler (`pgfortran`) and MPI wrappers (`mpif90`) are in your path. -</Callout> - -## Step 0: Evaluation - -Before you start, you should evaluate the code to determine -whether it is worth accelerating. -Using the compiler flag `-â Minfo=intensity`, you can see -that the average compute intensity of the various loops is between 2.5 and 2.64. -As a rule, anything below 1.0 is generally not worth accelerating -unless it is part of a larger program. - -To build and run the original MPI/OpenMP code on your system, do the following: - -```console -cd step0 -make build -make run -make verify -``` - -## Step 1: Adding Setup Code - -Because this is an MPI code where each process will use its own GPU, -you need to add some utility code to ensure that happens. -The `setDevice` routine first determines which node the process is on -(via a call to `hostid`) and then gathers the hostids from all other processes. -It then determines how many GPUs are available on the node -and assigns the devices to each process. - -Note that in order to maintain portability with the CPU version, -this section of code is guarded by the preprocessor macro `_OPENACC`, -which is defined when the OpenACC directives are enabled in the HPC Fortran compiler -through the use of the `-â acc` command-line compiler option. - -```code -#ifdef _OPENACC -# -function setDevice(nprocs,myrank) - - use iso_c_binding - use openacc - implicit none - include 'mpif.h' - - interface - function gethostid() BIND(C) - use iso_c_binding - integer (C_INT) :: gethostid - end function gethostid - end interface - - integer :: nprocs, myrank - integer, dimension(nprocs) :: hostids, localprocs - integer :: hostid, ierr, numdev, mydev, i, numlocal - integer :: setDevice - -! get the hostids so we can determine what other processes are on this node - hostid = gethostid() - CALL mpi_allgather(hostid,1,MPI_INTEGER,hostids,1,MPI_INTEGER, & - MPI_COMM_WORLD,ierr) - -! determine which processors are on this node - numlocal=0 - localprocs=0 - do i=1,nprocs - if (hostid .eq. hostids(i)) then - localprocs(i)=numlocal - numlocal = numlocal+1 - endif - enddo - -! get the number of devices on this node - numdev = acc_get_num_devices(ACC_DEVICE_NVIDIA) - - if (numdev .lt. 1) then - print *, 'ERROR: There are no devices available on this host. & - ABORTING.', myrank - stop - endif - -! print a warning if the number of devices is less then the number -! of processes on this node. Having multiple processes share devices is not -! recommended. - if (numdev .lt. numlocal) then - if (localprocs(myrank+1).eq.1) then - ! print the message only once per node - print *, 'WARNING: The number of process is greater then the number & - of GPUs.', myrank - endif - mydev = mod(localprocs(myrank+1),numdev) - else - mydev = localprocs(myrank+1) - endif - - call acc_set_device_num(mydev,ACC_DEVICE_NVIDIA) - call acc_init(ACC_DEVICE_NVIDIA) - setDevice = mydev - -end function setDevice -#endif -``` - -To build and run the step1 code on your system do the following: - -```console -cd step1 -make build -make run -make verify -``` - -## Step 2: Adding Compute Regions - -Next, you add six compute regions around the eight parallel loops. -For example, here's the final reduction loop. - -```code -!$acc kernels - do k = kmin,kmax - do j = NPOINTS_PML+1, NY-NPOINTS_PML - do i = NPOINTS_PML+1, NX-NPOINTS_PML - -! compute kinetic energy first, defined as 1/2 rho ||v||^2 -! in principle we should use rho_half_x_half_y instead of rho for vy -! in order to interpolate density at the right location in the staggered grid -! cell but in a homogeneous medium we can safely ignore it - - total_energy_kinetic = total_energy_kinetic + 0.5d0 * rho*( & - vx(i,j,k)**2 + vy(i,j,k)**2 + vz(i,j,k)**2) - -! add potential energy, defined as 1/2 epsilon_ij sigma_ij -! in principle we should interpolate the medium parameters at the right location -! in the staggered grid cell but in a homogeneous medium we can safely ignore it - -! compute total field from split components - epsilon_xx = ((lambda + 2.d0*mu) * sigmaxx(i,j,k) - lambda * & - sigmayy(i,j,k) - lambda*sigmazz(i,j,k)) / (4.d0 * mu * (lambda + mu)) - epsilon_yy = ((lambda + 2.d0*mu) * sigmayy(i,j,k) - lambda * & - sigmaxx(i,j,k) - lambda*sigmazz(i,j,k)) / (4.d0 * mu * (lambda + mu)) - epsilon_zz = ((lambda + 2.d0*mu) * sigmazz(i,j,k) - lambda * & - sigmaxx(i,j,k) - lambda*sigmayy(i,j,k)) / (4.d0 * mu * (lambda + mu)) - epsilon_xy = sigmaxy(i,j,k) / (2.d0 * mu) - epsilon_xz = sigmaxz(i,j,k) / (2.d0 * mu) - epsilon_yz = sigmayz(i,j,k) / (2.d0 * mu) - - total_energy_potential = total_energy_potential + & - 0.5d0 * (epsilon_xx * sigmaxx(i,j,k) + epsilon_yy * sigmayy(i,j,k) + & - epsilon_yy * sigmayy(i,j,k)+ 2.d0 * epsilon_xy * sigmaxy(i,j,k) + & - 2.d0*epsilon_xz * sigmaxz(i,j,k)+2.d0*epsilon_yz * sigmayz(i,j,k)) - - enddo - enddo - enddo -!$acc end kernels -``` - -The `-â acc` command line option to the HPC Accelerator Fortran compiler enables OpenACC directives. Note that OpenACC is meant to model a generic class of devices. - -Another compiler option you'll want to use during development is `-â Minfo`, -which provides feedback on optimizations and transformations performed on your code. -For accelerator-specific information, use the `-â Minfo=accel` sub-option. - -Examples of feedback messages produced when compiling `SEISMIC_CPML` include: - -```console - 1113, Generating copyin(vz(11:91,11:631,kmin:kmax)) - Generating copyin(vy(11:91,11:631,kmin:kmax)) - Generating copyin(vx(11:91,11:631,kmin:kmax)) - Generating copyin(sigmaxx(11:91,11:631,kmin:kmax)) - Generating copyin(sigmayy(11:91,11:631,kmin:kmax)) - Generating copyin(sigmazz(11:91,11:631,kmin:kmax)) - Generating copyin(sigmaxy(11:91,11:631,kmin:kmax)) - Generating copyin(sigmaxz(11:91,11:631,kmin:kmax)) - Generating copyin(sigmayz(11:91,11:631,kmin:kmax)) -``` - -To compute on a GPU, the first step is to move data from host memory to GPU memory. -In the example above, the compiler tells you that it is copying over nine arrays. - -Note the `copyin` statements. -These mean that the compiler will only copy the data to the GPU -but not copy it back to the host. -This is because line 1113 corresponds to the start of the reduction loop compute region, -where these arrays are used but never modified. - -Data movement clauses: - -* `copyin` - the data is copied only to the GPU; -* `copy` - the data is copied to the device at the beginning of the region and copied back at the end of the region; -* `copyout` - the data is only copied back to the host. - -The compiler is conservative and only copies the data -that's actually required to perform the necessary computations. -Unfortunately, because the interior sub-arrays are not contiguous in host memory, -the compiler needs to generate multiple data transfers for each array. - -```console - 1114, Loop is parallelizable - 1115, Loop is parallelizable - 1116, Loop is parallelizable - Accelerator kernel generated -``` - -Here the compiler has performed dependence analysis -on the loops at lines 1114, 1115, and 1116 (the reduction loop shown earlier). -It finds that all three loops are parallelizable so it generates an accelerator kernel. - -The compiler may attempt to work around dependences that prevent parallelization by interchanging loops (i.e changing the order) where it's safe to do so. At least one outer or interchanged loop must be parallel for an accelerator kernel to be generated. - -How the threads are organized is called the loop schedule. -Below you can see the loop schedule for our reduction loop. -The do loops have been replaced with a three-dimensional gang, -which in turn is composed of a two-dimensional vector section. - -```console - 1114, !$acc loop gang ! blockidx%y - 1115, !$acc loop gang, vector(4) ! blockidx%z threadidx%y - 1116, !$acc loop gang, vector(32) ! blockidx%x threadidx%x -``` - -In CUDA terminology, the gang clause corresponds to a grid dimension -and the vector clause corresponds to a thread block dimension. - -So here we have a 3-D array that's being grouped into blocks of 32Ă—4 elements -where a single thread is working on a specific element. -Because the number of gangs is not specified in the loop schedule, -it will be determined dynamically when the kernel is launched. -If the gang clause had a fixed width, such as gang(16), -then each kernel would be written to loop over multiple elements. - -With CUDA, programming reductions and managing shared memory can be a fairly difficult task. -In the example below, the compiler has automatically generated optimal code using these features. - -```console - 1122, Sum reduction generated for total_energy_kinetic - 1140, Sum reduction generated for total_energy_potential -``` - -To build and run the step2 code on your system do the following: - -```console -cd step2 -make build -make run -make verify -``` - -## Step 3: Adding Data Regions - -<Callout> - Set the environment variable `PGI_ACC_TIME=1` and run your executable. - This option prints basic profile information such as the kernel execution time, - data transfer time, initialization time, the actual launch configuration, - and total time spent in a compute region. - Note that the total time is measured from the host and includes time spent executing host code within a region. -<\Callout> - -To improve performance, you should minimize the amount of time transferring data, -i.e. the data directive. -You can use a data region to specify exact points in your program -where data should be copied from host memory to GPU memory, and back again. -Any compute region enclosed within a data region will use the previously copied data, -without the need to copy at the boundaries of the compute region. -A data region can span across host code and multiple compute regions, -and even across subroutine boundaries. - -In looking at the arrays in `SEISMIC_CMPL`, there are 18 arrays with constant values. -Another 21 are used only within compute regions so are never needed on the host. -Let's start by adding a data region around the outer time step loop. -The final three arrays do need to be copied back to the host to pass their halos. - -For those cases, we use the update directive. - -```code -!--- -!--- beginning of time loop -!--- -!$acc data & -!$acc copyin(a_x_half,b_x_half,k_x_half, & -!$acc a_y_half,b_y_half,k_y_half, & -!$acc a_z_half,b_z_half,k_z_half, & -!$acc a_x,a_y,a_z,b_x,b_y,b_z,k_x,k_y,k_z, & -!$acc sigmaxx,sigmaxz,sigmaxy,sigmayy,sigmayz,sigmazz, & -!$acc memory_dvx_dx,memory_dvy_dx,memory_dvz_dx, & -!$acc memory_dvx_dy,memory_dvy_dy,memory_dvz_dy, & -!$acc memory_dvx_dz,memory_dvy_dz,memory_dvz_dz, & -!$acc memory_dsigmaxx_dx, memory_dsigmaxy_dy, & -!$acc memory_dsigmaxz_dz, memory_dsigmaxy_dx, & -!$acc memory_dsigmaxz_dx, memory_dsigmayz_dy, & -!$acc memory_dsigmayy_dy, memory_dsigmayz_dz, & -!$acc memory_dsigmazz_dz) - - do it = 1,NSTEP - -... - -!$acc update host(sigmazz,sigmayz,sigmaxz) -! sigmazz(k+1), left shift - call MPI_SENDRECV(sigmazz(:,:,1),number_of_values,MPI_DOUBLE_PRECISION, & - receiver_left_shift,message_tag,sigmazz(:,:,NZ_LOCAL+1), & - number_of_values, - -... - -!$acc update device(sigmazz,sigmayz,sigmaxz) - -... - - ! --- end of time loop - enddo -!$acc end data -``` - -Data regions can be nested, and in fact we used this feature -in the time loop body for the arrays vx, vy and vz as shown below. -While these arrays are copied back and forth at the inner data region boundary, -and so are moved more often than the arrays moved in the outer data region, -they are used across multiple compute regions -instead of being copied at each compute region boundary. - -Note that we do not specify any array dimensions in the copy clause. -This instructs the compiler to copy each array in its entirety as a contiguous block, -and eliminates the inefficiency we noted earlier -when interior sub-arrays were being copied in multiple blocks. - -```code -!$acc data copy(vx,vy,vz) - -... data region spans over 5 compute regions and host code - -!$acc kernels - -... - -!$acc end kernels - -!$acc end data -``` - -To build and run the step3 code on your system do the following: - -```console -cd step3 -make build -make run -make verify -``` - -## Step 4: Optimizing Data Transfers - -The next steps further optimizes the data transfers -by migrating as much of the computation as we can over to the GPU -and moving only the absolute minimum amount of data required. -The first step is to move the start of the outer data region up -so that it occurs earlier in the code, and to put the data initialization loops into compute kernels. -This includes the `vx`, `vy`, and `vz` arrays. -This approach enables you to remove the inner data region used in the previous optimization step. - -In the following example code, notice the use of the `create` clause. -This instructs the compiler to allocate space for variables in GPU memory for local use -but to perform no data movement on those variables. -Essentially they are used as scratch variables in GPU memory. - -```console -!$acc data & -!$acc copyin(a_x_half,b_x_half,k_x_half, & -!$acc a_y_half,b_y_half,k_y_half, & -!$acc a_z_half,b_z_half,k_z_half, & -!$acc ix_rec,iy_rec, & -!$acc a_x,a_y,a_z,b_x,b_y,b_z,k_x,k_y,k_z), & -!$acc copyout(sisvx,sisvy), & -!$acc create(memory_dvx_dx,memory_dvy_dx,memory_dvz_dx, & -!$acc memory_dvx_dy,memory_dvy_dy,memory_dvz_dy, & -!$acc memory_dvx_dz,memory_dvy_dz,memory_dvz_dz, & -!$acc memory_dsigmaxx_dx, memory_dsigmaxy_dy, & -!$acc memory_dsigmaxz_dz, memory_dsigmaxy_dx, & -!$acc memory_dsigmaxz_dx, memory_dsigmayz_dy, & -!$acc memory_dsigmayy_dy, memory_dsigmayz_dz, & -!$acc memory_dsigmazz_dz, & -!$acc vx,vy,vz,vx1,vy1,vz1,vx2,vy2,vz2, & -!$acc sigmazz1,sigmaxz1,sigmayz1, & -!$acc sigmazz2,sigmaxz2,sigmayz2) & -!$acc copyin(sigmaxx,sigmaxz,sigmaxy,sigmayy,sigmayz,sigmazz) - -... - -! Initialize vx, vy and vz arrays on the device -!$acc kernels - vx(:,:,:) = ZERO - vy(:,:,:) = ZERO - vz(:,:,:) = ZERO -!$acc end kernels - -... -``` - -One caveat to using data regions is that you must be aware of which copy -(host or device) of the data you are actually using in a given loop or computation. -For example, any update to the copy of a variable in device memory -won't be reflected in the host copy until you specified -using either an update directive or a `copy` clause at a data or compute region boundary. - -<Callout type=warn> - Unintentional loss of coherence between the host and device copy of a variable is one of the most common causes of validation errors in OpenACC programs. -</Callout> - -After making the above change to `SEISMIC_CPML`, the code generated incorrect results. After debugging, it was determined that the section of the time step loop -that initializes boundary conditions was omitted from an OpenACC compute region. -As a result, we were initializing the host copy of the data, -rather than the device copy as intended, which resulted in uninitialized variables in device memory. - -The next challenge in optimizing the data transfers related to the handling of the halo regions. -`SEISMIC_CPML` passes halos from six 3-D arrays between MPI processes during the course of the computations. - -After some experimentation, we settled on an approach whereby we added six new temporary 2-D arrays to hold the halo data. -Within a compute region we gathered the 2-D halos from the main 3-D arrays -into the new temp arrays, copied the temporaries back to the host in one contiguous block, -passed the halos between MPI processes, and finally copied the exchanged values -back to device memory and scattered the halos back into the 3-D arrays. -While this approach does add to the kernel execution time, it saves a considerable amount of data transfer time. - -In the example code below, note that the source code added to support the halo -gathers and transfers is guarded by the preprocessor `_OPENACC` macro -and will only be executed if the code is compiled by an OpenACC-enabled compiler. - -```code -#ifdef _OPENACC -# -! Gather the sigma 3D arrays to a 2D slice to allow for faster -! copy from the device to host -!$acc kernels - do i=1,NX - do j=1,NY - vx1(i,j)=vx(i,j,1) - vy1(i,j)=vy(i,j,1) - vz1(i,j)=vz(i,j,NZ_LOCAL) - enddo - enddo -!$acc end kernels -!$acc update host(vxl,vyl,vzl) - -! vx(k+1), left shift - call MPI_SENDRECV(vx1(:,:), number_of_values, MPI_DOUBLE_PRECISION, & - receiver_left_shift, message_tag, vx2(:,:), number_of_values, & - MPI_DOUBLE_PRECISION, sender_left_shift, message_tag, MPI_COMM_WORLD,& - message_status, code) - -! vy(k+1), left shift - call MPI_SENDRECV(vy1(:,:), number_of_values, MPI_DOUBLE_PRECISION, & - receiver_left_shift,message_tag, vy2(:,:),number_of_values, & - MPI_DOUBLE_PRECISION, sender_left_shift, message_tag, MPI_COMM_WORLD,& - message_status, code) - -! vz(k-1), right shift - call MPI_SENDRECV(vz1(:,:), number_of_values, MPI_DOUBLE_PRECISION, & - receiver_right_shift, message_tag, vz2(:,:), number_of_values, & - MPI_DOUBLE_PRECISION, sender_right_shift, message_tag, MPI_COMM_WORLD, & - message_status, code) - -!$acc update device(vx2,vy2,vz2) -!$acc kernels - do i=1,NX - do j=1,NY - vx(i,j,NZ_LOCAL+1)=vx2(i,j) - vy(i,j,NZ_LOCAL+1)=vy2(i,j) - vz(i,j,0)=vz2(i,j) - enddo - enddo -!$acc end kernels - -#else -``` - -To build and run the step4 code on your system do the following: - -```console -cd step4 -make build -make run -make verify -``` - -## Step 5: Loop Schedule Tuning - -The final step is to tune the OpenACC compute region loop schedules -using the gang, worker, and vector clauses. -The default kernel schedules chosen by the NVIDIA OpenACC compiler are usually quite good. -Manual tuning efforts often don't improve timings significantly, -but it's always worthwhile to spend a little time examining -whether you can do better by overriding compiler-generated loop schedules -using explicit loop scheduling clauses. -You can usually tell fairly quickly if the clauses are having an effect. - -Note that there is no well-defined method for finding an optimal kernel schedule. -The best advice is to start with the compiler's default schedule and try small adjustments -to see if and how they affect execution time. -The kernel schedule you choose will affect whether and how shared memory is used, -global array accesses, and various types of optimizations. -Typically, it's better to perform gang scheduling of loops with large iteration counts. - -```code -!$acc loop gang - do k = k2begin,NZ_LOCAL - kglobal = k + offset_k -!$acc loop worker vector collapse(2) - do j = 2,NY - do i = 2,NX -``` - -To build and run the step5 code on your system do the following: - -```console -cd step5 -make build -make run -make verify -``` - -[1]: https://docs.nvidia.com/hpc-sdk/compilers/openacc-mpi-tutorial/index.html -[2]: https://docs.nvidia.com/hpc-sdk/compilers/openacc-mpi-tutorial/openacc-mpi-tutorial.tar.gz diff --git a/content/docs/software/tools/ansys/ansys-cfx.mdx b/content/docs/software/tools/ansys/ansys-cfx.mdx deleted file mode 100644 index f32cb84842bcba3bd02da2090983e9470b5f8cd1..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/ansys-cfx.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "ANSYS CFX" ---- -[ANSYS CFX][a] is a high-performance, general purpose fluid dynamics program -that has been applied to solve wide-ranging fluid flow problems for over 20 years. -At the heart of ANSYS CFX is its advanced solver technology, -the key to achieving reliable and accurate solutions quickly and robustly. -The modern, highly parallelized solver is the foundation for an abundant choice of physical models -to capture virtually any type of phenomena related to fluid flow. -The solver and its many physical models are wrapped in a modern, intuitive, and flexible GUI and user environment, -with extensive capabilities for customization and automation using session files, scripting and a powerful expression language. - -To run ANSYS CFX in batch mode, you can utilize/modify the default `cfx.slurm` script and execute it via the `sbatch` command: - -```bash -#!/bin/bash -#SBATCH --nodes=5 # Request 5 nodes -#SBATCH --ntasks-per-node=128 # Request 128 MPI processes per node -#SBATCH --job-name=ANSYS-test # Job name -#SBATCH --partition=qcpu # Partition name -#SBATCH --account=ACCOUNT_ID # Account/project ID -#SBATCH --output=%x-%j.out # Output log file with job name and job ID -#SBATCH --time=04:00:00 # Walltime - -#!change the working directory (default is home directory) -#cd <working directory> (working directory must exists) -DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID -mkdir -p "$DIR" -cd "$DIR" || exit - -echo Running on host `hostname` -echo Time is `date` -echo Directory is `pwd` -echo This jobs runs on the following processors: -echo `$SLURM_NODELIST` - -ml ANSYS/2023R2-intel-2022.12 - -#### Set number of processors per host listing -procs_per_host=1 -#### Create host list -hl="" -for host in $(scontrol show hostname $SLURM_NODELIST) -do - if [ "$hl" = "" ] - then hl="$host:$procs_per_host" - else hl="${hl}:$host:$procs_per_host" - fi -done - -echo Machines: $hl - -#-dev input.def includes the input of CFX analysis in DEF format -#-P the name of prefered license feature (aa_r=ANSYS Academic Research, ane3fl=Multiphysics(commercial)) -cfx5solve -def input.def -size 4 -size-ni 4x -part-large -start-method "Platform MPI Distributed Parallel" -par-dist $hl -P aa_r -``` - -SVS FEM recommends utilizing sources by keywords: nodes, ppn. -These keywords allow addressing directly the number of nodes (computers) and cores (ppn) utilized in the job. -In addition, the rest of the code assumes such structure of allocated resources. - -A working directory has to be created before sending the Slurm job into the queue. -The input file should be in the working directory or a full path to the input file has to be specified. -The input file has to be defined by a common CFX def file which is attached to the CFX solver via the `-def` parameter. - -The **license** should be selected by the `-P` parameter. -Licensed products are: `aa_r` (ANSYS **Academic** Research) and `ane3fl` (ANSYS Multiphysics-**Commercial**). - -[a]: http://www.ansys.com/products/fluids/ansys-cfx diff --git a/content/docs/software/tools/ansys/ansys-fluent.mdx b/content/docs/software/tools/ansys/ansys-fluent.mdx deleted file mode 100644 index 59efbae351fadf7246c7d9029d7ca534afd667e2..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/ansys-fluent.mdx +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: "ANSYS Fluent" ---- -[ANSYS Fluent][a] software contains the broad physical modeling capabilities needed to model flow, -turbulence, heat transfer, and reactions for industrial applications ranging -from air flow over an aircraft wing to combustion in a furnace, from bubble columns to oil platforms, -from blood flow to semiconductor manufacturing, and from clean room design to wastewater treatment plants. -Special models that give the software the ability to model in-cylinder combustion, -aeroacoustics, turbomachinery, and multiphase systems have served to broaden its reach. - -## Common Way to Run Fluent - -To run ANSYS Fluent in a batch mode, you can utilize/modify the default `fluent.slurm` script and execute it via the `sbatch` command: - -```bash -#!/bin/bash -#SBATCH --nodes=5 # Request 5 nodes -#SBATCH --ntasks-per-node=128 # 128 MPI processes per node -#SBATCH --job-name=ANSYS-test # Job name -#SBATCH --partition=qcpu # Partition name -#SBATCH --account=ACCOUNT_ID # Account/project ID -#SBATCH --output=%x-%j.out # Output log file with job name and job ID -#SBATCH --time=04:00:00 # Walltime - -#!change the working directory (default is home directory) -#cd <working directory> (working directory must exists) -DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID -mkdir -p "$DIR" -cd "$DIR" || exit - -echo Running on host `hostname` -echo Time is `date` -echo Directory is `pwd` -echo This jobs runs on the following processors: -echo $SLURM_NODELIST - -#### Load ansys module so that we find the cfx5solve command -ml ANSYS/2023R2-intel-2022.12 - -# Count the total number of cores allocated -NCORES=$SLURM_NTASKS - -fluent 3d -t$NCORES -cnf=$SLURM_NODELIST -g -i fluent.jou -``` - -[SVS FEM][b] recommends utilizing sources by keywords: nodes, ppn. -These keywords allows addressing directly the number of nodes (computers) and cores (ppn) utilized in the job. -In addition, the rest of the code assumes such structure of allocated resources. - -A working directory has to be created before sending the job into the queue. -The input file should be in the working directory or a full path to the input file has to be specified. -The input file has to be defined by a common Fluent journal file -which is attached to the Fluent solver via the `-i fluent.jou` parameter. - -A journal file with the definition of the input geometry and boundary conditions -and defined process of solution has, for example, the following structure: - -```console - /file/read-case aircraft_2m.cas.gz - /solve/init - init - /solve/iterate - 10 - /file/write-case-dat aircraft_2m-solution - /exit yes -``` - -The appropriate dimension of the problem has to be set by a parameter (`2d`/`3d`). - -## Fast Way to Run Fluent From Command Line - -```console -fluent solver_version [FLUENT_options] -i journal_file -slurm -``` - -This syntax will start the ANSYS FLUENT job under Slurm using the sbatch commnad. -When resources are available, Slurm will start the job and return the job ID, usually in the form of `_job_ID.hostname_`. -This job ID can then be used to query, control, or stop the job using standard Slurm commands, such as `squeue` or `scancel`. -The job will be run out of the current working directory and all output will be written to the fluent.o `_job_ID_` file. - -## Running Fluent via User's Config File - -If no command line arguments are present, the sample script uses a configuration file called slurm_fluent.conf. -This configuration file should be present in the directory from which the jobs are submitted -(which is also the directory in which the jobs are executed). -The following is an example of what the content of slurm_fluent.conf can be: - -```console -input="example_small.flin" -case="Small-1.65m.cas" -fluent_args="3d -pmyrinet" -outfile="fluent_test.out" -mpp="true" -``` - -The following is an explanation of the parameters: - -`input` is the name of the input file. - -`case` is the name of the .cas file that the input file will utilize. - -`fluent_args` are extra ANSYS FLUENT arguments. As shown in the previous example, you can specify the interconnect by using the `-p interconnect` command. The available interconnects include ethernet (default), Myrinet, InfiniBand, Vendor, Altix, and Crayx. MPI is selected automatically, based on the specified interconnect. - -`outfile` is the name of the file to which the standard output will be sent. - -`mpp="true"` will tell the job script to execute the job across multiple processors. - -To run ANSYS Fluent in batch mode with the user's config file, you can utilize/modify the following script and execute it via the `sbatch` command: - -```bash -#!/bin/sh -#SBATCH --nodes=2 # Request 2 nodes -#SBATCH --ntasks-per-node=4 # 4 MPI processes per node -#SBATCH --cpus-per-task=128 # 128 CPUs (threads) per MPI process -#SBATCH --job-name=$USE-Fluent-Project # Job name -#SBATCH --partition=qprod # Partition name -#SBATCH --account=XX-YY-ZZ # Account/project ID -#SBATCH --output=%x-%j.out # Output file name with job name and job ID -#SBATCH --time=04:00:00 # Walltime - - cd $SLURM_SUBMIT_DIR - - #We assume that if they didn’t specify arguments then they should use the - #config file if ["xx${input}${case}${mpp}${fluent_args}zz" = "xxzz" ]; then - if [ -f slurm_fluent.conf ]; then - . slurm_fluent.conf - else - printf "No command line arguments specified, " - printf "and no configuration file found. Exiting n" - fi - fi - - - #Augment the ANSYS FLUENT command line arguments case "$mpp" in - true) - #MPI job execution scenario - num_nodes=â€$SLURM_NODELIST | sort -u | wc -l†- cpus=â€expr $num_nodes * $NCPUS†- #Default arguments for mpp jobs, these should be changed to suit your - #needs. - fluent_args="-t${cpus} $fluent_args -cnf=$SLURM_NODELIST" - ;; - *) - #SMP case - #Default arguments for smp jobs, should be adjusted to suit your - #needs. - fluent_args="-t$NCPUS $fluent_args" - ;; - esac - #Default arguments for all jobs - fluent_args="-ssh -g -i $input $fluent_args" - - echo "---------- Going to start a fluent job with the following settings: - Input: $input - Case: $case - Output: $outfile - Fluent arguments: $fluent_args" - - #run the solver - fluent $fluent_args > $outfile -``` - -It runs the jobs out of the directory from which they are submitted (SLURM_SUBMIT_DIR). - -## Running Fluent in Parralel - -Fluent could be run in parallel only under the Academic Research license. -To do this, the ANSYS Academic Research license must be placed before the ANSYS CFD license in user preferences. -To make this change, the anslic_admin utility should be run: - -```console -/ansys_inc/shared_les/licensing/lic_admin/anslic_admin -``` - -The ANSLIC_ADMIN utility will be run: - - - - - - - -The ANSYS Academic Research license should be moved up to the top of the list: - - - -[a]: http://www.ansys.com/products/fluids/ansys-fluent -[b]: http://www.svsfem.cz diff --git a/content/docs/software/tools/ansys/ansys-ls-dyna.mdx b/content/docs/software/tools/ansys/ansys-ls-dyna.mdx deleted file mode 100644 index 85f338adb69a0c7a8ebfab966cfd1aa82b0c7441..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/ansys-ls-dyna.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "ANSYS LS-DYNA" ---- -[ANSYSLS-DYNA][a] provides convenient and easy-to-use access to the technology-rich, -time-tested explicit solver without the need to contend -with the complex input requirements of this sophisticated program. -Introduced in 1996, ANSYS LS-DYNA capabilities have helped customers in numerous industries -to resolve highly intricate design issues. -ANSYS Mechanical users have been able to take advantage of complex explicit solutions -for a long time utilizing the traditional ANSYS Parametric Design Language (APDL) environment. -These explicit capabilities are available to ANSYS Workbench users as well. -The Workbench platform is a powerful, comprehensive, easy-to-use environment for engineering simulation. -CAD import from all sources, geometry cleanup, automatic meshing, solution, -parametric optimization, result visualization, and comprehensive report generation -are all available within a single fully interactive modern graphical user environment. - -To run ANSYS LS-DYNA in batch mode, you can utilize/modify the default `ansysdyna.slurm` script -and execute it via the `sbatch` command: - -```bash -#!/bin/bash -#SBATCH --nodes=5 # Request 5 nodes -#SBATCH --ntasks-per-node=128 # Request 128 MPI processes per node -#SBATCH --job-name=ANSYS-test # Job name -#SBATCH --partition=qcpu # Partition name -#SBATCH --account=PROJECT_ID # Account/project ID -#SBATCH --output=%x-%j.out # Output log file with job name and job ID -#SBATCH --time=04:00:00 # Walltime - - -#!change the working directory (default is home directory) -#cd <working directory> -DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID -mkdir -p "$DIR" -cd "$DIR" || exit - -echo Running on host `hostname` -echo Time is `date` -echo Directory is `pwd` -echo This jobs runs on the following processors: -echo $SLURM_NODELIST - -#! Counts the number of processors -NPROCS=$(scontrol show hostname $SLURM_NODELIST | wc -l) - -echo This job has allocated $NPROCS nodes - -ml ANSYS/2023R2-intel-2022.12 - -#### Set number of processors per host listing -procs_per_host=1 -#### Create host list -hl="" -for host in $(scontrol show hostname $SLURM_NODELIST) -do - if [ "$hl" = "" ] - then hl="$host:$procs_per_host" - else hl="${hl}:$host:$procs_per_host" - fi -done - -echo Machines: $hl - -ansys211 -dis -lsdynampp i=input.k -machines $hl -``` - -[SVS FEM][b] recommends to utilize sources by keywords: nodes, ppn. -These keywords allows addressing directly the number of nodes (computers) -and cores (ppn) utilized in the job. -In addition, the rest of the code assumes such structure of allocated resources. - -[a]: http://www.ansys.com/products/structures/ansys-ls-dyna -[b]: http://www.svsfem.cz diff --git a/content/docs/software/tools/ansys/ansys-mechanical-apdl.mdx b/content/docs/software/tools/ansys/ansys-mechanical-apdl.mdx deleted file mode 100644 index aad5a9d8aabe2af0786d39848e860b9d3afd0091..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/ansys-mechanical-apdl.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "ANSYS MAPDL" ---- -[ANSYS Multiphysics][a] offers a comprehensive product solution for both multiphysics and single-physics analysis. -The product includes structural, thermal, fluid, and both high- and low-frequency electromagnetic analysis. -The product also contains solutions for both direct and sequentially coupled physics problems -including direct coupled-field elements and the ANSYS multi-field solver. - -To run ANSYS MAPDL in batch mode you can utilize/modify the default `mapdl.slurm` script and execute it via the `sbatch` command: - -```bash -#!/bin/bash -#SBATCH --nodes=5 # Request 5 nodes -#SBATCH --ntasks-per-node=128 # Request 128 MPI processes per node -#SBATCH --job-name=ANSYS-test # Job name -#SBATCH --partition=qcpu # Partition name -#SBATCH --account=PROJECT_ID # Account/project ID -#SBATCH --output=%x-%j.out # Output log file with job name and job ID -#SBATCH --time=04:00:00 # Walltime - -#!change the working directory (default is home directory) -#cd <working directory> (working directory must exists) -DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID -mkdir -p "$DIR" -cd "$DIR" || exit - -echo Running on host `hostname` -echo Time is `date` -echo Directory is `pwd` -echo This jobs runs on the following processors: -echo $SLURM_NODELIST - -ml ANSYS/2023R2-intel-2022.12 - -#### Set number of processors per host listing -procs_per_host=1 - -#### Create host list -hl="" -for host in $(scontrol show hostname $SLURM_NODELIST) -do - if [ "$hl" = "" ] - then hl="$host:$procs_per_host" - else hl="${hl}:$host:$procs_per_host" - fi -done - -echo Machines: $hl - -#-i input.dat includes the input of analysis in APDL format -#-o file.out is output file from ansys where all text outputs will be redirected -#-p the name of license feature (aa_r=ANSYS Academic Research, ane3fl=Multiphysics(commercial), aa_r_dy=Academic AUTODYN) -ansys211 -b -dis -p aa_r -i input.dat -o file.out -machines $hl -dir $WORK_DIR -``` - -[SVS FEM][b] recommends utilizing sources by keywords: nodes, ppn. -These keywords allow addressing directly the number of nodes (computers) and cores (ppn) utilized in the job. -In addition the rest of the code assumes such structure of allocated resources. - -A working directory has to be created before sending the Slurm job into the queue. -The input file should be in the working directory or a full path to the input file has to be specified. -The input file has to be defined by a common APDL file which is attached to the ANSYS solver via the `-i` parameter. - -The **license** should be selected by the `-p` parameter. -Licensed products are the following: `aa_r` (ANSYS **Academic** Research), -`ane3fl` (ANSYS Multiphysics-**Commercial**), and `aa_r_dy` (ANSYS **Academic** AUTODYN) - -[1]: ../../../general/resources-allocation-policy.md - -[a]: http://www.ansys.com/products/multiphysics -[b]: http://www.svsfem.cz diff --git a/content/docs/software/tools/ansys/ansys.mdx b/content/docs/software/tools/ansys/ansys.mdx deleted file mode 100644 index 44cd27713755bcd3ead10ab748e73735c360aa34..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/ansys.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Overview of ANSYS Products" ---- -[SVS FEM][a] as [ANSYS Channel partner][b] for the Czech Republic provided all ANSYS licenses for our clusters and supports all ANSYS Products (Multiphysics, Mechanical, MAPDL, CFX, Fluent, Maxwell, LS-DYNA, etc.) to IT staff and ANSYS users. In case of a problem with ANSYS functionality, contact [hotline@svsfem.cz][c]. - -We provides commercial as well as academic variants. Academic variants are distinguished by the "**Academic...**" word in the license name or by the two letter preposition "**aa\_**" in the license feature name. Change of license is realized on command line or directly in the user's Slurm file (see individual products). - -To load the latest version of any ANSYS product (Mechanical, Fluent, CFX, MAPDL, etc.) load the module: - -```console -$ ml ANSYS -``` - -ANSYS supports interactive mode, but due to assumed solution of extremely difficult tasks it is not recommended. - -If the user needs to work in the interactive mode, we recommend to configure the RSM service on the client machine which allows to forward the solution to the cluster directly from the client's Workbench project (see ANSYS RSM service). - -[a]: http://www.svsfem.cz/ -[b]: http://www.ansys.com/ -[c]: mailto:hotline@svsfem.cz diff --git a/content/docs/software/tools/ansys/licensing.mdx b/content/docs/software/tools/ansys/licensing.mdx deleted file mode 100644 index cdb1fde34abc24b70155c05de36137569101373a..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/licensing.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: "Licensing and Available Versions" ---- -## ANSYS License Can Be Used By: - -* all persons in the carrying out of the CE IT4Innovations Project (In addition to the primary licensee, which is VSB - Technical University of Ostrava, users are CE IT4Innovations third parties - CE IT4Innovations project partners, particularly the University of Ostrava, the Brno University of Technology - Faculty of Informatics, the Silesian University in Opava, Institute of Geonics AS CR.) -* all persons who have a valid license -* students of the Technical University - -## ANSYS Academic Research - -The license intended to be used for science and research, publications, students’ projects (academic license). - -## ANSYS COM - -The license intended to be used for science and research, publications, students’ projects, and commercial research with no commercial use restrictions. - -## Server / Port - -lic-ansys.vsb.cz / 1055 (2325) - - - -## Available Versions - -* 21.1 - -``` console -$ ml av ANSYS ----------------- /apps/modules/tools ----------------------- - ANSYS/21.1-intel-2018a (D) - - Where: - D: Default Module -``` diff --git a/content/docs/software/tools/ansys/meta.json b/content/docs/software/tools/ansys/meta.json deleted file mode 100644 index 8352cc16fb10f43a9503ba2a8b4925725ec5ec0e..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/meta.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Ansys", - "pages": [ - "ansys", - "ansys-cfx", - "ansys-fluent", - "ansys-ls-dyna", - "ansys-mechanical-apdl", - "licensing", - "setting-license-preferences", - "workbench" - ] -} diff --git a/content/docs/software/tools/ansys/setting-license-preferences.mdx b/content/docs/software/tools/ansys/setting-license-preferences.mdx deleted file mode 100644 index 1d33a9ac62a208eec4d03fac96ea6c412b243b0b..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/setting-license-preferences.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Setting License Preferences" ---- -Some ANSYS tools allow you to explicitly specify usage of academic or commercial licenses in the command line (e.g. ansys211 -p aa_r to select the Academic Research license). However, we have observed that not all tools obey this option and choose the commercial license. - -Thus you need to configure preferred license order with ANSLIC_ADMIN. Follow these steps and move the Academic Research license to the top or bottom of the list accordingly. - -Launch the ANSLIC_ADMIN utility in a graphical environment: - -```console -$ANSYSLIC_DIR/lic_admin/anslic_admin -``` - -ANSLIC_ADMIN Utility will be run - - - - - - - -The ANSYS Academic Research license should be moved up to the top or down to the bottom of the list. - - diff --git a/content/docs/software/tools/ansys/workbench.mdx b/content/docs/software/tools/ansys/workbench.mdx deleted file mode 100644 index dd64c440c4501be13b16d53ca8452d543a2d156c..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/ansys/workbench.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Workbench" ---- -## Workbench Batch Mode - -It is possible to run Workbench scripts in a batch mode. -You need to configure solvers of individual components to run in parallel mode. -Open your project in Workbench. -Then, for example, in *Mechanical*, go to *Tools - Solve Process Settings...*. - - - -Enable the *Distribute Solution* checkbox and enter the number of cores (e.g. 72 to run on two Barbora nodes). -If you want the job to run on more than 1 node, you must also provide a so called MPI appfile. -In the *Additional Command Line Arguments* input field, enter: - -```console - -mpifile /path/to/my/job/mpifile.txt -``` - -Where `/path/to/my/job` is the directory where your project is saved. -We will create the file `mpifile.txt` programmatically later in the batch script. -For more information, refer to \*ANSYS Mechanical APDL Parallel Processing\* \*Guide\*. - -Now, save the project and close Workbench. -We will use this script to launch the job: - -```bash - #!/bin/bash - #SBATCH --nodes=2 - #SBATCH --ntasks-per-node=128 - #SBATCH --job-name=test9_mpi_2 - #SBATCH --partition=qcpu - #SBATCH --account=ACCOUNT_ID - - # change the working directory - DIR=/scratch/project/PROJECT_ID/$SLURM_JOB_ID - mkdir -p "$DIR" - cd "$DIR" || exit - - echo Running on host `hostname` - echo Time is `date` - echo Directory is `pwd` - echo This jobs runs on the following nodes: - echo `$SLURM_NODELIST` - - ml ANSYS/2023R2-intel-2022.12 - - #### Set number of processors per host listing - procs_per_host=24 - #### Create MPI appfile - echo -n "" > mpifile.txt - for host in `$SLURM_NODELIST` - do - echo "-h $host -np $procs_per_host $ANSYS160_DIR/bin/ansysdis161 -dis" > mpifile.txt - done - - #-i input.dat includes the input of analysis in APDL format - #-o file.out is output file from ansys where all text outputs will be redirected - #-p the name of license feature (aa_r=ANSYS Academic Research, ane3fl=Multiphysics(commercial), aa_r_dy=Academic AUTODYN) - - # prevent using scsif0 interface on accelerated nodes - export MPI_IC_ORDER="UDAPL" - # spawn remote process using SSH (default is RSH) - export MPI_REMSH="/usr/bin/ssh" - - runwb2 -R jou6.wbjn -B -F test9.wbpj -``` - -The solver settings are saved in the `solvehandlers.xml` file, -which is not located in the project directory. -Verify your solved settings when uploading a project from your local computer. diff --git a/content/docs/software/tools/apptainer.mdx b/content/docs/software/tools/apptainer.mdx deleted file mode 100644 index 97f4912474cdd704984fc41cc617cfe87fba8ffb..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/apptainer.mdx +++ /dev/null @@ -1,228 +0,0 @@ ---- -title: "Apptainer on IT4Innovations" ---- -On our clusters, the Apptainer images of main Linux distributions are prepared. - -```console -Barbora Karolina - ├── CentOS ├── CentOS - | └── 7 | └── 7 - ├── Rocky ├── Rocky - | ├── 8 | ├── 8 - │ └── 9 │ └── 9 - ├── Fedora ├── Fedora - │ └── latest │ └── latest - └── Ubuntu └── Ubuntu - └── latest └── latest -``` - -<Callout> - Current information about available Apptainer images can be obtained by the `ml av` command. The images are listed in the `OS` section. -</Callout> - -The bootstrap scripts, wrappers, features, etc. are located on [it4i-singularity GitLab page][a]. - -## IT4Innovations Apptainer Wrappers - -For better user experience with Apptainer containers, we prepared several wrappers: - -* image-exec -* image-mpi -* image-run -* image-shell -* image-update - -Listed wrappers help you to use prepared Apptainer images loaded as modules. -You can easily load a Apptainer image like any other module on the cluster by the `ml OS/version` command. -After the module is loaded for the first time, the prepared image is copied into your home folder and is ready for use. -When you load the module next time, the version of the image is checked and an image update (if exists) is offered. -Then you can update your copy of the image by the `image-update` command. - -<Callout type=warn> - With an image update, all user changes to the image will be overridden. -</Callout> - -The runscript inside the Apptainer image can be run by the `image-run` command. - -<Callout> - This command automatically mounts the `/scratch` and `/apps` storage and invokes the image as writable, so user changes can be made. -</Callout> - -Very similar to `image-run` is the `image-exec` command. -The only difference is that `image-exec` runs a user-defined command instead of a runscript. -In this case, the command to be run is specified as a parameter. - -Using the interactive shell inside the Apptainer container is very useful for development. -In this interactive shell, you can make any changes to the image you want, -but be aware that you can not use the `sudo` privileged commands directly on the cluster. -To simply invoke interactive shell, use the `image-shell` command. - -Another useful feature of the Apptainer is the direct support of OpenMPI. -For proper MPI function, you have to install the same version of OpenMPI inside the image as you use on the cluster. -OpenMPI/4.1.2 is installed in prepared images (CentOS 7, Rocky 8). -The MPI must be started outside the container. -The easiest way to start the MPI is to use the `image-mpi` command. -This command has the same parameters as `mpirun`, so there is no difference between running normal MPI application -and MPI application in a Apptainer container. - -## Examples - -In the examples, we will use prepared Apptainer images. - -### Load Image - -```console -$ ml CentOS/7 -Preparing image CentOS-7_20230116143612.sif - 261.20M 100% 412.36MB/s 0:00:00 (xfr#1, to-chk=0/1) -Your image of CentOS/7 is at location: /home/username/.apptainer/images/CentOS-7_20230116143612.sif -``` - -<Callout> - After the module is loaded for the first time, the prepared image is copied into your home folder to the *.apptainer/images* subfolder. -</Callout> - -### Wrappers - -**image-exec** - -Executes the given command inside the Apptainer image. The container is in this case started, then the command is executed and the container is stopped. - -```console -$ ml CentOS/7 -$ image-exec cat /etc/redhat-release -CentOS Linux release 7.9.2009 (Core) -``` - -**image-mpi** - -MPI wrapper - see more in the [Examples MPI][1] section. - -**image-run** - -This command runs the runscript inside the Apptainer image. Note, that the prepared images do not contain a runscript. - -**image-shell** - -Invokes an interactive shell inside the Apptainer image. - -```console -$ ml CentOS/7 -$ image-shell -Apptainer> -``` - -### Update Image - -This command is for updating your local Apptainer image copy. -The local copy is overridden in this case. - -```console -$ ml CentOS/7 -New version of CentOS image was found. (New: CentOS-7_20230116143612.sif Old: CentOS-7_20230115143612.sif) -For updating image use: image-update -Your image of CentOS/7 is at location: /home/username/.apptainer/images/CentOS-7_20230115143612.sif -$ image-update -New version of CentOS image was found. (New: CentOS-7_20230116143612.sif Old: CentOS-7_20230115143612.sif) -Do you want to update local copy? (WARNING all user modification will be deleted) [y/N]: y -Updating image CentOS-7_20230116143612.sif - 2.71G 100% 199.49MB/s 0:00:12 (xfer#1, to-check=0/1) - -sent 2.71G bytes received 31 bytes 163.98M bytes/sec -total size is 2.71G speedup is 1.00 -New version is ready. (/home/username/.apptainer/images/CentOS-7_20230116143612.sif) -``` - -### MPI - -In the following example, we are using a job submitted by the command: - -```bash -$ salloc -A PROJECT_ID -p qcpu --nodes=2 --ntasks-per-node=128 --time=00:30:00 -``` - -<Callout> - We have seen no major performance impact for a job running in a Apptainer container. -</Callout> - -With Apptainer, the MPI usage model is to call `mpirun` from outside the container -and reference the container from your `mpirun` command. -Usage would look like this: - -```console -$ mpirun -np 128 apptainer exec container.img /path/to/contained_mpi_prog -``` - -By calling `mpirun` outside of the container, we solve several very complicated work-flow aspects. -For example, if `mpirun` is called from within the container, it must have a method for spawning processes on remote nodes. -Historically the SSH is used for this, which means that there must be an `sshd` running within the container on the remote nodes -and this `sshd` process must not conflict with the `sshd` running on that host. -It is also possible for the resource manager to launch the job -and (in OpenMPI’s case) the Orted (Open RTE User-Level Daemon) processes on the remote system, -but that then requires resource manager modification and container awareness. - -In the end, we do not gain anything by calling `mpirun` from within the container -except for increasing the complexity levels and possibly losing out on some added -performance benefits (e.g. if a container was not built with the proper OFED as the host). - -#### MPI Inside Apptainer Image - -```console -$ ml CentOS/7 -$ image-shell -Apptainer> mpirun hostname | wc -l -128 -``` - -As you can see in this example, we allocated two nodes, but MPI can use only one node (128 processes) when used inside the Apptainer image. - -#### MPI Outside Apptainer Image - -```console -$ ml CentOS/7 -Your image of CentOS/7 is at location: /home/username/.apptainer/images/CentOS-7_20230116143612.sif -$ image-mpi hostname | wc -l -256 -``` - -In this case, the MPI wrapper behaves like the `mpirun` command. -The `mpirun` command is called outside the container -and the communication between nodes are propagated into the container automatically. - -## How to Use Own Image on Cluster? - -* Prepare the image on your computer -* Transfer the images to your `/home` directory on the cluster (for example `.apptainer/image`) - -```console -local:$ scp container.img login@login2.clustername.it4i.cz:~/.apptainer/image/container.img -``` - -* Load module Apptainer (`ml apptainer`) -* Use your image - -<Callout> - If you want to use the Apptainer wrappers with your own images, load the `apptainer-wrappers/1.0` module and set the environment variable `IMAGE_PATH_LOCAL=/path/to/container.img`. -</Callout> - -## How to Edit IT4Innovations Image? - -* Transfer the image to your computer - -```console -local:$ scp login@login2.clustername.it4i.cz:/home/username/.apptainer/image/container.img container.img -``` - -* Modify the image -* Transfer the image from your computer to your `/home` directory on the cluster - -```console -local:$ scp container.img login@login2.clustername.it4i.cz:/home/username/.apptainer/image/container.img -``` - -* Load module Apptainer (`ml apptainer`) -* Use your image - -[1]: #mpi - -[a]: https://code.it4i.cz/sccs/it4i-singularity diff --git a/content/docs/software/tools/easybuild-images.mdx b/content/docs/software/tools/easybuild-images.mdx deleted file mode 100644 index 6ce75d22d87f1c4d8883baa7559342179357b216..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/easybuild-images.mdx +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: "Generating Container Recipes & Images" ---- -EasyBuild has support for generating container recipes that will use EasyBuild to build and install a specified software stack. In addition, EasyBuild can (optionally) leverage the build tool provided by the container software of choice to create container images. - -## Generating Container Recipes - -To generate container recipes, use `eb --containerize`, or `eb -C` for short. - -The resulting container recipe will leverage EasyBuild to build and install the software that corresponds to the easyconfig files that are specified as arguments to the eb command (and all required dependencies, if needed). - -<Callout> - EasyBuild will refuse to overwrite existing container recipes. - To re-generate an already existing recipe file, use the `--force` command line option. -</Callout> - -## Base Container Image - -In order to let EasyBuild generate a container recipe, it is required to specify which container image should be used as a base, via the `--container-base` configuration option. - -Currently, three types of container base images can be specified: - -* **localimage: *path***: the location of an existing container image file -* **docker:*name***: the name of a Docker container image (to be downloaded from [Docker Hub][a]. -* **shub:*name***: the name of a Apptainer/Singularity container image (to be downloaded from [Singularity Hub][b]. - -## Building Container Images - -To instruct EasyBuild to also build a container image from the generated container recipe, use `--container-build-image` (in combination with `-C` or `--containerize`). - -EasyBuild will leverage functionality provided by the container software of choice (see containers_cfg_image_type) to build the container image. - -For example, in the case of Apptainer/Singularity, EasyBuild will run `sudo /path/to/singularity build` on the generated container recipe. - -The container image will be placed in the location specified by the `--containerpath` configuration option (see Location for generated container recipes & images (`--containerpath`)), next to the generated container recipe that was used to build the image. - -## Example Usage - -In this example, we will use a pre-built base container image located at `/tmp/example.simg` (see also Base container image (`--container-base`)). - -To let EasyBuild generate a container recipe for GCC 6.4.0 + binutils 2.28: - -```console -eb GCC-6.4.0-2.28.eb --containerize --container-base localimage:/tmp/example.simg --experimental -``` - -With other configuration options left to default (see the output of `eb --show-config`), this will result in a Apptainer/Singularity container recipe using example.simg as a base image, which will be stored in `$HOME/.local/easybuild/containers`: - -```console -$ eb GCC-6.4.0-2.28.eb --containerize --container-base localimage:/tmp/example.simg --experimental -== temporary log file in case of crash /tmp/eb-dLZTNF/easybuild-LPLeG0.log -== Singularity definition file created at /home/example/.local/easybuild/containers/Singularity.GCC-6.4.0-2.28 -== Temporary log file(s) /tmp/eb-dLZTNF/easybuild-LPLeG0.log* have been removed. -== Temporary directory /tmp/eb-dLZTNF has been removed. -``` - -## Example of a Generated Container Recipe - -Below is an example of container recipe generated by EasyBuild, using the following command: - -```console -eb Python-3.6.4-foss-2018a.eb OpenMPI-2.1.2-GCC-6.4.0-2.28.eb -C --container-base shub:shahzebsiddiqui/eb-singularity:centos-7.4.1708 --experimental -``` - -It uses the *shahzebsiddiqui/eb-singularity:centos-7.4.1708* base container image that is available from the Apptainer/Singularity hub ([see this webpage][c]). - -``` -Bootstrap: shub -From: shahzebsiddiqui/eb-singularity:centos-7.4.1708 - -%post -yum --skip-broken -y install openssl-devel libssl-dev libopenssl-devel -yum --skip-broken -y install libibverbs-dev libibverbs-devel rdma-core-devel - - -# upgrade easybuild package automatically to latest version -pip install -U easybuild - -# change to 'easybuild' user -su - easybuild - -eb Python-3.6.4-foss-2018a.eb OpenMPI-2.1.2-GCC-6.4.0-2.28.eb --robot --installpath=/app/ --prefix=/scratch --tmpdir=/scratch/tmp - -# exit from 'easybuild' user -exit - -# cleanup -rm -rf /scratch/tmp/* /scratch/build /scratch/sources /scratch/ebfiles_repo - -%runscript -eval "$@" - -%environment -source /etc/profile -module use /app/modules/all -ml Python/3.6.4-foss-2018a OpenMPI/2.1.2-GCC-6.4.0-2.28 - -%labels -``` - -<Callout> - We also specify the easyconfig file for the OpenMPI component of `foss/2018a` here, because it requires specific OS dependencies to be installed (see the second `yum ... install` line in the generated container recipe). - We intend to let EasyBuild take into account the OS dependencies of the entire software stack automatically in a future update. - - The generated container recipe includes `pip install -U easybuild` to ensure that the latest version of EasyBuild is used to build the software in the container image, regardless of whether EasyBuild was already present in the container and which version it was. - - In addition, the generated module files will follow the default module-naming scheme (EasyBuildMNS). The modules that correspond to the easyconfig files that were specified on the command line will be loaded automatically; see the statements in the %environment section of the generated container recipe. -</Callout> - -## Example of Building Container Image - -You can instruct EasyBuild to also build the container image by using `--container-build-image`. - -Note that you will need to enter your sudo password (unless you recently executed a sudo command in the same shell session): - -```console -$ eb GCC-6.4.0-2.28.eb --containerize --container-base localimage:/tmp/example.simg --container-build-image --experimental -== temporary log file in case of crash /tmp/eb-aYXYC8/easybuild-8uXhvu.log -== Singularity tool found at /usr/bin/singularity -== Singularity version '2.4.6' is 2.4 or higher ... OK -== Singularity definition file created at /home/example/.local/easybuild/containers/Singularity.GCC-6.4.0-2.28 -== Running 'sudo /usr/bin/singularity build /home/example/.local/easybuild/containers/GCC-6.4.0-2.28.simg /home/example/.local/easybuild/containers/Singularity.GCC-6.4.0-2.28', you may need to enter your 'sudo' password... -== (streaming) output for command 'sudo /usr/bin/singularity build /home/example/.local/easybuild/containers/GCC-6.4.0-2.28.simg /home/example/.local/easybuild/containers/Singularity.GCC-6.4.0-2.28': -Using container recipe deffile: /home/example/.local/easybuild/containers/Singularity.GCC-6.4.0-2.28 -Sanitizing environment -Adding base Singularity environment to container -... -== temporary log file in case of crash /scratch/tmp/eb-WnmCI_/easybuild-GcKyY9.log -== resolving dependencies ... -... -== building and installing GCCcore/6.4.0... -... -== building and installing binutils/2.28-GCCcore-6.4.0... -... -== building and installing GCC/6.4.0-2.28... -... -== COMPLETED: Installation ended successfully -== Results of the build can be found in the log file(s) /app/software/GCC/6.4.0-2.28/easybuild/easybuild-GCC-6.4.0-20180424.084946.log -== Build succeeded for 15 out of 15 -... -Building Singularity image... -Singularity container built: /home/example/.local/easybuild/containers/GCC-6.4.0-2.28.simg -Cleaning up... -== Singularity image created at /home/example/.local/easybuild/containers/GCC-6.4.0-2.28.simg -== Temporary log file(s) /tmp/eb-aYXYC8/easybuild-8uXhvu.log* have been removed. -== Temporary directory /tmp/eb-aYXYC8 has been removed. -``` - -To inspect the container image, you can use `singularity shell` to start a shell session in the container: - -```console -$ singularity shell --shell "/bin/bash --norc" $HOME/.local/easybuild/containers/GCC-6.4.0-2.28.simg - -Singularity GCC-6.4.0-2.28.simg:~> source /etc/profile - -Singularity GCC-6.4.0-2.28.simg:~> module list - -Currently Loaded Modules: - 1) GCCcore/6.4.0 2) binutils/2.28-GCCcore-6.4.0 3) GCC/6.4.0-2.28 - -Singularity GCC-6.4.0-2.28.simg:~> which gcc -/app/software/GCCcore/6.4.0/bin/gcc - -Singularity GCC-6.4.0-2.28.simg:~> gcc --version -gcc (GCC) 6.4.0 -... -``` - -Or, you can use `singularity exec` to execute a command in the container. - -Compare the output of running which gcc and `gcc --version` locally: - -```console -$ which gcc -/usr/bin/gcc -$ gcc --version -gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) -... -``` - -and the output when running the same commands in the container: - -```console -$ singularity exec GCC-6.4.0-2.28.simg which gcc -/app/software/GCCcore/6.4.0/bin/gcc - -$ singularity exec GCC-6.4.0-2.28.simg gcc --version -gcc (GCC) 6.4.0 -... -``` - -## Configuration - -### Location for Generated Container Recipes & Images - -To control the location where EasyBuild will put generated container recipes & images, use the `--containerpath` configuration setting. Next to providing this as an option to the eb command, you can also define the `$EASYBUILD_CONTAINERPATH` environment variable or specify containerpath in an EasyBuild configuration file. - -The default value for this location is `$HOME/.local/easybuild/containers`, unless the `--prefix` configuration setting was provided, in which case it becomes <prefix>/containers (see Overall prefix path (`--prefix`)). - -Use `eb --show-full-config | grep containerpath` to determine the currently active setting. - -### Container Image Format - -The format for container images that EasyBuild produces via the functionality provided by the container software can be controlled via the `--container-image-format` configuration setting. - -For Apptainer/Singularity containers (see Type of container recipe/image to generate (`--container-type`)), three image formats are supported: - -* squashfs (default): compressed images using squashfs read-only file system -* ext3: writable image file using ext3 file system -* sandbox: container image in a regular directory - -See also official user guide on [Image Mounts format][d] and [Building a Container][e]. - -## Name for Container Recipe & Image - -By default, EasyBuild will use the name of the first easyconfig file (without the .eb suffix) as a name for both the container recipe and the image. - -You can specify an alternate name using the `--container-image-name` configuration setting. - -The filename of the generated container recipe will be `Singularity`.<name>. - -The filename of the container image will be `<name><extension>`, where the value for `<extension>` depends on the image format (see Container image format (`--container-image-format`)): - -* â€.simg’ for squashfs container images -* â€.img’ for ext3 container images -* empty for sandbox container images (in which case the container image is actually a directory rather than a file) - -### Temporary Directory for Creating Container Images - -The container software that EasyBuild leverages to build container images may be using a temporary directory in a location that does not have sufficient free space. - -You can instruct EasyBuild to pass an alternate location via the `--container-tmpdir` configuration setting. - -For Apptainer/Singularity, the default is to use /tmp, [see][f]. If `--container-tmpdir` is specified, the `$SINGULARITY_TMPDIR` environment variable will be defined accordingly to let Apptainer/Singularity use that location instead. - -Type of container recipe/image to generate (`--container-type`). -With the `--container-type` configuration option, you can specify what type of container recipe/image EasyBuild should generate. Possible values are: - -* singularity (default): [Singularity][g] container recipes & images -* docker: [Docker][h] container recipe & images - -For detailed documentation, see the [webpage][i]. - -[a]: https://hub.docker.com/ -[b]: https://singularity-hub.org/ -[c]: https://singularity-hub.org/collections/143 -[d]: https://apptainer.org/docs/user/latest/bind_paths_and_mounts.html#image-mounts -[e]: https://apptainer.org/docs/user/latest/build_a_container.html -[f]: https://apptainer.org/docs/user/latest/build_env.html#temporary-folders -[g]: https://singularity.lbl.gov -[h]: https://docs.docker.com/ -[i]: http://easybuild.readthedocs.io/en/latest/Containers.html diff --git a/content/docs/software/tools/easybuild.mdx b/content/docs/software/tools/easybuild.mdx deleted file mode 100644 index cf7d70d63b420a23adf72c076af5fb5366c65a33..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/easybuild.mdx +++ /dev/null @@ -1,482 +0,0 @@ ---- -title: "EasyBuild" ---- -The objective of this tutorial is to show how EasyBuild can be used to ease, automate, and script the build of software on the IT4Innovations clusters. Two use-cases are considered. First, we are going to build a software that is supported by EasyBuild. Then, we will see through a simple example how to add support for a new software in EasyBuild. - -The benefit of using EasyBuild for your builds is that it allows automated and reproducible build of software. Once a build has been made, the build script (via the EasyConfig file) or the installed software (via the module file) can be shared with other users. - -## Short Introduction - -EasyBuild is a tool that allows performing automated and reproducible software compilation and installation. - -All builds and installations are performed at user level, so you do not need the admin rights. The software is installed in your home directory (by default in `$HOME/.local/easybuild/software/`) and a module file is generated (by default in `$HOME/.local/easybuild/modules/`) to use the software. - -EasyBuild relies on two main concepts: - -* Toolchains -* EasyConfig file (our easyconfigs are [here][a]) - -A detailed documentation is available [here][b]. - -## Toolchains - -A toolchain corresponds to a compiler and a set of libraries, which are commonly used to build a software. The two main toolchains frequently used on the IT4Innovations clusters are the **foss** and **intel**. - -* **foss** is based on the GCC compiler and on open-source libraries (OpenMPI, OpenBLAS, etc.). -* **intel** is based on the Intel compiler and on Intel libraries (Intel MPI, Intel Math Kernel Library, etc.). - -Additional details are available [here][c]. - -## EasyConfig File - -The EasyConfig file is a simple text file that describes the build process of a software. For most software that uses standard procedure (like configure, make, and make install), this file is very simple. Many EasyConfig files are already provided with EasyBuild. - -By default, EasyConfig files and generated modules are named using the following convention: - -`software-name-software-version-toolchain-name-toolchain-version(-suffix).eb` - -Additional details are available [here][d]. - -## EasyBuild on IT4Innovations Clusters - -To use EasyBuild on a compute node, load the `EasyBuild` module: - -```console -$ml av easybuild - ------------------------------------------- /apps/modules/tools ------------------------------------------- - EasyBuild/4.3.3 (S) EasyBuild/4.4.2 (S) EasyBuild/4.5.4 (S) EasyBuild/4.6.2 (S) - EasyBuild/4.3.4 (S) EasyBuild/4.5.0 (S) EasyBuild/4.5.5 (S) EasyBuild/4.7.0 (S,D) - EasyBuild/4.4.0 (S) EasyBuild/4.5.1 (S) EasyBuild/4.6.0 (S) - EasyBuild/4.4.1 (S) EasyBuild/4.5.3 (S) EasyBuild/4.6.1 (S) - - Where: - S: Module is Sticky, requires --force to unload or purge - D: Default Module - -Use "module spider" to find all possible modules and extensions. -Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -$ ml EasyBuild -``` - -The EasyBuild command is `eb`. Check the version you have loaded: - -```console -$ eb --version -This is EasyBuild 4.7.0 (framework: 4.7.0, easyblocks: 4.7.0) on host login1.karolina.it4i.cz. -``` - -To get help on the EasyBuild options, use the `-h` or `-H` option flags: - -```console -$ eb -h -Usage: eb [options] easyconfig [...] - -Builds software based on easyconfig (or parse a directory). Provide one or more easyconfigs or -directories, use -H or --help more information. - -Options: - -h show short help message and exit - -H OUTPUT_FORMAT show full help message and exit - - Debug and logging options (configfile section MAIN): - -d Enable debug log mode (default: False) - - Basic options: - Basic runtime options for EasyBuild. (configfile section basic) -... -``` - -## Build Software Using Provided EasyConfig File - -### Search for Available Easyconfig - -Searching for available easyconfig files can be done using the `--search` (long output) and `-S` (short output) command line options. All easyconfig files available in the robot search path are considered and searching is done case-insensitive. - -```console -$ eb -S git -CFGS1=/apps/easybuild/easyconfigs-it4i -CFGS2=/apps/easybuild/easyconfigs-master/easybuild/easyconfigs -CFGS3=/apps/easybuild/easyconfigs-develop/easybuild/easyconfigs - * $CFGS1/.gitignore - * $CFGS1/.gitlab-ci.yml - * $CFGS1/g/git-lfs/git-lfs-1.1.1.eb - * $CFGS1/g/git-lfs/git-lfs-2.11.0.eb - * $CFGS1/g/git-lfs/git-lfs-3.1.2.eb - * $CFGS1/g/git/git-2.19.1.eb - * $CFGS1/g/git/git-2.21.0.eb - * $CFGS1/g/git/git-2.23.0.eb - * $CFGS1/g/git/git-2.25.1.eb - * $CFGS1/g/git/git-2.30.1.eb - * $CFGS1/g/git/git-2.31.1.eb - * $CFGS1/g/git/git-2.32.0-GCCcore-10.3.0-nodocs-test.eb - * $CFGS2/b/BCALM/BCALM-2.2.0-fix-nogit.patch - * $CFGS2/d/dagitty/dagitty-0.2-2-foss-2018b-R-3.5.1.eb - * $CFGS2/e/EMAN2/EMAN2-2.3_fix_broken_githash_regex_replace.patch - * $CFGS2/g/GIMIC/GIMIC-2018.04.20_git.patch - * $CFGS2/g/GitPython/GitPython-2.1.11-foss-2018b-Python-3.6.6.eb - * $CFGS2/g/GitPython/GitPython-2.1.11-intel-2018b-Python-3.6.6.eb - * $CFGS2/g/GitPython/GitPython-2.1.15.eb - * $CFGS2/g/GitPython/GitPython-3.0.3-GCCcore-8.2.0-Python-3.7.2.eb - * $CFGS2/g/GitPython/GitPython-3.1.0-GCCcore-8.3.0-Python-3.7.4.eb - * $CFGS2/g/GitPython/GitPython-3.1.9-GCCcore-9.3.0-Python-3.8.2.eb - * $CFGS2/g/GitPython/GitPython-3.1.14-GCCcore-10.2.0.eb - * $CFGS2/g/GitPython/GitPython-3.1.18-GCCcore-10.3.0.eb - * $CFGS2/g/GitPython/GitPython-3.1.24-GCCcore-11.2.0.eb - * $CFGS2/g/GitPython/GitPython-3.1.27-GCCcore-11.3.0.eb - * $CFGS2/g/gettext/gettext-0.19.8_fix-git-config.patch - * $CFGS2/g/git-extras/git-extras-5.1.0-foss-2016a.eb -... -``` - -### Get an Overview of Planned Installations - -You can do a “dry-run” overview by supplying `-D`/`--dry-run` (typically combined with `--robot`, in the form of `-Dr`): - -```console -$ eb git-2.30.1.eb -Dr -== Temporary log file in case of crash /tmp/eb-6vwvor2_/easybuild-vg82aat4.log -Dry run: printing build status of easyconfigs and dependencies -CFGS=/apps/easybuild - * [x] $CFGS/easyconfigs-master/easybuild/easyconfigs/m/M4/M4-1.4.18.eb (module: M4/1.4.18) - * [x] $CFGS/easyconfigs-it4i/a/Autoconf/Autoconf-2.69.eb (module: Autoconf/2.69) - * [ ] $CFGS/easyconfigs-it4i/g/git/git-2.30.1.eb (module: git/2.30.1) -== Temporary log file(s) /tmp/eb-6vwvor2_/easybuild-vg82aat4.log* have been removed. -== Temporary directory /tmp/eb-6vwvor2_ has been removed. -``` - -### Compile and Install Module - -If we try to build *git-2.31.1.eb*, nothing will happen as it is already installed on the cluster. To enable dependency resolution, use the `--robot` command line option (or `-r` for short): - -```console -$ eb git-2.31.1.eb -r -== Temporary log file in case of crash /tmp/eb-11d_kpht/easybuild-jmygqpqr.log -== git/2.31.1 is already installed (module found), skipping -== No easyconfigs left to be built. - -== Build succeeded for 0 out of 0 -== Temporary log file(s) /tmp/eb-11d_kpht/easybuild-jmygqpqr.log* have been removed. -== Temporary directory /tmp/eb-11d_kpht has been removed. -``` - -Rebuild *git-2.31.1.eb*. Use `eb --rebuild` to rebuild a given easyconfig/module or use `eb --force`/`-f` to force the reinstallation of a given easyconfig/module. The behavior of `--force` is the same as `--rebuild` and `--ignore-osdeps`. - -```console -$ eb git-2.31.1.eb -r -f -== Temporary log file in case of crash /tmp/eb-wbzf_rxh/easybuild-umq1_01u.log -== resolving dependencies ... -== processing EasyBuild easyconfig /apps/easybuild/easyconfigs-it4i/g/git/git-2.31.1.eb -== building and installing git/2.31.1... -== fetching files... -== creating build dir, resetting environment... -== ... (took 3 secs) -== unpacking... -== ... (took 9 secs) -== patching... -== preparing... -== configuring... -== ... (took 4 secs) -== building... -== ... (took 4 secs) -== testing... -== installing... -== ... (took 2 secs) -== taking care of extensions... -== restore after iterating... -== postprocessing... -== sanity checking... -== cleaning up... -== ... (took 3 secs) -== creating module... -== permissions... -== packaging... -== COMPLETED: Installation ended successfully (took 30 secs) -== Results of the build can be found in the log file(s) -/home/username/.local/easybuild/software/git/2.31.1/easybuild/easybuild-git-2.31.1-20230315.092001.log - -== Build succeeded for 1 out of 1 -== Temporary log file(s) /tmp/eb-wbzf_rxh/easybuild-umq1_01u.log* have been removed. -== Temporary directory /tmp/eb-wbzf_rxh has been removed. -``` - -If we try to build *git-2.30.1.eb*: - -```console -$ eb git-2.30.1.eb -r -== Temporary log file in case of crash /tmp/eb-s3t9lwk_/easybuild-cvx5kpna.log -== resolving dependencies ... -== processing EasyBuild easyconfig /apps/easybuild/easyconfigs-it4i/g/git/git-2.30.1.eb -== building and installing git/2.30.1... -== fetching files... -== creating build dir, resetting environment... -== unpacking... -== ... (took 10 secs) -== patching... -== preparing... -== configuring... -== ... (took 4 secs) -== building... -== ... (took 4 secs) -== testing... -== installing... -== ... (took 3 secs) -== taking care of extensions... -== restore after iterating... -== postprocessing... -== sanity checking... -== cleaning up... -== ... (took 3 secs) -== creating module... -== permissions... -== packaging... -== COMPLETED: Installation ended successfully (took 29 secs) -== Results of the build can be found in the log file(s) -/home/username/.local/easybuild/software/git/2.30.1/easybuild/easybuild-git-2.30.1-20230315.092117.log - -== Build succeeded for 1 out of 1 -== Temporary log file(s) /tmp/eb-s3t9lwk_/easybuild-cvx5kpna.log* have been removed. -== Temporary directory /tmp/eb-s3t9lwk_ has been removed. -``` - -If we try to build *git-2.30.1*, but we used easyconfig *git-2.25.1.eb*, change the version command `--try-software-version=2.30.1`: - -```console -$ eb git-2.25.1.eb -r --try-software-version=2.30.1 -== Temporary log file in case of crash /tmp/eb-lw9itci8/easybuild-qzb7j64j.log -== resolving dependencies ... -== processing EasyBuild easyconfig /tmp/eb-lw9itci8/tweaked_easyconfigs/git-2.30.1.eb -== building and installing git/2.30.1... -== fetching files... -== ... (took 4 secs) -== creating build dir, resetting environment... -== unpacking... -== ... (took 9 secs) -== patching... -== preparing... -== configuring... -== ... (took 4 secs) -== building... -== ... (took 4 secs) -== testing... -== installing... -== ... (took 4 secs) -== taking care of extensions... -== restore after iterating... -== postprocessing... -== sanity checking... -== cleaning up... -== ... (took 3 secs) -== creating module... -== permissions... -== packaging... -== COMPLETED: Installation ended successfully (took 33 secs) -== Results of the build can be found in the log file(s) -/home/username/.local/easybuild/software/git/2.30.1/easybuild/easybuild-git-2.30.1-20230315.092313.log - -== Build succeeded for 1 out of 1 -== Temporary log file(s) /tmp/eb-lw9itci8/easybuild-qzb7j64j.log* have been removed. -== Temporary directory /tmp/eb-lw9itci8 has been removed. -``` - -### MODULEPATH - -To see the newly installed modules, you need to add the path where they were installed to the MODULEPATH. On the cluster, you have to use the `module use` command: - -```console -$ module use $HOME/.local/easybuild/modules/all/ -``` - -or modify your `.bash_profile`: - -```console -$ cat ~/.bash_profile -# .bash_profile - -# Get the aliases and functions -if [ -f ~/.bashrc ]; then -. ~/.bashrc -fi - -# User specific environment and startup programs - -module use $HOME/.local/easybuild/modules/all/ - -PATH=$PATH:$HOME/bin - -export PATH -``` - -## Build Software Using Your Own EasyConfig File - -For this example, we create an EasyConfig file to build Git 2.38.1 with the *foss* toolchain. Open your favorite editor and create a file named *git-2.18.1-foss-2022b.eb* with the following content: - -```console -$ vim git-2.38.1-foss-2022b.eb -``` - -```python -easyblock = 'ConfigureMake' - -name = 'git' -version = '2.38.1' - -homepage = 'https://git-scm.com/' -description = """Git is a free and open source distributed version control system designed -to handle everything from small to very large projects with speed and efficiency.""" - -toolchain = {'name': 'foss', 'version': '2022b'} - -source_urls = ['https://github.com/git/git/archive'] -sources = ['v%(version)s.tar.gz'] - -builddependencies = [ - ('binutils', '2.39'), - ('Autotools', '20220317'), -] - -dependencies = [ - ('cURL', '7.86.0'), - ('expat', '2.4.9'), - ('gettext', '0.21.1'), - ('Perl', '5.36.0'), -] - -preconfigopts = 'make configure && ' - -# Work around git build system bug. If LIBS contains -lpthread, then configure -# will not append -lpthread to LDFLAGS, but Makefile ignores LIBS. -configopts = "--with-perl=${EBROOTPERL}/bin/perl --enable-pthreads='-lpthread'" - -postinstallcmds = ['cd contrib/subtree; make install'] - -sanity_check_paths = { - 'files': ['bin/git'], - 'dirs': ['libexec/git-core', 'share'], -} - -moduleclass = 'tools' -``` - -This is a simple EasyConfig. Most of the fields are self-descriptive. No build method is explicitly defined, so it uses by default the standard configure/make/make install approach. - -Let us build Git with this EasyConfig file: - -```console -$ eb git-2.38.1-foss-2022b.eb -r -== Temporary log file in case of crash /tmp/eb-2aiq9qr8/easybuild-eb4zenze.log -== resolving dependencies ... -== processing EasyBuild easyconfig /home/username/git-2.38.1-foss-2022b.eb -== building and installing git/2.38.1-foss-2022b... -== fetching files... -== ... (took 3 secs) -== creating build dir, resetting environment... -== unpacking... -== ... (took 11 secs) -== patching... -== preparing... -== ... (took 2 secs) -== configuring... -== ... (took 7 secs) -== building... -== ... (took 7 secs) -== testing... -== installing... -== ... (took 2 secs) -== taking care of extensions... -== restore after iterating... -== postprocessing... -== sanity checking... -== ... (took 1 secs) -== cleaning up... -== ... (took 4 secs) -== creating module... -== ... (took 1 secs) -== permissions... -== packaging... -== COMPLETED: Installation ended successfully (took 41 secs) -== Results of the build can be found in the log file(s) -/home/username/.local/easybuild/software/git/2.38.1-foss-2022b/easybuild/easybuild-git-2.38.1-20230315.0957 -22.log - -== Build succeeded for 1 out of 1 -== Temporary log file(s) /tmp/eb-2aiq9qr8/easybuild-eb4zenze.log* have been removed. -== Temporary directory /tmp/eb-2aiq9qr8 has been removed. -``` - -We can now check that our version of Git is available via the modules: - -```console -$ ml av git - -------------------------------- /home/username/.local/easybuild/modules/all ------------------------------- - git/2.38.1-foss-2022b - ------------------------------------------- /apps/modules/devel ------------------------------------------- - libgit2/1.1.0-GCCcore-10.3.0 - ------------------------------------------- /apps/modules/tools ------------------------------------------- - git-lfs/3.1.2 git/2.32.0-GCCcore-10.3.0-nodocs - git/2.28.0-GCCcore-10.2.0-nodocs git/2.33.1-GCCcore-11.2.0-nodocs - git/2.31.1 git/2.36.0-GCCcore-11.3.0-nodocs - git/2.32.0-GCCcore-10.3.0-nodocs-test git/2.38.1-GCCcore-12.2.0-nodocs (D) - - Where: - D: Default Module - -Use "module spider" to find all possible modules and extensions. -Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". -``` - -## Advanced EasyBuild Configuration - -By creating the `~/.config/easybuild/config.cfg` file, you can easily specify the desired location of your software, CUDA compute capabilities, and other options that you would usually have to specify within your easyconfig or from the command line. To get an overview of all available options, use `eb --confighelp` command. - -You can use our template to set all of the usual EasyBuild variables: - -```console -[MAIN] - -[basic] -locks-dir=EASYBUILD_ROOT/.locks/ -robot=/apps/easybuild/easyconfigs-it4i:/apps/easybuild/easyconfigs-master/easybuild/easyconfigs:/apps/easybuild/easyconfigs-develop/easybuild/easyconfigs -robot-paths=/apps/easybuild/easyconfigs-it4i:/apps/easybuild/easyconfigs-master/easybuild/easyconfigs:/apps/easybuild/easyconfigs-develop/easybuild/easyconfigs - -[config] -buildpath=/dev/shm/USER/build -installpath=EASYBUILD_ROOT -installpath-modules=EASYBUILD_ROOT/modules -installpath-software=EASYBUILD_ROOT/all -moduleclasses=python -repository=FileRepository -repositorypath=EASYBUILD_ROOT/file-repository -sourcepath=EASYBUILD_ROOT/sources - -[easyconfig] -local-var-naming-check=error - -[override] -# 8.0 for Karolina, 7.0 for Barbora -cuda-compute-capabilities=CUDA_CC -detect-loaded-modules=purge -enforce-checksums=True -silence-deprecation-warnings=True -trace=True -``` - -<Callout> - Do not forget to add the path to your modules to MODULEPATH using the `module use` command in your `~/.bashrc` to be able to lookup and use your installed modules. -</Callout> - -Template requires you to fill in the `EASYBUILD_ROOT`, `CUDA_CC`, and `USER` variables. `EASYBUILD_ROOT` is the top level directory which will hold all of your EasyBuild related data. `CUDA_CC` defines the CUDA compute capabilities of graphics cards, and `USER` should preferably be set to your username. - -If you plan on writing more than one or two of your own easyconfigs, it might be useful to setup a custom easyconfig repository. Simply prepend it's path to the `robot` and `robot-paths` variables. - -A detailed documentation regarding EasyBuild configuration is available [here][e]. - -[a]: https://code.it4i.cz/sccs/easyconfigs-it4i -[b]: https://docs.easybuild.io/ -[c]: https://github.com/easybuilders/easybuild/wiki/Compiler-toolchains -[d]: https://github.com/easybuilders/easybuild-easyconfigs -[e]: https://docs.easybuild.io/configuration/ diff --git a/content/docs/software/tools/meta.json b/content/docs/software/tools/meta.json deleted file mode 100644 index 8c595f7ea77bcf133f40d140125ef155916c9a65..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/meta.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Tools", - "pages": [ - "ansys", - "apptainer", - "easybuild", - "easybuild-images", - "singularity", - "spack", - "virtualization" - ] -} diff --git a/content/docs/software/tools/singularity.mdx b/content/docs/software/tools/singularity.mdx deleted file mode 100644 index f665e895af53c96a8b5b403543da3abb793df486..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/singularity.mdx +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: "Apptainer Container" ---- -[Apptainer][a] is a container platform. It allows you to create and run containers that package up pieces of software in a way that is portable and reproducible. You can build a container using Apptainer on your laptop, and then run it on many of the largest HPC clusters in the world, local university or company clusters, a single server, in the cloud, or on a workstation down the hall. Your container is a single file, and you don’t have to worry about how to install all the software you need on each different operating system. - -## Using Docker Images - -Apptainer can import, bootstrap, and even run Docker images directly from [Docker Hub][b]. You can easily run an CentOS container like this: - -```console -$ cat /etc/redhat-release -CentOS Linux release 7.9.2009 (Core) -$ ml apptainer -$ apptainer shell docker://centos:latest -INFO: Converting OCI blobs to SIF format -INFO: Starting build... -Getting image source signatures -Copying blob a1d0c7532777 done -Copying config 8c1402b22a done -Writing manifest to image destination -Storing signatures -2023/01/17 12:55:08 info unpack layer: sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 -2023/01/17 12:55:09 warn rootless{usr/bin/newgidmap} ignoring (usually) harmless EPERM on setxattr "security.capability" -2023/01/17 12:55:09 warn rootless{usr/bin/newuidmap} ignoring (usually) harmless EPERM on setxattr "security.capability" -2023/01/17 12:55:09 warn rootless{usr/bin/ping} ignoring (usually) harmless EPERM on setxattr "security.capability" -2023/01/17 12:55:10 warn rootless{usr/sbin/arping} ignoring (usually) harmless EPERM on setxattr "security.capability" -2023/01/17 12:55:10 warn rootless{usr/sbin/clockdiff} ignoring (usually) harmless EPERM on setxattr "security.capability" -INFO: Creating SIF file... -Apptainer> cat /etc/redhat-release -CentOS Linux release 8.4.2105 -``` - -In this case, the image is downloaded from Docker Hub, extracted to a temporary directory, and Apptainer interactive shell is invoked. This procedure can take a lot of time, especially with large images. - -## Importing Docker Image - -Apptainer containers can be in three different formats: - -* read-only **squashfs** (default) - best for production -* writable **ext3** (--writable option) -* writable **(ch)root directory** (--sandbox option) - best for development - -Squashfs and (ch)root directory images can be built from Docker source directly on the cluster, no root privileges are needed. It is strongly recommended to create a native Apptainer image to speed up the launch of the container. - -```console -$ ml apptainer -$ apptainer build ubuntu.sif docker://ubuntu:latest -INFO: Starting build... -Getting image source signatures -Copying blob 6e3729cf69e0 done -Copying config 415250ec06 done -Writing manifest to image destination -Storing signatures -2023/01/17 12:58:04 info unpack layer: sha256:6e3729cf69e0ce2de9e779575a1fec8b7fb5efdfa822829290ab6d5d1bc3e797 -INFO: Creating SIF file... -INFO: Build complete: ubuntu.sif -``` - -alternatively, you can create your own docker image and import it to Apptainer. -For example, we show how to create and run ubuntu docker image with gvim installed: - -```console -your_local_machine $ docker pull ubuntu -your_local_machine $ docker run --rm -it ubuntu bash -# apt update -# apt install vim-gtk -your_local_machine $ docker ps -a -your_local_machine $ docker commit 837a575cf8dc -your_local_machine $ docker image ls -your_local_machine $ docker tag 4dd97cefde62 ubuntu_gvim -your_local_machine $ docker save -o ubuntu_gvim.tar ubuntu_gvim -``` - -copy the `ubuntu_gvim.tar` archive to IT4I supercomputers, convert to Apptainer image and run: - -```console -$ ml Apptainer -$ apptainer build ubuntu_givm.sif docker-archive://ubuntu_gvim.tar -$ apptainer shell -B /usr/user/$ID ubuntu_gvim.sif -``` - -Note the bind to `/usr/user/$ID` directory. - -## Launching the Container - -The interactive shell can be invoked by the `apptainer shell` command. This is useful for development purposes. Use the `-w | --writable` option to make changes inside the container permanent. - -```console -$ apptainer shell ubuntu.sif - -Apptainer> cat /etc/lsb-release -DISTRIB_ID=Ubuntu -DISTRIB_RELEASE=22.04 -DISTRIB_CODENAME=jammy -DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS" -``` - -A command can be run inside the container (without an interactive shell) by invoking the `apptainer exec` command. - -``` -$ apptainer exec ubuntu.sif cat /etc/lsb-release -DISTRIB_ID=Ubuntu -DISTRIB_RELEASE=22.04 -DISTRIB_CODENAME=jammy -DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"" -``` - -An Apptainer image can contain a runscript. This script is executed inside the container after the `apptainer run` command is used. The runscript is mostly used to run an application for which the container is built. In the following example, it is the `fortune | cowsay` command: - -``` -$ apptainer build lolcow.sif docker://ghcr.io/apptainer/lolcow -INFO: Starting build... -Getting image source signatures -Copying blob 5ca731fc36c2 skipped: already exists -Copying blob 16ec32c2132b skipped: already exists -Copying config fd0daa4d89 done -Writing manifest to image destination -Storing signatures -2023/01/17 13:06:01 info unpack layer: sha256:16ec32c2132b43494832a05f2b02f7a822479f8250c173d0ab27b3de78b2f058 -2023/01/17 13:06:01 info unpack layer: sha256:5ca731fc36c28789c5ddc3216563e8bfca2ab3ea10347e07554ebba1c953242e -INFO: Creating SIF file... -INFO: Build complete: lolcow.sif -$ apptainer exec lolcow.sif cowsay moo - _____ -< moo > - ----- - \ ^__^ - \ (oo)\_______ - (__)\ )\/\ - ||----w | - || || -``` - -## Accessing /HOME and /SCRATCH Within Container - -A user home directory is mounted inside the container automatically. If you need access to the **/SCRATCH** storage for your computation, this must be mounted by the `-B | --bind` option. - -<Callout type=warn> - The mounted folder has to exist inside the container or the container image has to be writable! -</Callout> - -```console -$ apptainer shell -B /scratch ubuntu.sif -Apptainer> ls /scratch -ddn sys temp work -``` - -A comprehensive documentation can be found at the [Apptainer Quick Start][c] website. - -[a]: https://apptainer.org/docs/user/latest/introduction.html -[b]: https://hub.docker.com/ -[c]: https://apptainer.org/docs/user/latest/quick_start.html diff --git a/content/docs/software/tools/spack.mdx b/content/docs/software/tools/spack.mdx deleted file mode 100644 index 2758c64b260fbf1a4f0e77c85369e3322daaa76e..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/spack.mdx +++ /dev/null @@ -1,450 +0,0 @@ ---- -title: "Spack" ---- -Spack is a package manager for supercomputers, Linux, and macOS. It makes installing scientific software easy. With Spack, you can build a package with multiple versions, configurations, platforms, and compilers, and all of these builds can coexist on the same machine. - -For more information, see Spack's [documentation][a]. - -## Spack on IT4Innovations Clusters - -```console - -$ ml av Spack - ----------------------- /apps/modules/devel ------------------------------ - Spack/0.16.2 (D) -``` - -<Callout> - Spack/default is the rule for setting up local installation -</Callout> - -## First Usage Module Spack/Default - -Spack will be installed into the ~/Spack folder. You can set the configuration by modifying ~/.spack/configure.yml. - -```console -$ ml Spack -== Settings for first use -Couldn't import dot_parser, loading of dot files will not be possible. -== temporary log file in case of crash /tmp/eb-wLh1RT/easybuild-54vEn3.log -== processing EasyBuild easyconfig /apps/easybuild/easyconfigs-master/easybuild/easyconfigs/s/Spack/Spack-0.16.2.eb -== building and installing Spack/0.16.2... -== fetching files... -== creating build dir, resetting environment... -== unpacking... -== patching... -== preparing... -== configuring... -== building... -== testing... -== installing... -== taking care of extensions... -== postprocessing... -== sanity checking... -== cleaning up... -== creating module... -== permissions... -== packaging... -== COMPLETED: Installation ended successfully -== Results of the build can be found in the log file(s) /home/user/.local/easybuild/software/Spack/0.16.2/easybuild/easybuild-Spack-0.16.2-20210922.123022.log -== Build succeeded for 1 out of 1 -== Temporary log file(s) /tmp/eb-wLh1RT/easybuild-54vEn3.log* have been removed. -== Temporary directory /tmp/eb-wLh1RT has been removed. -== Create folder ~/Spack - -The following have been reloaded with a version change: - 1) Spack/default => Spack/0.16.2 - -$ spack --version -0.16.2 -``` - -## Usage Module Spack/Default - -```console -$ ml Spack -$ ml - -Currently Loaded Modules: - 1) Spack/0.16.2 -``` - -## Build Software Package - -Packages in Spack are written in pure Python, so you can do anything in Spack that you can do in Python. Python was chosen as the implementation language for two reasons. First, Python is becoming ubiquitous in the scientific software community. Second, it is a modern language and has many powerful features to help make package writing easy. - -### Search for Available Software - -To install software with Spack, you need to know what software is available. Use the `spack list` command. - -```console -$ spack list -==> 1114 packages. -abinit font-bh-100dpi libffi npm py-ply r-maptools tetgen -ack font-bh-75dpi libfontenc numdiff py-pmw r-markdown tethex -activeharmony font-bh-lucidatypewriter-100dpi libfs nwchem py-prettytable r-mass texinfo -adept-utils font-bh-lucidatypewriter-75dpi libgcrypt ocaml py-proj r-matrix texlive -adios font-bh-ttf libgd oce py-prompt-toolkit r-matrixmodels the-platinum-searcher -adol-c font-bh-type1 libgpg-error oclock py-protobuf r-memoise the-silver-searcher -allinea-forge font-bitstream-100dpi libgtextutils octave py-psutil r-mgcv thrift -allinea-reports font-bitstream-75dpi libhio octave-splines py-ptyprocess r-mime tinyxml -ant font-bitstream-speedo libice octopus py-pudb r-minqa tinyxml2 -antlr font-bitstream-type1 libiconv ompss py-py r-multcomp tk -ape font-cronyx-cyrillic libint ompt-openmp py-py2cairo r-munsell tmux -apex font-cursor-misc libjpeg-turbo opari2 py-py2neo r-mvtnorm tmuxinator -applewmproto font-daewoo-misc libjson-c openblas py-pychecker r-ncdf4 transset -appres font-dec-misc liblbxutil opencoarrays py-pycodestyle r-networkd3 trapproto -apr font-ibm-type1 libmesh opencv py-pycparser r-nlme tree -... -``` - -#### Specify Software Version (For Package) - -To see more available versions of a package, run `spack versions`. - -```console -$ spack versions git -==> Safe versions (already checksummed): - 2.29.0 2.27.0 2.25.0 2.20.1 2.19.1 2.17.1 2.15.1 2.13.0 2.12.1 2.11.1 2.9.3 2.9.1 2.8.4 2.8.2 2.8.0 2.7.1 - 2.28.0 2.26.0 2.21.0 2.19.2 2.18.0 2.17.0 2.14.1 2.12.2 2.12.0 2.11.0 2.9.2 2.9.0 2.8.3 2.8.1 2.7.3 -==> Remote versions (not yet checksummed): - 2.33.0 2.26.2 2.23.3 2.21.1 2.18.3 2.16.1 2.13.6 2.10.4 2.7.0 2.5.2 2.4.2 2.3.0 2.0.2 1.8.5.2 1.8.3.1 - 2.32.0 2.26.1 2.23.2 2.20.5 2.18.2 2.16.0 2.13.5 2.10.3 2.6.7 2.5.1 2.4.1 2.2.3 2.0.1 1.8.5.1 1.8.3 - 2.31.1 2.25.5 2.23.1 2.20.4 2.18.1 2.15.4 2.13.4 2.10.2 2.6.6 2.5.0 2.4.0 2.2.2 2.0.0 1.8.5 1.8.2.3 - 2.31.0 2.25.4 2.23.0 2.20.3 2.17.6 2.15.3 2.13.3 2.10.1 2.6.5 2.4.12 2.3.10 2.2.1 1.9.5 1.8.4.5 0.7 - 2.30.2 2.25.3 2.22.5 2.20.2 2.17.5 2.15.2 2.13.2 2.10.0 2.6.4 2.4.11 2.3.9 2.2.0 1.9.4 1.8.4.4 0.6 - 2.30.1 2.25.2 2.22.4 2.20.0 2.17.4 2.15.0 2.13.1 2.9.5 2.6.3 2.4.10 2.3.8 2.1.4 1.9.3 1.8.4.3 0.5 - 2.30.0 2.25.1 2.22.3 2.19.6 2.17.3 2.14.6 2.12.5 2.9.4 2.6.2 2.4.9 2.3.7 2.1.3 1.9.2 1.8.4.2 0.04 - 2.29.3 2.24.4 2.22.2 2.19.5 2.17.2 2.14.5 2.12.4 2.8.6 2.6.1 2.4.8 2.3.6 2.1.2 1.9.1 1.8.4.1 0.03 - 2.29.2 2.24.3 2.22.1 2.19.4 2.16.6 2.14.4 2.12.3 2.8.5 2.6.0 2.4.7 2.3.5 2.1.1 1.9.0 1.8.4.rc0 0.02 - 2.29.1 2.24.2 2.22.0 2.19.3 2.16.5 2.14.3 2.11.4 2.7.6 2.5.6 2.4.6 2.3.4 2.1.0 1.8.5.6 1.8.4 0.01 - 2.28.1 2.24.1 2.21.4 2.19.0 2.16.4 2.14.2 2.11.3 2.7.5 2.5.5 2.4.5 2.3.3 2.0.5 1.8.5.5 1.8.3.4 - 2.27.1 2.24.0 2.21.3 2.18.5 2.16.3 2.14.0 2.11.2 2.7.4 2.5.4 2.4.4 2.3.2 2.0.4 1.8.5.4 1.8.3.3 - 2.26.3 2.23.4 2.21.2 2.18.4 2.16.2 2.13.7 2.10.5 2.7.2 2.5.3 2.4.3 2.3.1 2.0.3 1.8.5.3 1.8.3.2 -``` - -## Graph for Software Package - -Spack provides the `spack graph` command to display the dependency graph. By default, the command generates an ASCII rendering of a spec’s dependency graph. - -```console -$ spack graph git -==> Warning: gcc@4.8.5 cannot build optimized binaries for "zen2". Using best target possible: "x86_64" -o git -|\ -| |\ -| | |\ -| | | |\ -| | | | |\ -| | | | | |\ -| | | | | | |\ -| | | | | | | |\ -| | | | | | | | |\ -| | | | | | | | | |\ -| | | | | | | | | | |\ -| | | | | | | | | | | |\ -| | | | | | | | | | | | |\ -| | | | o | | | | | | | | | openssh -| |_|_|/| | | | | | | | | | -|/| | |/| | | | | | | | | | -| | | | |\ \ \ \ \ \ \ \ \ \ -| | | | | | | | | | | | o | | curl -| |_|_|_|_|_|_|_|_|_|_|/| | | -|/| | | |_|_|_|_|_|_|_|/| | | -| | | |/| | | | | |_|_|/ / / -| | | | | | | | |/| | | | | -| | | o | | | | | | | | | | openssl -| |_|/| | | | | | | | | | | -|/| |/ / / / / / / / / / / -| |/| | | | | | | | | | | -| | | | | | | | | o | | | gettext -| | | | |_|_|_|_|/| | | | -| | | |/| | | | |/| | | | -| | | | | | | | | |\ \ \ \ -| | | | | | | | | | |\ \ \ \ -| | | | | | | | | | | |\ \ \ \ -| | | | | | | | | | | o | | | | libxml2 -| |_|_|_|_|_|_|_|_|_|/| | | | | -|/| | | | | | | | |_|/| | | | | -| | | | | | | | |/| |/| | | | | -| | | | | | | | | |/| | | | | | -o | | | | | | | | | | | | | | | zlib - / / / / / / / / / / / / / / / -| | | | | | | | o | | | | | | xz -| | | | | | | | / / / / / / -| | | | | | | | o | | | | | tar -| | | | | | | |/ / / / / / -| | | | | | | | | | | o | automake -| |_|_|_|_|_|_|_|_|_|/| | -|/| | | | | | | | | | | | -| | | | | | | | | | | |/ -| | | | | | | | | | | o autoconf -| |_|_|_|_|_|_|_|_|_|/| -|/| | | | |_|_|_|_|_|/ -| | | | |/| | | | | | -o | | | | | | | | | | perl -|\ \ \ \ \ \ \ \ \ \ \ -o | | | | | | | | | | | gdbm -o | | | | | | | | | | | readline -| |_|/ / / / / / / / / -|/| | | | | | | | | | -| | | o | | | | | | | libedit -| |_|/ / / / / / / / -|/| | | | | | | | | -o | | | | | | | | | ncurses -| |_|_|_|_|_|/ / / -|/| | | | | | | | -o | | | | | | | | pkgconf - / / / / / / / / -| o | | | | | | pcre2 -| / / / / / / -| | o | | | | libtool -| |/ / / / / -| o | | | | m4 -| | o | | | libidn2 -| | o | | | libunistring -| | |/ / / -| o | | | libsigsegv -| / / / -| | o | bzip2 -| | o | diffutils -| |/ / -| o | libiconv -| / -| o expat -| o libbsd -| -o berkeley-db -``` - -### Information for Software Package - -To get more information on a particular package from `spack list`, use `spack info`. - -```console -$ spack info git -AutotoolsPackage: git - -Description: - Git is a free and open source distributed version control system - designed to handle everything from small to very large projects with - speed and efficiency. - -Homepage: http://git-scm.com - -Tags: - None - -Preferred version: - 2.29.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.29.0.tar.gz - -Safe versions: - 2.29.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.29.0.tar.gz - 2.28.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz - 2.27.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.27.0.tar.gz - 2.26.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.26.0.tar.gz - 2.25.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.25.0.tar.gz - 2.21.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.21.0.tar.gz - 2.20.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.20.1.tar.gz - 2.19.2 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz - 2.19.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.1.tar.gz - 2.18.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz - 2.17.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.17.1.tar.gz - 2.17.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.17.0.tar.gz - 2.15.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.15.1.tar.gz - 2.14.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.14.1.tar.gz - 2.13.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.13.0.tar.gz - 2.12.2 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.12.2.tar.gz - 2.12.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.12.1.tar.gz - 2.12.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.12.0.tar.gz - 2.11.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.11.1.tar.gz - 2.11.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.11.0.tar.gz - 2.9.3 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz - 2.9.2 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.2.tar.gz - 2.9.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.1.tar.gz - 2.9.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.0.tar.gz - 2.8.4 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.4.tar.gz - 2.8.3 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.3.tar.gz - 2.8.2 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.2.tar.gz - 2.8.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.1.tar.gz - 2.8.0 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.0.tar.gz - 2.7.3 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz - 2.7.1 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.7.1.tar.gz - -Variants: - Name [Default] Allowed values Description - ============== ============== =========================================== - - tcltk [off] on, off Gitk: provide Tcl/Tk in the run environment - -Installation Phases: - autoreconf configure build install - -Build Dependencies: - autoconf automake curl expat gettext iconv libidn2 libtool m4 openssl pcre pcre2 perl tk zlib - -Link Dependencies: - curl expat gettext iconv libidn2 openssl pcre pcre2 perl tk zlib - -Run Dependencies: - openssh - -Virtual Packages: - None -``` - -### Install Software Package - -`spack install` will install any package shown by `spack list`. For example, to install the latest version of the `git` package, you might type `spack install git` for default version or `spack install git@version` to chose a particular one. - -```console -$ spack install git@2.29.0 -==> Warning: specifying a "dotkit" module root has no effect [support for "dotkit" has been dropped in v0.13.0] -==> Warning: gcc@4.8.5 cannot build optimized binaries for "zen2". Using best target possible: "x86_64" -==> Installing libsigsegv-2.12-lctnabj6w4bmnyxo7q6ct4wewke2bqin -==> No binary for libsigsegv-2.12-lctnabj6w4bmnyxo7q6ct4wewke2bqin found: installing from source -==> Fetching https://spack-llnl-mirror.s3-us-west-2.amazonaws.com/_source-cache/archive/3a/3ae1af359eebaa4ffc5896a1aee3568c052c99879316a1ab57f8fe1789c390b6.tar.gz -######################################################################## 100.0% -==> libsigsegv: Executing phase: 'autoreconf' -==> libsigsegv: Executing phase: 'configure' -==> libsigsegv: Executing phase: 'build' -==> libsigsegv: Executing phase: 'install' -[+] /home/kru0052/Spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/libsigsegv-2.12-lctnabj6w4bmnyxo7q6ct4wewke2bqin -==> Installing berkeley-db-18.1.40-bwuaqjex546zw3bimt23bgokfctnt46y -==> No binary for berkeley-db-18.1.40-bwuaqjex546zw3bimt23bgokfctnt46y found: installing from source -==> Fetching https://spack-llnl-mirror.s3-us-west-2.amazonaws.com/_source-cache/archive/0c/0cecb2ef0c67b166de93732769abdeba0555086d51de1090df325e18ee8da9c8.tar.gz -######################################################################## 100.0% -... -... -==> Fetching https://spack-llnl-mirror.s3-us-west-2.amazonaws.com/_source-cache/archive/8f/8f3bf70ddb515674ce2e19572920a39b1be96af12032b77f1dd57898981fb151.tar.gz -################################################################################################################################################################################################################################ 100.0% -==> Moving resource stage - source : /tmp/kru0052/resource-git-manpages-cabbbb7qozeijgspy2wl3hf6on6f4b4c/spack-src/ - destination : /tmp/kru0052/spack-stage-git-2.29.0-cabbbb7qozeijgspy2wl3hf6on6f4b4c/spack-src/git-manpages -==> git: Executing phase: 'autoreconf' -==> git: Executing phase: 'configure' -==> git: Executing phase: 'build' -==> git: Executing phase: 'install' -[+] /home/kru0052/Spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/git-2.29.0-cabbbb7qozeijgspy2wl3hf6on6f4b4c -``` - -<Callout type=warn> - `FTP` on cluster is not allowed, you must edit the source link. -</Callout> - -### Edit Rule - -```console -$ spack edit git -``` - -<Callout> - To change the source link (`ftp://` to `http://`), use `spack create URL -f` to regenerate rules. -</Callout> - -## Available Spack Module - -We know that `spack list` shows you the names of available packages, but how do you figure out which are already installed? - -```console -==> 19 installed packages. --- linux-centos6-x86_64 / gcc@4.4.7 ----------------------------- -autoconf@2.69 cmake@3.7.1 expat@2.2.0 git@2.11.0 libsigsegv@2.10 m4@1.4.17 openssl@1.0.2j perl@5.24.0 tar@1.29 zlib@1.2.10 -bzip2@1.0.6 curl@7.50.3 gettext@0.19.8.1 libiconv@1.14 libxml2@2.9.4 ncurses@6.0 pcre@8.41 pkg-config@0.29.1 xz@5.2.2 -``` - -Spack colorizes output. - -```console -$ spack find | less -R --- linux-centos7-x86_64 / gcc@4.8.5 ----------------------------- -autoconf@2.69 -automake@1.16.2 -berkeley-db@18.1.40 -bzip2@1.0.8 -curl@7.72.0 -diffutils@3.7 -expat@2.2.10 -gdbm@1.18.1 -gettext@0.21 -git@2.29.0 -libbsd@0.10.0 -libedit@3.1-20191231 -libiconv@1.16 -libidn2@2.3.0 -libsigsegv@2.12 -libtool@2.4.6 -libunistring@0.9.10 -libxml2@2.9.10 -m4@1.4.18 -ncurses@6.2 -openssh@8.4p1 -openssl@1.1.1h -pcre2@10.35 -perl@5.32.0 -pkgconf@1.7.3 -readline@8.0 -tar@1.32 -xz@5.2.5 -zlib@1.2.11 -``` - -`spack find` shows the specs of installed packages. A spec is like a name, but it has a version, compiler, architecture, and build options associated with it. In Spack, you can have many installations of the same package with different specs. - -## Load and Unload Module - -Neither of these is particularly pretty, easy to remember, or easy to type. Luckily, Spack has its own interface for using modules and dotkits. - -```console -$ spack load git -==> This command requires spack's shell integration. - - To initialize spack's shell commands, you must run one of - the commands below. Choose the right command for your shell. - - For bash and zsh: - . ~/.local/easybuild/software/Spack/0.16.2/share/spack/setup-env.sh - - For csh and tcsh: - setenv SPACK_ROOT ~/.local/easybuild/software/Spack/0.16.2 - source ~/.local/easybuild/software/Spack/0.16.2/share/spack/setup-env.csh -``` - -### First Usage - -```console -$ . ~/.local/easybuild/software/Spack/0.16.2/share/spack/setup-env.sh -``` - -```console -$ git version 1.7.1 -$ spack load git -$ git --version -git version 2.29.0 -$ spack unload git -$ git --version -git version 1.7.1 -``` - -## Uninstall Software Package - -Spack will ask you either to provide a version number to remove the ambiguity or use the `--all` option to uninstall all of the matching packages. - -You may force uninstall a package with the `--force` option. - -```console -$ spack uninstall git -==> The following packages will be uninstalled : - --- linux-centos7-x86_64 / gcc@4.4.7 ----------------------------- -xmh3hmb git@2.29.0%gcc - - -==> Do you want to proceed ? [y/n] -y -==> Successfully uninstalled git@2.29.00%gcc@4.8.5 arch=linux-centos6-x86_64 -xmh3hmb - -``` - -[a]: https://spack.readthedocs.io/en/latest/ diff --git a/content/docs/software/tools/virtualization.mdx b/content/docs/software/tools/virtualization.mdx deleted file mode 100644 index 3ae8ea0f5a5a64afbd649fdd2fe7f3cd44e509c4..0000000000000000000000000000000000000000 --- a/content/docs/software/tools/virtualization.mdx +++ /dev/null @@ -1,433 +0,0 @@ ---- -title: "Virtualization" ---- -<!-- -musime proverit ---> - -Running virtual machines on compute nodes. - -## Introduction - -There are situations when our clusters' environment is not suitable for user's needs: - -* Application requires a different operating system (e.g. Windows) or it is not available for Linux; -* Application requires a different versions of base system libraries and tools; -* Application requires specific setup (installation, configuration) of a complex software stack; -* Application requires privileged access to the operating system; -* ... and combinations of the above cases. - -The solution for these cases is **virtualization**. Clusters' environment allows to run virtual machines on compute nodes. Users can create their own images of the operating system with a specific software stack and run instances of these images as virtual machines on compute nodes. Run of virtual machines is provided by the standard mechanism of [Resource Allocation and Job Execution][1]. - -Solution is based on QEMU-KVM software stack and provides hardware-assisted x86 virtualization. - -## Limitations - -Clusters' infrastructure and environment were s not designed for virtualization. Compute nodes, storages, and infrastructure is intended and optimized for running HPC jobs. This implies suboptimal configuration of virtualization and limitations. - -Clusters' virtualization does not provide the performance and all features of a native environment. There is significant a performance hit (degradation) in I/O performance (storage, network). The virtualization is not suitable for I/O (disk, network) intensive workloads. - -Virtualization has some drawbacks, as well. It is not so easy to set up an efficient solution. - -The solution described in the [HOWTO][2] section is suitable for single node tasks; it does not introduce virtual machine clustering. - -<Callout> - Consider virtualization as a last resort solution for your needs. -</Callout> - -<Callout type=warn> - Consult use of virtualization with IT4Innovations' support. -</Callout> - -For running a Windows application (when the source code and Linux native application are not available), consider use of Wine, Windows compatibility layer. Many Windows applications can be run using Wine with less effort and better performance than when using virtualization. - -## Licensing - -IT4Innovations does not provide any licenses for operating systems and software of virtual machines. Users are (in accordance with [Acceptable use policy document][a]) fully responsible for licensing all software running on virtual machines on clusters. Be aware of complex conditions of licensing software in virtual environments. - -<Callout> - Users are responsible for licensing OS (e.g. MS Windows) and all software running on their virtual machines. -</Callout> - -## Howto - -### Virtual Machine Job Workflow - -We propose this job workflow: - - - -Our recommended solution is that the job script creates a distinct shared job directory, which makes a central point for data exchange between cluster's environment, compute node (host) (e.g. HOME, SCRATCH, local scratch, and other local or cluster file systems), and virtual machine (guest). The job script links or copies input data and instructions on what to do (run script) for the virtual machine to the job directory and the virtual machine process input data according to the instructions in the job directory and store output back to the job directory. We recommend that the virtual machine is running in a so called [snapshot mode][3], the image is immutable - it does not change, so one image can be used for many concurrent jobs. - -### Procedure - -1. Prepare the image of your virtual machine -1. Optimize the image of your virtual machine for cluster's virtualization -1. Modify your image for running jobs -1. Create a job script for executing the virtual machine -1. Run jobs - -### Prepare Image of Your Virtual Machine - -You can either use your existing image or create a new image from scratch. - -QEMU currently supports these image types or formats: - -* raw -* cloop -* cow -* qcow -* qcow2 -* vmdk - VMware 3 & 4, or 6 image format, for exchanging images with that product -* vdi - VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox. - -You can convert your existing image using the `qemu-img convert` command. Supported formats of this command are: `blkdebug blkverify bochs cloop cow dmg file ftp ftps host_cdrom host_device host_floppy http https nbd parallels qcow qcow2 qed raw sheepdog tftp vdi vhdx vmdk vpc vvfat`. - -We recommend using an advanced QEMU native image format qcow2. - -More about QEMU images [here][b]. - -### Optimize Image of Your Virtual Machine - -Use virtio devices (for the disk/drive and the network adapter) and install virtio drivers (paravirtualized drivers) into the virtual machine. There is a significant performance gain when using virtio drivers. For more information, see [Virtio Linux][c] and [Virtio Windows][d]. - -Disable all unnecessary services and tasks. Restrict all unnecessary operating system operations. - -Remove all unnecessary software and files. - -Remove all paging space, swap files, partitions, etc. - -Shrink your image. (It is recommended to zero all free space and reconvert the image using `qemu-img`.) - -### Modify Your Image for Running Jobs - -Your image should contian an operating system startup script. The startup script should run the application and when the application exits, run shutdown or quit the virtual machine. - -We recommend that the startup script: - -* maps Job Directory from host (from compute node); -* runs script (we call it "run script") from Job Directory and waits for application's exit; - * for management purposes if the run script does not exist wait for some time period (few minutes); -* shutdowns/quits OS. - -For Windows operating systems, we suggest using a Local Group Policy Startup script; for Linux operating systems, use the rc.local, runlevel init script, or similar service. - -Example startup script for the Windows virtual machine: - -```bat -@echo off -set LOG=c:\startup.log -set MAPDRIVE=z: -set SCRIPT=%MAPDRIVE%\run.bat -set TIMEOUT=300 - -echo %DATE% %TIME% Running startup script>%LOG% - -rem Mount share -echo %DATE% %TIME% Mounting shared drive>>%LOG% -net use z: \\10.0.2.4\qemu >>%LOG% 2>&1 -dir z:\ >>%LOG% 2>&1 -echo. >>%LOG% - - -if exist %MAPDRIVE%\ ( - echo %DATE% %TIME% The drive "%MAPDRIVE%" exists>>%LOG% - - if exist %SCRIPT% ( - echo %DATE% %TIME% The script file "%SCRIPT%"exists>>%LOG% - echo %DATE% %TIME% Running script %SCRIPT%>>%LOG% - set TIMEOUT=0 - call %SCRIPT% - ) else ( - echo %DATE% %TIME% The script file "%SCRIPT%"does not exist>>%LOG% - ) - -) else ( - echo %DATE% %TIME% The drive "%MAPDRIVE%" does not exist>>%LOG% -) -echo. >>%LOG% - -timeout /T %TIMEOUT% - -echo %DATE% %TIME% Shut down>>%LOG% -shutdown /s /t 0 -``` - -The example startup script maps a shared job script as a drive z: and looks for a run script called run.bat. If the run script is found, it is run, otherwise it waits for 5 minutes, then shuts down the virtual machine. - -### Create Job Script for Executing Virtual Machine - -Create the job script according to the recommended [Virtual Machine Job Workflow][4]. - -Example job for the Windows virtual machine: - -```bat - #/bin/sh - - JOB_DIR=/scratch/$USER/win/${$SLURM_JOBID} - - #Virtual machine settings - VM_IMAGE=~/work/img/win.img - VM_MEMORY=49152 - VM_SMP=16 - - # Prepare job dir - mkdir -p ${JOB_DIR} && cd ${JOB_DIR} || exit 1 - ln -s ~/work/win . - ln -s /scratch/$USER/data . - ln -s ~/work/win/script/run/run-appl.bat run.bat - - # Run virtual machine - export TMPDIR=/lscratch/${$SLURM_JOBID} - module add qemu - qemu-system-x86_64 - -enable-kvm - -cpu host - -smp ${VM_SMP} - -m ${VM_MEMORY} - -vga std - -localtime - -usb -usbdevice tablet - -device virtio-net-pci,netdev=net0 - -netdev user,id=net0,smb=${JOB_DIR},hostfwd=tcp::3389-:3389 - -drive file=${VM_IMAGE},media=disk,if=virtio - -snapshot - -nographic -``` - -The job script links application data (win), input data (data), and run script (run.bat) into the job directory and runs the virtual machine. - -Example run script (run.bat) for the Windows virtual machine: - -```doscon - z: - cd winappl - call application.bat z:data z:output -``` - -The run script runs the application from the shared job directory (mapped as drive z:), processes the input data (z:data) from the job directory, and stores output to the job directory (z:output). - -### Run Jobs - -Run jobs as usual, see [Resource Allocation and Job Execution][1]. Use only full node allocation for virtualization jobs. - -### Running Virtual Machines - -Virtualization is enabled only on compute nodes, virtualization does not work on login nodes. - -Load the QEMU environment module: - -```console -$ module add qemu -``` - -Get help: - -```console -$ man qemu -``` - -Run the virtual machine (simple): - -```console -$ qemu-system-x86_64 -hda linux.img -enable-kvm -cpu host -smp 16 -m 32768 -vga std -vnc :0 -$ qemu-system-x86_64 -hda win.img -enable-kvm -cpu host -smp 16 -m 32768 -vga std -localtime -usb -usbdevice tablet -vnc :0 -``` - -You can access the virtual machine via the VNC viewer (the `-vnc` option) connecting to the IP address of the compute node. For VNC, you must use a VPN network. - -Install the virtual machine from the ISO file: - -```console -$ qemu-system-x86_64 -hda linux.img -enable-kvm -cpu host -smp 16 -m 32768 -vga std -cdrom linux-install.iso -boot d -vnc :0 -$ qemu-system-x86_64 -hda win.img -enable-kvm -cpu host -smp 16 -m 32768 -vga std -localtime -usb -usbdevice tablet -cdrom win-install.iso -boot d -vnc :0 -``` - -Run the virtual machine using optimized devices, user network back-end with sharing and port forwarding, in snapshot mode - -```console -$ qemu-system-x86_64 -drive file=linux.img,media=disk,if=virtio -enable-kvm -cpu host -smp 16 -m 32768 -vga std -device virtio-net-pci,netdev=net0 -netdev user,id=net0,smb=/scratch/$USER/tmp,hostfwd=tcp::2222-:22 -vnc :0 -snapshot -$ qemu-system-x86_64 -drive file=win.img,media=disk,if=virtio -enable-kvm -cpu host -smp 16 -m 32768 -vga std -localtime -usb -usbdevice tablet -device virtio-net-pci,netdev=net0 -netdev user,id=net0,smb=/scratch/$USER/tmp,hostfwd=tcp::3389-:3389 -vnc :0 -snapshot -``` - -Port forwarding allows you to access the virtual machine via SSH (Linux) or RDP (Windows) connecting to the IP address of the compute node (and port 2222 for SSH). You must use a VPN network). - -<Callout> - Keep in mind, that if you use virtio devices, you must have virtio drivers installed on your virtual machine. -</Callout> - -### Networking and Data Sharing - -For a networking virtual machine, we suggest using a (default) user network back-end (sometimes called slirp). This network back-end NATs virtual machines and provides useful services for virtual machines as DHCP, DNS, SMB sharing, port forwarding. - -In default configuration, IP network 10.0.2.0/24 is used, host has IP address 10.0.2.2, DNS server 10.0.2.3, SMB server 10.0.2.4 and virtual machines obtain address from range 10.0.2.15-10.0.2.31. Virtual machines have access to cluster's network via NAT on the compute node (host). - -Simple network setup: - -```console -$ qemu-system-x86_64 ... -net nic -net user -``` - -(It is default when no `-net` options are given.) - -Simple network setup with sharing and port forwarding (obsolete but simpler syntax, lower performance): - -```console -$ qemu-system-x86_64 ... -net nic -net user,smb=/scratch/$USER/tmp,hostfwd=tcp::3389-:3389 -``` - -Optimized network setup with sharing and port forwarding: - -```console -$ qemu-system-x86_64 ... -device virtio-net-pci,netdev=net0 -netdev user,id=net0,smb=/scratch/$USER/tmp,hostfwd=tcp::2222-:22 -``` - -### Advanced Networking - -#### Internet Access - -Sometimes, your virtual machine needs an access to internet (install software, updates, software activation, etc.). We suggest using Virtual Distributed Ethernet (VDE) enabled QEMU with SLIRP running on the login node tunneled to the compute node. Note that this setup has very low performance, the worst performance of all described solutions. - -Load the VDE enabled QEMU environment module (unload the standard QEMU module first if necessary): - -```console -$ module add qemu/2.1.2-vde2 -``` - -Create a virtual network switch: - -```console -$ vde_switch -sock /tmp/sw0 -mgmt /tmp/sw0.mgmt -daemon -``` - -Run a SLIRP daemon over the SSH tunnel on the login node and connect it to the virtual network switch: - -```console -$ dpipe vde_plug /tmp/sw0 = ssh login1 $VDE2_DIR/bin/slirpvde -s - --dhcp & -``` - -Run QEMU using the VDE network back-end, connect to the created virtual switch. - -Basic setup (obsolete syntax) - -```console -$ qemu-system-x86_64 ... -net nic -net vde,sock=/tmp/sw0 -``` - -Setup using a Virtio device (obsolete syntax): - -```console -$ qemu-system-x86_64 ... -net nic,model=virtio -net vde,sock=/tmp/sw0 -``` - -Optimized setup: - -```console -$ qemu-system-x86_64 ... -device virtio-net-pci,netdev=net0 -netdev vde,id=net0,sock=/tmp/sw0 -``` - -#### TAP Interconnect - -Both the user and the VDE network back-end have low performance. For fast interconnect (10 Gbit/s and more) of the compute node (host) and the virtual machine (guest), we suggest using the Linux kernel TAP device. - -Clusters provide the TAP device tap0 for your job. TAP interconnect does not provide any services (like NAT, DHCP, DNS, SMB, etc.) just raw networking, so you should provide your services if you need them. - -To enable the TAP interconect feature, you need to specify the `virt_network:1` Slurm resource at job submit. - -```console -$ salloc ... --gres=virt_network:1 -``` - -Run QEMU with TAP network back-end: - -```console -$ qemu-system-x86_64 ... -device virtio-net-pci,netdev=net1 -netdev tap,id=net1,ifname=tap0,script=no,downscript=no -``` - -Interface tap0 has IP address 192.168.1.1 and network mask 255.255.255.0 (/24). In the virtual machine, use an IP address from range 192.168.1.2-192.168.1.254. For your convenience, some ports on tap0 interface are redirected to a higher numbered ports, so you as a non-privileged user can provide services on these ports. - -Redirected ports: - -* DNS UDP/53->UDP/3053, TCP/53->TCP/3053 -* DHCP UDP/67->UDP/3067 -* SMB TCP/139->TCP/3139, TCP/445->TCP/3445). - -You can configure the virtual machine's IP address statically or dynamically. For dynamic addressing provide your DHCP server on port 3067 of tap0 interface, you can also provide your DNS server on port 3053 of tap0 interface for example: - -```console -$ dnsmasq --interface tap0 --bind-interfaces -p 3053 --dhcp-alternate-port=3067,68 --dhcp-range=192.168.1.15,192.168.1.32 --dhcp-leasefile=/tmp/dhcp.leasefile -``` - -You can also provide your SMB services (on ports 3139, 3445) to obtain high performance data sharing. - -Example smb.conf (not optimized): - -```console -$ cat smb.conf - - [global] - socket address=192.168.1.1 - smb ports = 3445 3139 - - private dir=/tmp/qemu-smb - pid directory=/tmp/qemu-smb - lock directory=/tmp/qemu-smb - state directory=/tmp/qemu-smb - ncalrpc dir=/tmp/qemu-smb/ncalrpc - log file=/tmp/qemu-smb/log.smbd - smb passwd file=/tmp/qemu-smb/smbpasswd - security = user - map to guest = Bad User - unix extensions = no - load printers = no - printing = bsd - printcap name = /dev/null - disable spoolss = yes - log level = 1 - guest account = USER - [qemu] - path=/scratch/USER/tmp - read only=no - guest ok=yes - writable=yes - follow symlinks=yes - wide links=yes - force user=USER -``` - -(Replace USER with your login name.) - -Run SMB services - -```console -$ smbd -s /tmp/qemu-smb/smb.conf -``` - -A virtual machine can have more than one network interface controller and can use more than one network back-end. So, you can combine, for example, a network back-end and a TAP interconnect. - -### Snapshot Mode - -In snapshot mode, the image is not written, changes are written to a temporary file (and discarded after the virtual machine exits). **It is a strongly recommended mode for running your jobs.** Set the `TMPDIR` environment variable to a local scratch directory for temporary files placement: - -```console -$ export TMPDIR=/lscratch/${$SLURM_JOBID} -$ qemu-system-x86_64 ... -snapshot -``` - -### Windows Guests - -For Windows guests, we recommend these options: - -```console -$ qemu-system-x86_64 ... -localtime -usb -usbdevice tablet -``` - -[1]: ../../general/job-submission-and-execution.md -[2]: #howto -[3]: #snapshot-mode -[4]: #virtual-machine-job-workflow - -[a]: http://www.it4i.cz/acceptable-use-policy.pdf -[b]: http://en.wikibooks.org/wiki/QEMU/Images -[c]: http://www.linux-kvm.org/page/Virtio -[d]: http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers diff --git a/content/docs/software/viz/NICEDCVsoftware.mdx b/content/docs/software/viz/NICEDCVsoftware.mdx deleted file mode 100644 index 1164842142fea5f883ddb9ea5a7c98c3153ce7c0..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/NICEDCVsoftware.mdx +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: "NICE DCV" ---- -**Install NICE DCV** (user-computer) - -* [Overview][a] -* [Download][b] - -**Install VPN client** [VPN Access][1] - -## How to Use - -Read the documentation on [VNC server][3]. - -**Run VNC** - -* Login to Barbora - -```console -[username@yourPC]$ ssh -i path/to/your_id_rsa user@login1.Barbora.it4i.cz -``` - -* Run a Job on Barbora on the Vizserv1 (or Vizserv2) - -```console -[user@login1]$ salloc -p qviz -A OPEN-XX-XX --nodes=1 --ntasks=4 --time=04:00:00 --nodelist=vizserv1 --job-name=Vizserver1 -``` - -You are connected to Vizserv1 now. - -```console -[yourusername@vizserv1 ~]$ -``` - -**VNC Server** - -* Create a VNC Server Password - -<Callout> - A VNC server password should be set before the first login to VNC server. Use a strong password. -</Callout> - -```console -[yourusername@vizserv1 ~]$ vncpasswd -password: -verify: -``` - -* Check the display number of the connected users - -```console -[yourusername@vizserv1 ~]$ ps aux | grep Xvnc | sed -rn 's/(\s) .*Xvnc.* (\:[0-9]+) .*/\1 \2/p' -username :15 -username :61 -..... -``` - -<Callout> - The VNC server runs on port 59xx, where xx is the display number. To get your port number, simply add 5900 + display number, in our example 5900 + 11 = 5911. **Calculate your own port number and use it instead of 5911 from examples below**. -</Callout> - -* Start your remote VNC server - -<Callout> - Choose the display number which is different from other users display number. Also remember that display number should be lower or equal 99. -</Callout> - -```console -[yourusername@vizserv1 ~]$ vncserver :11 -geometry 1600x900 -depth 24 -Running applications in /etc/vnc/xstartup -VNC Server signature: f0-3d-df-ee-6f-a4-b1-62 -Log file is /home/yourusername/.vnc/vizserv1:11.log -New desktop is vizserv1:11 (195.113.250.204:11) -``` - -* Check the display number - -```console -[yourusername@vizserv1 ~]$ ps aux | grep Xvnc | sed -rn 's/(\s) .*Xvnc.* (\:[0-9]+) .*/\1 \2/p' -username :15 -username :61 -yourusername :11 -..... -``` - -<Callout> - You started a new VNC server. The server is listening on port 5911 (5900 + 11 = 5911). -</Callout> - -Your VNC server is listening on port 59xx, in our example on port 5911. - -**VNC Client (your local machine)** -You are going to connect your local machine to remote VNC server. - -* Create the SSH tunnel (on your local machine) for port 59xx and for the range of ports 7300-7305. - -```console -[username@yourPC]$ ssh -i path/to/your_id_rsa -TN -f user@vizserv1.barbora.it4i.cz -L 5911:localhost:5911 -L 7300:localhost:7300 -L 7301:localhost:7301 -L 7302:localhost:7302 -L 7303:localhost:7303 -L 7304:localhost:7304 -L 7305:localhost:7305 -``` - -To create an SSH tunnel on Windows, download the [PuTTY installer][d] and follow the instructions in the [VNC server][3] section. - -* Run NICE DCV or one of the recommended clients on your local machine. Recommended clients are [TightVNC][f] or [TigerVNC][g] (free, open source, available for almost any platform). - -* Fill in the localhost:59xx address, click Connect, and enter the password. - - - - -**Test the OpenGL functionality on Vizserv** - -* Run the command in the VNC terminal - -```console -[kub0393@vizserv1 ~]$ /apps/easybuild/glxgears -``` - - - -**Test the NICE DCV functionality** - -* Run the command in VNC terminal - -```console -[kub0393@vizserv1 ~]$ dcvtest -``` - - - -## Stop the Service Correctly After Finishing Work - -**On VNC server site** - -* Logout from your local VNC window - - - -**On your local machine** - -* Find the Process ID (PID) of your SSH tunel - -```console -[username@yourPC]$ netstat -natp | grep 5911 -(Not all processes could be identified, non-owned process info -will not be shown, you would have to be root to see it all.) -tcp 0 0 127.0.0.1:5911 0.0.0.0:* LISTEN 5675/ssh -tcp6 0 0 ::1:5911 :::* LISTEN 5675/ssh -``` - -or - -```console -[username@yourPC]$ lsof -i :5911 -COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME -ssh 5675 user 5u IPv6 571419 0t0 TCP ip6-localhost:5911 (LISTEN) -ssh 5675 user 6u IPv4 571420 0t0 TCP localhost:5911 (LISTEN) -``` - -<Callout> - PID in our example is 5675. You also need to use the correct port number for both commands above. In this example, the port number is 5911. Your PID and port number may differ. -</Callout> - -* Kill the process - -```console -[username@yourPC]$ kill 5675 -``` - -* If on Windows, close Putty. - -[1]: ../../general/accessing-the-clusters/vpn-access.md -[2]: ../../general/accessing-the-clusters/shell-access-and-data-transfer/putty.md -[3]: ../../general/accessing-the-clusters/graphical-user-interface/vnc.md - -[a]: https://aws.amazon.com/hpc/dcv/ -[b]: https://www.nice-dcv.com/2016-0.html -[c]: https://winscp.net/eng/download.php -[d]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html -[e]: https://vpn.it4i.cz/user -[f]: http://www.tightvnc.com -[g]: http://sourceforge.net/apps/mediawiki/tigervnc/index.php?title=Main_Page diff --git a/content/docs/software/viz/gpi2.mdx b/content/docs/software/viz/gpi2.mdx deleted file mode 100644 index c5ac43cb214de40d7bc357e16b1129cbb954dd79..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/gpi2.mdx +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "GPI-2" ---- -<Callout type=warn> - This page has not been updated yet. The page does not reflect the transition from PBS to Slurm. -</Callout> - -## Introduction - -Programming Next Generation Supercomputers: GPI-2 is an API library for asynchronous interprocess, cross-node communication. It provides a flexible, scalable, and fault tolerant interface for parallel applications. - -The GPI-2 library implements the GASPI specification ([Global Address Space Programming Interface][a]). GASPI is a Partitioned Global Address Space (PGAS) API. It aims at scalable, flexible, and failure-tolerant computing in massively parallel environments. - -## Modules - -For the current list of installed versions, use: - -```console -$ ml av GPI-2 -``` - -The module sets up environment variables required for linking and running GPI-2 enabled applications. This particular command loads the default `gpi2/1.0.2` module. - -## Linking - -<Callout> - Link with -lGPI2 -libverbs -</Callout> - -Load the `gpi2` module. Link using `-lGPI2` and `-libverbs` switches to link your code against GPI-2. The GPI-2 requires the OFED InfiniBand communication library ibverbs. - -### Compiling and Linking With Intel Compilers - -```console -$ ml intel -$ ml gpi2 -$ icc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs -``` - -### Compiling and Linking With GNU Compilers - -```console -$ ml gcc -$ ml gpi2 -$ gcc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs -``` - -## Running the GPI-2 Codes - -<Callout> - `gaspi_run` starts the GPI-2 application -</Callout> - -The `gaspi_run` utility is used to start and run GPI-2 applications: - -```console -$ gaspi_run -m machinefile ./myprog.x -``` - -A machine file (** machinefile **) must be provided with the hostnames of nodes where the application will run. The machinefile lists all nodes on which to run, one entry per node per process. This file may be hand created or obtained from standard $PBS_NODEFILE: - -```console -$ cut -f1 -d"." $PBS_NODEFILE > machinefile -``` - -machinefile: - -```console - cn79 - cn80 -``` - -This machinefile will run 2 GPI-2 processes, one on node cn79 and one on node cn80. - -machinefle: - -```console - cn79 - cn79 - cn80 - cn80 -``` - -This machinefile will run 4 GPI-2 processes, two on node cn79 and two on node cn80. - -<Callout> - Use `mpiprocs` to control how many GPI-2 processes will run per node. -</Callout> - -Example: - -```console -$ qsub -A OPEN-0-0 -q qexp -l select=2:ncpus=16:mpiprocs=16 -I -``` - -This example will produce $PBS_NODEFILE with 16 entries per node. - -### Gaspi_logger - -<Callout> - `gaspi_logger` views the output from GPI-2 application ranks. -</Callout> - -The `gaspi_logger` utility is used to view the output from all nodes except the master node (rank 0). `gaspi_logger` is started, on another session, on the master node - the node where the `gaspi_run` is executed. The output of the application, when called with `gaspi_printf()`, will be redirected to the `gaspi_logger`. Other I/O routines (e.g. `printf`) will not. - -## Example - -Following is an example of GPI-2 enabled code: - -```cpp -#include <GASPI.h> -#include <stdlib.h> - -void success_or_exit ( const char* file, const int line, const int ec) -{ - if (ec != GASPI_SUCCESS) - { - gaspi_printf ("Assertion failed in %s[%i]:%dn", file, line, ec); - exit (1); - } -} - -#define ASSERT(ec) success_or_exit (__FILE__, __LINE__, ec); - -int main(int argc, char *argv[]) -{ - gaspi_rank_t rank, num; - gaspi_return_t ret; - - /* Initialize GPI-2 */ - ASSERT( gaspi_proc_init(GASPI_BLOCK) ); - - /* Get ranks information */ - ASSERT( gaspi_proc_rank(&rank) ); - ASSERT( gaspi_proc_num(&num) ); - - gaspi_printf("Hello from rank %d of %dn", - rank, num); - - /* Terminate */ - ASSERT( gaspi_proc_term(GASPI_BLOCK) ); - - return 0; -} -``` - -Load the modules and compile: - -```console -$ ml gcc gpi2 -$ gcc helloworld_gpi.c -o helloworld_gpi.x -Wl,-rpath=$LIBRARY_PATH -lGPI2 -libverbs -``` - -Submit the job and run the GPI-2 application: - -```console -$ qsub -q qexp -l select=2:ncpus=1:mpiprocs=1,place=scatter,walltime=00:05:00 -I - qsub: waiting for job 171247.dm2 to start - qsub: job 171247.dm2 ready -cn79 $ ml gpi2 -cn79 $ cut -f1 -d"." $PBS_NODEFILE > machinefile -cn79 $ gaspi_run -m machinefile ./helloworld_gpi.x - Hello from rank 0 of 2 -``` - -At the same time, in another session, you may start the GASPI logger: - -```console -$ ssh cn79 -cn79 $ gaspi_logger - GASPI Logger (v1.1) - [cn80:0] Hello from rank 1 of 2 -``` - -In this example, we compile the helloworld_gpi.c code using the **gnu compiler**(gcc) and link it to the GPI-2 and the ibverbs library. The library search path is compiled in. For execution, we use the qexp queue, 2 nodes 1 core each. The GPI module must be loaded on the master compute node (in this example cn79), `gaspi_logger` is used from a different session to view the output of the second process. - -[a]: http://www.gaspi.de/en/project.html diff --git a/content/docs/software/viz/insitu.mdx b/content/docs/software/viz/insitu.mdx deleted file mode 100644 index 7d2f4e10ea31f381babbb4493b6b47a63f6aadad..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/insitu.mdx +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: "In Situ Visualization" ---- -## Introduction - -In situ visualization allows you to visualize your data while your computation is progressing on multiple nodes of a cluster. It is a visualization pipeline based on the [ParaView Catalyst][a] library. - -To leverage the possibilities of the in situ visualization by Catalyst library, you have to write an adaptor code that will use the actual data from your simulation and process them in the way they can be passed to ParaView for visualization. We provide a simple example of such simulator/adaptor code that binds together to provide the in situ visualization. - -Detailed description of the Catalyst API can be found [here][b]. We restrict ourselves to provide more of an overall description of the code together with specifications for building, and explanation about how to run the code on the cluster. - -## Installed Version - -For the current list of installed versions, use: - -```console -$ ml av CUDA -``` - -## Usage - -All code concerning the simulator/adaptor is available to download from [here][code]. It is a package with the following files: [CMakeLists.txt][cmakelist_txt], [FEAdaptor.h][feadaptor_h], [FEAdaptor.cxx][feadaptor_cxx], [FEDataStructures.h][fedatastructures_h], [FEDataStructures.cxx][fedatastructures_cxx], [FEDriver.cxx][fedriver_cxx], and [feslicescript.py][feslicescript]. - -After the download, unpack the code: - -```console -$ tar xvf package_name -``` - -Then use CMake to manage the build process, but before that, load the appropriate modules (`CMake`, `ParaView`): - -```console -$ ml CMake ParaView/5.6.0-intel-2017a-mpi -``` - -This module set also loads a necessary Intel compiler within the dependencies: - -```console -$ mkdir build -$ cd build -$ cmake ../ -``` - -Now you can build the simulator/adaptor code by using `make`: - -```console -$ make -``` - -It will generate the CxxFullExampleAdaptor executable file. This will be later run together with ParaView and it will provide the in situ visualization example. - -## Code Explanation - -The provided example is a simple MPI program. Main executing part is written in FEDriver.cxx. It is simulator code that creates computational grid and performs simulator/adaptor interaction (see below). - -Dimensions of the computational grid in terms of number of points in x, y, z directions are supplied as input parameters to the `main` function (see lines 22-24 in the code below). Based on the number of MPI ranks, each MPI process creates a different part of the overall grid. This is done by grid initialization (see line 30). The respective code for this is in FEDataStructures.cxx. The parameter nr. 4 in `main` is for the name of the Python script (we use feslicescript.py). It sets up the ParaView-Catalyst pipeline (see line 36). The simulation starts by linearly progressing the `timeStep` value in the `for` loop. Each iteration of the loop upates the grid attributes (Velocity and Pressure) by calling the `UpdateFields` method from the `Attributes` class. Next in the loop, the adaptor's `CoProcess` function is called by using actual parameters (`grid`, `time`). To provide some information about the state of the simulation, the actual time step is printed together with the name of the processor that handles the computation inside the allocated MPI rank. Before the loop ends, appropriate sleep time is used to give some time for visualization to update. After the simulation loop ends, clean up is done by calling the `Finalize` function on adaptor and `MPI_Finalize` on MPI processes. - - - -Adaptor's initialization performs several necessary steps, see the code below. It creates vtkCPProcessor using the Catalyst library and adds a pipeline to it. The pipeline is initialized by the reffered Python script: - - - -To initialize the Catalyst pipeline, we use the feslicescript.py Python script. You enable the live visualization in here and set the proper connection port. You can also use another commands and functions to configure it for saving the data during the visualization or another tasks that are available from the ParaView environment. For more details, see the [Catalyst guide][catalyst_guide]. - - - -The `UpdateFields` method from the `Attributes` class updates the `velocity` value in respect to the value of `time` and the value of `setting` which depends on the actual MPI rank, see the code below. This way, different processes can be visually distinguished during the simulation. - - - -As mentioned before, further in the simulation loop, the adaptor's `CoProcess` function is called by using actual parameters of the `grid`, `time`, and `timeStep`. In the function, proper representation and description of the data is created. Such data is then passed to the Processor that has been created during the adaptor's initialization. The code of the `CoProcess` function is shown below. - - - -### Launching the Simulator/Adaptor With ParaView - -There are two standard options to launch ParaView,. You can run ParaView from your local machine in client-server mode by following the information [here][2] or you can connect to the cluster using VNC and the graphical environment by following the information on [VNC][3]. In both cases, we will use ParaView version 5.6.0 and its respective module. - -Whether you use the client-server mode or VNC for ParaView, you have to allocate some computing resources. This is done by the console commands below (supply valid Project ID). - -For the client-server mode of ParaView we allocate the resources by - -```console -$ salloc -p qcpu -A PROJECT_ID --nodes=2 -``` - -In the case of VNC connection, we use X11 forwarding by the `--x11` option to allow the graphical environment on the interactive session: - -```console -$ salloc -p qcpu -A PROJECT_ID --nodes=2 --x11 -``` - -The issued console commands launch the interactive session on 2 nodes. This is the minimal setup to test that the simulator/adaptor code runs on multiple nodes. - -After the interactive session is opened, load the `ParaView` module: - -```console -$ ml ParaView/5.6.0-intel-2017a-mpi -``` - -When the module is loaded and you run the client-server mode, launch the mpirun command for pvserver as used in the description for [ParaView client-server][2] but also use the `&` sign at the end of the command. Then you can use the console later for running the simulator/adaptor code. If you run the VNC session, after loading the ParaView module, set up the environmental parameter for correct keyboard input and then run the ParaView in the background using the `&` sign. - -```console -$ export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb -$ paraview & -``` - -If you have proceeded to the end in the description for the ParaView client-server mode and run ParaView localy or you have launched ParaView remotely using VNC the further steps are the same for both options. In the ParaView, go to the *Catalyst* -> *Connect* and hit *OK* in the pop up window asking for the connection port. After that, ParaView starts listening for incomming data to the in situ visualization. - - - -Go to your build directory and run the built simulator/adaptor code from the console: - -```console -mpirun -n 2 ./CxxFullExample 30 30 30 ../feslicescript.py -``` - -The programs starts to compute on the allocated nodes and prints out the response: - - - -In ParaView, you should see a new pipeline called *input* in the *Pipeline Browser*: - - - -By clicking on it, another item called *Extract: input* is added: - - - -If you click on the eye icon to the left of the *Extract: input* item, the data will appear: - - - -To visualize the velocity property on the geometry, go to the *Properties* tab and choose *velocity* instead of *Solid Color* in the *Coloring* menu: - - - -The result will look like in the image below, where different domains dependent on the number of allocated resources can be seen and they will progress through the time: - - - -### Cleanup - -After you finish the in situ visualization, you should provide a proper cleanup. - -Terminate the simulation if it is still running. - -In the VNC session, close ParaView and the interactive job. Close the VNC client. Kill the VNC Server as described [here][3]. - -In the client-server mode of ParaView, disconnect from the server in ParaView and close the interactive job. - -[1]: ../../../salomon/introduction/ -[2]: ../paraview/ -[3]: ../../../general/accessing-the-clusters/graphical-user-interface/vnc/ - -[a]: https://www.paraview.org/in-situ/ -[b]: https://www.paraview.org/files/catalyst/docs/ParaViewCatalystUsersGuide_v2.pdf -[c]: http://www.paraview.org/ - -[code]: insitu/insitu.tar.gz -[cmakelist_txt]: insitu/CMakeLists.txt -[feadaptor_h]: insitu/FEAdaptor.h -[feadaptor_cxx]: insitu/FEAdaptor.cxx -[fedatastructures_h]: insitu/FEDataStructures.h -[fedatastructures_cxx]: insitu/FEDataStructures.cxx -[fedriver_cxx]: insitu/FEDriver.cxx -[feslicescript]: insitu/feslicescript.py diff --git a/content/docs/software/viz/insitu/meta.json b/content/docs/software/viz/insitu/meta.json deleted file mode 100644 index 0017e5050b53727aac37a60ee7f0037b9048cfff..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/insitu/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Insitu", - "pages": [] -} diff --git a/content/docs/software/viz/meta.json b/content/docs/software/viz/meta.json deleted file mode 100644 index e011fb06b9ddaa56f8ee437ed2563d083d2e429f..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/meta.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Viz", - "pages": [ - "NICEDCVsoftware", - "gpi2", - "insitu", - "insitu", - "openfoam", - "ovito", - "paraview", - "qtiplot", - "vesta", - "vgl" - ] -} diff --git a/content/docs/software/viz/openfoam.mdx b/content/docs/software/viz/openfoam.mdx deleted file mode 100644 index 99518d41d43e9100b13982f2066bb8ff1c01dc98..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/openfoam.mdx +++ /dev/null @@ -1,239 +0,0 @@ ---- -title: "OpenFOAM" ---- -OpenFOAM is a free, open source CFD software package. - -## Introduction - -[OpenFOAM][a] is a free, open source CFD software package developed by [OpenCFD Ltd][b] at [ESI Group][c] and distributed by the [OpenFOAM Foundation][d]. It has a large user base across most areas of engineering and science from both commercial and academic organizations. - -### Installed Version - -Currently, several versions are available compiled by GCC/ICC compilers in single/double precision with several versions of OpenMPI. - -The naming convention of the installed versions is: - -`openfoam/<VERSION>-<COMPILER>-<openmpiVERSION>-<PRECISION>` - -* `VERSION` - version of openfoam -* `COMPILER` - version of used compiler -* `openmpiVERSION` - version of used openmpi/impi -* `PRECISION` - DP/SP – double/single precision - -Example of the available OpenFOAM modules syntax is `openfoam/2.2.1-icc-openmpi1.6.5-DP` - -This means OpenFOAM version 2.2.1 compiled by the ICC compiler with openmpi1.6.5 in double precision. - -### Available OpenFOAM Modules - -To check the available modules, use: - -```console -$ ml av -``` - -In /opt/modules/modulefiles/engineering, you can see the installed engineering softwares: - -```console - ------------------------------------ /opt/modules/modulefiles/engineering ------------------------------------------------------------- - ansys/14.5.x matlab/R2013a-COM openfoam/2.2.1-icc-impi4.1.1.036-DP - comsol/43b-COM matlab/R2013a-EDU openfoam/2.2.1-icc-openmpi1.6.5-DP - comsol/43b-EDU openfoam/2.2.1-gcc481-openmpi1.6.5-DP paraview/4.0.1-gcc481-bullxmpi1.2.4.1-osmesa10.0 - lsdyna/7.x.x openfoam/2.2.1-gcc481-openmpi1.6.5-SP -``` - -For information on how to use modules, look [here][1]. - -## Getting Started - -To create OpenFOAM environment, use the commands: - -```console -$ ml openfoam -$ source $FOAM_BASHRC -``` - -<Callout> - Load the correct module with your requirements “compiler - GCC/ICC, precision - DP/SP”. -</Callout> - -Create a project directory within the $HOME/OpenFOAM directory named `<USER>-<OFversion>` and create a directory named `run` within it: - -```console -$ mkdir -p $FOAM_RUN -``` - -The project directory is now available by typing: - -```console -$ cd /home/<USER>/OpenFOAM/<USER>-<OFversion>/run -``` - -`<OFversion>` - for example `2.2.1` - -or - -```console -$ cd $FOAM_RUN -``` - -Copy the tutorial examples directory in the OpenFOAM distribution to the run directory: - -```console -$ cp -r $FOAM_TUTORIALS $FOAM_RUN -``` - -Now you can run the first case, for example incompressible laminar flow in a cavity. - -## Running Serial Applications - -Create a test.sh Bash script: - -```bash -#!/bin/bash - -ml openfoam/2.2.1-icc-openmpi1.6.5-DP -source $FOAM_BASHRC - -# source to run functions -. $WM_PROJECT_DIR/bin/tools/RunFunctions - -cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavity - -runApplication blockMesh -runApplication icoFoam -``` - -Job submission (example for Karolina): - -```console -$ sbatch -A PROJECT_ID -p qcpu --nodes=1 --ntasks=128 --time=03:00:00 test.sh -``` - -For information about job submission, look [here][2]. - -## Running Applications in Parallel - -Run the second case, for example external incompressible turbulent flow - case - motorBike. - -First we must run the serial application bockMesh and decomposePar for preparation of parallel computation. - -<Callout> - Create a test.sh Bash scrip: -</Callout> - -```bash -#!/bin/bash - -ml openfoam/2.2.1-icc-openmpi1.6.5-DP -source $FOAM_BASHRC - -# source to run functions -. $WM_PROJECT_DIR/bin/tools/RunFunctions - -cd $FOAM_RUN/tutorials/incompressible/simpleFoam/motorBike - -runApplication blockMesh -runApplication decomposePar -``` - -Job submission - -```console -$ sbatch -A PROJECT_ID -p qcpu --nodes=1 --ntasks=16 --time=03:00:00 test.sh -``` - -This job creates a simple block mesh and domain decomposition. Check your decomposition and submit parallel computation: - -<Callout> - Create a testParallel.slurm script: -</Callout> - -```bash -#!/bin/bash -#SBATCH --job-name=motorBike -#SBATCH --nodes=2 -#SBATCH --ntasks-per-node=16 -#SBATCH --time=01:00:00 -#SBATCH --partition=qcpu -#SBATCH --account=ACCOUNT_ID - -ml openfoam/2.2.1-icc-openmpi1.6.5-DP -source $FOAM_BASHRC - -cd $FOAM_RUN/tutorials/incompressible/simpleFoam/motorBike - -nproc = 32 - -mpirun -hostfile ${$SLURM_JOB_NODELIST} -np $nproc snappyHexMesh -overwrite -parallel | tee snappyHexMesh.log - -mpirun -hostfile ${$SLURM_JOB_NODELIST} -np $nproc potentialFoam -noFunctionObject-writep -parallel | tee potentialFoam.log - -mpirun -hostfile ${$SLURM_JOB_NODELIST} -np $nproc simpleFoam -parallel | tee simpleFoam.log -``` - -`nproc` – the number of subdomains - -Job submission - -```console -$ srun testParallel.slurm -``` - -## Compile Your Own Solver - -Initialize the OpenFOAM environment before compiling your solver: - -```console -$ ml openfoam/2.2.1-icc-openmpi1.6.5-DP -$ source $FOAM_BASHRC -$ cd $FOAM_RUN/ -``` - -Create the applications/solvers directory in the user directory: - -```console -$ mkdir -p applications/solvers -$ cd applications/solvers -``` - -Copy icoFoam solver’s source files: - -```console -$ cp -r $FOAM_SOLVERS/incompressible/icoFoam/My_icoFoam -$ cd My_icoFoam -``` - -Rename icoFoam.C to My_icoFOAM.C: - -```console -$ mv icoFoam.C My_icoFoam.C -``` - -Edit the _files_ file in the _Make_ directory: - -```bash - icoFoam.C - EXE = $(FOAM_APPBIN)/icoFoam -``` - -and change to: - -```bash - My_icoFoam.C - EXE = $(FOAM_USER_APPBIN)/My_icoFoam -``` - -In the My_icoFoam directory, use the compilation command: - -```console -$ wmake -``` - -[1]: ../../environment-and-modules.md -[2]: ../../general/job-submission-and-execution.md - -[a]: http://www.openfoam.com/ -[b]: http://www.openfoam.com/about -[c]: http://www.esi-group.com/ -[d]: http://www.openfoam.org/ diff --git a/content/docs/software/viz/ovito.mdx b/content/docs/software/viz/ovito.mdx deleted file mode 100644 index d4309b47109cdd90c32895cf4473ae2667f41d45..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/ovito.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Ovito" ---- -[OVITO][a] is a visualization and analysis software for output data generated in molecular dynamics, atomistic Monte-Carlo and other particle-based simulations. - -## Introduction - -A central aim of OVITO as a data visualization and analysis solution is to provide a maximum of flexibility – and, at the same time, ease-of-use – to support you in extracting meaningful information from simulation outputs. To achieve this goal, OVITO is based on a powerful data pipeline technology depicted below. The software offers a wide range of basic visualization and analysis functions (building blocks), which you can assemble to a sequence of processing steps. These operations, which are all configurable, will then be applied to the simulation data in real-time by the software. The outcome of the data pipeline is finally displayed on screen, may be rendered to an output image for publication, or exported to output data files. - - - -The dynamic pipeline concept makes it possible for you to change and adjust the sequence of applied operations at any time. In other words, OVITO enables you to work in a non-destructive manner with a dataset as all manipulation steps can easily be revoked. You can adjust the order of filter and manipulation operations, their parameters, and also the input data itself –the program will re-evaluate the pipeline and update the display in real-time. Thanks to intelligent data caching and parallelization techniques implemented in OVITO, this all happens without interrupting your workflow. - -For more information, see the [User Manual][b] - -### Installed Version - -For the list of installed versions, use: - -```console -$ ml av ovito -``` - -## Getting Started - -The visualization software requires [graphical user interface][1] or [virtual network computing][2] software. - -[1]: ../../general/accessing-the-clusters/graphical-user-interface/x-window-system.md -[2]: ../../general/accessing-the-clusters/graphical-user-interface/vnc.md - -[a]: https://www.ovito.org/ -[b]: https://www.ovito.org/docs/current/ diff --git a/content/docs/software/viz/paraview.mdx b/content/docs/software/viz/paraview.mdx deleted file mode 100644 index de8ab8b3679b7f916bd8b3e5dab5d3187107f3ce..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/paraview.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "ParaView" ---- -An open-source, multi-platform data analysis and visualization application. - -## Introduction - -[ParaView][a] is an open-source, multi-platform data analysis and visualization application. ParaView users can quickly build visualizations to analyze their data using qualitative and quantitative techniques. The data exploration can be done interactively in 3D or programmatically using ParaView's batch processing capabilities. - -ParaView was developed to analyze extremely large datasets using distributed memory computing resources. It can be run on supercomputers to analyze datasets of exascale size as well as on laptops for smaller data. - -## Installed Version - -Currently, version 5.1.2 compiled with Intel/2017a against the Intel MPI library and OSMesa 12.0.2 is installed on the clusters. - -## Usage - -On the clusters, ParaView is to be used in the client-server mode. A parallel ParaView server is launched on compute nodes by the user and the client is launched on your desktop PC to control and view the visualization. Download the ParaView client application for your OS [here][b]. - -<Callout type=warn> - Your version must match the version number installed on the cluster. -</Callout> - -### Launching Server - -To launch the server, you must first allocate compute nodes, for example: - -```console -$ salloc -p qprod -A PROJECT_ID --nodes=2 --time=01:00:00 --x11 -``` - -to launch an interactive session on 2 nodes. For details, refer to [Job Submission and Execution][1] section. - -After the interactive session is opened, load the ParaView module: - -```console -$ ml ParaView/5.1.2-intel-2017a-mpi -``` - -Now launch the parallel server, with the number of processes equal to the number of nodes times 24: - -```console -$ mpirun -np 48 pvserver --use-offscreen-rendering - Waiting for client... - Connection URL: cs://r37u29n1006:11111 - Accepting connection(s): r37u29n1006:11111i -``` - -Note that in this case, the server is listening on the compute node r37u29n1006, we will use this information later. - -### Client Connection - -Because a direct connection is not allowed to compute nodes on clusters, you must establish an SSH tunnel to connect to the server. Choose a port number on your PC to be forwarded to ParaView server, for example 12345. If your PC is running Linux, use this command to establish an SSH tunnel: - -```console -Barbora: $ ssh -TN -L 12345:r37u29n1006:11111 username@barbora.it4i.cz -``` - -Replace username with your login and r37u29n1006 with the name of the compute node on which your ParaView server is running (see the previous step). - -If you use PuTTY on Windows, load Barbora connection configuration, then go to *Connection* -> *SSH* -> *Tunnels* to set up the port forwarding. - -Fill the Source port and Destination fields. **Do not forget to click the Add button.** - - - -Now launch ParaView client installed on your desktop PC. Select *File* -> *Connect...* and fill in the following : - - - -The configuration is now saved for later use. Now click Connect to connect to the ParaView server. In your terminal where you have the interactive session with the ParaView server launched, you should see: - -```console -Client connected. -``` - -You can now use Parallel ParaView. - -### Close Server - -Remember to close the interactive session after you finish working with the ParaView server, as it will remain launched and continue consuming resources even after your client is disconnected. - -[1]: ../../general/job-submission-and-execution.md - -[a]: http://www.paraview.org/ -[b]: http://paraview.org/paraview/resources/software.php diff --git a/content/docs/software/viz/qtiplot.mdx b/content/docs/software/viz/qtiplot.mdx deleted file mode 100644 index a2732775cbb7215356029419b27471e6afe36f58..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/qtiplot.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "QtiPlot" ---- -A cross-platform scientific application for data analysis and visualisation. - -## Introduction - -[QtiPlot][1] is a cross-platform scientific application for data analysis and visualisation. -QtiPlot can be used to present 2D and 3D data and has various data analysis functions like curve fitting. -The program is also extensible to a considerable degree via muParser and Python scripting language, -which allows adding the arbitrary user-defined functions with access to graphs, matrices and data tables. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av QtiPlot -``` - -## Running QtiPlot - -<Callout type=warn> - You must first enable the [VNC][a] or [X Window System][b] GUI environment. -</Callout> - -To run QtiPlot, use: - -```console -$ ml QtiPlot; qtiplot -``` - -[1]: https://www.qtiplot.com/index.html - -[a]: ../../../general/accessing-the-clusters/graphical-user-interface/vnc/ -[b]: ../../../general/accessing-the-clusters/graphical-user-interface/x-window-system/ diff --git a/content/docs/software/viz/vesta.mdx b/content/docs/software/viz/vesta.mdx deleted file mode 100644 index 196498ddaea2815a566d2a2e51406f138e5cafc9..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/vesta.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "Vesta" ---- -## Introduction - -VESTA (Visualization for Electronic and Structural Analysis) is a 3D visualization program for structural models, volumetric data such as electron/nuclear densities, and crystal morphologies. Some of the novel features of VESTA include: - -* Deal with multiple structural models, volumetric data, and crystal morphologies in the same window; -* Support multiple tabs corresponding to files; -* Support multiple windows with more than two tabs in the same process; -* Deal with virtually unlimited number of objects such as atoms, bonds polyhedra, and polygons on isosurfaces (theoretical limit on 32bit operating system is 1,073,741,823); -* Support lattice transformation from conventional to non-conventional lattice by using matrix. The transformation matrix is also used to create superlattice and sublattice; -* Visualize interatomic distances and bond angles that are restrained in Rietveld analysis with RIETAN-FP; -* Transparent isosurfaces can be overlap with structural models; -* Isosurface can be colored on the basis of another physical quantity; -* Arithmetic operations among multiple volumetric data files; -* High quality smooth rendering of isosurfaces and sections; -* Export high-resolution graphic images exceeding Video card limitation. - -For the full list of features and supported file formats, see the [official page][1]. - -## Manual - -The VESTA manual can be found [here][2]. - -## Installed Versions - -For the current list of installed versions, use: - -```console -$ ml av vesta -``` - -<Callout> - This module is currently availble on the Barbora cluster only. -</Callout> - -[1]: https://jp-minerals.org/vesta/en/ -[2]: https://jp-minerals.org/vesta/archives/VESTA_Manual.pdf diff --git a/content/docs/software/viz/vgl.mdx b/content/docs/software/viz/vgl.mdx deleted file mode 100644 index efeddafba5963b6045750f3e6ff52aca16fc3deb..0000000000000000000000000000000000000000 --- a/content/docs/software/viz/vgl.mdx +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "VirtualGL" ---- -VirtualGL is an open source program that redirects the 3D rendering commands from Unix and Linux OpenGL applications to 3D accelerator hardware in a dedicated server and displays the rendered output interactively to a thin client located elsewhere on the network. - -See the documentation [here][a]. - -<Callout> - VirtualGL is available on Barbora and Karolina. -<\Callout> - -## How to Use - -**Run VNC** - -* VNC Server - -Read our documentation on [VNC server][1]. - -```console -Warning: No xauth data; using fake authentication data for X11 forwarding. - ____ _ - | _ \ | | - | |_) | __ _ _ __| |__ ___ _ __ __ _ - | _ < / _` | '__| '_ \ / _ \| '__/ _` | - | |_) | (_| | | | |_) | (_) | | | (_| | - |____/ \__,_|_| |_.__/ \___/|_| \__,_| - - - ...running on Red Hat Enterprise Linux 7.x - -login@login1:~$ vncserver :99 - -login@login1:~$ -``` - -* VNC Client (your local machine) - -```console -root@toshiba:~# ssh -L 5999:localhost:5999 login@login1.barbora.it4i.cz -X -``` - -* Connect to a VNC server from a VNC client (your local machine) - -```console -vncviewer localhost:99 - -``` - -Or via GUI. - - - -<Callout> - To resize the window scale, use the `xrandr -s 1920x1200` command. -</Callout> - -**Run vglclient on the login server (use the terminal in the local machine VNC window)** - -```console -login@login1:~$ ml VirtualGL -login@login1:~$ vglclient - -VirtualGL Client 64-bit v2.6.1 (Build 20200228) -Listening for unencrypted connections on port 4242 - -``` - - - -**Execute an interactive job on vizserv (use another terminal in the local machine VNC window)** - -```console -[login@login1.barbora ~]$ salloc -p qviz -A PROJECT_ID --x11 -salloc: Granted job allocation 694741 -salloc: Waiting for resource configuration -salloc: Nodes vizserv1 are ready for job - -[login@vizserv1.barbora ~]$ -``` - - - -**New SSH connection on vizserv - elimination of the Slurm setting (use another terminal in the local machine VNC window)** - -```console -login@login1:~$ ssh vizserv1 -X -Last login: Tue Mar 3 13:54:33 2020 from login1.barbora.it4i.cz -login@vizserv1:~$ -``` - - - -**Run the graphical application** - -```console -login@vizserv1:~$ vglrun /apps/easybuild/glxgears -[VGL] NOTICE: Automatically setting VGL_CLIENT environment variable to -[VGL] 10.32.2.1, the IP address of your SSH client. -libGL error: unable to load driver: swrast_dri.so -libGL error: failed to load driver: swrast -17128 frames in 5.0 seconds = 3425.573 FPS -17251 frames in 5.0 seconds = 3450.128 FPS -... -``` - - - -## Examples for Remote Visualization on Barbora Cluster - -<div align="center"> - <iframe width="854" height="480" src="https://www.youtube.com/embed/BArIbIC_-24"></iframe> -</div> - -[1]: ../../../general/accessing-the-clusters/graphical-user-interface/vnc/ - -[a]: https://www.virtualgl.org/ diff --git a/content/docs/src/meta.json b/content/docs/src/meta.json deleted file mode 100644 index e262bae5a1444217101ecf5c4bf316adbcfad274..0000000000000000000000000000000000000000 --- a/content/docs/src/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Src", - "pages": [ - "ompi" - ] -} diff --git a/content/docs/src/ompi/meta.json b/content/docs/src/ompi/meta.json deleted file mode 100644 index fca79a3eba76799a9dd7d4e42d64cf69569429e1..0000000000000000000000000000000000000000 --- a/content/docs/src/ompi/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Ompi", - "pages": [] -} diff --git a/content/docs/storage/awscli.mdx b/content/docs/storage/awscli.mdx deleted file mode 100644 index ff70e41fffa382e6b6c5486041ba3739efedd3df..0000000000000000000000000000000000000000 --- a/content/docs/storage/awscli.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "AWS CLI" ---- -You can use the AWS command line tools to issue commands or build scripts at your system's command line to perform AWS (including S3) tasks. -The AWS Command Line Interface (AWS CLI) provides commands for a broad set of AWS services. To get started, see the AWS Command Line Interface User Guide. - -For more information, see the official site [https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#BasicsBucket][a]. - -## How to Load Modules: - -To see loaded modules, use: - -``` -ml -``` - -To load modules, use: - -``` -ml awscli -``` - -To see module info, use: - -``` -ml spider AWS -``` - -For more information on how to work with modules, see -[https://docs.it4i.cz/software/modules/lmod/][1]. - -## Configuration - -For configuration steps, follow the [e-INFRA CZ guide][b]. - -For the list of basic AWS CLI commands, see [https://docs.e-infra.cz/storage/object-storage/aws-cli/#controls-of-aws-cli---high-level-s3][e]. - -## Useful Links - -* [Getting started][c] -* [Troubleshoot AWS CLI errors][f] -* [Configuration erros][d] - -[1]: https://docs.it4i.cz/software/modules/lmod/ - -[a]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#BasicsBucket -[b]: https://docs.e-infra.cz/storage/object-storage/aws-cli/ -[c]: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html -[d]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html -[e]: https://docs.e-infra.cz/storage/object-storage/aws-cli/#controls-of-aws-cli---high-level-s3 -[f]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-troubleshooting.html diff --git a/content/docs/storage/cesnet-s3.mdx b/content/docs/storage/cesnet-s3.mdx deleted file mode 100644 index 2df46f7de14303af2cc74ae169ef7e920e0cecd9..0000000000000000000000000000000000000000 --- a/content/docs/storage/cesnet-s3.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "CESNET S3 Storage" ---- -S3 service is a general service suited for most of the use cases. S3 service can be used for elementary data storing, automated backups, or various types of data handling applications. The service is supported by CESNET Storage Department: [du-support(at)cesnet.cz][email] - -For more information, see [e-IINFRA CZ S3 Service documentation][a]. - -## Access: - -To access to S3 you must: - -* have an [e-Infra CZ account][3] -* be a [member of an active project][4] - -### Steps - -1. Fil in application at [https://einfra.cesnet.cz/allfed/registrar/?vo=VO_s3&group=s3_cl4&locale=en][b] to be a member of VO group. For more information about the S3 object storage, see [https://du.cesnet.cz/en/navody/object_storage/osobni_s3/start][f]. - -2. Once the application is approved you will be informed via email. Then please wait at least 30 minutes for our system to synchronize all data. Then you can continue to the Gatekeeper service to generate your credentials. To the [Gatekeeper service][g], you need to login via eduID.cz identity. - -IT4I offers two tools for object storage management on Karolina and Barbora: - -<Callout> - We recommend using the default versions installed. -</Callout> - -* [S3cmd][1] -* [AWS CLI][2] - -## Walkthroughs (Config Connection) - -* [https://du.cesnet.cz/en/navody/object_storage/cesnet_s3/start][c] -* [https://www.s3express.com/kb/item26.htm][d] - -[1]: s3cmd.md -[2]: awscli.md -[3]: https://docs.e-infra.cz/account/ -[4]: https://docs.it4i.cz/general/access/project-access/ - -[a]: https://docs.e-infra.cz/storage/object-storage/s3-service/ -[b]: https://einfra.cesnet.cz/allfed/registrar/?vo=VO_s3&group=s3_cl4&locale=en -[c]: https://du.cesnet.cz/cs/navody/object_storage/cesnet_s3/start -[d]: https://www.s3express.com/kb/item26.htm -[e]: https://filesender.cesnet.cz/ -[f]: https://du.cesnet.cz/en/navody/object_storage/osobni_s3/start -[g]: https://access.du.cesnet.cz/#/access - -[email]: mailto:du-support@cesnet.cz diff --git a/content/docs/storage/cesnet-storage.mdx b/content/docs/storage/cesnet-storage.mdx deleted file mode 100644 index c331d9c9c92862029a2367495f8108a136e8d6e5..0000000000000000000000000000000000000000 --- a/content/docs/storage/cesnet-storage.mdx +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "CESNET Data Storage" ---- -IT4Innovations' shared file systems are not intended as a backup for large amount of data or for long-term archiving purposes. -Academic staff and students of research institutions in the Czech Republic should use [CESNET Storage service][a]. - -CESNET data storage can be used by any organization or an individual person who is in the current employment relationship (employees) or the current study relationship (students) to a legal entity (organization) that meets the “Principles for access to CESNET Large infrastructure (Access Policy)”. - -The user may only use the CESNET data storage for data transfer and storage associated with activities in science, research, development, spread of education, culture, and prosperity. For details, see “Acceptable Use Policy CESNET Large Infrastructure (Acceptable Use Policy, AUP)”. - -The service is documented [here][b]. For special requirements contact directly CESNET Storage Department via e-mail [du-support(at)cesnet.cz][c]. - -The procedure to obtain the CESNET access is quick and simple. - -## CESNET Storage Access - -### Understanding CESNET Storage - -<Callout> - It is very important to understand the CESNET storage before uploading data. [Read][d] first. -</Callout> - -Once registered for CESNET Storage, you may [access the storage][e] in number of ways. We recommend the SSHFS and RSYNC methods. - -### SSHFS Access - -<Callout> - SSHFS: The storage will be mounted like a local hard drive -</Callout> - -The SSHFS provides a very convenient way to access the CESNET Storage. The storage will be mounted onto a local directory, exposing the vast CESNET Storage as if it was a local removable hard drive. Files can be than copied in and out in a usual fashion. - -First, create the mount point: - -```console -$ mkdir cesnet -``` - -Mount the storage. Note that you can choose among ssh.du4.cesnet.cz (Ostrava) and ssh.du5.cesnet.cz (Jihlava). -Mount tier1_home **(only 5120M !)**: - -```console -$ sshfs username@ssh.du4.cesnet.cz:. cesnet/ -``` - -For easy future access, install your public key: - -```console -$ cp .ssh/id_rsa.pub cesnet/.ssh/authorized_keys -``` - -Mount tier1_cache_tape for the Storage VO: - -```console -$ sshfs username@ssh.du4.cesnet.cz:/cache_tape/VO_storage/home/username cesnet/ -``` - -View the archive, copy the files and directories in and out: - -```console -$ ls cesnet/ -$ cp -a mydir cesnet/. -$ cp cesnet/myfile . -``` - -Once done, remember to unmount the storage: - -```console -$ fusermount -u cesnet -``` - -### Rsync Access - -<Callout> - Rsync provides delta transfer for best performance and can resume interrupted transfers. -</Callout> - -Rsync is a fast and extraordinarily versatile file copying tool. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination. Rsync is widely used for backups and mirroring and as an improved copy command for everyday use. - -Rsync finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time. Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file's data does not need to be updated. - -More about Rsync [here][f]. - -Transfer large files to/from CESNET storage, assuming membership in the Storage VO: - -```console -$ rsync --progress datafile username@ssh.du4.cesnet.cz:VO_storage-cache_tape/. -$ rsync --progress username@ssh.du4.cesnet.cz:VO_storage-cache_tape/datafile . -``` - -Transfer large directories to/from CESNET storage, assuming membership in the Storage VO: - -```console -$ rsync --progress -av datafolder username@ssh.du4.cesnet.cz:VO_storage-cache_tape/. -$ rsync --progress -av username@ssh.du4.cesnet.cz:VO_storage-cache_tape/datafolder . -``` - -Transfer rates of about 28MB/s can be expected. - -[a]: https://du.cesnet.cz/ -[b]: https://du.cesnet.cz/en/start -[c]: mailto:du-support@cesnet.cz -[d]: https://du.cesnet.cz/en/navody/home-migrace-plzen/start -[e]: https://du.cesnet.cz/en/navody/faq/start) -[f]: https://du.cesnet.cz/en/navody/rsync/start#pro_bezne_uzivatele diff --git a/content/docs/storage/meta.json b/content/docs/storage/meta.json deleted file mode 100644 index eae763281462eb37eea2fd6cf943beaf08abfd0f..0000000000000000000000000000000000000000 --- a/content/docs/storage/meta.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Storage", - "pages": [ - "awscli", - "cesnet-s3", - "cesnet-storage", - "nfs4-file-acl", - "proj4-storage", - "project-storage", - "s3cmd", - "standard-file-acl" - ] -} diff --git a/content/docs/storage/nfs4-file-acl.mdx b/content/docs/storage/nfs4-file-acl.mdx deleted file mode 100644 index d531b3535afe951097e8b741f9bbc979e324f19a..0000000000000000000000000000000000000000 --- a/content/docs/storage/nfs4-file-acl.mdx +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "NFSv4 File ACL" ---- -An NFSv4 ACL consists of one or more NFSv4 ACEs (Access Control Entry), each delimited by a comma or whitespace. - -An NFSv4 ACE is written as a colon-delimited, 4-field string in the following format: - -``` code -<type>:<flags>:<principal>:<permissions> -``` - -## ACE Elements - -`<type>` - one of: - -| Flag | Name | -| ---- | ----- | -| A | allow | -| D | deny | -| U | audit | -| L | alarm | - -`<flags>` - zero or more (depending on `<type>`) of: - -| Flag | Name | -| ---- | ------------------------------------------- | -| f | file-inherit | -| d | directory-inherit | -| p | no-propagate-inherit | -| i | inherit-only | -| S | successful-access | -| F | failed-access | -| g | group (denotes that <principal> is a group) | - -`<principal>` - named user or group, or one of: `OWNER@`, `GROUP@`, `EVERYONE@` - -`<permissions>` - one or more of: - -| Flag | Name | -| ---- | --------------------------------- | -| r | read-data / list-directory | -| w | write-data / create-file | -| a | append-data / create-subdirectory | -| x | execute | -| d | delete | -| D | delete-child (directories only) | -| t | read-attrs | -| T | write-attrs | -| n | read-named-attrs | -| N | write-named-attrs | -| c | read-ACL | -| C | write-ACL | -| o | write-owner | -| y | synchronize | - -## Example - -``` code -[root@login2.karolina proj1]# nfs4_getfacl open-20-11 - -# file: open-20-11 -A::OWNER@:rwaDxtTcCy -A::GROUP@:rxtcy -A:g:open-20-11@it4i.cz:rwaDxtcy -A::EVERYONE@:tcy -A:fdi:OWNER@:rwaDxtTcCy -A:fdi:GROUP@:rxtcy -A:fdig:open-20-11@it4i.cz:rwaDxtcy -A:fdi:EVERYONE@:tcy -``` diff --git a/content/docs/storage/proj4-storage.mdx b/content/docs/storage/proj4-storage.mdx deleted file mode 100644 index 8a677d6a4c3b533c8b59c767287e6f291eea86d2..0000000000000000000000000000000000000000 --- a/content/docs/storage/proj4-storage.mdx +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: "PROJ4 Object Storage" ---- -OpenStack Swift is a highly scalable, distributed object storage system -designed to store and retrieve large amounts of unstructured data. -It is an open-source project that provides a simple, scalable, and durable storage system for applications and services. -Swift is built to be highly available, fault-tolerant, and scalable, making it an ideal choice for storing large amounts of data. - -Swift is designed to be highly modular, with a simple API that allows developers to easily integrate it into their applications. -It provides a RESTful API that can be accessed using a variety of programming languages, -making it easy to integrate with existing applications. - -One of the key features of Swift is its ability to scale horizontally, -allowing it to handle large amounts of data and high levels of traffic. -It is also designed to be highly durable, with data being replicated across multiple nodes to ensure that it is always available. - -Overall, OpenStack Swift is a powerful and flexible object storage system -that is well-suited for a wide range of applications and use cases. - -## Accessing PROJ4 - -PROJ4 is accessible from all IT4Innovations clusters' login nodes -as well as from the outside. -Additionally, it allows to share data across clusters, etc. - -User has to be part of a project, which is allowed to use S3 storage. If you haven't received your S3 credentials after your project was created, please send a request to support@it4i.cz asking for the "S3 PROJECT ACCESS", stating your IT4I login and name of your project (in the OPEN-XX-YY format or similar). -After that an active role on the S3 storage will be created and you will obtain via na email the credentials for using the S3 storage. - -## How to Configure S3 Client - -```console -$ sudo yum install s3cmd -y ## for debian based systems use apt-get - -$ s3cmd --configure -. -. -. -. - Access Key: ***your_access*** - Secret Key: ***your_secret_key*** - Default Region: US - S3 Endpoint: obj.proj4.it4i.cz - DNS-style bucket+hostname:port template for accessing a bucket: obj.proj4.it4i.cz - Encryption password: RANDOM - Path to GPG program: /usr/bin/gpg - Use HTTPS protocol: True - HTTP Proxy server name: - HTTP Proxy server port: 0 -. -. -. - -Configuration saved to '/home/IT4USER/.s3cfg' -. -. - -``` - -Please note, that the Encryption password should be defined by you instead of using the value "RANDOM". - -Now you have to make some bucket for your data with **your_policy**, referencing your project (e.g. OPEN-XX-YY - if OPEN-XX-YY is your active and eligible project). -If you make a bucket without policy, we will not able to manage your project's data expiration and you might loose the data before the end of your actuall project - so please use the policy. - -```console -~ s3cmd --add-header=X-Storage-Policy:OPEN-XX-YY mb s3://test-bucket - -~ $ s3cmd put test.sh s3://test-bucket/ -upload: 'test.sh' -> 's3://test-bucket/test.sh' [1 of 1] -1239 of 1239 100% in 0s 19.59 kB/s done - -~ $ s3cmd ls -2023-10-17 13:00 s3://test-bucket - -~ $ s3cmd ls s3://test-bucket -2023-10-17 13:09 1239 s3://test-bucket/test.sh -``` - -There is no possibility to set permissions for all members of a project, -so you have to set permissions for each user in a project. -Permission can be set only by the owner of the bucket. - -```console -~ s3cmd setacl s3://test-bucket/test1.log --acl-grant=full\_control:user1 - s3://test-bucket/test1.log: ACL updated - -~ s3cmd setacl s3://test-bucket/test1.log --acl-grant=full\_control:user2 - s3://test-bucket/test1.log: ACL updated - -~ s3cmd setacl s3://test-bucket/test1.log --acl-grant=read:user3 - s3://test-bucket/test1.log: ACL updated - -~ s3cmd setacl s3://test-bucket/test1.log --acl-grant=write:user4 - s3://test-bucket/test1.log: ACL updated - -~ s3cmd info s3://test-bucket/test1.log - s3://test-bucket/test1.log (object): - File size: 1024000000 - Last mod: Mon, 09 Oct 2023 08:06:12 GMT - MIME type: application/xml - Storage: STANDARD - MD5 sum: b5c667a723a10a3485a33263c4c2b978 - SSE: none - Policy: none - CORS: none - ACL: OBJtest:user2: FULL\_CONTROL - ACL: \*anon\*: READ - ACL: user1: FULL\_CONTROL - ACL: user2: FULL\_CONTROL - ACL: user3: READ - ACL: user4: WRITE - URL: [http://195.113.250.1:8080/test-bucket/test1.log](http://195.113.250.1:8080/test-bucket/test1.log) - x-amz-meta-s3cmd-attrs: atime:1696588450/ctime:1696588452/gid:1001/gname:******/md5:******/mode:33204/mtime:1696588452/uid:******/uname:****** -``` - -## Access to Multiple Projects - -If a user needs to access multiple projects' data, it is needed to repeat the step asking the IT4I support for new credentials for the additional projects. In case you don't have the credentials assigned with the project activation, please send a request to support@it4i.cz. - -As the first step, rename your current S3 configuration, so that it uniquely identifies your current project or organize it on your local storage accordingly. - -```console -$ mv /home/IT4USER/.s3cfg /home/IT4USER/.s3cfg-OPEN-XX-YY -``` - -Then create new S3 configuration for the additional project (e.g. OPEN-AA-BB). - -```console -$ s3cmd --configure -``` - -Rename or organize you newly created config. - -```console -$ mv /home/IT4USER/.s3cfg /home/IT4USER/.s3cfg-OPEN-AA-BB -``` - -When acccessing the data of the different project specify the right configuration using the S3 commands. - -```console -~ s3cmd -c /home/IT4USER/.s3cfg-OPEN-AA-BB --add-header=X-Storage-Policy:OPEN-AA-BB mb s3://test-bucket - -~ $ s3cmd -c /home/IT4USER/.s3cfg-OPEN-AA-BB put test.sh s3://test-bucket/ -upload: 'test.sh' -> 's3://test-bucket/test.sh' [1 of 1] -1239 of 1239 100% in 0s 19.59 kB/s done - -~ $ s3cmd -c /home/IT4USER/.s3cfg-OPEN-AA-BB ls -2023-10-17 13:00 s3://test-bucket - -~ $ s3cmd -c /home/IT4USER/.s3cfg-OPEN-AA-BB ls s3://test-bucket -2023-10-17 13:09 1239 s3://test-bucket/test.sh -``` - -## Bugs & Features - -By default, the S3CMD client uses the so-called "multipart upload", -which means that it splits the uploaded file into "chunks" with a default size of 15 MB. -However, this upload method has major implications for the data capacity of the filesystem/fileset when overwriting existing files. -When overwriting an existing file in a "multipart" mode, the capacity is duplicated -(the file is not overwritten, but rewritten and the original file remains - but the capacity is allocated by both files). -This is a described swift bug for which there is no fix yet. -But there is a workaround and that is to disable "multipart upload" on the S3CMD client side. - -```console -~ s3cmd --disable-multipart put /install/test1.log s3://test-bucket1 -upload: '/install/test1.log' -> 's3://test-bucket1/test1.log' [1 of 1] - 1024000000 of 1024000000 100% in 9s 99.90 MB/s done -``` - -This method is not recommended for large files, because it is not as fast and reliable as multipart upload, but it is the only way how to overwrite files without duplicating capacity. diff --git a/content/docs/storage/project-storage.mdx b/content/docs/storage/project-storage.mdx deleted file mode 100644 index 956aa39f84cfaf823e76a41815fcddb93dc09f70..0000000000000000000000000000000000000000 --- a/content/docs/storage/project-storage.mdx +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: "PROJECT Data Storage" ---- -The PROJECT data storage is a central storage for projects' and users' data on IT4Innovations. -The PROJECT data storage is accessible from all IT4Innovations clusters and allows to share data across clusters. -The storage is intended to be used throughout the whole project's lifecycle. - -## Technical Overview - -The PROJECT storage consists of three equal file storages (blocks) called PROJ1, PROJ2, and PROJ3. -Each file storage implements GPFS file system exported via NFS protocol using three NFS servers. -File storages provide high-availability and redundancy. - - - -| Specification | Total | Per Block | -| ----------------- | -------------------|-------------------- | -| Protocol | NFS over GPFS | -| Total capacity | 15PB | 5PB | -| Throughput | 39GB/s | 13GB/s | -| IO Performance | 57kIOPS | 19kIOPS | - -## Accessing PROJECT - -All aspects of allocation, provisioning, accessing, and using the PROJECT storage are driven by project paradigm. -Storage allocation and access to the storage are based on projects (i.e. computing resources allocations) and project membership. - -A project directory (actually implemented as an independent fileset) is created for every active project. -Default limits (quotas), default file permissions, and ACLs are set. -The project directory life cycle strictly follows the project's life cycle. -The project directory is removed after the project's data expiration. - -### POSIX File Access - -<Callout> - PROJECT file storages are accessible at mountpoints `/mnt/proj1`, `/mnt/proj2`, and `/mnt/proj3`. -</Callout> - -The PROJECT storage can be accessed via the following nodes: - -| Cluster | Node(s) | -| ------------- | ----------------------------- | -| Karolina | Login, Compute, Visualization | -| Barbora | Login, Compute, Visualization | - -To show the path to your project's directory on the PROJECT storage, use the `it4i-get-project-dir` command: - -```console -$ it4i-get-project-dir OPEN-XX-XX -/mnt/proj3/open-XX-XX -``` - -### Project Quotas - -The PROJECT storage enforces quotas on projects' usage (used capacity and allocated inodes). -Default quotas for capacity and amount of inodes per project are set by IT4Innovations. - -| Project default quota | | -| --------------------- | ------- | -| Space quota | 20TB | -| Inodes quota | 5 mil. | - -You can check the actual usage of the PROJECT storage (e.g. location of project directory, used capacity, allocated inodes, etc.) by executing the `it4ifsusage` command from the Login nodes' command line. The command lists all projects associated with the user. - -```console -[vop999@login1.barbora ~]$ it4ifsusage -Quota Type Cluster / PID File System Space used Space limit Entries used Entries limit Last update -------------- --------------- ------------- ------------ ------------- -------------- --------------- ------------------- -User barbora /home 11.1 MB 25.0 GB 122 500,000 2021-08-24 07:50:09 -User karolina /home 354.6 MB 25.0 GB 3,194 500,000 2021-08-24 08:20:08 -User barbora /scratch 256.5 GB 10.0 TB 169 10,000,000 2021-08-24 07:50:19 -User karolina /scratch 52.5 GB 100.0 TB 967 20,000,000 2021-08-24 08:20:18 -Project open-XX-XX proj1 3.9 TB 20.0 TB 212,377 5,000,000 2021-08-24 08:20:02 -Project open-YY-YY proj3 9.5 MB 20.0 TB 182 5,000,000 2021-08-24 08:20:02 -Project open-ZZ-ZZ proj2 844.4 GB 20.0 TB 797 5,000,000 2021-08-24 08:20:02 -``` - -The information can also be found in IT4Innovations' [SCS information system][b]. - -<Callout> - At this time, only PIs can see the quotas of their respective projects in IT4Innovations' SCS information system. - We are working on making this information available to all users assigned to their projects. -</Callout> - -#### Increasing Project Quotas - -It is preferred that you request additional storage space allocation in advance in your application for computational resources. -Alternatively, if the project is already active, contact [IT4I support][a]. - -### ACL and File Permissions - -Access to a project directory and containing files is restricted by Unix file permissions and file access control lists (ACLs). -Default file permissions and ACLs are set by IT4Innovations during project directory provisioning. - -## Backup and Safety - -<Callout type=warn> - Data on the PROJECT storage is **not** backed up. -</Callout> - -The PROJECT storage utilizes fully redundant design, redundant devices, highly available services, data redundancy, and snapshots. For increased data protection, disks in each disk array are connected in Distributed RAID6 with two hot-spare disks, meaning the disk array can recover full redundancy after two simultaneous disk failures. - -However, the storage does not provide data backup, so we strongly recommend using the [CESNET storage][1] for making independent copies of your data. - -### Snapshots - -The PROJECT storage provides snapshot functionality. A snapshot represents a state of a filesystem at a particular point in time. Snapshots are created for all projects on fileset (i.e. project directory) level. -Snapshots are created every day, snapshots older than seven days are deleted. -Snapshots are not calculated towards the disk quota. - -Files in snapshots are accessible directly by users in the special subdirectory of each project directory named `.snapshots`. -Snapshots are read-only. - -Snapshots' names have the `YYYY-MM-DD-hhmmss` format. - -```console -[vop999@login1.karolina ~]# ls -al /mnt/proj3/open-XX-XX/.snapshots -total 4 -dr-xr-xr-x. 2 root root 4096 led 14 12:14 . -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 .. -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-01-022441 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-02-022544 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-03-022949 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-04-023454 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-05-024152 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-06-020412 -drwxrws---. 16 vop999 open-XX-XX 4096 led 20 16:36 2021-03-07-021446 -``` - -<! --- (HA data replication?) --> -<! --- (balancing in case of overload (data migration?) --> - -## Computing on PROJECT - -<Callout type=error> - Stage files for intensive I/O calculations onto the SCRATCH storage. -</Callout> - -The PROJECT storage is not primarily intended for computing and it is strongly recommended to avoid using it directly for computing in majority of cases. - -On the other hand, the PROJECT storage is accessible from compute nodes and can be used for computing jobs with low I/O demands, -when copying data to other storage for computing is not feasible or efficient. -However, be aware of overloading the storage, as this will result in degraded performance for other users of the PROJECT storage or its unavailability. - -For maximum performance, you should always copy the files of I/O intensive jobs onto the SCRATCH storage. -The files should be copied to SCRATCH from Login nodes before submitting the job. - -<! --- See also: data storage policy on filesystems (link?) --> - -<! --- ## Technical Specification --> - -<! --- For a detailed technical specification, see the Technical Specification section. --> - -## Summary - -| PROJECT Storage | | -| -------------------- | ------------------- | -| Mountpoint | /mnt/proj{1,2,3} | -| Capacity | 15PB | -| Throughput | 39GB/s | -| IO Performance | 57kIOPS | -| Default project space quota | 20TB | -| Default project inodes quota | 5 mil. | - -[1]: ../storage/cesnet-storage.md - -[a]: mailto:support@it4i.cz -[b]: https://scs.it4i.cz/projects diff --git a/content/docs/storage/s3cmd.mdx b/content/docs/storage/s3cmd.mdx deleted file mode 100644 index a9038af7f008dced0c3c7351762cf330ddac7c9b..0000000000000000000000000000000000000000 --- a/content/docs/storage/s3cmd.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Object Storage Tools" ---- -## s3cmd - -S3cmd is a command-line tool for managing data in Amazon Simple Storage Service (S3). It is a free and open-source tool that is available for Linux, macOS, and Windows. - -For more information, see [https://docs.e-infra.cz/storage/object-storage/s3cmd/][a]. - -We recommend using the S3cmd tool already installed on Karolina. - -## How to Load Modules: - -To see loaded modules, use: - -``` -ml -``` - -To load modules, use: - -``` -ml s3cmd -``` - -To see module info, use: - -``` -ml spider s3cmd -``` - -For more information on how to work with modules, see -[https://docs.it4i.cz/software/modules/lmod/][1]. - -## Configuration - -The s3cmd configuration file is named `.s3cfg` and it is located in the user's home directory, e.g. `/home/username/($HOME)`. - -The configuration file has to be created first: - -``` -s3cmd --configure -``` - -For configuration steps, follow the [e-INFRA CZ guide][b]. - -For the list of basic S3cmd commands, see [https://docs.e-infra.cz/storage/object-storage/s3cmd/#basic-s3cmd-commands][c]. - -## FAQ - -Error when creating bucket: - -``` -ERROR: S3 error: 400 (InvalidLocationConstraint): The specified location-constraint is not valid -``` - -Solution: set location: - -``` -s3cmd --bucket-location=":default-placement" mb s3://newbucketname -``` - -## Useful Links - -* [Introduction][d] -* [Usage][e] -* [Common S3cmd Errors][g] -* [Configuration erros][f] - -[1]: https://docs.it4i.cz/software/modules/lmod/ - -[a]: https://docs.e-infra.cz/storage/object-storage/s3cmd/ -[b]: https://docs.e-infra.cz/storage/object-storage/s3cmd/#configuration-of-s3cmd-tool -[c]: https://docs.e-infra.cz/storage/object-storage/s3cmd/#basic-s3cmd-commands -[d]: https://s3tools.org/s3cmd -[e]: https://s3tools.org/usage -[f]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html -[g]: https://s3tools.org/kb/category1.htm diff --git a/content/docs/storage/standard-file-acl.mdx b/content/docs/storage/standard-file-acl.mdx deleted file mode 100644 index 13ced9de53bfafa3b584fee5ec69f61ce3d2ecbc..0000000000000000000000000000000000000000 --- a/content/docs/storage/standard-file-acl.mdx +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "Standard File ACL" ---- -Access control list (ACL) provides an additional, more flexible permission mechanism for file systems. It is designed to assist with UNIX file permissions. ACL allows you to give permissions for any user or group to any disk resource. - -## Show ACL - -To show permissions, use: - -```code -$ getfacl <file/dir> -``` - -### Examples - -Set all permissions for user john to file named testfile: - -```code -$ setfacl -m "u:john:rwx" testfile -``` - -Check permissions: - -```code -$ getfacl testfile -# file: testfile -# owner: someone -# group: someone -user::rw- -user:john:rwx -group::r-- -mask::rwx -other::r-- -``` - -Change permissions for user john: - -```code -$ setfacl -m "u:john:r-x" testfile -``` - -Check permissions: - -```code -$ getfacl testfile -# file: testfile -# owner: someone -# group: someone -user::rw- -user:john:r-x -group::r-- -mask::r-x -other::r-- -``` - -Remove all ACL entries: - -```code -$ setfacl -b testfile -``` - -Check permissions: - -```code -$ getfacl testfile -# file: testfile -# owner: someone -# group: someone -user::rw- -group::r-- -other::r-- -``` - -## Output of LS Command - -You will notice that there is an ACL for a given file because it will exhibit `+` after its Unix permissions in the output of `ls -l`. - -```code -$ ls -l testfile -crw-rw----+ 1 someone someone 14, 4 nov. 9 12:49 testfile -``` - -## Modify ACL - -The ACL can be modified using the `setfacl` command. - -You can list file/directory permission changes without modifying the permissions (i.e. dry-run) by appending the `--test` flag. -To apply operations to all files and directories recursively, append the `-R/--recursive` argument. - -To set permissions for a user (user is either the user name or ID): - -```code -$ setfacl -m "u:user:permissions" <file/dir> -``` - -To set permissions for a group (group is either the group name or ID): - -```code -$ setfacl -m "g:group:permissions" <file/dir> -``` - -To set permissions for others: - -```code -$ setfacl -m "other:permissions" <file/dir> -``` - -To allow all newly created files or directories to inherit entries from the parent directory (this will not affect files which will be copied into the directory): - -```code -$ setfacl -dm "entry" <dir> -``` - -To remove a specific entry: - -```code -$ setfacl -x "entry" <file/dir> -``` - -To remove the default entries: - -```code -$ setfacl -k <file/dir> -``` - -To remove all entries (entries of the owner, group and others are retained): - -```code -$ setfacl -b <file/dir> -``` - -Source: [wiki.archlinux.org][1] - -[1]: https://wiki.archlinux.org/title/Access_Control_Lists diff --git a/public/it4i/barbora/img/BullSequanaX.png b/public/it4i/barbora/img/BullSequanaX.png deleted file mode 100644 index ea371ab73f55fb5b8d01de98934d04c51fb3f425..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/BullSequanaX.png and /dev/null differ diff --git a/public/it4i/barbora/img/BullSequanaX1120.png b/public/it4i/barbora/img/BullSequanaX1120.png deleted file mode 100644 index b901e6f6d217163b7c23edea2bc6dd0b087ca5b2..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/BullSequanaX1120.png and /dev/null differ diff --git a/public/it4i/barbora/img/BullSequanaX410E5GPUNVLink.jpg b/public/it4i/barbora/img/BullSequanaX410E5GPUNVLink.jpg deleted file mode 100644 index 37f93261cde1a6edb1c783b78dbd1f2ef731009d..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/BullSequanaX410E5GPUNVLink.jpg and /dev/null differ diff --git a/public/it4i/barbora/img/BullSequanaX808.jpg b/public/it4i/barbora/img/BullSequanaX808.jpg deleted file mode 100644 index 0337ebee43f14c5e1bb39a7e4c9584dd3cc03ce8..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/BullSequanaX808.jpg and /dev/null differ diff --git a/public/it4i/barbora/img/QM8700.jpg b/public/it4i/barbora/img/QM8700.jpg deleted file mode 100644 index 367745d1bed2f486075ef3d1fff37223010306b6..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/QM8700.jpg and /dev/null differ diff --git a/public/it4i/barbora/img/XH2000.png b/public/it4i/barbora/img/XH2000.png deleted file mode 100644 index d84ed2ba2d43378a98982ad3d4e301f102886a63..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/XH2000.png and /dev/null differ diff --git a/public/it4i/barbora/img/bullsequanaX450-E5.png b/public/it4i/barbora/img/bullsequanaX450-E5.png deleted file mode 100644 index b02eaef8b6c055bbc9a77fc40081b86aaaf45cc0..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/bullsequanaX450-E5.png and /dev/null differ diff --git a/public/it4i/barbora/img/gpu-v100.png b/public/it4i/barbora/img/gpu-v100.png deleted file mode 100644 index 163085482c93c42d7b7d736135ba5a6a768c3df0..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/gpu-v100.png and /dev/null differ diff --git a/public/it4i/barbora/img/hdr.jpg b/public/it4i/barbora/img/hdr.jpg deleted file mode 100644 index 653977f3aca22b8aa4efaa5515aaeb4d01ad65dd..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/hdr.jpg and /dev/null differ diff --git a/public/it4i/barbora/img/quadrop6000.jpg b/public/it4i/barbora/img/quadrop6000.jpg deleted file mode 100644 index 897743776d436470dfd0d221e0a026134f4ba40a..0000000000000000000000000000000000000000 Binary files a/public/it4i/barbora/img/quadrop6000.jpg and /dev/null differ diff --git a/public/it4i/cloud/.gitkeep b/public/it4i/cloud/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/cs/.gitkeep b/public/it4i/cs/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/general/AUP-final.pdf b/public/it4i/general/AUP-final.pdf deleted file mode 100644 index 725beecf990f2f5ed9e858ddcad36fa4f566622b..0000000000000000000000000000000000000000 Binary files a/public/it4i/general/AUP-final.pdf and /dev/null differ diff --git a/public/it4i/general/Energy_saving_Karolina.pdf b/public/it4i/general/Energy_saving_Karolina.pdf deleted file mode 100644 index 8f8697b457a0d01328e379ef968e80de8b6e427a..0000000000000000000000000000000000000000 Binary files a/public/it4i/general/Energy_saving_Karolina.pdf and /dev/null differ diff --git a/public/it4i/general/access/.gitkeep b/public/it4i/general/access/.gitkeep deleted file mode 100644 index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000 --- a/public/it4i/general/access/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/public/it4i/general/capacity.zip b/public/it4i/general/capacity.zip deleted file mode 100644 index 28d838bade2719b2b5a73f6ecee2f35f17eb10cb..0000000000000000000000000000000000000000 Binary files a/public/it4i/general/capacity.zip and /dev/null differ diff --git a/public/it4i/general/management/.gitkeep b/public/it4i/general/management/.gitkeep deleted file mode 100644 index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000 --- a/public/it4i/general/management/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/public/it4i/general/tools/.gitkeep b/public/it4i/general/tools/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/img/49213048_2722927791082867_3152356642071248896_n.png b/public/it4i/img/49213048_2722927791082867_3152356642071248896_n.png deleted file mode 100644 index 5c78e10f664dbc8b9c0ccacba62a309a1b599a20..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/49213048_2722927791082867_3152356642071248896_n.png and /dev/null differ diff --git a/public/it4i/img/7D_Enhanced_hypercube.png b/public/it4i/img/7D_Enhanced_hypercube.png deleted file mode 100644 index 12bb0a406708a5839f2f008294a560a04a80abe8..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/7D_Enhanced_hypercube.png and /dev/null differ diff --git a/public/it4i/img/AMsetPar1.png b/public/it4i/img/AMsetPar1.png deleted file mode 100644 index f7886e6cbbcf501d87c8f363209ac72dcb8463a5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/AMsetPar1.png and /dev/null differ diff --git a/public/it4i/img/Anselm-Schematic-Representation.png b/public/it4i/img/Anselm-Schematic-Representation.png deleted file mode 100644 index 5c711ab51a8c7abec076d9ae5b6876d2c14fd403..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Anselm-Schematic-Representation.png and /dev/null differ diff --git a/public/it4i/img/Anselmprofile.jpg b/public/it4i/img/Anselmprofile.jpg deleted file mode 100644 index 92b9d8b3887e76cff92255955f354e364ed53130..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Anselmprofile.jpg and /dev/null differ diff --git a/public/it4i/img/Ansys-lic-admin.jpg b/public/it4i/img/Ansys-lic-admin.jpg deleted file mode 100644 index 9e1932c5f52b5e12c305822de15e7133e0fdcda2..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Ansys-lic-admin.jpg and /dev/null differ diff --git a/public/it4i/img/Authorization_chain.png b/public/it4i/img/Authorization_chain.png deleted file mode 100644 index c7747cfc28c0a4e7ab98034543e602ee3fc88d79..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Authorization_chain.png and /dev/null differ diff --git a/public/it4i/img/B2ACCESS_chrome_eng.jpg b/public/it4i/img/B2ACCESS_chrome_eng.jpg deleted file mode 100644 index 800bc1f52c0e36f1e6b533848433c10821869339..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/B2ACCESS_chrome_eng.jpg and /dev/null differ diff --git a/public/it4i/img/Fluent_Licence_1.jpg b/public/it4i/img/Fluent_Licence_1.jpg deleted file mode 100644 index 1e3ba0f25be08787a9f3d5eb8d7a89f771fad403..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Fluent_Licence_1.jpg and /dev/null differ diff --git a/public/it4i/img/Fluent_Licence_2.jpg b/public/it4i/img/Fluent_Licence_2.jpg deleted file mode 100644 index e8ffdf5a01337df7271a865d48dd58501eb78180..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Fluent_Licence_2.jpg and /dev/null differ diff --git a/public/it4i/img/Fluent_Licence_3.jpg b/public/it4i/img/Fluent_Licence_3.jpg deleted file mode 100644 index 81be6763cb35ed8dca8dad9a0a1e714ef3d8c9e3..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Fluent_Licence_3.jpg and /dev/null differ diff --git a/public/it4i/img/Fluent_Licence_4.jpg b/public/it4i/img/Fluent_Licence_4.jpg deleted file mode 100644 index ce4686740082b3e77070d4afe96184ab45e82637..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Fluent_Licence_4.jpg and /dev/null differ diff --git a/public/it4i/img/IBsingleplanetopologyAcceleratednodessmall.png b/public/it4i/img/IBsingleplanetopologyAcceleratednodessmall.png deleted file mode 100644 index fd6d5759d5bd38554e2e5b956435444cd3c2044c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/IBsingleplanetopologyAcceleratednodessmall.png and /dev/null differ diff --git a/public/it4i/img/IBsingleplanetopologyICEXMcellsmall.png b/public/it4i/img/IBsingleplanetopologyICEXMcellsmall.png deleted file mode 100644 index 2fc399aed344f04a2916e2dfe48cd956a4370bbc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/IBsingleplanetopologyICEXMcellsmall.png and /dev/null differ diff --git a/public/it4i/img/Matlab.png b/public/it4i/img/Matlab.png deleted file mode 100644 index 71bdf7e101998fbba84d5e58f341f605df930325..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Matlab.png and /dev/null differ diff --git a/public/it4i/img/PageantV.png b/public/it4i/img/PageantV.png deleted file mode 100644 index 7a08be3c3b44dadfe4144fbd83639be0eb6151a5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PageantV.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_host_Salomon.png b/public/it4i/img/PuTTY_host_Salomon.png deleted file mode 100644 index 61e1928f02f8348d4719cbeefe803eeb035e03e4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_host_Salomon.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_host_cluster.png b/public/it4i/img/PuTTY_host_cluster.png deleted file mode 100644 index 718e01ea5e62a3e840117dfb673b53d071387bb6..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_host_cluster.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_keyV.png b/public/it4i/img/PuTTY_keyV.png deleted file mode 100644 index 6d847de4a235c9d5cb1b134bb12bca3d6abab404..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_keyV.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_open_Salomon.png b/public/it4i/img/PuTTY_open_Salomon.png deleted file mode 100644 index 97e381683908ac7c813fed7b97a962a4ba44d223..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_open_Salomon.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_open_cluster.png b/public/it4i/img/PuTTY_open_cluster.png deleted file mode 100644 index e1f9811db70cbeac3f7ac02adbe0e5fbc4b36ac8..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_open_cluster.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_save_Salomon.png b/public/it4i/img/PuTTY_save_Salomon.png deleted file mode 100644 index 886a79f60ca983084ae7218f21e5fe6e39fbcd00..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_save_Salomon.png and /dev/null differ diff --git a/public/it4i/img/PuTTY_save_cluster.png b/public/it4i/img/PuTTY_save_cluster.png deleted file mode 100644 index 341b8c35a1b9ca1a784817dace18fa5e821f949d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuTTY_save_cluster.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygeneratorV.png b/public/it4i/img/PuttyKeygeneratorV.png deleted file mode 100644 index 7c3014a9443f5a65d56ff64c6a2639e35b4514de..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygeneratorV.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_001V.png b/public/it4i/img/PuttyKeygenerator_001V.png deleted file mode 100644 index ba3183be0894ea4edffa9d514a55ce20e766e304..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_001V.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_002V.png b/public/it4i/img/PuttyKeygenerator_002V.png deleted file mode 100644 index f15167f04fa6006f27908a97f61b8a5347ef2248..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_002V.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_003V.png b/public/it4i/img/PuttyKeygenerator_003V.png deleted file mode 100644 index 73a5505a2b2ac4aa1fd0adf4c3a74adcca0c8c08..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_003V.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_004V.png b/public/it4i/img/PuttyKeygenerator_004V.png deleted file mode 100644 index d90756b3a9a1816e48b37a66cfef174cb281778a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_004V.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_005V.png b/public/it4i/img/PuttyKeygenerator_005V.png deleted file mode 100644 index 0fe5c1258aeafbe5c564fb6655e480f8417f27d7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_005V.png and /dev/null differ diff --git a/public/it4i/img/PuttyKeygenerator_006V.png b/public/it4i/img/PuttyKeygenerator_006V.png deleted file mode 100644 index cee16e08f1c8d588a148e76f8374d1f16d3fd410..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/PuttyKeygenerator_006V.png and /dev/null differ diff --git a/public/it4i/img/Salomon_IB_topology.png b/public/it4i/img/Salomon_IB_topology.png deleted file mode 100644 index e370a4b44725571e51498ed45fa3e0aa313b94e4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Salomon_IB_topology.png and /dev/null differ diff --git a/public/it4i/img/Snmekobrazovky20141204v12.56.36.png b/public/it4i/img/Snmekobrazovky20141204v12.56.36.png deleted file mode 100644 index 2d0009c34c6c861c018b7999079cbd5aa6e0401d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Snmekobrazovky20141204v12.56.36.png and /dev/null differ diff --git a/public/it4i/img/Snmekobrazovky20151204v15.35.12.png b/public/it4i/img/Snmekobrazovky20151204v15.35.12.png deleted file mode 100644 index 53c93b0687dabea5a6ae6a3e298d584d512133f4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Snmekobrazovky20151204v15.35.12.png and /dev/null differ diff --git a/public/it4i/img/Snmekobrazovky20160211v14.27.45.png b/public/it4i/img/Snmekobrazovky20160211v14.27.45.png deleted file mode 100644 index 8c56805d7a0a69f2c7b90d1c3c6ee1d8d84fc85a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Snmekobrazovky20160211v14.27.45.png and /dev/null differ diff --git a/public/it4i/img/Snmekobrazovky20160708v12.33.35.png b/public/it4i/img/Snmekobrazovky20160708v12.33.35.png deleted file mode 100644 index d8ea15508f0714eeacfadff6d85fe8cafe5c406b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/Snmekobrazovky20160708v12.33.35.png and /dev/null differ diff --git a/public/it4i/img/TightVNC_login.png b/public/it4i/img/TightVNC_login.png deleted file mode 100644 index 078dfc73a90b2b3ffc1648fa82ba4b0a109fbc29..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/TightVNC_login.png and /dev/null differ diff --git a/public/it4i/img/aai.jpg b/public/it4i/img/aai.jpg deleted file mode 100644 index fcad6d0104d95c2174e1f2e3509b6b1f65f7f560..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/aai.jpg and /dev/null differ diff --git a/public/it4i/img/aai2.jpg b/public/it4i/img/aai2.jpg deleted file mode 100644 index 37b195fb67c5addbdd763c9c7102fb37cc7d510c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/aai2.jpg and /dev/null differ diff --git a/public/it4i/img/aai3-passwd.jpg b/public/it4i/img/aai3-passwd.jpg deleted file mode 100644 index 60d4dc14697fdf99a398133996e3f4369037c6d4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/aai3-passwd.jpg and /dev/null differ diff --git a/public/it4i/img/addsshkey.png b/public/it4i/img/addsshkey.png deleted file mode 100644 index f0492b7d5fbacd935899aa383ae23f5d5088a177..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/addsshkey.png and /dev/null differ diff --git a/public/it4i/img/altair_logo.svg b/public/it4i/img/altair_logo.svg deleted file mode 100644 index 0c9d19cad3fc86f69501ae343e3995134e354890..0000000000000000000000000000000000000000 --- a/public/it4i/img/altair_logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" viewBox="0 0 191.02778 47.051822"><style id="style2">.st0{fill:#FFFFFF;} .st1{fill:#EC1944;} .st2{fill:none;} .st3{fill:#00B4EF;} .st4{fill:url(#SVGID_1_);} .st5{fill:url(#SVGID_2_);} .st6{fill:url(#SVGID_3_);} .st7{fill:#FFC745;} .st8{fill:#FFCE51;} .st9{fill:none;stroke:#FFFFFF;stroke-width:0.69;stroke-miterlimit:10;}</style><path class="st0" d="M94.95 45.778l-3.6-11.5h-13.1l-3.7 11.4h-4.7l12.9-38.2h4.6l12.9 38.2h-5.3zm-8.9-29c-.5-1.5-.9-3-1.1-4.6h-.1c-.3 1.6-.7 3.1-1.2 4.6l-4.6 14.5h11.4z" id="path6" fill="#fff"/><path class="st0" d="M105.55 45.778v-43.6h4.9v43.6z" id="path8" fill="#fff"/><path class="st0" d="M127.85 46.078c-5.4 0-7.4-3.9-7.4-7.6v-19.6h-3.4v-3.1h3.4v-6.8l4.9-1.5v8.3h5.2v3h-5.2v19.5c0 2.4 1.1 4.3 3.8 4.3.5 0 1-.1 1.4-.2v3.1c-.9.4-1.8.5-2.7.6z" id="path10" fill="#fff"/><path class="st0" d="M146.45 46.278c-7.8 0-11.4-3.4-11.4-8.8 0-7.9 7.4-10.3 16.7-11.2v-1.8c0-4.6-2.8-5.9-6.6-5.9-2.5.1-5 .7-7.2 1.9l-1.2-2.9c2.8-1.5 6-2.2 9.2-2.2 5.6 0 10.4 2.4 10.4 9.7v19.2c-3 1.4-6.4 2.1-9.9 2zm5.4-17.5c-7.6.9-12.1 2.6-12.1 8.6 0 4.3 2.7 6.1 7.1 6.1 1.7.1 3.4-.3 4.9-1v-13.7z" id="path12" fill="#fff"/><path class="st0" d="M167.05 9.978c-1.5-.1-2.6-1.3-2.6-2.8.1-1.5 1.3-2.6 2.8-2.6 1.4.1 2.6 1.3 2.6 2.7 0 1.6-1.3 2.8-2.8 2.7zm-2.4 35.8v-30h4.9v30z" id="path14" fill="#fff"/><path class="st0" d="M189.45 18.978c-2.4-.7-5.2-.5-6.8.5v26.2h-4.9v-28.3c2.9-1.5 5.8-2.3 12.9-2.1z" id="path16" fill="#fff"/><path class="st2" id="polygon20" d="M41.25 24.578l-.8-2.7.8 2.6z" fill="none"/><path class="st2" id="polygon22" d="M41.25 24.478v.1l-.8-2.7z" fill="none"/><path class="st2" id="polygon24" d="M41.25 24.478v.1l-.8-2.7z" fill="none"/><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="59.336" y1="31.946" x2="71.996" y2="9.306" gradientTransform="matrix(1 0 0 -1 -29.91 33.768)"><stop offset="0" id="stop28" stop-color="#BBBCBF"/><stop offset=".07" id="stop30" stop-color="#D7D8D9"/><stop offset=".14" id="stop32" stop-color="#E9EAEB"/><stop offset=".19" id="stop34" stop-color="#F0F0F1"/><stop offset=".38" id="stop36" stop-color="#ECECED"/><stop offset=".57" id="stop38" stop-color="#E0E1E2"/><stop offset=".75" id="stop40" stop-color="#CCCDCF"/><stop offset=".94" id="stop42" stop-color="#B1B3B5"/><stop offset="1" id="stop44" stop-color="#A6A8AB"/></linearGradient><path class="st4" d="M40.45 21.878l-1.8-5.6-4.3-13.8s-.7-2.1-1.7-2.1c-.4 0-.7.1-1 .3-.8.5-1.5 1.2-2.1 1.9l-2.7 2.9 10.6 12.2c1.5 1.8 2.6 3.7 3.5 5.9.1.3.3.6.4 1v-.1z" id="path47" fill="url(#SVGID_1_)"/><path class="st1" d="M32.65.378h-10.8c-1.1 0-2.1.7-2.4 1.8 0 0-6.3 16.7-8 20.4l5.6-6.1 9.9-10.8 2.7-3c.6-.8 1.3-1.4 2.1-1.9.3-.2.6-.3.9-.4z" id="path18" fill="#ec1944"/><linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="33.613" y1="-3.546" x2="47.043" y2="19.924" gradientTransform="matrix(1 0 0 -1 -29.91 33.768)"><stop offset="0" id="stop49" stop-color="#BBBCBF"/><stop offset=".07" id="stop51" stop-color="#D7D8D9"/><stop offset=".14" id="stop53" stop-color="#E9EAEB"/><stop offset=".19" id="stop55" stop-color="#F0F0F1"/><stop offset=".38" id="stop57" stop-color="#ECECED"/><stop offset=".57" id="stop59" stop-color="#E0E1E2"/><stop offset=".75" id="stop61" stop-color="#CCCDCF"/><stop offset=".94" id="stop63" stop-color="#B1B3B5"/><stop offset="1" id="stop65" stop-color="#A6A8AB"/></linearGradient><path class="st5" d="M14.05 19.678l-12.6 13.8s-1.4 1.6-1 2.5l.1.1.6.6c.9.5 1.8.8 2.7.9l3.9.8 5.4-15.2c.8-2.1 1.9-4.1 3.3-5.9.2-.3.4-.6.6-.8z" id="path68" fill="url(#SVGID_2_)"/><path class="st8" d="M29.25 43.078l-6.4-1.4-.8-.2-18.2-4c-1.01-.217-1.874-.433-2.7-.9-.267-.15-.53-.436-.7-.6l5.8 9.2c.6.9 1.7 1.4 2.7 1.2l21.3-3.2z" id="path93" fill="#ffce51"/><linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="76.961" y1="-8.864" x2="52.531" y2="-7.845" gradientTransform="matrix(1 0 0 -1 -29.91 33.768)"><stop offset="0" id="stop70" stop-color="#BBBCBF"/><stop offset=".07" id="stop72" stop-color="#D7D8D9"/><stop offset=".14" id="stop74" stop-color="#E9EAEB"/><stop offset=".19" id="stop76" stop-color="#F0F0F1"/><stop offset=".38" id="stop78" stop-color="#ECECED"/><stop offset=".57" id="stop80" stop-color="#E0E1E2"/><stop offset=".75" id="stop82" stop-color="#CCCDCF"/><stop offset=".94" id="stop84" stop-color="#B1B3B5"/><stop offset="1" id="stop86" stop-color="#A6A8AB"/></linearGradient><path class="st6" d="M46.95 42.278l-.7-2.2-.5-1.5-15.9 3c-2.3.4-4.5.4-6.8.1-.3 0-.6-.1-1-.2l.7.2 6.4 1.4 1 .2 14.4 3.2s2.1.6 2.7-.3l.175-.365c.1-.3.09-.48.09-.78-.037-.748-.265-1.855-.565-2.755z" id="path89" fill="url(#SVGID_3_)"/><path class="st3" d="M52.15 33.378l-13.5-17.1 1.8 5.6.8 2.7 5.6 17.8c.3.9.593 1.846.6 2.8.002.34-.1.7-.2 1 1.793-3.15 3.48-6.398 5.2-9.6.5-1.1.4-2.3-.3-3.2z" id="path26" fill="#00b4ef"/></svg> \ No newline at end of file diff --git a/public/it4i/img/anyconnectcontextmenu.jpg b/public/it4i/img/anyconnectcontextmenu.jpg deleted file mode 100644 index 26122f2f5965ce71489267d359eff21c39ed7960..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/anyconnectcontextmenu.jpg and /dev/null differ diff --git a/public/it4i/img/anyconnecticon.jpg b/public/it4i/img/anyconnecticon.jpg deleted file mode 100644 index d7397f5c43f659d71a6fe8413ad89dca8157bb48..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/anyconnecticon.jpg and /dev/null differ diff --git a/public/it4i/img/application.png b/public/it4i/img/application.png deleted file mode 100644 index 006a93a202327e57ca9bb57f0c63f38b43d6411a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/application.png and /dev/null differ diff --git a/public/it4i/img/b2access-fill.jpg b/public/it4i/img/b2access-fill.jpg deleted file mode 100644 index 043d14010227c67df6410de462a084c33f2f6670..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access-fill.jpg and /dev/null differ diff --git a/public/it4i/img/b2access-no_account.jpg b/public/it4i/img/b2access-no_account.jpg deleted file mode 100644 index 5e1fd73ccb33eb787e66202767547310cd0a5ba1..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access-no_account.jpg and /dev/null differ diff --git a/public/it4i/img/b2access-select.jpg b/public/it4i/img/b2access-select.jpg deleted file mode 100644 index 10ba17b3d57bdf4820c12ed4b539bbb7390d1fe7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access-select.jpg and /dev/null differ diff --git a/public/it4i/img/b2access-social.jpg b/public/it4i/img/b2access-social.jpg deleted file mode 100644 index eb9b55a98cde83320fc3f39bc3b89f308a78cc8f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access-social.jpg and /dev/null differ diff --git a/public/it4i/img/b2access-univerzity.jpg b/public/it4i/img/b2access-univerzity.jpg deleted file mode 100644 index 363c05b82006c83e4e85b907d05c92efe4093902..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access-univerzity.jpg and /dev/null differ diff --git a/public/it4i/img/b2access.jpg b/public/it4i/img/b2access.jpg deleted file mode 100644 index 83a14392eb3fd32b6fda9d290c376e66c83fd3ce..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/b2access.jpg and /dev/null differ diff --git a/public/it4i/img/barbora_cluster_usage.png b/public/it4i/img/barbora_cluster_usage.png deleted file mode 100644 index a076ad5569cd40469a51d53b5d40ebdf8c143b26..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/barbora_cluster_usage.png and /dev/null differ diff --git a/public/it4i/img/bio-graphs.png b/public/it4i/img/bio-graphs.png deleted file mode 100644 index 2bd3b67f8e9ecb8818df8fd0b494347bb283d7ea..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/bio-graphs.png and /dev/null differ diff --git a/public/it4i/img/blender.png b/public/it4i/img/blender.png deleted file mode 100644 index c416320498368439a15586ea924d83b37e9d7dd3..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/blender.png and /dev/null differ diff --git a/public/it4i/img/blender1.png b/public/it4i/img/blender1.png deleted file mode 100644 index 9ed310cf31c91dc5852f0252484f99de13edc7cd..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/blender1.png and /dev/null differ diff --git a/public/it4i/img/blender2.png b/public/it4i/img/blender2.png deleted file mode 100644 index ebbd2c7e70813a9544b9ba51f8e240011429224c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/blender2.png and /dev/null differ diff --git a/public/it4i/img/bullxB510.png b/public/it4i/img/bullxB510.png deleted file mode 100644 index abbb472fc66b730c609ac5dda573b5edc92c4884..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/bullxB510.png and /dev/null differ diff --git a/public/it4i/img/client.jpg b/public/it4i/img/client.jpg deleted file mode 100644 index d36c1f9d9dc140ee5b899ee3fc01eebaaab9cb90..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/client.jpg and /dev/null differ diff --git a/public/it4i/img/cn_m_cell.jpg b/public/it4i/img/cn_m_cell.jpg deleted file mode 100644 index 6a882034ba55b29e04eebe4801c727088c677c8d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cn_m_cell.jpg and /dev/null differ diff --git a/public/it4i/img/cn_mic-1.jpg b/public/it4i/img/cn_mic-1.jpg deleted file mode 100644 index 210eb3d3ba9d9cc4339d0a0b97fb9610aafe9aaa..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cn_mic-1.jpg and /dev/null differ diff --git a/public/it4i/img/cn_mic.jpg b/public/it4i/img/cn_mic.jpg deleted file mode 100644 index 7b9f2f8326ca9c0c0e093aad12a0c80d8a28444f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cn_mic.jpg and /dev/null differ diff --git a/public/it4i/img/copy_of_vpn_web_install_3.png b/public/it4i/img/copy_of_vpn_web_install_3.png deleted file mode 100644 index 1750cfde48b5c660f9c375dd88d3c666f36dcded..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/copy_of_vpn_web_install_3.png and /dev/null differ diff --git a/public/it4i/img/crypto_v2.jpg b/public/it4i/img/crypto_v2.jpg deleted file mode 100644 index 27d43c6861963e189e00354e77297292ad99dcfc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/crypto_v2.jpg and /dev/null differ diff --git a/public/it4i/img/cs/guides/p10_numa_sc4_flat.png b/public/it4i/img/cs/guides/p10_numa_sc4_flat.png deleted file mode 100644 index ae24bc62fa8fc4ae488893c1e7520e9e747b578a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs/guides/p10_numa_sc4_flat.png and /dev/null differ diff --git a/public/it4i/img/cs/guides/p10_stream_dram.png b/public/it4i/img/cs/guides/p10_stream_dram.png deleted file mode 100644 index eaa98595e1f479072a69312193147c02655f4127..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs/guides/p10_stream_dram.png and /dev/null differ diff --git a/public/it4i/img/cs/guides/p10_stream_hbm.png b/public/it4i/img/cs/guides/p10_stream_hbm.png deleted file mode 100644 index 990a9d3470f680bd2e9ebf6718b84a1e7aa48a5c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs/guides/p10_stream_hbm.png and /dev/null differ diff --git a/public/it4i/img/cs/guides/p10_stream_memkind.png b/public/it4i/img/cs/guides/p10_stream_memkind.png deleted file mode 100644 index 55aebc790b61f91438aa667dad1a3fd7a5da1cc2..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs/guides/p10_stream_memkind.png and /dev/null differ diff --git a/public/it4i/img/cs1.png b/public/it4i/img/cs1.png deleted file mode 100644 index b6101ae93ddaa81e25a69b19f4727347b44d7da2..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs1.png and /dev/null differ diff --git a/public/it4i/img/cs1_1.png b/public/it4i/img/cs1_1.png deleted file mode 100644 index b62738c2237a0da390fc792d4848467da372a1c2..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs1_1.png and /dev/null differ diff --git a/public/it4i/img/cs2_1.png b/public/it4i/img/cs2_1.png deleted file mode 100644 index 2003ef2cd083ea3630f0373170216812f25bfd97..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs2_1.png and /dev/null differ diff --git a/public/it4i/img/cs2_2.png b/public/it4i/img/cs2_2.png deleted file mode 100644 index c7a30d18947d93b9ad9ff01180b772b84172b719..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cs2_2.png and /dev/null differ diff --git a/public/it4i/img/cudaq.png b/public/it4i/img/cudaq.png deleted file mode 100644 index 6ec8dee0c8550f567d1b2499be0450eb11a2ce87..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cudaq.png and /dev/null differ diff --git a/public/it4i/img/cygwinX11forwarding.png b/public/it4i/img/cygwinX11forwarding.png deleted file mode 100644 index 7c2a3bcb138cc7cce77c878bd6f3ed69492e86b8..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/cygwinX11forwarding.png and /dev/null differ diff --git a/public/it4i/img/dcv_5911_1.png b/public/it4i/img/dcv_5911_1.png deleted file mode 100644 index 0a1b097c2ef74ce358132757099d34f83ff37c9a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dcv_5911_1.png and /dev/null differ diff --git a/public/it4i/img/dcv_5911_2.png b/public/it4i/img/dcv_5911_2.png deleted file mode 100644 index 6bb2d6404f04ab1e811d1b12f245005e880658fd..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dcv_5911_2.png and /dev/null differ diff --git a/public/it4i/img/dcvtest_5911.png b/public/it4i/img/dcvtest_5911.png deleted file mode 100644 index cc8ef8e0f882111691d4f7051439ef640de64412..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dcvtest_5911.png and /dev/null differ diff --git a/public/it4i/img/ddt1.png b/public/it4i/img/ddt1.png deleted file mode 100644 index 57a18f48908f0b8a4857bc14a820b450fcdd9652..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/ddt1.png and /dev/null differ diff --git a/public/it4i/img/desktop.ini b/public/it4i/img/desktop.ini deleted file mode 100644 index a51683dae5158c401aab388ce7015ade0ac2a064..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/desktop.ini and /dev/null differ diff --git a/public/it4i/img/dgx-htop.png b/public/it4i/img/dgx-htop.png deleted file mode 100644 index 61ea3c22cf6203f921b8e4d3731cf23f94b15a58..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx-htop.png and /dev/null differ diff --git a/public/it4i/img/dgx1.png b/public/it4i/img/dgx1.png deleted file mode 100644 index 89807e71f6ed8044f863e336f168120e16a7ed99..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx1.png and /dev/null differ diff --git a/public/it4i/img/dgx2-nvlink.png b/public/it4i/img/dgx2-nvlink.png deleted file mode 100644 index 30452c2bc5e22076e89116f992769e8db1eaa0b5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx2-nvlink.png and /dev/null differ diff --git a/public/it4i/img/dgx2.png b/public/it4i/img/dgx2.png deleted file mode 100644 index fd6c42fff6a218c59deb85cc23ff84ab8977c60b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx2.png and /dev/null differ diff --git a/public/it4i/img/dgx3.png b/public/it4i/img/dgx3.png deleted file mode 100644 index 39dc8d602f075776c0a7c23557ba1f8cf2b0795a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx3.png and /dev/null differ diff --git a/public/it4i/img/dgx4.png b/public/it4i/img/dgx4.png deleted file mode 100644 index a9fa87778ace17b9aee785402458263cf3e8c79b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dgx4.png and /dev/null differ diff --git a/public/it4i/img/dis_clluster.png b/public/it4i/img/dis_clluster.png deleted file mode 100644 index dfb6bf01b4ae16df8eeceb7e5803771ec0a652f5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/dis_clluster.png and /dev/null differ diff --git a/public/it4i/img/download.png b/public/it4i/img/download.png deleted file mode 100644 index 5c9839a4fba0f8bf1286b73ba18362f14a1f59d9..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/download.png and /dev/null differ diff --git a/public/it4i/img/downloadfilesuccessfull.jpeg b/public/it4i/img/downloadfilesuccessfull.jpeg deleted file mode 100644 index be0d8c671fbdb1631a53698c5f53d8708cb3758e..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/downloadfilesuccessfull.jpeg and /dev/null differ diff --git a/public/it4i/img/eosc-marketplace-active.jpg b/public/it4i/img/eosc-marketplace-active.jpg deleted file mode 100644 index dd9feb3bd3d389c237acc5ddd2bf8146d2503822..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/eosc-marketplace-active.jpg and /dev/null differ diff --git a/public/it4i/img/eosc-providers.jpg b/public/it4i/img/eosc-providers.jpg deleted file mode 100644 index 4d2f94f0315b7fd5e899c74ce92b79caffcb1bb4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/eosc-providers.jpg and /dev/null differ diff --git a/public/it4i/img/eudat_request.jpg b/public/it4i/img/eudat_request.jpg deleted file mode 100644 index 96bf947af458db4ada330e542f0c2977d1ab158a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/eudat_request.jpg and /dev/null differ diff --git a/public/it4i/img/eudat_v2.jpg b/public/it4i/img/eudat_v2.jpg deleted file mode 100644 index 247132cf032fb473921d4ce614c96ab45cd7a26b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/eudat_v2.jpg and /dev/null differ diff --git a/public/it4i/img/executionaccess.jpeg b/public/it4i/img/executionaccess.jpeg deleted file mode 100644 index 24993c8e26e0d2c9951bbb47c24d5e37111e7ed1..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/executionaccess.jpeg and /dev/null differ diff --git a/public/it4i/img/executionaccess2.jpeg b/public/it4i/img/executionaccess2.jpeg deleted file mode 100644 index 179ef898f65dc73e40a87de8db17afa207468135..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/executionaccess2.jpeg and /dev/null differ diff --git a/public/it4i/img/external.png b/public/it4i/img/external.png deleted file mode 100644 index 16f9b92db47a1f1cd9d2320cc7d03122155a5200..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/external.png and /dev/null differ diff --git a/public/it4i/img/fairshare_formula.png b/public/it4i/img/fairshare_formula.png deleted file mode 100644 index 6a5a1443fa08cd9d3c62bea52bbb48136b2501dc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fairshare_formula.png and /dev/null differ diff --git a/public/it4i/img/favicon.ico b/public/it4i/img/favicon.ico deleted file mode 100644 index 6c5618663a1a3500ae09b49ca6130774adc894d8..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/favicon.ico and /dev/null differ diff --git a/public/it4i/img/fc_vpn_web_login.png b/public/it4i/img/fc_vpn_web_login.png deleted file mode 100644 index 834b1a3d7b718d9a441b7980416fe8a0fd58a222..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fc_vpn_web_login.png and /dev/null differ diff --git a/public/it4i/img/fc_vpn_web_login_2_1.png b/public/it4i/img/fc_vpn_web_login_2_1.png deleted file mode 100644 index c81afa250d27a2604271c03431cc1f253ebe7638..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fc_vpn_web_login_2_1.png and /dev/null differ diff --git a/public/it4i/img/fc_vpn_web_login_3_1.png b/public/it4i/img/fc_vpn_web_login_3_1.png deleted file mode 100644 index 13b6556169ad98e2817b334187c1a542ed93582e..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fc_vpn_web_login_3_1.png and /dev/null differ diff --git a/public/it4i/img/fig1.png b/public/it4i/img/fig1.png deleted file mode 100644 index 938b783964771627aa573f0f4944213e54c67a32..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig1.png and /dev/null differ diff --git a/public/it4i/img/fig2.png b/public/it4i/img/fig2.png deleted file mode 100644 index f5bc24d65e435dbd869f873a3c88c6926fe5b466..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig2.png and /dev/null differ diff --git a/public/it4i/img/fig3.png b/public/it4i/img/fig3.png deleted file mode 100644 index 911f443a5a175ca36073dd17944589a37c7dec6a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig3.png and /dev/null differ diff --git a/public/it4i/img/fig4.png b/public/it4i/img/fig4.png deleted file mode 100644 index 8aa39d6aa924e3a567a135334e7305ccd14ce05d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig4.png and /dev/null differ diff --git a/public/it4i/img/fig5.png b/public/it4i/img/fig5.png deleted file mode 100644 index 4e87c6f45b1e69d053663a539ab67176d166b094..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig5.png and /dev/null differ diff --git a/public/it4i/img/fig6.png b/public/it4i/img/fig6.png deleted file mode 100644 index 43987a78a007e9489ad5e103db8c80a6749ec259..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig6.png and /dev/null differ diff --git a/public/it4i/img/fig7.png b/public/it4i/img/fig7.png deleted file mode 100644 index dc4952d10d945e633ffcf2aed1317fba55f55cef..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig7.png and /dev/null differ diff --git a/public/it4i/img/fig7x.png b/public/it4i/img/fig7x.png deleted file mode 100644 index c02375966b44f3cdfb336e457c9be17dd2b0a3c2..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig7x.png and /dev/null differ diff --git a/public/it4i/img/fig8.png b/public/it4i/img/fig8.png deleted file mode 100644 index 93934042e94fecf27fe2351dfc96da50d64c8921..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig8.png and /dev/null differ diff --git a/public/it4i/img/fig9.png b/public/it4i/img/fig9.png deleted file mode 100644 index 406e0dbb156d0f8e75f6230f66dfccc58fed457b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/fig9.png and /dev/null differ diff --git a/public/it4i/img/firstrun.jpg b/public/it4i/img/firstrun.jpg deleted file mode 100644 index fb26fe932626bfbf927874d3953606078a130fbb..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/firstrun.jpg and /dev/null differ diff --git a/public/it4i/img/floatingip.png b/public/it4i/img/floatingip.png deleted file mode 100644 index 6d511ae14cf5defeea3b681c66ccb516f14a23d4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/floatingip.png and /dev/null differ diff --git a/public/it4i/img/gdmdisablescreensaver.png b/public/it4i/img/gdmdisablescreensaver.png deleted file mode 100644 index 437d05effabe47a1dfd18129619398ef7ef74739..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gdmdisablescreensaver.png and /dev/null differ diff --git a/public/it4i/img/gdmscreensaver.png b/public/it4i/img/gdmscreensaver.png deleted file mode 100644 index 309b8f06db5058a4029dbdf63f9c4cd4d2370043..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gdmscreensaver.png and /dev/null differ diff --git a/public/it4i/img/git.png b/public/it4i/img/git.png deleted file mode 100644 index 22b28b31f83afb597a5c13103cc86f80aa1e85a0..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/git.png and /dev/null differ diff --git a/public/it4i/img/global_ramdisk.png b/public/it4i/img/global_ramdisk.png deleted file mode 100644 index 27f98afcf4c0d2692c72e342330ee5fb5cdecd1e..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/global_ramdisk.png and /dev/null differ diff --git a/public/it4i/img/glxgears.jpg b/public/it4i/img/glxgears.jpg deleted file mode 100644 index b8c8b8b42e2c730daba9bb7132cfafaac4ca715a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/glxgears.jpg and /dev/null differ diff --git a/public/it4i/img/gnome-compute-nodes-over-vnc.png b/public/it4i/img/gnome-compute-nodes-over-vnc.png deleted file mode 100644 index b7d24165d5b2a486534c095b5fb156d83db10428..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gnome-compute-nodes-over-vnc.png and /dev/null differ diff --git a/public/it4i/img/gnome-terminal.png b/public/it4i/img/gnome-terminal.png deleted file mode 100644 index 1f404e503edeb796ed0ee96c0ed81aaca64d97eb..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gnome-terminal.png and /dev/null differ diff --git a/public/it4i/img/gnome_screen.png b/public/it4i/img/gnome_screen.png deleted file mode 100644 index 62d535f3bfaefb286d120a9aa85b33127665c644..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gnome_screen.png and /dev/null differ diff --git a/public/it4i/img/gpu.png b/public/it4i/img/gpu.png deleted file mode 100644 index 993f002810060bda11b5f81219d3b6c9a030ae1b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/gpu.png and /dev/null differ diff --git a/public/it4i/img/hdl_net.jpg b/public/it4i/img/hdl_net.jpg deleted file mode 100644 index d96c82a99df18c7d306bafd7fa40353dd067a308..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/hdl_net.jpg and /dev/null differ diff --git a/public/it4i/img/hdl_pid.jpg b/public/it4i/img/hdl_pid.jpg deleted file mode 100644 index cd1cfbdbbc49fa44af6b67ae282a48558d1f3d54..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/hdl_pid.jpg and /dev/null differ diff --git a/public/it4i/img/horizon.png b/public/it4i/img/horizon.png deleted file mode 100644 index b5f1d5c1b9358b86e95038d5ebbadb6bf026ca8b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/horizon.png and /dev/null differ diff --git a/public/it4i/img/hq-architecture.png b/public/it4i/img/hq-architecture.png deleted file mode 100644 index d395ddb727900a849e4b9d0ae3ce4cb2d5894a64..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/hq-architecture.png and /dev/null differ diff --git a/public/it4i/img/hq-idea-s.png b/public/it4i/img/hq-idea-s.png deleted file mode 100644 index 6d2d6d34c62b43b0f53765b93ee11222256879bf..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/hq-idea-s.png and /dev/null differ diff --git a/public/it4i/img/instalationfile.jpeg b/public/it4i/img/instalationfile.jpeg deleted file mode 100644 index 71fcc12197b4c6246d457bd3ecd75c5e971fc174..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instalationfile.jpeg and /dev/null differ diff --git a/public/it4i/img/instance.png b/public/it4i/img/instance.png deleted file mode 100644 index 034070b76c639fcbb7fafbc8f70736379ce77af4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance.png and /dev/null differ diff --git a/public/it4i/img/instance1.png b/public/it4i/img/instance1.png deleted file mode 100644 index 36fec71fd65e9d5b4dfc8c160df0257aa7f9beb5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance1.png and /dev/null differ diff --git a/public/it4i/img/instance2.png b/public/it4i/img/instance2.png deleted file mode 100644 index 2227f75e1f014648f4f3ff9385f350b94c7ea7db..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance2.png and /dev/null differ diff --git a/public/it4i/img/instance3.png b/public/it4i/img/instance3.png deleted file mode 100644 index 826f4046e492f9d6cd6b881b8d023883c6f95cae..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance3.png and /dev/null differ diff --git a/public/it4i/img/instance4.png b/public/it4i/img/instance4.png deleted file mode 100644 index 31c27c8eafb8c3af05875eb9488ffa5c35c705f1..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance4.png and /dev/null differ diff --git a/public/it4i/img/instance5.png b/public/it4i/img/instance5.png deleted file mode 100644 index 1e76579beff5db2168cc5cf68fcff16b5dab3dbe..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/instance5.png and /dev/null differ diff --git a/public/it4i/img/irods-cyberduck.jpg b/public/it4i/img/irods-cyberduck.jpg deleted file mode 100644 index 86ef78e02fce994dc41f0b110d00a4bdcb21bc4d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/irods-cyberduck.jpg and /dev/null differ diff --git a/public/it4i/img/irods_linking_link.jpg b/public/it4i/img/irods_linking_link.jpg deleted file mode 100644 index 53e87c61439399699027d2c8dd2f9745c136d1aa..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/irods_linking_link.jpg and /dev/null differ diff --git a/public/it4i/img/it4i-ci.png b/public/it4i/img/it4i-ci.png deleted file mode 100644 index e477a5ca788a72ee466625c69a7725297ab57c54..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-ci.png and /dev/null differ diff --git a/public/it4i/img/it4i-ci.svg b/public/it4i/img/it4i-ci.svg deleted file mode 100644 index 88f4a42683281cc5ebaee6f14107e221ca536c63..0000000000000000000000000000000000000000 --- a/public/it4i/img/it4i-ci.svg +++ /dev/null @@ -1,147 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="974" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="651" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"> - <!--Generated by ySVG 2.5--> - <defs id="genericDefs"/> - <g> - <defs id="defs1"> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"> - <path d="M0 0 L974 0 L974 651 L0 651 L0 0 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"> - <path d="M188 113 L1162 113 L1162 764 L188 764 L188 113 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"> - <path d="M-3210.3906 -5007.4917 L25476.9531 -5007.4917 L25476.9531 14166.4932 L-3210.3906 14166.4932 L-3210.3906 -5007.4917 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"> - <path d="M-2272.9143 -870.0214 L2624.9143 -870.0214 L2624.9143 2403.5786 L-2272.9143 2403.5786 L-2272.9143 -870.0214 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"> - <path d="M-4965.3335 -2971.4238 L6101.5654 -2971.4238 L6101.5654 4425.4458 L-4965.3335 4425.4458 L-4965.3335 -2971.4238 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"> - <path d="M-115.8449 -11.9742 L859.1812 -11.9742 L859.1812 610.6357 L-115.8449 610.6357 L-115.8449 -11.9742 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"> - <path d="M-5811.3696 -2622.4727 L1353.5343 -2622.4727 L1353.5343 2166.3904 L-5811.3696 2166.3904 L-5811.3696 -2622.4727 Z"/> - </clipPath> - <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"> - <path d="M-5820.2856 -2624.262 L1356.8438 -2624.262 L1356.8438 2170.3445 L-5820.2856 2170.3445 L-5820.2856 -2624.262 Z"/> - </clipPath> - </defs> - <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-188,-113)" stroke="white"> - <rect x="188" width="974" height="651" y="113" clip-path="url(#clipPath2)" stroke="none"/> - </g> - <g fill="rgb(58,14,117)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke="rgb(58,14,117)"> - <rect x="203" width="258" height="88" y="280" clip-path="url(#clipPath2)" stroke="none"/> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <rect fill="none" x="203" width="258" height="88" y="280" clip-path="url(#clipPath2)"/> - <image stroke-linecap="square" x="0" y="0" transform="translate(297,283.0156) scale(0.034,0.034)" clip-path="url(#clipPath3)" width="2048" xlink:href="data:image/png;base64,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 AAAAAABgtvsfGNde7ciOsnMAAAAASUVORK5CYII=" height="1885" preserveAspectRatio="none" stroke-miterlimit="10"/> - </g> - <g stroke-linecap="butt" transform="matrix(1,0,0,1,-188,-113)" fill="white" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="white" font-weight="bold" stroke-miterlimit="1.45"> - <text x="288.1221" xml:space="preserve" y="362.1543" clip-path="url(#clipPath2)" stroke="none">Gitlab server</text> - </g> - <g fill="rgb(58,14,117)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke="rgb(58,14,117)"> - <rect x="546" width="258" height="88" y="286" clip-path="url(#clipPath2)" stroke="none"/> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <rect fill="none" x="546" width="258" height="88" y="286" clip-path="url(#clipPath2)"/> - <image stroke-linecap="square" x="0" y="0" transform="translate(640,286.0156) scale(0.1989,0.1989)" clip-path="url(#clipPath4)" width="352" xlink:href="data:image/png;base64,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 TdlknVeiwA8Jw/iC1egN/EvEVTgd+e2Df/IWo9MWrQERZgAb09TKnfzFNsuBX6Rn O6rTXhTbpdUmh0uh/RL0euWi129jbgNlmrLJOq9EgV9qDPNsmy8SS2F05NY/d0vR aUv0AjinZq4o9uf+PvXg1Jyqc1innSi2S6tNDpdC+yXo9fJFt9/GGWWZssk4P4gC PyUN81f8y8RR0B250ETgdnTaEsUATs34rdrLX2+zbF38Y1W36CVeLJciQRfVdmm1 yeFSaL8Evd62i5N+G1eUYcom2/wiCvxUk27+VjKT28e/VNwE25HfLPpIdE6nLZEM YGOWWlPkclKaDH38Hd6CLqrt0mqT2q8+3LlLy+59u9TKRbPEeji99bpdnPXbOKLs ogxTNtnmF1Hgt9pMdg7/YnETbEfep37NJn8pRqct0QzgUo83f1vd94i3oItqu7Ta VPR6XHe01ut6cdZv44iyS9lkmp9Egd8Sw5uPtH7Gv8O/XJwE25GV2vboPLHOQnTa EtUATl2ztMhcOPvV1s1vF3n9wMLrjEG7dNvEp8H0Smu9HhYn/TZuKLMou5RNpvlJ FAQh7o8u0u3Im+ki9nXr1co8+u9NRS9zal0KPYvMjk5bIhvAxo/V+mJTMOgsos7o t8tdm7zTWq8Kp9/GT7ZR2WSZ30RBUJKZ3GPyS8aDVke2/oSss/mszixSbe+6KkWn LdEN4Jyau24Hf1fLcmii3uKLTZ1Rb5fbNnmltd6Q+m2cUFYpmwwLgigISk1907HW z/o9/MvGgVZHLjCAih9fbF307yTSaUuUAzg1Z5X9n/Ntgs729dbFrs6It8t1mzzy sl6/+21cUEZRVimbDAuCKAhSbTo7lX/hOPDSkevuWMvfabtse6L9JOCF6LQl0gFs zFUbvPy5b1tntNvlvk3eeFmv3/02LiijlE12BUUUBInuJkkauXX8S0edl46sN5eq 9Vvi3RW2fwpyOm2JdgDrPV2h4FKgzii3y0ubvPC0Xp/7bRxQNgV1x1shoiBoHdJm N+uLfsa/fJR56sjGtBKzbrUuerd06rQl6gFcd6veryvbpUCdUW6XlzZ54W29/vbb qKNMomxSNpkVJFEQhmTGvI5vgCjz1pFzanahEzztlv3q0VtLH0/TaUvUA5j+3N9c 9IBqkaVgndFtl7c2ued1vX7226ijTFI2WRU0URCGRO+mGutLb+IbIaq8duSzF63n 77Zd+MMg7ei0JfoBnFMLNxa5/azYUqTOqLbLa5vc8rpeP/ttxG2iTFI2WRU0URAW 60t3TxrmX2w2RuR47cipyQ+p9/n77ZZ3V5U8nqbTlt0bNSbHLnMA192hN7jFUqTO qLbLa5vc8rxeH/ttVB3IoO7KJqPCIArCVJsxL+MbJIo8d+RS0x4eXEo/V0urLTvX l76tdeojWhfbBxXAKWOe2urmz/2idUazXd7b5I739frXb6OKMkjZZFNYREGYrOUw ayMs5Rslarx35Jyaq3mGvdT0fmfrzMyldqmFU+Vn25q5Quc6zyADWPdhj2wpUWcU 2+VHm9zwY71+9duIWkoZpGyyKSyiIGzJ4c1fT2XMD2w2TmT40ZHPvl8nOJV6f/U9 4rPtTNb75brf+rOw4K/gGb/VqoOW9ffbz7rlyzbR+seELSXqjGK7tNp0YPJ3/lkv tNZbpN3Et34bNVbmUPYom0wKkygoh1oj1yA2UIT40ZHpeJrOMVf1wdrCwZk3V23W vGFg/web1OwZ7c9Qn3v/Wu3wpV/St03m62/hyzYxFqht/DOllhJ1RrFdem16Xc2c OkuNn/Fjd6bKKxH01lu43Xm+9dtoocxRNlkUNlFQLsmMuYhvpKjwpSOXmHf20LJD zS1xPM3pn8i7P3hbbd76pnp/j8ODm0WOJfuzTXLqwa2a/5q0LiXqjGK7tNrkcdm/ dbG79RZpdwv/+m1UUNYomwwqB1FQLvmnKUf00jR/OnJO3bZR73jayhLH0+puXcU/ EshS7IkHfm0TrXraLiXq1KqvRB3a9bRditTpuC4Xi92lh1rrLdLuVn7124jYFMTT jd0SBeV0REPueGsD7bLZaGXlV0fWqsdaPlzX8jTewi5Sv97u8Nes02XflqJPPND6 LhrbJDXxHq1bXg8uJeqMYru02uRxCTKAtepROv227HZRxiib7CkXUVBuyXS23voT 4a82G69stDqgRkfWvfSr2J/+B5V4lpnXZU2JR974tk0sD29z8Od+iTqj2C6tNnlc ggxgX/ttmVCmULYom8wpJ1EQBVG7Vdm3jkwTf2seTyt08qutqU+8yT/oy7J7szye yPm3Tay6HtrCP1l4KVFnFNul1SaPS6AB7HO/LYdy3WpciiiIAms5PGWYj/ONWC7+ deScWqh5Aq3UL9BWt63Tu55Xd9m7bYXWrxg/twnNvKV1xxUtJeqMYru02uRxCTaA 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 ClAO/x/5CuZnqkxG1gAAAABJRU5ErkJggg==" height="352" preserveAspectRatio="none" stroke-miterlimit="10"/> - </g> - <g stroke-linecap="butt" transform="matrix(1,0,0,1,-188,-113)" fill="white" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="white" font-weight="bold" stroke-miterlimit="1.45"> - <text x="628.0928" xml:space="preserve" y="371.1543" clip-path="url(#clipPath2)" stroke="none">GitLab runner</text> - </g> - <g fill="rgb(130,170,10)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke="rgb(130,170,10)"> - <rect x="546" width="258" height="88" y="374" clip-path="url(#clipPath2)" stroke="none"/> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <rect fill="none" x="546" width="258" height="88" y="374" clip-path="url(#clipPath2)"/> - <image stroke-linecap="square" x="0" y="0" transform="translate(625,374.5156) scale(0.088,0.088)" clip-path="url(#clipPath5)" width="1140" xlink:href="data:image/png;base64,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 vPf+e/LvV1+R555/Vh597BG58+5Zcu3118iZ50yWCUcerP09kPM2FZX5zy+MFv5Y DK9/AAAAaBmtAaDj2VsSYoudZwwLIGSpYaMHOhMwl0yb6kzNzLn/Ppn/7DwnIFn4 wUJZ8dkK+eabb2TLli3i1dq9e7ds2LBBVn6+Uj788EPn7/b0M085gdSVV18hJ59y khNWqd8bZL1VQct/VJcuXb4jhtdDAAAANI/WANBxelu990lcuWq3YdEDDyutCMof Jp3obGV65NGH5bXXXpVPPv3EmXDZuXOnUPGqra2VjRs3OgHWO++87Uz72IHPjCum y29PPN75PqrfW2SHIivwct+yQH8xvDYCAACgaVoDQPsrLCz8z6DlPyO2qPlWXeTA Ww469ACZPuNSuW/OvfLSS/+UjxZ/5Gx/sqdTqD2v5JTP0qVL5KUFL8mDDz0gl10+ TcbVjNF+FvCkuphZdrgthtdKAAAANExrAGhfRWWBgZyT403HHHeUXP/X62Te/Gdk 0aIPZf2G9UJ1Xm3atEmWr1gur73+mjzw4P0y9ZILZcTYIdrPDZ6wqThUMMUOu8Xw ugkAAACd1gDQPoJh/y9ji5ZZhoUMXOikP/5Obvn7zfKPF/4hS5ctdcIDyv1lH968 du1a58weO3j7201/dQ6UVn++cKciK/BhsbXfEDG8hgIAACCT1gDQtnwjfP9VHAqc HVusbFEXL3CHISOjcsWVM5xDiT/++GPZtm2bUNlVmzdvcrZtPf/8c87l2Znkcb17 C0sLfy6G11QAAADEaQ0AbacoHBgeW5gsMSxW0InsS2rbV5ZasOAl+XzV55x3k4Nl H8b85Zdfyuuvv+YcwmxPZKmPE3S69cGygt926dLlu2J4fQUAAMh1WgPAnotfvYrt VW5hb7m5/Y7bnMtm24t4e1sORam1YeMG50pb99w7W3530gna4widpCzwr35WoEgM r7UAAAC5TGsAaL1YfaeozD8xtghZoy1K0GEOOGiU3HjT3+TNt950FukU1ZqyD71+ +523nQkezuHpXMWhwM6+ocA0a4T132J47QUAAMhFWgNA6/QL7+8LhgLPqgsRtL9Q dT+ZccV0+edLL8rqL1czgUO1S9mXT7envOwzeKJDy7XHIdpHcagg3Sf9wr1Hi+E1 GAAAINdoDQAtU1JS8h/BUGBybOGxTV2IoP2MOnBY/RTO5i2bhaI6srZv3y6LPlok 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 kjoFBI8qcgKJnSNWHR4Jmtvu3CLTOSyhs23nTdFS40LkpODLGn6ek1jsLF93jLm1 +TOoMscJHVdm5cqrPN5lHo+FTrQPlVelSRwub5r7v7Q81iI6p/vHHog+bs/PufZM IXNUqTNGueOEzjnXnemVpaU2R45LrR588G3m8lvWmsPWLY4Ejd2740IoMie31EkR O7aZsl0hSxU6MRNte/nll82HPvwh8Zrbw/y0yXyjvK8CAAAAADjEAADjzdTFU19Z afQ9pdyw9iaNkpl9zCwidajMiQWPG6d7LnWcvOEihwmdUHLHEzp5pQ6VO1bsWGGj yp0UVKnjxrSPEbFD5I4QOBwrbfg+gJA5OWlJHLKnYkdJ7By7doXZsGWd2X7HZpHQ sbLHfmzZ6mVRg2UubVJJ0jpc5vDzACytc/z648z2ne0VnNoihwkduix5lMxhPXMe s0uIW+HCkzmxqKFCJz6PxA2Fjj0So31Ok6233ygkjkYiZsaY2rFCZ9n6Zead77w7 eaySlE5A6Lzz/nvMBTecH/3bI9YvTWROR0InQ+wIgaOhCB3LuTecZR5v/i7dIHR+ /OMfm803b5Kvtb3LzwYbfQuN8n4KAAAAAEARAwDsDiad1Gky69CZZuT0kTilQ5I6 XOYEhI4qdgJSR4Uucc6FTQjeV6eo0CF9dfTEDj+XIoeftwQOFzz8vKDUoWInp+RJ miQHZA5l6aojzFuuOS9K7VhWXvcWc9SlR0Yfi2QOhcubEKS/jhA2eSFi57j1K8zm 2zayvjkWnsyx8obIHIbsl6PInDSh44kcm8QhOLkTf/y8a88W8iYNT+Z0KHbs8uY7 79nWljnJvt1Px/XRees7dprTrj7Fb65MhM6YxI4idHJLnYDcueq2y2VKJ1rl6oNm omzf+cfvmNPOOFm8vvYwvyg3+pca5X0UAAAAAIAjBgDYXQwMDPzGZJM6UQnWScNE 6rDUDpc8RO7MVcUOETyRuInLs7jMYSRiJ4/goVKH9tfh8kaDll+58/hjmWKHyhxV 6qQw1rROJ2VYVObwc4bttZMcU0nTidQheyFs8kCkzqJLFpnzrj7LXLt1g7ntji1e MoeWWrVWtYqTOQRV5lCBEx8HBc4jVtoQIolDhU57v+32TS1Rs1qKmzTGKnQsN9x2 jd9Hh5VeWZlz2903mxVXLPdlDmesUmc8xA6TOjvfvk2kdJ5/7iNmb2+2xOrZZz9m hudVxOtqD/NSpVE61ijvnwAAAAAAGmIAgN3JZJQ6ltlvqEYlWFEZFu+rk5HQ8aRO JG+s1InFjiOX1HH9dOLmyRH0OJ1IzNi0TpLYoZKHCR8icgr11yESJxE85FyIHE4O oSOkTkjupKAmdDTRE5A67TEndJjoyYKkdToSO7HUOWzVYUTuHGKOW3+sOffqs8yl N1xkrr7lcrN5+0az444tfipHlTlxmRWVOY+1VqSSIqclaN4TyZr7hdSJxrngaXLJ DRe2hY5DETghDl0Ty50OeuysvumiKL0kUjrvfdjcf/89UePkxWuXSIETYjeKndxy JxY6R11xtHnXw2/3pM6nX/i42Zvbj370I3PDpo3idbTH+Z9yvbTcKO+bAAAAAAAh xAAAu5uoUXKt9EHlhranmXXITNOIS7ASsWNFDRc7OSSPV4JFy7DylGS5UixF2qRC ++oUgZVg+WInh+TpROxwyaMghA4VOzmkTkvsxH11uNAJSB0NUX6VN7FDhE5HUocS 99Zxq2G1WWgOWXWIOXbdCnPu1WeaS2+82Fx7yxVm6+2bYqHDSqvcsVZaxRM5RNbw 45bsaZ/fcfdWs2ztMl/mWBRxk0XSV6eA0DnlypNaQidJ57S49x23R02ThbDJw1jL sKy8GSexc+bG083jjz9sPvLhp8wzH3rKfOFznzZ7a/u7v/umOf6k5eL1s8f5RaXW d5RR3i8BAAAAANIQAwDsCaKkTq30pHJj29NU5/ab2vGzfamTCJ1Y8BRASB2H/RgX OYSokTLtsVNE8MSrYflpnQLEgkeImxA0rUPOhbjRyEjstCQO3zO5k4IVN24vxI47 ViQOJ0npFJU6TOwIUZMX1jRZEzv++SJz7PoVZtX1K6MVs7y+OfGKVD5E2GgSh47R cquYa7ZeLkWO23dIEbFjl0l/2zvu8KTO1js3mWMuPzr6mJA1RehU6HC5o8icIlLn lrtvNM8/94z52DMfMF/5my+ZPb398pe/NO99/D3iNXMS8LNqbf/DjfI+CQAAAACQ hRgAYE8xWaWOZejwshk5c4RIHbL6lV0JS5E3IdoSx4kd1mcnh9xJZE0euUOWN3cI aROC9dYR8iYvJLXTkjcFBI+CEDk0qVNA7rRXxCoudSKxQ2VOUalD+usIYZOHTKkT 5ppbLm8nc1w6xzU51kQNT+fE54893MTuHQ+3xs+46rRY5hzi753YcSjiJo1E2uQQ O9vuvCnqLfT2++4067asikSOkz3jJXXacqcDwaNInSJJnWM2HGPe8/hD5iMffr95 8RtfM3ty++6/fddcunaVeJ2cBPx3pd5/iFHeHwEAAAAA8iAGANiTWKlTrZeeUG50 e57qQdNN/aSa7K3jljanqZ2MEqyW2Gk1UhalV1qCh9JpCZYjNa2T0luHnQtpwyEl V3TMihqZ2OHnUuJwhNDhKBKHI0ROckxKs3JSuGEyFTsxQtpk4WQOO+cCh2PLsmwp VkvmWEHDUjlK6iYSOJG0ub+5D2OXgLeyZdHqQyJE2ZVlDGLHS+qkSJ2rtl5mbrtr izlxwxvFxxyHrW0tdd4RTOp0nNpRhE5esXP5trXm0y88b/bUtmvXLvPZz33GjB4y V7w+TgJ+iqXJAQAAADBWxAAAe5poSfNJmtSpNEpm9pGDZuQsmtaJJY2QO9lix++h o6V3wiQNk0Xj5JxweROCS514TAicLKjciQSOInFCcidF9AiRU0DoeFInJHdy0lFf HSp2yLEQN0VQpQ4/X2SWXnqEuWXHDbHMcWKHSZx4LEriRNzfxkkcet7cb9i8NpE5 nLbEIceKtMlDltBZftkxZvGaJWKckyR2xpLaGavUSZE7LXkTljvPPv+M2RObbXx8 y9Yt8jVxcvCTJvON8n4IAAAAAFAEMQDA3mB0dPTXmze4Dyg3vpOCwQUDpn5q3U/r OKlDBU8OqZOIHY1E9jiJI8VOW+4c0Flyx4mdYGqHiB0udxKxU0DwiPKrEPHHrbhJ ETq63ImPrbTJKXiE0KHCpqDg6WglLCp2OpE6tASLjHGRQznrqjell1bFZVSqyBEy 553R/vQrTxUih+OJHStoknMpbvIQSuwsWZstdBKxwyVNUcaa2FFkDpU6ocTOe555 j9nd21//9ZfNUSuWitfBScL3B2v9I0Z5HwQAAAAAKIoYAGBv0dx+pdLo36rcAE8O bFrHLm9+ZkvqBPvr5BQ7nrzJSOdoFG6YTHrrJCJHXeJcgYkdIW1CEJmT7GOk0Amg iJyWzOFSRxE7ishRpQ4XOwVkTiR0uKgpktgh/XXawqaA4ClYhnXd1g2+0PH64xBx E9oTonKr1YcKgaMxXkmdROg4OaOInSKMV1KnJXR2f3+dE689yfzgRz8wu2P7yU9/ Yu592z3ytW/y8N3BWl/FKO9/AAAAAACdIAYA2NtUGqW1yo3wpGFwdLqpn9zqrdMW OnFix+LJnOweO8Fyq9A4JSm9Ys2TFQ5Qxjy5kwcqdqKUTkG5U1TsWGmTInV8wdOZ 1FEFjxU19txJmwKCZ0FELHWKiJ2g3MlJTqlz3PoV5radW9oyxwkdJ3OouAnJnPj8 qi3rzaJVh7RRRI6UOgqKtMnDWGUORciavAipowibNBSJw2nJnLbc+fSXxn/ZcpvK WX78UeL1brJQrZW+NXO4b1+jvOcBAAAAAHSKGABgIlCt9725eRP8Mr8pnjQ0SmZo WTutI8WOUpLFxI5tkJwcO4HDRU5SjhVYCes8InWKpHU4rnFyVlKHk3c1LCJwtHEh cjRyyh1P6hQow/LSOiEUgaORCJqiQodJnY7ETpOFROpocmf9ptWs+bEibEJjTR61 5VbNsfOuPiu3zNmtYocLmg4lz3j21ulI7mQIHid07njkDjNe209+8hNz71vvlq9x k4r+r1dG+v6PUd7rAAAAAADGghgAYKJQbfSf1rwZ/qW8OZ48RGmdeCUsK3O8xslJ b52A3OFSh5df5UnoULET7xO5w6WNBl3i3JVjedKGnxORw7CCJpfccSJHkT1C4vAx ReCE8EuxiNhRZE6q2LGSpqDQEWKnCKxhcqdSJ0GROssuXWq27dik98yJZQ1N51iB E/FQvG+y446bzdI1S/2EjhM7OSSPkDkWK2jcviB5V8PKIhIz4yp1OhA7isyhQmfF VceOS9nVl7/8JXPMcW8Qr2uTjBdmzpv5B0Z5jwMAAAAAGCtiAICJRLXWd2Tzhvi/ lZvkScXQERUzckZrJSzRW4eXW+XoseMJHZrQyZI8TuycW7BxspM6MZkNkzWxQ8aF wOEyhwud+FgKHQr5uJU2OUSPkDqFxA4vwSIo8kYjkjKdll9RuTNWsaOkdS7eeIGJ liUnyRuexIlkDpE4idRpcv22q6TM0cSOInMypY4TO/Q8J4euGXsp1mFU7oyFTtM6 iszxxc4S89VvftV0uv3ghz8wO3beJl7HJh2N0kcHRgd+xyjvbQAAAAAA44EYAGCi UW7sX6/USt8TN8uTjOrcfjO8YsiMnKU0TeYyhx8rtMQNWxErkjpW7gRKsIjY8YRO HqnD5I7tuZNL6lCxw8Z9mUPOqdTR9sHEjiJyUoROqtQpKnYiSZPSSDmDjuWOK8GK EbImD66/TiJ0FprDVh1mtmzfqJdWxcdO3iQQoWOF0MJVi6TI4SgiR0OIHYcibfIw HmkdJ3fGK7FTKK1j5Q3fE5567v2m6PbSSy+Zjz//nFm0ZFS8fk1CHhgaGnqFUd7T AAAAAADGCzEAwERkxpyp+zVvkL+p3DRPOmYtmmEa8RLnXhkWlzoZQscXO07okPMs 4v469rgldtKbJgup4/rq5E3rKHJHlTkUntTpVOrkEDtBuZND6rTEjiJv+HkOhLDJ Cy3FusiKnQ7lDpE851x1Jiu3IjJHSeVQjl9/bCR0HG2Jo0geK21yyB0hcyiKtMlC rIalCJu8jEnqCLGjCJw8EKGz+b7Npsj2L//yL2b9FWvF69UkZfuUKVN+1SjvZQAA AAAA44kYAGCiUp6z3580b5Q/p9w8Tz7sEudHDZqRs1plWCKpw8kQO57EEZKnjZU2 IbHjpXSKJHZiweOLG36uCx13nil2NLlTROzkEDpW3KhSxwqbolInhCJwNNoJHXpc AJHWySF3XEqHjV2z5XKZzElkzn2id449tskeKnMKiZ0cqMubu3M6lgPRW2cMqZ1I zIxF7Iyj1Dlqw9G5+uj8/Oc/N08+9aQZnleRr1OTj5fKjdJ5Rnn/AgAAAADYHYgB ACYyQ0NDv1Wtl55QbqQnJdUDp5na8bOTMiyxGhZP6fDzROjEeydxPMFD9lnpHbe8 eV6hQxomR3Imb1onUH7l9plkpnXssSJ5nNhJkTtC6FCpk1vsKImdgmInETlF5Q7r q2MRoiYvlyw0Sy9dajbfep2UObTEiiV11t+4SogcXeoEUCSOhprSoccF6VTkeFJn nFfC6ljurF9iXvyHF03a9jdf+Rtz2hkni9elScqPq/W+JUZ53wIAAAAA2F2IAQAm OitWTPm1Sr3/duWGetIyuHCGqZ/SKsNK+utQgcOlDhM6ntzh8iYSPkTa5JE6VtJY scOTOxqsYbIlt9hR5I6QNxya1KHnQuwoQoendQJyRwidDsROIm54SidD6CxQx2I5 00l/HXIuhE1Olq89xmy5dWPSN8eudCXETnz8yLvvM6dvOLW9DLoidHKJHUXgaAip Y8fGIHZaUmccGidzUVOUsUqd9UvMMy88Y7Tt3//9383mmzeJ16FJzHdn1vuHjPJ+ BQAAAACwOxEDAHQL1VppTfNG+mXl5npy0iiZoaVVuRoWFTuK1KFLmwfFDu+vkyOt kyR1soSOkzp0ifN4TMgbbYyndeKSLCFyOIrIkVInhRShI+UOkzxO7Cgih+NJnBxC J0RHDZOZ2PFFDT9Pxy5lfsVNa8ytO24S/XKc0HnkofvMth03msNWH9YWOilSR0gc jpU2OQWPEDuKrMlLJGXGKHQiqTOWpM44iJ1bH7zV0M2VVzUOmiVffyYtfX8/a2T6 VP7+BAAAAACwJxADAHQT5UZpWfOm+sfyJnvy0l4Ni/XX4XInI6njpE5L+jihU6Bp ciJ2YqlTVO7E57mTOprcOd+KnRxyh4odRfIImRNCETqZiZ0ciIROzrSORkvq5Cy/ 0hD9dQpwSSuts3rjSnPjtmu8hI6VOZartqz3ZY4TOiliJ7fcyUBIHY4ib7IYa1+d SOxYMTNWuSPETrbcOeqKo81//Nd/mF27dpkvfOHz5viTlovXm8lMud7/kZnzZv4B f18CAAAAANhTiAEAuo0Z9VK5eXP9HX6zPdmpHjTd1N44O5zW4ShCh8udCK8cSwoc AS+7yiN2tDIsLm80nNCh+6zEjpM4fCyROQWETqdip4DgEUKHSp0Cgkf22MmAlV91 JHXY8uaHrz7cnHrFSebCa883l2261Gy8eYM596ozpdDhKEInl9TJLXaY3LFyhu8z OJQLHUXUFGVMUkcIHSlwNJ768FPmyquvEK8vk55G347R0dFf5+9HAAAAAAB7EjEA QDdSq/X/UblW+ri46QZm8OAZpn5SjaV1YlFDZQ7fB2iXXsX7HOVXFF3mBJY8p2kd rdwqDSJzUoVOHoomdQpJndGWrMkpday0ScQOlTRc7mSQW+RojLW3DhM7C5O9Im80 FJmze8ROQOp0SCRmnNzpUPKMSeoUkDuHXHyIGVleE68noPTLSqP/Av4eBAAAAACw NxADAHQrUxdPfWWl3vcO5QYcNJl12EzTOLVOpI5N7BC5wwWPgiu5ah0rUieP2HGJ HSd2VMGjwPrs5CrFikQOP7eSJkXw0HIrbSwoduJxLnG0MU/uKJLHCR5F6LTFjtJf h4qdInLHiplOBU+nJVixxEmIx4S80bDiJpfYCcgdK2xyih1RdmUZg9zxEjsdSp1x kTtM6jixY3+meSeMmOpIv3gNAaX/KtdKC/h7DwAAAADA3kIMANDtVGulSytolqwT NU6umMabGn5iJxI2sdyJYKInQCJpPKmT0WfnPCJ2uNzJSSRn8q6ExYROO7GTo78O FztM7kipw1AkDkfIHC50AmLHEzqRvJmvCx1F7KgrYTmpU7QUiyCkTRFYaieX3HHy JkXuCJnDcXJHkTm5xY47zklL5ozTMudc1BTFCZ3m8UGnH2AGD5guXzeA5e/Ks0sl /n4DAAAAALA3EQMA9ALVet+S5g3495WbcmCxYmdZ1TROb5CkDknsRDKHyp4wwYRO mtQhckc0TC4qd4TYCZRmObET76PkTpbQSSOP1LHSRpE7rVROAamTA0/kOMGjyJws uKTpiCix4wRPTtHjhA6ROm15kyF3xip1coodX+jE5x1KnUjs8IbJYxA8Y0nrjJ55 kBk6eKZ8nQAR5Xrp6aGhfX+fv88AAAAAAOxtxAAAvcLQ0MBfVBqlz/Obc0AY6Y/F zkg7rZPWS0cbc2KHipq8YoemdSKRE+qxo0BKsNpSJyBzNLFDELImDZfYyVWGFZA7 TPAEEztO6vCxACKdY+lA6kRihy5zXiStE5dg2WNf2vDzADSpE++FwMlCkTqFxE4O RFrHoYibLMYicjyh46ROTrkz/5xRM3tRWb4uAMeuSq20acqUKb/K318AAAAAACYC YgCAXmJoaOi3mjflDyg36oAy0m9mHzloRs5gYoc3Tc7ssaPInGQsbqjMpQ4ROt6K WHnFjpM78fEBljSxowidbKlzoC9yFKEzXlLHShshdjJEDkeUXKWUX4UYU/kVkzpt uZNT6ihyR0ibLBShk0vqWGGTU+wEZQ49zkkkZnhipwPyCJ0F5y8ww4ur8nUAUH5U qfUdxd9TAAAAAAAmEmIAgF6kWu8/u3mD/gvlph1QbGLniFaPHbWPTg6pI8ROsg/I HCZ2/GXOcyR2aLPkNJGjQXrq5BM7KeSVOlzsKFInM62jSBwNkdTREjw5KJzSYQhR kxfST8dJndxyR5E5YbHDz2Npk0PspEodep6TscgcSkve+D12Fpw33wwfPij/7gHn K7NGpk/l7yMAAAAAABMNMQBAr1JtlOY2b9T/Vbl5BxzbYycRO0TmRHsmehS5I5I5 nuBRkjyK1LHHibRx5Vhc5sTYVE4id+z5+QcWK8XijZNVscPGXFKHnwfFjjZGUISO Kna45MmBWBGLSh5F4Gh0LHXcEudkqXMhbtKgvXXImBA4IazACQieTKlD5U4KQuo4 FGGTh/Hqq+OYf+58M7wEiZw8VOt97y6Xy7/N3z8AAAAAACYiYgCAXmZoaNqrq/X+ 5/lNPAhgxc7hFdM4jSR2uMzhY1TsRAKHyh12nBPRODkNUn7VcWInPpdSJwCXO/GY kDaa3MmR1hEihyd2MuSOSOdoyR1F4nDs6liFS7Go0FF76+TEJXXIcVvc5BA8qWKH yhx+nl/sqHLHShq37wAuZ4owetZBZvYh6JGTk/8p10sr+XsGAAAAAMBERgwA0OuM jo7+erlW2ljB0uaFmLW4bOon1aTACcgcjpA6nuzJKMdy6ZwMsZMkdajccakdbzWs FNFDpQ45FsKGw3vrkONUoUNxckeROrnljiJ0UsWOkzmFpA5ZDauT5E4sd4S0yYKV YBVK6lCxE0AIHA1F4nBUoUOPFXGTRiRocvbWsZ9/0BkHmKGFWLWqAP9cqffN4+8V AAAAAAATHTEAwGSheRM/v8n/U27uQQqDCwZM7bjZZuSseElzWpKVIXdEMoeLHS5y GGkyR4WldSKxkyZzNLGTV+hwsUPPQwJHkzkZQqcldVL66xSVOk7mFEjqtOVOh1KH pHaEtFHHAgQTOzlQhE4hqZND7qhpnQ6lTiR2UsqwFl1yiDng1Llm1vwZ4m8WpNH3 zIz6jD/l7w8AAAAAAN2AGABgMlGes9+fNG/qPyRv8kEW1QOmmdlHxStjJdJGWR0r gCd1tPSOhuitk6NpMiNJ6XiJnRzEckcIHA0trePJHUqG2EkRPCKpk1PqCLHjpM5K 0ki5gNxZcJErxSLJnQysuOGSRwibPOyGxI6VNb7cSRE9isjxpY4idiiKuMmCSp2F KxeauW9smOrcaeJvFKTyy2qj/2osSQ4AAACAbkYMADDZsDf0zZv7DU1eUm76QRZ2 Zaxl1VafHSdsqNAJiB1P5HhSR0nyaFLHEzn8PAVahsWlTURonIid+LgtcTJEjxM7 BCFyNJy8SZE6qWJHETkcKXWUfU466q/DeuwIYZMFTemQMSFuQihCR0/r8HMidDLE jip1rJxx+w6Yf+6oqb9hSP49gjx8uzLSV+PvBQAAAAAA3YYYAGCyMnN4/wObN/r/ otz8g5wMLpwhy7ECQseTOy6Zk7P0ioqdpL9OhySiJiutQ1fCEkInRepoJVhE8giJ Q8e4zEkRO6rMKSp1OGOVOkVhqR0hb0JwqdNpYkeROm2xExA6XO5kkCp23D5AVFZ1 2jwzdDD643RKuV5638x5M/+Av/4DAAAAAHQjYgCAyUy1us//KjdK7+KTAFCM6tx+ M5undpzgUYROUOrkSezEdFJ+FREndjKFjpM6VOyoaR0Fms5RxoJCh+KETi6pQ447 ETtU0tjxTsSOEzNF5c5YVsNi5Ve7R+zkQBE5QamTQ+QseMsCM+fYGsqqxsZ/V+t9 b+av+QAAAAAA3YwYAACYKdVG/2nNCcCPlEkBKEKjZGYdNtPUThg2ybLnisxJpA4v v/LEDtkH8IROHrnDy6+E1MlffpUpdbjIUcaExOEoEkdDpHXsWGGxk5HcySBJ6kRC J39vHU/qdFKGRUuvmOQR4iaEkziK3GmLm4DgceKmqNhxxBJn4cWLojTO7EMr8u8K FKPW/6XB+tTp/HUeAAAAAKDbEQMAgBaDc6a9rlrvf15MDkBH2HRBlNo5pZ7dX8em cpyoSWSOG0tZ4tyWYdF+OkVXxbJixzVLFnJHga6ElTetQyWONpaInYDgsdKGnweQ YieWNoXEDpU4JK2TV+w4SVO0FIuWXxWVOhwidAqJHUXo5E7q5JA6QuY0x2xvnJHl w0jjjA+7mmyfunjqK/nrOwAAAABALyAGAABtbMPkcr20sjkp+IUyWQAdYpc+H14x ZEbOTE/tiJ46OZM6Tu4kQudc22cnR68dl9hxyZw8UocLnngvZI1GSimWEDkhFJHD UYVODqljpU0idqjIySlzPLHjJXYKMl6Nk+NjIW2yUKROIbmTIXYWXHCwmXtCw8ya PyD+VkBnlBulf6o2+kf5azoAAAAAQC8hBgAAkpn1/qFyvfQNPmkAY8SukLWkbOqu JCskdYTQSUnpCKnjEjs5hA6TO7mTOlTmuONE6th9huBxQkcRO6lyx0kbfq4gkjpc 8qTgiR0udQrInZagKVh+RUSOPT44HhPSJg9O7CSJnYJyRxE6ucSOktY5eOVCc8Cp c83w4VX5dwHGRqP06MDIwB/y13EAAAAAgF5DDAAAdEZGXvuqSq3/lgqWN98tVOf0 m6EjKqZ+Uk2kdkS5VZLcIcInlNrxkjqxrMlThkX66xRO7LBSLCl0+LkucnJJHU3w KAiJo6HKHF/stCSOK71yY4GGygFaSZ0OxQ4bE9ImBOmlw8+FuNGw4mYsUqfJwub3 PfCMA0z9DbNMpdEv/gbAmPl+tdZ/An/tBgAAAADoVcQAACCdwVr/CNI6u5fqvGlm 9htYvx0ndzxhQ8/5xxQ0uZMGETqe2OkAIW40eFJnHIVOWO6wFbFShI4ndngZliJu 0vDETNEyLFqCVUTqcMFDj/OKHSp4AlCJEyVxTptnastmmeoIJM5uo1Z6cmho2qv5 6zUAAAAAQC8jBgAA2ewzus9vVhv9VzcnEv8jJhZgXLFyZ2hpxdRPrJk5Z7XKsrxU jlaSFcI2TY6POxI757XKsHSxo41JfInDzxWhw8SOLnfYGBU4/Dwkdqys4ecpYsdb BcuJnUjWFEvreHKnSI8dUoblzoW0CUFTOkToFJI6QuK0jxdceLCZd+ocU1s6GJUV 8msajCs/qNb7z+av0QAAAAAAkwExAADIz2Ctr2KXxFUmGWB3EPfcqR0/28w5c44v a3i/nRSsmPGkDhc4IWhiJxE4+USOR0jkaKTInUyxE5I8aWLHnjtxo4gdTiJvOkjs 2LIr/7yg1HFih40JgZMHJneK9tcZPX/UzD2xgWXG9yyPDwwP/Bl/XQYAAAAAmCyI AQBAMYaGhl5RaZTWVrAS1p6l0W9mHTbT1I6dbUbeNELETkx0nrMMy0qaTuSOEzud 9NY5v4DUoUKHSR0pdsi5S+hkiB1f6BCZk0PoSLGjJHcyBA8VO5GUcUKnE7FTJKmj CR1P6lBp458f3PzZbD+cxjGzzeBBWJ1qD4NUDgAAAACAgdABYNyYUS+Vy/XSp5XJ B9gDDB40Peq70yrNIs2TucDhUKFD93kgjZMjYWP3kdwJpHb4SljxXsgbDk/p8DEh dRSo3AlIHVXuUMGjiBxd6lChQ5opF6BjqeOJHYcicEKQ8it3bmWOPR49b9TMPWmk tTIVSqn2CtV66bEZ9Rl/yl9/AQAAAAAmI2IAANA5ze1XyrW+U8r10n/yiQjYgzRK ZtYhM83w8iHTOK2RLXZsbx2+rHkRseOEThFIUseXOm5VLD7Wljee1LEyJz72JQ4/ JwKHn6eldbjYyUGRdE4a0RLnRYQOFTuJ1FGkTRokqWPLqOadMsfU3jAr6uUkrjOw J/nXcr3/GP6aCwAAAAAwmREDAICxY/8HuTkBub/JLmViAvYwdkn0SPAcPcs0Tq6b uWcHSrHipslc1rQIjR/gr4JlEzpFS7DicytuciV2qNDhokcTOZwcYicod6y0KSJ3 FFFTVPR4sqaI4CH9dYS4UYgSOKfMMfWjhlBGNXF4qdLo3zowOvA7/HUWAAAAAGCy IwYAAONHtdE/2pyQvKhMUsDeZKTfzDp0phk+ZihaGj0keLyUTlZihzZMPs+VYCkS Jw9C6vBzJnGUcSFxuNDhYkcROi2po4gdKnUy5I4owaJCp6jUGYemyU7e2K9x4NkH mjknNMzw0kEkcCYmX5xZ7x/ir6sAAAAAAKCFGAAAjC8jI699VXNicl2lVvq5MmEB E4FGyQwuGDCzl1VN/fhhr8lybqFDxI7toePOhawJQfvruHNN5PAxntIhWFGTKXeo 4EkVO1beBJY6V0QOR5U4/DwDT9QUFDs2fTPvtLmmceywmb24EqW2xHUAJgo/tY3m V6yY8mv89RQAAAAAALQRAwCA3cOMOVP3a05SHlUmL2AiYlM8tkzrqEFTP6HWkjzn pJRdafCGyVzihKByJz5OlTpc7PB9ltRx4iZF6ASlDpU7KbTkDVsBK4KUZeWUO57M YVLHfvygcw6MSqcaKyBvupC/HBoa+Av++gkAAAAAACRiAACweykP9x1cqfd9TZnI gImOTfKMTjdDS8qmZhsun1g3c06fk57eoUubFynB4omdGCFyQlLHkVfqULnDRY+C EDo5xY4neKjIySlzKAedP2oOOGOemXNC3dSOnGVmLZwZPUfieQMTnnK99I3BRt9C /noJAAAAAADCiAEAwO5naGjoFc0JzMrmROaHfGIDuo/q3H4za9FMM3tpNRY9NTOH Jnrc8uZjkTte82RF5mSJnXhMXf1Kw8mbImLHypoCYieROKFyrOZ+9C3zzYE2cXPa HDNyXC1acWqo+VhXsWx4r/CjSr1/lX1N5K+TAAAAAAAgHTEAANhzxKthva3Jy8pE B/QA1QOmRaVbtj+PlT31N9bMyCkNM+cMm+yZJ+UNx4kcJ3WK9NahKR1F9AiJk4Yi c4TQ4WJHkTiC5tc+8NwDzbzT55o5JzeiHjeRtDmkHD12/PEEPYNdAfD+oaFpr+av iwAAAAAAIB9iAACw5xmslWY3JzfPKZMe0ONE6Z6DZ5ihJRUz/IbBlvQ5ftg0Tqqb OaeOmLlW/Jw9r5Xo4UmdPGkdDSJ7WsImIHdcQoePKVLHkztW0px/kDng7APMvDPm mrnN32PkxHpL1hw1y8xu/q6zFs5o/u4QNpOSWv+Xqo3SXP46CAAAAAAAiiEGAAB7 j+ZE54hKvf/rYgIEQBO7tLZdjWvo0LKZfUTV1I6eZerHzjaNE2pmzikNM9f287Hy RxM9NK1D0zshmeOwn29lkpMzp42YkZMapnF8zdSXz45619ifZeiwciSmsPw3SOFf m7xpypQpv8pf+wAAAAAAQHHEAABg72KX6i03+s6MJz98QgQAAN3GT8q1vqvK5fJv 89c7AAAAAADQOWIAADAxGBoa+q1Ko7S2gsbJAIDu5OXma9ijg3OmvY6/vgEAAAAA gLEjBgAAE4vynP3+pNLo29GcHP1CmTABAMBE5GPV4f2r/PUMAAAAAACMH2IAADAx mTG83583J0nbK7XSz5XJEwAA7H1sw+N63xL++gUAAAAAAMYfMQAAmNjMmDN1v2q9 /53NydNLYjIFAAB7gXK99I1qrbRiypQpv8JfswAAAAAAwO5BDAAAuoNyrfT6Sr3v 7grEDgBgL1FulP6pWu8/e3R09Nf5axQAAAAAANi9iAEAQHdRnj1tRrVeeqxiG5Aq Ey4AABh3aqXv2abtUxdPfSV/TQIAAAAAAHsGMQAA6E5sKVac2PkfMfkCAIDx4f+W G6ULR0Ze+yr+GgQAAAAAAPYsYgAA0N3YJYIrtnlyvfTfymQMAAA64TvlemnlPqP7 /CZ/zQEAAAAAAHsHMQAA6A2Ghqa9ulovbWlOxH6sTM4AACCTaq30LfTIAQAAAACY mIgBAEBvMTAy8IflWt9VzcnZv/PJGgAAqNT6v1Sul5ZPmTLlV/lrCgAAAAAAmBiI AQBAbzIwMPAb5VrfKZVG6ati8gYAAPXSrnK9/yPlRv9SLD8OAAAAADDxEQMAgN6n Uu+bV2n0PWUncMqkDgAwmaiVft7c318Znj7AXysAAAAAAMDERQwAACYP1fq0/Sto oAzAZOXfK7XSJttvi782AAAAAACAiY8YAABMPspz9vuTSr1vXXOC9x1l0gcA6Cn6 P2vLL6cunvpK/loAAAAAAAC6BzEAAJi82Aaog42+hZVG6dHmxO8lOREEAHQltqyq +XddHemfw//uAQAAAABAdyIGAADAUhnp+z/VRv/VzYng98TkEADQJfT9faVRWlur 9f8R/xsHAAAAAADdjRgAAACKLctoTgxPKtdKH6+giTIA3cDPmjxcrU9bhNWqAAAA AAB6FzEAAAAhZgzv9+f2f/ubk8VvK5NIAMBepf/r9u9zaKjvj/nfLgAAAAAA6D3E AAAAZGF77TQnj4c0eajSSgPRvP8+AAAGoUlEQVQok0sAwG6nVvpeuV7aNnOkfyb/ OwUAAAAAAL2NGAAAgCLMnDfzD6r1vvPtyjlisgkA2B38d7Veeqxa6ztyaGjoFfxv EgAAAAAATA7EAAAAdMrQ0MBflOullc0J5xeVSSgAoHN+Wa2XPmCXG6/Xp/4e/9sD AAAAAACTDzEAAADjQWV4+kC0SpZdZUdOTgEAOajWS39lJemM+ow/5X9jAAAAAABg ciMGAABgPLGr7FQbpbmVRt+O5gT1X/iEFQDg8VKT58qN0oW2CTn/ewIAAAAAAMAh BgAAYHfSTu70f12ZzAIwGbES5wWbxBkYHvgz/jcDAAAAAACAhhgAAIA9xczhvn3j njsvNNmlTHQB6FV+WGmUHi3X+t+InjgAAAAAAKATxAAAAOwNyvWpr63W+95cqfc9 U8FS6KAn6ftauV7aXG30jza3X+d/AwAAAAAAABRBDAAAwN5mZOS1rxps9C2s1Eqb bFNYOTEGoCv4aaXR91S5UTpvcM601/HrHAAAAAAAgLEgBgAAYKJRrpVeX633n21L VJqT5B8oE2cAJgIvRQKyVtpkheQ+o/v8Jr+WAQAAAAAAGC/EAAAATGSGhoZeMTjS f1Bz8nxtk09UUJ4F9h6279NfVxr9W6u1/Q8vzS39Lr9eAQAAAAAA2F2IAQAA6CZs L5KZ9f6hSqO01pa3VGyzWTnxBmA8+J9Kve8zTW6u1ktvGBrq+2N+PQIAAAAAALCn EAMAANDNRAmeWv+IFTzleunp5iT8+8rEHIA8/KhSK32weS1dYVNhzWvrt/j1BgAA AAAAwN5CDAAAQK8xOLf0mnKjf6ntbVJpLZH+38rkHUxuflmp93+9ub+/XC+ttKmv FSum/Bq/lgAAAAAAAJgoiAEAAOh1bIrHTtjt6kPNCfzbK43SV1sTejHJB71IrfTz 5v6LTd4WrUBVK8221wS/TgAAAAAAAJjIiAEAAJiM2Al9ZXj6QLVWWlFt9F8d9+P5 h0qr8a2UAqBbsCV3NpW1vVzrO8WKvKmLp76SP/8AAAAAAAB0G2IAAABAm1qt/48q 9dL8SqP/gnK9/55yrfTx5vm/KuIA7D1ebvLtJh8q10vbKrXSuc3j+eU5+/0Jfz4B AAAAAADoFcQAAACAbGzKY+Zw375Rbx67wla97+5yvf8jFaR6dhcvNfnHJs81eZtt VNzk2Orw/tWRkde+ij8/AAAAAAAA9DpiAAAAwNio16f+3v9v545V7CjjMA53knuw 2WKZc7KrO2ctzux2sYigRe5A7BJIF6xNkSaQKpALCEnqNBZ2sbEQr0AEvYoExM5v st2+i40GXtmnePif+RXD+ab8mG/eH99apq92y/buvGwejflizDfDb8OfV2xYXHfv hl+HH4eX87J9PO+398b84rPzo8Pj4+OPLj9nAAC4ziIA8OGtx4HWt0s+PZu+nJfp 63k/PXi/ibF+pHm/+X60n3f7ze/j+u0Vmx//F+t//2Ndy8U3iabnJ8vmyVjnt7v9 9pvdcvP26XJ4tG6AXX4+AADAP4sAQJf1SNHubHtwut+en5xt7ly89TM9nM+mZ2O+ npfNT/PFmz/rB4D/umJj5d9a77neez1O9stu2fww5qsxn4753W6Z7q/Hn8bvzz9Z Nifz+fTxwa2DG5fXAQAA/HciAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIAAAAA 0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAAAN0i AAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAA AADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQ LQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIA AAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAA AN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAt AgAAAADdIgAAAADQLQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAA AADQLQIAAAAA3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA 3SIAAAAA0C0CAAAAAN0iAAAAANAtAgAAAADdIgAAAADQLQIAAAAA3f4GOowsdBsl WWoAAAAASUVORK5CYII=" height="784" preserveAspectRatio="none" stroke-miterlimit="10"/> - </g> - <g stroke-linecap="butt" transform="matrix(1,0,0,1,-188,-113)" fill="white" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="white" font-weight="bold" stroke-miterlimit="1.45"> - <text x="639.1289" xml:space="preserve" y="458.6543" clip-path="url(#clipPath2)" stroke="none">Jacamar CI</text> - </g> - <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(0.9989,0,0,1.0456,115.7229,12.5202)"> - <g clip-path="url(#clipPath6)"> - <svg xml:space="preserve" opacity="1" writing-mode="lr-tb" stop-color="rgb(0, 0, 0)" shape-rendering="auto" glyph-orientation-horizontal="0deg" color-profile="auto" lighting-color="rgb(255, 255, 255)" color="rgb(0, 0, 0)" font-weight="400" alignment-baseline="auto" font-style="normal" version="1.1" color-interpolation-filters="linearrgb" text-anchor="start" stroke-linecap="butt" color-interpolation="srgb" font-variant="normal" word-spacing="normal" fill-opacity="1" text-rendering="auto" clip-path="none" text-decoration="none" letter-spacing="normal" viewBox="0 0 57 65" glyph-orientation-vertical="auto" display="inline" font-size-adjust="none" overflow="hidden" fill="rgb(0, 0, 0)" font-stretch="normal" stroke-dasharray="none" id="svg1.Ebene_1" stroke-miterlimit="4" stop-opacity="1" color-rendering="auto" font-size="12" pointer-events="visiblepainted" mask="none" direction="ltr" baseline-shift="baseline" enable-background="new 0 0 57 65" fill-rule="nonzero" image-rendering="auto" stroke-dashoffset="0" width="57px" marker-end="none" clip="auto" cursor="auto" stroke="none" filter="none" visibility="visible" kerning="auto" stroke-width="1" font-family=""Arial","Helvetica",sans-serif" flood-opacity="1" clip-rule="nonzero" src="none" height="65px" unicode-bidi="normal" stroke-linejoin="miter" stroke-opacity="1" flood-color="rgb(0, 0, 0)" dominant-baseline="auto" marker-start="none" x="0px" marker-mid="none" y="0px"> -<g> - - <linearGradient gradientTransform="matrix(1 0 0 1 0.0801 -771.6914)" x1="26.5796" x2="27.8207" gradientUnits="userSpaceOnUse" y1="796.6533" y2="826.4517" id="svg1.SVGID_1_"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#svg1.SVGID_1_)" d="M49.529,52.225c-4.396-4.396-10.951-5.884-12.063-6.109 V38.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,57.691,0.5,63.77,0.5,63.77 c0,1.937,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,63.768,54.211,56.906,49.529,52.225z" stroke-miterlimit="10" stroke="#ED9135"/> - - <radialGradient gradientTransform="matrix(1 0 0 1 0.0801 -771.6914)" gradientUnits="userSpaceOnUse" r="23.4236" cx="27.8228" id="svg1.face_x5F_white_1_" cy="798.418" fx="23.2533" fy="795.9283"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path fill="url(#svg1.face_x5F_white_1_)" id="svg1.face_x5F_white_3_" d="M43.676,24.357 c0.086,10.2-6.738,18.52-15.245,18.586c-8.504,0.068-15.468-8.146-15.554-18.344C12.794,14.4,19.618,6.079,28.123,6.012 C36.627,5.945,43.59,14.158,43.676,24.357z" stroke-miterlimit="10" stroke="#ED9135"/> - <path fill="#ECECEC" d="M20.278,14.25 c0,0,5.321,7.25,15,3.75c2.729-0.563,9.058,1.035,9.058,1.035S40.68,2.865,27.289,3.744C9.403,5.125,12.058,26.678,12.058,26.678 s2.768-0.684,5.036-4.802C18.068,20.106,20.278,14.25,20.278,14.25z" id="svg1.hair_x5F_gray_1_" stroke="#9B9B9B" stroke-linecap="round" stroke-linejoin="round"/> - - <radialGradient gradientTransform="matrix(1 0 0 1 0.0801 -771.6914)" id="svg1.collar_x5F_body_1_" r="32.4004" cx="15.1982" gradientUnits="userSpaceOnUse" cy="829.8604"> - <stop offset="0" style="stop-color:#B0E8FF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path fill="url(#svg1.collar_x5F_body_1_)" d="M0.5,63.768c0,1.938,1.575,3.494,3.523,3.494 h48.51c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.814-11.244-6.146-11.244-6.146 c-1.771,1.655-5.61,2.802-10.063,2.802c-4.453,0-8.292-1.146-10.063-2.802c0,0-5.755,0.586-11.189,6.021 C1.378,57.689,0.5,63.768,0.5,63.768z" id="svg1.collar_x5F_body_3_" stroke="#5491CF"/> - - <radialGradient gradientTransform="matrix(1 0 0 1 0.0801 -771.6914)" id="svg1.collar_x5F_r_1_" r="9.2835" cx="31.54" gradientUnits="userSpaceOnUse" cy="819.9863"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path fill="url(#svg1.collar_x5F_r_1_)" d="M38.159,42.381c0,0-0.574,2.369-3.013,4.441 c-2.108,1.795-5.783,2.072-5.783,2.072l3.974,6.217c0,0,2.957-1.637,5.009-3.848c1.922-2.072,1.37-5.479,1.37-5.479L38.159,42.381z " id="svg1.collar_x5F_r_3_" stroke="#5491CF"/> - - <radialGradient gradientTransform="matrix(1 0 0 1 0.0801 -771.6914)" id="svg1.collar_x5F_l_1_" r="9.2834" cx="19.1777" gradientUnits="userSpaceOnUse" cy="820.0273"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path fill="url(#svg1.collar_x5F_l_1_)" d="M18.63,42.422c0,0,0.576,2.369,3.012,4.441 c2.109,1.793,5.785,2.072,5.785,2.072l-3.974,6.217c0,0-2.957-1.637-5.007-3.85c-1.922-2.072-1.37-5.479-1.37-5.479L18.63,42.422z" id="svg1.collar_x5F_l_3_" stroke="#5491CF"/> -</g> -</svg> - </g> - </g> - <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)"> - <image x="889" y="638" clip-path="url(#clipPath2)" width="256" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQsAAABrCAYAAABg1qe8AACAAElEQVR4XoS9Z3si 2ZK1TZW8A0l4IwmPQBbkvUFIQg6EvJdK5V13VXd1d/UxM2fmen53vGvFJhHVc+ad D3ElJEmSkDvuWBHbYCscFGX7cE92jspSrJRk46Ak63v7kt8vSaF0KIW9Y1kvHsrc 6rZMLW7I7GJB8ltlWV7bkfwmjtkuyVhuTqKJYTk6vZGDw0tZze9J+fhOtvfOZOfg Qor75z8Y9/O8G7tHsBNZ2SzrdmnjQNa2yzKzvCnLhX3x9CUkO78mI9NLMjqL7fy6 ZGZWZXB6RQbn8rA1SfPx1JIkJ5ckMbFYs+jEklpkYkXCuWXpzy1JX3ZR+saXJTS2 JP6xRfGOLYh3FNuhaYmkJ6U/OiQdLr/EJ2bFOzIroclV8Y+uSGBkUYIjCxIaXxA/ vqsnOy8ePPeMLIlzZF5cowviwnlpvTg3rXt8Rc0B68mtSVd2TdpHl6UN1pVbV2vH Z3eMzIgb5210xaW9b1jcc1vSMrEsjom8uGa3xZ7dkO6pLemdKUr3zLb0zBbFOb8r /vl9CczBFvYkuLivFlo6kL7lkvSvlCWyWpHo2pEk1o/VUusnkt44k6HNCxnZvpLx 4o1kd68lt38rE6UbmeC2eCbblWtxh+LS4wnJSrEis9xffoFjXsrk4aNMlx9k5vCF TB++lKnD1zJVeanG57SZyqPabOXhB5vW95j36Xut9xy8lkmce6LyWoZKdzJaupVx XFdXKCu59QtJb19LrAjbupHI1nXNoluXEsP3iBSuZKBwKf0bF2p9+XO14Nqp+FeO 1QKrJxJcOZHA8rH4FiviXTjUbWClIp7FkvhWDsS5sCW+Zdj0mniG5yQYn5Ih/P6+ xW1xrBTFvrwjXct7Yl/alx781q65XXHN7Ejv3I445sy90fszva33yzG5IXbcQ95H Gh93sg2Mrah1ZNEOJlalA22F7aAN7cnYHJ7P65bWUbUutDM72ln36Jz0jM2LE22X 7SbAtj2JNor9YWz9Q1Nis/skhHaVmF6V5MwK/GBB0vCdIfhvZqEgo/g+42u7MrGx J3M7FcmuFyW3ti0LO4dSuXsljz//JrfvPsnR7T3aw7GULi5l9+xEbFvlfSkc7Mpq EQdv5GV6dU2mVtZkemVDZlYLMoEPofPOLG/L/FpRltdxPBrRwlJRllbxHB9CUMSS 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 12SEDQTRRCINYCVIaAaAMhnhd2vr0RPoMYEsI4kAQ7BQM0+7hCIbLqLgooGBJiTx hmpGQ0zGFLTNUJNQmc04UIZDMQe3T6EeQWrPJt1WQZDl2FNdwFA1o8DCzqlPX/h0 6IZbxhbYXAeVJSudpkMexBgCPZBKfNWSHStgSq9ARO5MROTMQVzWTKgLM2xcASJS ChCUkufWOhTQu4kmp+lBrjKwiCJYhFmkXg9WJcLoXTX2zInpifAJvMn6vpiFwCJZ D7SMSmxDKbhSq4kI4N8bxnMY2bIKz+45gn3XruPQ1WvYdeYCvr3+N1w4/yuOHrqM M+d+xZFLf8GC1z7F3flT+V58f3pWTxkBjmzJJ2sR35fnSK8uT++dOcsqMjvQEDX5 S6nT0HsftGupdK3iHRabMGZEI6WHVmwikpLj0dlr8Ak/a9e1/0DVW9vIePKt8Mov V0Y7xQKLylYoHuCX2eLGSmjMXpIF6YprzCYIzieoKOtS40odgmVkap2Nxnduvcf6 WizmcQMsfPhab8oFpUCVmTJALpjhsjaCqq8Kzci0uuVUYPj0Vnz84z+Qt+4ti1c5 Kqkn6PkROC12QzBUcNeK3iwNSyaUQkAdXYMYsrrgR4fACWlvrQwB9OpiZZ6xk613 x3d0BbyTqiw74yvJODqT8oXenADgO4Z/43je7zReh1EugwhIyLI+F39JrnH8W0Yr S1JpskaDkbzuGUzAGIiwhP8PsBhV5AKGsh9Kow4haAzKc6WIxTH4s1FlBhZWg0Gw MDAYkmzNik7srQjt/ZjtrlGa9SZYqGxcgOEhkxBYeA1Mu3GIaSRbLMPRlnBt1jLp MZggQfTpRCah1Wq3DFIaNJUMYzx6DB2L0Hsegf+dD6HniDS+Nt12J6hk2jZfabzc KA0gTbdR9FoGo5VwWgyjqdMaACKarPiC299f8EfDjVKh/r0eQZtHh1n3X1tSP2vS IlVTV18HesZwIrYajDT0pD2pqAJNoakEk0zKC4JQNNmH6idi1P2X7AYpA5NVUFRv +lzaXzdTEkGZCPUGaA9FzJ394NP+HmMxqtxT9F7aVrLCoWEGlFB+0NP1r5qP2S+8 h5bnN2PVW+/juU/2YdOWg9iy6yq27r6Cd7afxLot25E2dwXPP980uU8pKXe6Wy0Z MFaZk0brq1Ck3hlfh3Bq8Mi+IwgWPaw02WIAJkPowflaP0qfoGIZUCW/zrSv/qov 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" height="103" preserveAspectRatio="none"/> - <rect x="546" y="462" clip-path="url(#clipPath2)" fill="rgb(0,164,153)" width="258" height="88" stroke="none"/> - <rect stroke-linecap="butt" x="546" y="462" clip-path="url(#clipPath2)" fill="none" width="258" height="88" stroke-miterlimit="1.45"/> - </g> - <g stroke-linecap="butt" transform="matrix(1,0,0,1,-188,-113)" fill="white" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="white" font-weight="bold" stroke-miterlimit="1.45"> - <text x="637.585" xml:space="preserve" y="510.1543" clip-path="url(#clipPath2)" stroke="none">Login node</text> - </g> - <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke="white"> - <rect x="889" width="258" height="88" y="462" clip-path="url(#clipPath2)" stroke="none"/> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <rect fill="none" x="889" width="258" height="88" y="462" clip-path="url(#clipPath2)"/> - </g> - <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(0.1357,0,0,0.1358,789.8643,356.3159)"> - <g clip-path="url(#clipPath8)"> - <svg opacity="1" writing-mode="lr-tb" shape-rendering="auto" stop-color="rgb(0, 0, 0)" glyph-orientation-horizontal="0deg" color-profile="auto" lighting-color="rgb(255, 255, 255)" color="rgb(0, 0, 0)" font-weight="400" alignment-baseline="auto" font-style="normal" color-interpolation-filters="linearrgb" text-anchor="start" stroke-linecap="butt" color-interpolation="srgb" font-variant="normal" word-spacing="normal" fill-opacity="1" text-rendering="auto" clip-path="none" text-decoration="none" letter-spacing="normal" glyph-orientation-vertical="auto" display="inline" font-size-adjust="none" fill="rgb(0, 0, 0)" overflow="hidden" font-stretch="normal" stroke-dasharray="none" stroke-miterlimit="4" stop-opacity="1" color-rendering="auto" font-size="12" mask="none" direction="ltr" baseline-shift="baseline" pointer-events="visiblepainted" enable-background="accumulate" fill-rule="nonzero" image-rendering="auto" stroke-dashoffset="0" width="590" marker-end="none" clip="auto" cursor="auto" stroke="none" filter="none" visibility="visible" kerning="auto" stroke-width="1" font-family=""Arial","Helvetica",sans-serif" flood-opacity="1" clip-rule="nonzero" src="none" height="540" unicode-bidi="normal" stroke-linejoin="miter" stroke-opacity="1" flood-color="rgb(0, 0, 0)" dominant-baseline="auto" marker-start="none" marker-mid="none"> - - <path fill="#42AFEB" d="m 276.51869,1.35595 c -10.03747,0 -18.17189,8.07623 -18.17189,18.04188 l 0,0 0,34.72604 c 0,9.95864 8.13442,18.04453 18.17189,18.04453 l 0,0 36.09331,0 c 10.03749,0 18.18515,-8.08589 18.18515,-18.04453 l 0,0 0,-34.72604 c 0,-9.96565 -8.14766,-18.04188 -18.18515,-18.04188 l 0,0 -36.09331,0 z m 88.71565,54.94648 c -7.5396,0 -13.65414,6.17626 -13.65414,13.77442 l 0,0 0,26.49865 c 0,7.60607 6.11454,13.77793 13.65414,13.77793 l 0,0 27.11802,0 c 7.54048,0 13.6497,-6.17186 13.6497,-13.77793 l 0,0 0,-26.49865 c 0,-7.59816 -6.10922,-13.77442 -13.6497,-13.77442 l 0,0 -27.11802,0 z m -168.45685,0 c -7.537,0 -13.65239,6.17626 -13.65239,13.77442 l 0,0 0,26.49865 c 0,7.60607 6.11539,13.77793 13.65239,13.77793 l 0,0 27.11617,0 c 7.53607,0 13.65414,-6.17186 13.65414,-13.77793 l 0,0 0,-26.49865 c 0,-7.59816 -6.11807,-13.77442 -13.65414,-13.77442 l 0,0 -27.11617,0 z m 79.7412,30.3944 c -10.03747,0 -18.17189,8.07184 -18.17189,18.04365 l 0,0 0,34.72341 c 0,9.96391 8.13442,18.04716 18.17189,18.04716 l 0,0 36.09331,0 c 10.03749,0 18.18515,-8.08325 18.18515,-18.04716 l 0,0 0,-34.72341 c 0,-9.97181 -8.14766,-18.04365 -18.18515,-18.04365 l 0,0 -36.09331,0 z m 158.47519,16.27901 c -5.60732,0 -10.15253,4.58561 -10.15253,10.24865 l 0,0 0,19.71251 c 0,5.65072 4.54521,10.23984 10.15253,10.23984 l 0,0 20.17408,0 c 5.60384,0 10.15254,-4.58912 10.15254,-10.23984 l 0,0 0,-19.71251 c 0,-5.66304 -4.5487,-10.24865 -10.15254,-10.24865 l 0,0 -20.17408,0 z m -300.14068,0 c -5.60563,0 -10.15607,4.58561 -10.15607,10.24865 l 0,0 0,19.71251 c 0,5.65072 4.55044,10.23984 10.15607,10.23984 l 0,0 20.16783,0 c 5.6127,0 10.15786,-4.58912 10.15786,-10.23984 l 0,0 0,-19.71251 c 0,-5.66304 -4.54516,-10.24865 -10.15786,-10.24865 l 0,0 -20.16783,0 z m 230.38114,20.74687 c -7.5396,0 -13.65414,6.16658 -13.65414,13.76562 l 0,0 0,26.50744 c 0,7.59993 6.11454,13.76914 13.65414,13.76914 l 0,0 27.11802,0 c 7.54048,0 13.6497,-6.16921 13.6497,-13.76914 l 0,0 0,-26.50744 c 0,-7.59904 -6.10922,-13.76562 -13.6497,-13.76562 l 0,0 -27.11802,0 z m -168.45685,0 c -7.537,0 -13.65239,6.16658 -13.65239,13.76562 l 0,0 0,26.50744 c 0,7.59993 6.11539,13.76914 13.65239,13.76914 l 0,0 27.11617,0 c 7.53607,0 13.65414,-6.16921 13.65414,-13.76914 l 0,0 0,-26.50744 c 0,-7.59904 -6.11807,-13.76562 -13.65414,-13.76562 l 0,0 -27.11617,0 z m 238.21639,33.392 c -5.60732,0 -10.15253,4.58298 -10.15253,10.23898 l 0,0 0,19.71338 c 0,5.65162 4.54521,10.24162 10.15253,10.24162 l 0,0 20.17408,0 c 5.60384,0 10.15254,-4.59 10.15254,-10.24162 l 0,0 0,-19.71338 c 0,-5.656 -4.5487,-10.23898 -10.15254,-10.23898 l 0,0 -20.17408,0 z m -300.14068,0 c -5.60563,0 -10.15607,4.58298 -10.15607,10.23898 l 0,0 0,19.71338 c 0,5.65162 4.55044,10.24162 10.15607,10.24162 l 0,0 20.16783,0 c 5.6127,0 10.15786,-4.59 10.15786,-10.24162 l 0,0 0,-19.71338 c 0,-5.656 -4.54516,-10.23898 -10.15786,-10.23898 l 0,0 -20.16783,0 z m 141.66549,14.18043 c -10.03747,0 -18.17189,8.07973 -18.17189,18.04629 l 0,0 0,34.72603 c 0,9.96479 8.13442,18.03839 18.17189,18.03839 l 0,0 36.09331,0 c 10.03749,0 18.18515,-8.0736 18.18515,-18.03839 l 0,0 0,-34.72603 c 0,-9.96656 -8.14766,-18.04629 -18.18515,-18.04629 l 0,0 -36.09331,0 z m 218.09457,14.83601 c -4.16984,0 -7.54314,3.40801 -7.54314,7.60607 l 0,0 0,14.633 c 0,4.19806 3.3733,7.59993 7.54314,7.59993 l 0,0 14.97393,0 c 4.15747,0 7.52807,-3.40187 7.52807,-7.59993 l 0,0 0,-14.633 c 0,-4.19806 -3.3706,-7.60607 -7.52807,-7.60607 l 0,0 -14.97393,0 z m -414.175738,0 c -4.163688,0 -7.53695,3.40801 -7.53695,7.60607 l 0,0 0,14.633 c 0,4.19806 3.373262,7.59993 7.53695,7.59993 l 0,0 14.967691,0 c 4.16636,0 7.538737,-3.40187 7.538737,-7.59993 l 0,0 0,-14.633 c 0,-4.19806 -3.372377,-7.60607 -7.538737,-7.60607 l 0,0 -14.967691,0 z m 284.796818,5.02414 c -7.5396,0 -13.65414,6.16218 -13.65414,13.76298 l 0,0 0,26.50216 c 0,7.60608 6.11454,13.77353 13.65414,13.77353 l 0,0 27.11802,0 c 7.54048,0 13.6497,-6.16745 13.6497,-13.77353 l 0,0 0,-26.50216 c 0,-7.6008 -6.10922,-13.76298 -13.6497,-13.76298 l 0,0 -27.11802,0 z m -168.45685,0 c -7.537,0 -13.65239,6.16218 -13.65239,13.76298 l 0,0 0,26.50216 c 0,7.60608 6.11539,13.77353 13.65239,13.77353 l 0,0 27.11617,0 c 7.53607,0 13.65414,-6.16745 13.65414,-13.77353 l 0,0 0,-26.50216 c 0,-7.6008 -6.11807,-13.76298 -13.65414,-13.76298 l 0,0 -27.11617,0 z m 238.21639,20.50255 c -5.60732,0 -10.15253,4.59527 -10.15253,10.25655 l 0,0 0,19.70811 c 0,5.66215 4.54521,10.23985 10.15253,10.23985 l 0,0 20.17408,0 c 5.60384,0 10.15254,-4.5777 10.15254,-10.23985 l 0,0 0,-19.70811 c 0,-5.66128 -4.5487,-10.25655 -10.15254,-10.25655 l 0,0 -20.17408,0 z m -300.14068,0 c -5.60563,0 -10.15607,4.59527 -10.15607,10.25655 l 0,0 0,19.70811 c 0,5.66215 4.55044,10.23985 10.15607,10.23985 l 0,0 20.16783,0 c 5.6127,0 10.15786,-4.5777 10.15786,-10.23985 l 0,0 0,-19.70811 c 0,-5.66128 -4.54516,-10.25655 -10.15786,-10.25655 l 0,0 -20.16783,0 z m 359.76006,19.04111 c -4.16984,0 -7.54314,3.40449 -7.54314,7.60255 l 0,0 0,14.63301 c 0,4.19013 3.3733,7.60606 7.54314,7.60606 l 0,0 14.97393,0 c 4.15747,0 7.52807,-3.41593 7.52807,-7.60606 l 0,0 0,-14.63301 c 0,-4.19806 -3.3706,-7.60255 -7.52807,-7.60255 l 0,0 -14.97393,0 z m -414.175738,0 c -4.163688,0 -7.53695,3.40449 -7.53695,7.60255 l 0,0 0,14.63301 c 0,4.19013 3.373262,7.60606 7.53695,7.60606 l 0,0 14.967691,0 c 4.16636,0 7.538737,-3.41593 7.538737,-7.60606 l 0,0 0,-14.63301 c 0,-4.19806 -3.372377,-7.60255 -7.538737,-7.60255 l 0,0 -14.967691,0 z m 463.610728,14.62158 c -3.14309,0 -5.69675,2.56786 -5.69675,5.73685 l 0,0 0,11.03956 c 0,3.15931 2.55366,5.73245 5.69675,5.73245 l 0,0 11.29436,0 c 3.13078,0 5.6826,-2.57314 5.6826,-5.73245 l 0,0 0,-11.03956 c 0,-3.16899 -2.55182,-5.73685 -5.6826,-5.73685 l 0,0 -11.29436,0 z m -509.365304,0 c -3.141356,0 -5.69144,2.56786 -5.69144,5.73685 l 0,0 0,11.03956 c 0,3.15931 2.550084,5.73245 5.69144,5.73245 l 0,0 11.287287,0 c 3.142241,0 5.685242,-2.57314 5.685242,-5.73245 l 0,0 0,-11.03956 c 0,-3.16899 -2.543001,-5.73685 -5.685242,-5.73685 l 0,0 -11.287287,0 z"/> - - <path d="m 124.57183,478.1228 0,49.2138 3.98262,0 0,-16.8787 c 2.3706,1.7106 11.98199,8.5797 17.73213,12.6116 4.34295,2.8334 4.2102,3.903 4.26709,4.2671 l 5.31016,0 c 0,-2.5565 -2.89783,-3.8309 -6.16358,-6.0687 -1.98372,-1.3693 -16.68906,-11.6634 -16.68906,-11.6634 0,0 14.31846,-9.4483 16.30977,-10.81 3.25816,-2.2416 5.8791,-3.5085 5.8791,-6.0687 l -5.12051,0 c -0.0455,0.3527 0.17842,1.4299 -4.17227,4.267 -5.43911,3.8347 -14.41328,10.2297 -17.35283,12.3272 l 0,-31.1972 -3.98262,0 z m 37.36075,0 0,49.2138 3.98262,0 0,-49.2138 -3.98262,0 z m 118.9096,0 0,41.3434 0,0.095 0,0.4741 c 0.003,0.6144 -0.10226,1.7296 -0.47412,2.4654 -0.44378,0.7321 -0.61825,1.081 -1.80166,1.1379 l -19.53379,0 c -1.17582,-0.057 -1.35409,-0.4058 -1.80166,-1.1379 -0.27704,-0.55 -0.42861,-1.2782 -0.47412,-1.8965 l 0,-20.1975 0,-0.095 0,-0.3793 c -0.0121,-0.6334 0.0986,-1.8244 0.47412,-2.5603 0.44757,-0.7358 0.61446,-1.0582 1.80166,-1.1378 l 19.53379,0 0,-3.9827 -19.53379,0 c -2.69301,-0.068 -4.69949,1.722 -5.40498,3.4137 -0.78515,1.6765 -0.84204,3.3151 -0.85342,4.2671 l 0,0.6638 0,18.6803 0,0.7586 0,0.6638 0,0.6638 0.0947,0 c 0.091,0.8458 0.28068,1.9116 0.75859,2.9395 0.7055,1.6803 2.71198,3.3871 5.40499,3.3189 l 19.53379,0 0.18965,0 c 2.60577,0 4.50984,-1.6727 5.21533,-3.3189 0.77756,-1.6803 0.84963,-3.3264 0.85342,-4.2671 l 0,-0.7586 0,-41.1537 -3.98262,0 z m -178.64887,14.3185 c -2.19137,0.3156 -3.73799,1.8452 -4.361918,3.3188 -0.785145,1.6765 -0.834454,3.3189 -0.853418,4.2671 l 0,0.7586 0,26.5508 3.982616,0 0,-26.7404 0,-0.095 0,-0.4741 c -0.006,-0.6372 0.10226,-1.8282 0.47412,-2.5603 0.43999,-0.7358 0.52723,-0.971 1.70684,-1.043 l 14.79258,0 0,-3.9827 -14.79258,0 c -0.33663,-0.01 -0.63519,-0.045 -0.94824,0 z m 216.38892,0 c -2.68542,-0.068 -4.68052,1.7296 -5.40498,3.4137 -0.78135,1.6802 -0.84204,3.3226 -0.85342,4.267 l 0,0.6638 0,26.6456 4.07744,0 0,-26.8352 -0.0947,-0.095 0,-0.3793 c 0,-0.6296 0.10226,-1.8168 0.47412,-2.5603 0.4324,-0.7358 0.62584,-0.9785 1.80166,-1.043 l 15.36153,0 0,30.9127 3.98262,0 0,-30.9127 15.55118,0 c 1.17961,0.064 1.26685,0.3034 1.70683,1.043 0.36792,0.7435 0.4855,1.9307 0.47412,2.5603 l 0,0.3793 0,0.095 0,26.8352 3.98262,0 0,-26.6456 0,-0.6638 c -0.0121,-0.9444 -0.068,-2.5906 -0.85342,-4.267 -0.70549,-1.6841 -2.61335,-3.482 -5.31015,-3.4137 l -34.89533,0 z m 95.58284,0 c -2.6968,-0.065 -4.68811,1.7334 -5.40498,3.4137 -0.78135,1.6802 -0.84583,3.3226 -0.85342,4.267 l 0,0.6638 0,26.6456 4.07744,0 0,-26.8352 -0.0947,-0.095 0,-0.3793 c -0.0243,-0.6296 0.11379,-1.8168 0.47412,-2.5603 0.44378,-0.732 0.61067,-1.0696 1.80166,-1.1378 l 18.87003,0.095 c 1.19099,0.065 1.36926,0.3035 1.80166,1.0431 0.37171,0.7434 0.48929,1.9306 0.47412,2.5602 l 0,0.3793 0,0.095 0,26.8353 3.98262,0 0,-26.6456 0,-0.6638 c -0.0121,-0.9445 -0.0683,-2.5906 -0.85342,-4.2671 -0.7017,-1.6803 -2.71956,-3.4782 -5.40498,-3.4137 l -18.87003,0 z m 156.8393,0 c -2.1876,0.313 -3.74794,1.8419 -4.36192,3.3188 -0.79652,1.6765 -0.84204,3.3151 -0.85341,4.2671 l 0,0.7586 0,26.5508 3.98261,0 0,-26.7404 0,-0.095 0,-0.4741 c -0.0182,-0.641 0.0907,-1.8282 0.47413,-2.5603 0.41722,-0.7396 0.61825,-0.9748 1.80166,-1.043 l 14.79258,0 0,-3.9827 -14.79258,0 c -0.33567,-0.01 -0.73056,-0.045 -1.04307,0 z m -568.1868699,0.2843 0,26.5508 c -0.012137,0.1214 0,0.4134 0,0.7586 0.00607,0.9406 0.060991,2.5868 0.8534182,4.2671 0.6979064,1.6461 2.6095632,3.3188 5.2153334,3.3188 l 0.1896485,0 34.8004968,0 c 2.696802,0.068 4.691904,-1.6385 5.404982,-3.3188 0.781352,-1.6803 0.845832,-3.3265 0.853418,-4.2671 l 0,-0.7586 0,-26.5508 -3.982618,0 0,26.7404 0,0.095 0,0.4741 c 0.01214,0.6145 -0.109844,1.7296 -0.474121,2.4655 -0.443778,0.7358 -0.614461,1.081 -1.801661,1.1379 l -15.266703,0 0,-30.9127 -3.982618,0 0,30.9127 -15.5511758,0 c -1.1834066,-0.057 -1.3540902,-0.4021 -1.8016606,-1.1379 -0.3717111,-0.7359 -0.4855002,-1.851 -0.4741213,-2.4655 l 0,-0.4741 0,-0.095 0,-26.7404 -3.9826182,0 z m 59.5496249,0 c -2.188787,0.3041 -3.741295,1.8353 -4.361916,3.3189 -0.79273,1.6764 -0.849625,3.3226 -0.853418,4.267 l 0,0.6638 0,18.3011 0,0.7586 c 0.003,0.9406 0.06099,2.5868 0.853418,4.2671 0.690321,1.6461 2.605771,3.3188 5.215334,3.3188 l 0.189648,0 19.723443,0 c 2.693009,0.068 4.691904,-1.6385 5.404982,-3.3188 0.788938,-1.6803 0.845832,-3.3265 0.853418,-4.2671 l -0.09467,-0.6638 0,-18.3959 0.09467,-0.6638 c -0.0061,-0.9444 -0.06463,-2.5906 -0.853418,-4.267 -0.713078,-1.6955 -2.711973,-3.3948 -5.404982,-3.3189 l -19.723443,0 c -0.336148,-0.01 -0.730374,-0.043 -1.043066,0 z m 116.064875,0 c -2.19024,0.3041 -3.74129,1.8353 -4.36192,3.3189 -0.78893,1.6764 -0.93307,3.3226 -0.94824,4.267 l 0.0947,0.6638 0,18.3011 -0.0947,0.7586 c 0.0152,0.9406 0.15931,2.5868 0.94824,4.2671 0.7017,1.6461 2.59819,3.3188 5.21534,3.3188 l 0.0947,0 19.81827,0 c 2.67404,0.068 4.59708,-1.6385 5.31016,-3.3188 0.78514,-1.6803 0.84203,-3.3265 0.85341,-4.2671 l 0,-0.6638 0,-18.3959 0,-0.6638 c -0.0121,-0.9444 -0.0683,-2.5906 -0.85341,-4.267 -0.71308,-1.6955 -2.63612,-3.3948 -5.31016,-3.3189 l -19.81827,0 c -0.33615,-0.01 -0.63534,-0.043 -0.94824,0 z m 34.51602,0 0,3.9826 26.55079,0 c 1.18341,0.065 1.36547,0.3073 1.80166,1.0431 0.36792,0.7358 0.49309,1.942 0.47412,2.5602 l 0,0.4742 0,0.095 0,18.5856 0,0.095 0,0.4741 c 0.0121,0.6144 -0.1062,1.7296 -0.47412,2.4654 -0.43619,0.7358 -0.61825,1.0772 -1.80166,1.1379 l -21.24063,0 c -1.3465,-0.057 -1.44512,-0.3755 -1.80166,-0.8534 -0.30723,-0.5083 -0.47412,-1.4262 -0.47412,-1.8965 l 0,-0.2843 0,-0.095 0,-7.3015 0,-0.095 0,-0.4742 c 0,-0.6182 0.0986,-1.8206 0.47412,-2.5602 0.4324,-0.7358 0.61446,-0.9748 1.80166,-1.0431 l 21.24063,0 0,-3.9826 -21.24063,0 c -2.6968,-0.068 -4.68052,1.6386 -5.40498,3.3189 -0.78514,1.684 -0.84583,3.3188 -0.85342,4.267 l 0,0.7586 0,6.9222 0,0.569 c 0.006,0.842 0.10256,2.3592 0.94824,3.8877 0.80411,1.5514 2.77646,2.9093 5.31016,2.8448 l 21.24063,0 0.18965,0 c 2.61715,0 4.52122,-1.6765 5.21533,-3.3189 0.78515,-1.6841 0.84584,-3.3264 0.85342,-4.2671 l 0,-0.7586 0,-18.301 0,-0.6638 c -0.006,-0.9445 -0.0683,-2.5906 -0.85342,-4.2671 -0.71307,-1.6917 -2.71576,-3.3909 -5.40498,-3.3188 l -26.55079,0 z m 154.75317,0 0,3.9826 26.64561,0 c 1.16824,0.065 1.26685,0.3073 1.70684,1.0431 0.37171,0.7358 0.47412,1.9458 0.47412,2.5602 l 0,0.4742 0,0.095 0,18.5856 0,0.095 0,0.4741 c 0,0.6144 -0.10226,1.7296 -0.47412,2.4654 -0.43999,0.7358 -0.5386,1.0772 -1.70684,1.1379 l -21.33545,0 c -1.1872,-0.061 -1.35788,-0.4021 -1.80166,-1.1379 -0.36413,-0.7396 -0.47412,-1.851 -0.47412,-2.4654 l 0,-0.4741 0,-0.095 0,-6.2584 0,-0.095 0,-0.095 0,-0.3793 c -0.0121,-0.6182 0.10984,-1.8206 0.47412,-2.5602 0.44378,-0.7358 0.61446,-0.9748 1.80166,-1.0431 l 21.33545,0 0,-3.9826 -21.33545,0 c -2.68542,-0.068 -4.69191,1.6386 -5.40498,3.3189 -0.77377,1.684 -0.85342,3.3188 -0.85342,4.267 l 0,0.7586 0,5.8791 0,0.7586 c 0.006,0.9407 0.0795,2.583 0.85342,4.2671 0.71307,1.6765 2.71956,3.3871 5.40498,3.3189 l 21.33545,0 0.0947,0 c 2.60577,0 4.52122,-1.6765 5.21533,-3.3189 0.78514,-1.6841 0.84583,-3.3264 0.85342,-4.2671 l 0,-0.6637 0,-18.3959 0,-0.6638 c -0.006,-0.9482 -0.0683,-2.5868 -0.85342,-4.2671 -0.7017,-1.6917 -2.62474,-3.3909 -5.31016,-3.3188 l -26.64561,0 z m 79.93684,0 0,3.9826 26.55079,0 c 1.17582,0.065 1.36167,0.3073 1.80166,1.0431 0.37171,0.7358 0.4855,1.9458 0.47412,2.5602 l 0,0.4742 0,0.095 0,18.5856 0,0.095 0,0.4741 c 0.0121,0.6144 -0.10226,1.7296 -0.47412,2.4654 -0.43999,0.7358 -0.62584,1.0772 -1.80166,1.1379 l -21.33546,0 c -1.33512,-0.057 -1.46029,-0.3755 -1.80166,-0.8534 -0.31482,-0.5083 -0.3793,-1.4262 -0.3793,-1.8965 l 0,-0.2843 0,-0.095 0,-7.3015 0,-0.095 0,-0.095 0,-0.3793 c 0,-0.6183 0.0874,-1.8206 0.47413,-2.5603 0.4286,-0.7358 0.51963,-0.9748 1.70683,-1.043 l 21.33546,0 0,-3.9826 -21.33546,0 c -2.6968,-0.068 -4.59708,1.6385 -5.31016,3.3188 -0.78514,1.6841 -0.84583,3.3189 -0.85341,4.2671 l 0,0.7586 0,6.9222 0,0.5689 c 0,0.842 0.10225,2.3554 0.94824,3.8878 0.80031,1.5437 2.77645,2.9092 5.31016,2.8447 l 21.24063,0 0.18964,0 c 2.5944,0 4.52122,-1.6765 5.21534,-3.3188 0.78135,-1.6841 0.84583,-3.3265 0.85342,-4.2671 l 0,-0.6638 0,-18.3959 0,-0.6638 c -0.009,-0.9482 -0.0722,-2.5868 -0.85342,-4.267 -0.71687,-1.6917 -2.71956,-3.391 -5.40498,-3.3189 l -26.55079,0 z m 43.4295,0 c -2.19127,0.3116 -3.7446,1.8387 -4.36191,3.3189 -0.48171,1.0316 -0.67136,1.9988 -0.7586,2.8447 l -0.0947,0 0,0.7586 0,0.6637 0,0.6638 0,16.1201 0,0.6638 c 0.0152,0.9482 0.0719,2.4958 0.85342,4.1723 0.6979,1.6537 2.60956,3.4136 5.21533,3.4136 l 0.18965,0 20.57686,0 0,-3.9826 -20.57686,0 c -1.17582,-0.065 -1.35788,-0.402 -1.80166,-1.1379 -0.37171,-0.7358 -0.48171,-1.832 -0.47412,-2.4654 l 0,-0.4741 0,-0.095 0,-17.4477 c 0.0495,-0.622 0.2124,-1.4337 0.47412,-1.9913 0.44378,-0.732 0.62584,-0.9748 1.80166,-1.043 l 21.24063,0 c 1.1872,0.068 1.35788,0.311 1.80166,1.043 0.37171,0.7435 0.48171,1.942 0.47412,2.5603 l 0,0.4741 0,0.095 0,29.9644 0,0.095 0,0.4741 c 0.006,0.6259 -0.10256,1.8245 -0.47412,2.5603 -0.44378,0.732 -0.61446,0.9786 -1.80166,1.0431 l -19.05967,0 0,3.9826 19.05967,0 0.18965,0 c 2.60198,0 4.50984,-1.6765 5.21533,-3.3189 0.78135,-1.6878 0.83825,-3.3226 0.85342,-4.2671 l 0,-0.6637 0,-29.7748 0,-0.6638 c 0,-0.9445 -0.0722,-2.5868 -0.85342,-4.2671 -0.71687,-1.6917 -2.71197,-3.3909 -5.40498,-3.3188 l -21.24063,0 c -0.33663,-0.01 -0.73004,-0.045 -1.04307,0 z m 40.30031,0 c -2.18609,0.3066 -3.72801,1.8387 -4.36192,3.3189 -0.77377,1.6764 -0.84204,3.3226 -0.85342,4.267 l 0,0.6638 0,18.3011 0,0.7586 c 0,0.9406 0.0798,2.583 0.85342,4.2671 0.71687,1.6765 2.72335,3.3871 5.40498,3.3188 l 26.55079,0 0,-3.9826 -26.55079,0 c -1.1834,-0.061 -1.35788,-0.402 -1.80166,-1.1379 -0.36033,-0.7358 -0.48929,-1.851 -0.47412,-2.4654 l 0,-0.4741 0,-0.095 0,-18.5856 0,-0.095 0,-0.095 0,-0.3793 c -0.0152,-0.6107 0.11379,-1.8168 0.47412,-2.5603 0.44378,-0.7358 0.61826,-0.9785 1.80166,-1.043 l 21.24063,0 c 1.17582,0.065 1.35789,0.3072 1.80166,1.043 0.31861,0.6524 0.45137,1.6196 0.47412,2.2758 l 0,7.1118 0,0.095 0,0.095 0,0.1896 c 0.006,0.3869 -0.1062,1.1114 -0.37929,1.5172 -0.29191,0.3755 -0.4893,0.7055 -1.89649,0.7586 l -21.24063,0 0,4.0775 21.24063,0 0.18965,0 c 2.39716,0 4.27847,-1.21 5.12051,-2.6551 0.87238,-1.4527 0.94066,-2.9054 0.94824,-3.6982 l 0,-0.5689 0,-5.9739 0,-0.6638 c -0.006,-0.9482 -0.0683,-2.5868 -0.85342,-4.2671 -0.70549,-1.6917 -2.72335,-3.3909 -5.40498,-3.3188 l -21.24063,0 c -0.33521,-0.01 -0.73077,-0.044 -1.04306,0 z m -467.957649,3.9826 19.723443,0 c 1.172028,0.064 1.365469,0.3035 1.801661,1.0431 0.360332,0.7358 0.481707,1.942 0.474121,2.5602 l -0.09467,0.4742 0,0.095 0,18.5856 0,0.095 0.09467,0.4741 c 0.0061,0.6144 -0.113789,1.7296 -0.474121,2.4654 -0.436192,0.7358 -0.629633,1.081 -1.801661,1.1379 l -19.723443,0 c -1.179613,-0.057 -1.361676,-0.4021 -1.80166,-1.1379 -0.364125,-0.7358 -0.4855,-1.851 -0.474121,-2.4654 l 0,-0.4741 0,-0.095 0,-18.5856 0,-0.095 0,-0.4742 c -0.01214,-0.6182 0.109844,-1.8244 0.474121,-2.5602 0.439984,-0.7396 0.614461,-0.9786 1.80166,-1.0431 z m 115.970049,0 19.81827,0 c 1.17203,0.064 1.26685,0.3035 1.70684,1.0431 0.37171,0.7358 0.4817,1.942 0.47412,2.5602 l 0,0.4742 0,0.095 0,18.5856 0,0.095 0,0.4741 c 0.006,0.6144 -0.10226,1.7296 -0.47412,2.4654 -0.43999,0.7358 -0.53481,1.081 -1.70684,1.1379 l -19.81827,0 c -1.1834,-0.057 -1.26306,-0.4021 -1.70683,-1.1379 -0.36034,-0.7358 -0.4855,-1.851 -0.47413,-2.4654 l 0,-0.4741 0,-0.095 0,-18.5856 0,-0.095 0,-0.4742 c -0.0121,-0.6182 0.11379,-1.8244 0.47413,-2.5602 0.44377,-0.7396 0.52343,-0.9786 1.70683,-1.0431 z"/> - - <path d="m 581.05128,330.18773 c -4.41881,-3.55781 -12.79369,-4.35054 -17.63731,-4.50605 -2.23406,-0.0607 -3.73228,0 -3.73228,0 l -113.71703,0 c 0,0 -3.44781,-0.26551 -7.66559,0 -4.10779,0.26551 -8.94382,1.03548 -11.97061,3.09127 -7.69215,5.18499 -8.65935,13.65469 -8.65935,21.33925 l 0,97.62724 28.29555,0 0,-85.71353 c 0,-12.3006 10.53687,-10.95409 10.53687,-10.95409 l 32.84712,0 0,96.55004 26.96801,0 0,-96.55004 33.6133,0 c 9.05003,0 9.72138,7.87041 9.75173,9.63414 l 0,0.36792 0,86.66556 28.31831,0 0,-96.66762 0,-0.68653 c -0.0416,-3.01162 -0.58791,-15.08464 -6.94872,-20.19756 m -239.26433,-4.50605 c -4.11537,0.26551 -8.9514,1.03548 -11.98578,3.09127 -7.69214,5.18499 -8.64797,13.65469 -8.64797,21.33925 l 0,97.62724 28.29176,0 0,-85.71353 c 0,-12.3006 10.54066,-10.95409 10.54066,-10.95409 l 37.53523,0 0,-25.39014 -48.07589,0 c 0,0 -3.44781,-0.26551 -7.65801,0 m -72.10814,85.60353 c 0,12.29681 -10.53308,10.95789 -10.53308,10.95789 l -38.64278,0 c -9.03485,0 -9.71759,-7.88179 -9.74793,-9.65311 l 0,-0.35274 0,-86.68453 -28.30693,0 0,96.69038 0,0.68653 c 0.034,2.98886 0.58411,15.07705 6.94493,20.19377 4.41501,3.55401 12.7861,4.35054 17.62972,4.49846 2.23785,0.0719 3.73228,0 3.73228,0 l 58.92379,0 c 0,0 3.4516,0.2731 7.658,0 4.11537,-0.26186 8.94762,-1.04306 11.98199,-3.09127 7.68456,-5.19637 8.65935,-13.64331 8.65935,-21.33545 l 0,-97.64242 -28.29934,0 0,85.73249 z m -140.16541,36.33665 28.29556,0 0,-173.62698 -28.29556,0 0,173.62698 z m -25.12084,-55.71114 c 0,0 0.25792,-8.97037 -5.344292,-12.84299 -5.158439,-3.53505 -12.573695,-3.53505 -12.573695,-3.53505 l -51.527494,0 c 0,0 -7.756623,0.51964 -7.756623,-7.75662 l 0,-8.69349 c 0,0 -0.682735,-9.18278 9.178986,-9.18278 l 66.820748,0 0,-24.34707 -72.294003,0 c 0,0 -11.978198,-0.16325 -16.734582,0.96341 C 7.8652753,328.00677 1,331.23079 1,345.55305 l 0,34.55016 c 0,18.76382 17.887645,16.79527 17.887645,16.79527 l 48.030376,0 c 11.382702,0 10.574799,8.40522 10.574799,8.40522 l 0,8.3066 c 0,10.98065 -12.444733,9.23209 -12.444733,9.23209 l -64.048087,0 0,24.77947 82.963627,0 c 0,0 10.863065,0.37171 15.858406,-5.39739 5.002927,-5.76911 4.570527,-15.24016 4.570527,-15.24016 l 0,-35.07359 z"/> - - </svg> - </g> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" stroke-width="7" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <path fill="none" d="M475.0068 330 L531.9892 330" clip-path="url(#clipPath2)"/> - </g> - <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" stroke-width="7" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-188,-113)" stroke-linecap="butt"> - <path d="M461.0068 330 L482.0068 338.75 L476.7568 330 L482.0068 321.25 Z" stroke="none" clip-path="url(#clipPath2)"/> - <path d="M545.9892 330 L524.9892 321.25 L530.2392 330 L524.9892 338.75 Z" clip-path="url(#clipPath2)" stroke="none"/> - <text x="482.1659" y="304.1543" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" stroke-width="1" xml:space="preserve">https</text> - <path fill="none" d="M332 193.5125 L332 266" clip-path="url(#clipPath2)"/> - <path d="M332 280 L340.75 259 L332 264.25 L323.25 259 Z" clip-path="url(#clipPath2)" stroke="none"/> - <text x="243.2822" y="237.8964" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" stroke-width="1" xml:space="preserve">git push</text> - <path fill="none" d="M804 506 L875 506" clip-path="url(#clipPath2)"/> - <path d="M889 506 L868 497.25 L873.25 506 L868 514.75 Z" clip-path="url(#clipPath2)" stroke="none"/> - <text x="813.2773" y="480.1543" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" stroke-width="1" xml:space="preserve">Slurm API</text> - <path fill="none" d="M1017.7602 550 L1017.3571 623.971" clip-path="url(#clipPath2)"/> - <path d="M1017.2808 637.9708 L1026.1451 617.0188 L1017.3666 622.2211 L1008.6454 616.9235 Z" clip-path="url(#clipPath2)" stroke="none"/> - </g> - </g> -</svg> diff --git a/public/it4i/img/it4i-cz-128.png b/public/it4i/img/it4i-cz-128.png deleted file mode 100644 index f04763f5fcfbfaedeebc1adc5226c060d015319a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-cz-128.png and /dev/null differ diff --git a/public/it4i/img/it4i-cz-256.png b/public/it4i/img/it4i-cz-256.png deleted file mode 100644 index da9d6e39b71e234a4de82fdf9a6e22ac09ac0d34..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-cz-256.png and /dev/null differ diff --git a/public/it4i/img/it4i-cz-512.png b/public/it4i/img/it4i-cz-512.png deleted file mode 100644 index f0fb0e39aa222b5357828de77f452961cf4e4524..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-cz-512.png and /dev/null differ diff --git a/public/it4i/img/it4i-cz.png b/public/it4i/img/it4i-cz.png deleted file mode 100644 index 6fca1728ab5790ac5f3ebd88c134933c2d4abc21..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-cz.png and /dev/null differ diff --git a/public/it4i/img/it4i-en-128.png b/public/it4i/img/it4i-en-128.png deleted file mode 100644 index 53a6d50dcdeccc171482745f7c44eee42777cb64..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-en-128.png and /dev/null differ diff --git a/public/it4i/img/it4i-en-256.png b/public/it4i/img/it4i-en-256.png deleted file mode 100644 index 7d6e8cc3d2a966338308df51764db9d9b271d3f3..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-en-256.png and /dev/null differ diff --git a/public/it4i/img/it4i-en-512.png b/public/it4i/img/it4i-en-512.png deleted file mode 100644 index 29ca2c0c842f1e9bd4215dd71e1291b9f6268df9..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-en-512.png and /dev/null differ diff --git a/public/it4i/img/it4i-en.png b/public/it4i/img/it4i-en.png deleted file mode 100644 index 64f5d4e9130ad3ff6aae9833cb6c6fb34e8e0cb5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/it4i-en.png and /dev/null differ diff --git a/public/it4i/img/java_detection.jpeg b/public/it4i/img/java_detection.jpeg deleted file mode 100644 index 0c1707c03f1b27c8490efdb4bc1305aa5adbb74a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/java_detection.jpeg and /dev/null differ diff --git a/public/it4i/img/job.jpg b/public/it4i/img/job.jpg deleted file mode 100644 index 0fa7f67f008bd5ae1432e00333208b055ace62c5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/job.jpg and /dev/null differ diff --git a/public/it4i/img/job_sort_formula.png b/public/it4i/img/job_sort_formula.png deleted file mode 100644 index 6078911559aa56effb4b342fa4ffd074cfaed46f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/job_sort_formula.png and /dev/null differ diff --git a/public/it4i/img/keypairs.png b/public/it4i/img/keypairs.png deleted file mode 100644 index 8592e8ddefde27db0171e6a42df892afe5ec4c31..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/keypairs.png and /dev/null differ diff --git a/public/it4i/img/keypairs1.png b/public/it4i/img/keypairs1.png deleted file mode 100644 index 8cdcd2ea2b7a5ed8f2d828c0aeac26d12c62c4d0..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/keypairs1.png and /dev/null differ diff --git a/public/it4i/img/legend.png b/public/it4i/img/legend.png deleted file mode 100644 index 2950ff1bd7059f93195437476fa9333ec42da408..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/legend.png and /dev/null differ diff --git a/public/it4i/img/login.jpeg b/public/it4i/img/login.jpeg deleted file mode 100644 index a683564de8cf7ccd8bb24f2654fd3f2dca60bf79..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/login.jpeg and /dev/null differ diff --git a/public/it4i/img/login.png b/public/it4i/img/login.png deleted file mode 100644 index d71c648cabaec795578bdb3c73ece80153d5f6d8..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/login.png and /dev/null differ diff --git a/public/it4i/img/logingui.jpg b/public/it4i/img/logingui.jpg deleted file mode 100644 index 2a11a13f8c511c801ce67a963ee145f2dcbb6db9..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/logingui.jpg and /dev/null differ diff --git a/public/it4i/img/loginwithprofile.jpeg b/public/it4i/img/loginwithprofile.jpeg deleted file mode 100644 index 568c771e5e696085ec86ddc5fe71d2b190ff6a3f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/loginwithprofile.jpeg and /dev/null differ diff --git a/public/it4i/img/logo.png b/public/it4i/img/logo.png deleted file mode 100644 index fbb51c7f5ee2e361a0cb3ebb69a46dc23a2818fc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/logo.png and /dev/null differ diff --git a/public/it4i/img/logo2.png b/public/it4i/img/logo2.png deleted file mode 100644 index 21df7a518c1711ca1cfe5c4cb901913411acab24..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/logo2.png and /dev/null differ diff --git a/public/it4i/img/monitor_job.png b/public/it4i/img/monitor_job.png deleted file mode 100644 index ec496165d2b7b0bfe9746eac1a5e6c52a31a6a89..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/monitor_job.png and /dev/null differ diff --git a/public/it4i/img/mount.png b/public/it4i/img/mount.png deleted file mode 100644 index adf2ba62d7e81350a8e5b5b8927a5b0ab50499a0..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/mount.png and /dev/null differ diff --git a/public/it4i/img/node_gui_sshx.png b/public/it4i/img/node_gui_sshx.png deleted file mode 100644 index 267e863b2dabc1d0aad3e0f470cac4c2958fbb91..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/node_gui_sshx.png and /dev/null differ diff --git a/public/it4i/img/node_gui_xwindow.png b/public/it4i/img/node_gui_xwindow.png deleted file mode 100644 index 37401d03b3184c444ad40dab0465e4bad3539fd3..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/node_gui_xwindow.png and /dev/null differ diff --git a/public/it4i/img/ood-ansys.png b/public/it4i/img/ood-ansys.png deleted file mode 100644 index 65208203ce448bdcccbb6b463ca5c27c68e9dbb7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/ood-ansys.png and /dev/null differ diff --git a/public/it4i/img/ovito_data_pipeline.png b/public/it4i/img/ovito_data_pipeline.png deleted file mode 100644 index d4b65dd5dd0a4a94685b359155b0ed61fd8674be..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/ovito_data_pipeline.png and /dev/null differ diff --git a/public/it4i/img/paraview.png b/public/it4i/img/paraview.png deleted file mode 100644 index 21b738ac9aad725cc9f1e052ecd2ff9bc208f3c6..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview.png and /dev/null differ diff --git a/public/it4i/img/paraview1.png b/public/it4i/img/paraview1.png deleted file mode 100644 index 8e5a4704131aae4dc8cb7ec240dc30fcbda337f9..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview1.png and /dev/null differ diff --git a/public/it4i/img/paraview2.png b/public/it4i/img/paraview2.png deleted file mode 100644 index 46de3db2886e0ed6e115aecd24f6ee61550aa891..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview2.png and /dev/null differ diff --git a/public/it4i/img/paraview_connect.png b/public/it4i/img/paraview_connect.png deleted file mode 100644 index 4f05b6a7be747b08d867b594e8e4fe31331e3a91..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview_connect.png and /dev/null differ diff --git a/public/it4i/img/paraview_connect_salomon.png b/public/it4i/img/paraview_connect_salomon.png deleted file mode 100644 index 2e6b6f4e0749ced81826502ea37f3a75834e351a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview_connect_salomon.png and /dev/null differ diff --git a/public/it4i/img/paraview_ssh_tunnel.png b/public/it4i/img/paraview_ssh_tunnel.png deleted file mode 100644 index c4e75f0bcb8abc00e1b5d9f42edd4f0e53d8d416..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview_ssh_tunnel.png and /dev/null differ diff --git a/public/it4i/img/paraview_ssh_tunnel_salomon.png b/public/it4i/img/paraview_ssh_tunnel_salomon.png deleted file mode 100644 index b6dc810ed754e19c38380b01e57c2dd886e79b78..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/paraview_ssh_tunnel_salomon.png and /dev/null differ diff --git a/public/it4i/img/pdf.png b/public/it4i/img/pdf.png deleted file mode 100644 index 64fcbead36b4e6352527f37daf3b2c2d7dcc87a7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/pdf.png and /dev/null differ diff --git a/public/it4i/img/putty-tunnel.png b/public/it4i/img/putty-tunnel.png deleted file mode 100644 index e2af3200f0c1c205cfb925f266a579ba65919249..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/putty-tunnel.png and /dev/null differ diff --git a/public/it4i/img/puttygen.png b/public/it4i/img/puttygen.png deleted file mode 100644 index f31259b9cc761fc6e16104d26756693f97e96afc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/puttygen.png and /dev/null differ diff --git a/public/it4i/img/puttygenconvert.png b/public/it4i/img/puttygenconvert.png deleted file mode 100644 index 349a0c933a5e233874978a1c5e1e8b586a4d05c4..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/puttygenconvert.png and /dev/null differ diff --git a/public/it4i/img/quality1.png b/public/it4i/img/quality1.png deleted file mode 100644 index ed6304dd9c6d1acdd4f3f9e4514930d2a7853d8c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/quality1.png and /dev/null differ diff --git a/public/it4i/img/quality2.png b/public/it4i/img/quality2.png deleted file mode 100644 index 73d9b9d31f7989d9e2c409d91494f872f97b9397..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/quality2.png and /dev/null differ diff --git a/public/it4i/img/quality3.png b/public/it4i/img/quality3.png deleted file mode 100644 index be279b83580528fcaaf2171c7c10f485e06420c7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/quality3.png and /dev/null differ diff --git a/public/it4i/img/report.png b/public/it4i/img/report.png deleted file mode 100644 index d7614f04f06b8fb8b93e83225ad97e4210ea2c14..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/report.png and /dev/null differ diff --git a/public/it4i/img/rsweb.png b/public/it4i/img/rsweb.png deleted file mode 100644 index 568d23763fe2dacc3a86df3a2d4f37018bdf8399..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/rsweb.png and /dev/null differ diff --git a/public/it4i/img/rswebsalomon.png b/public/it4i/img/rswebsalomon.png deleted file mode 100644 index 40ccf2b42bc112a40e25a2fdbb8a0caeb3cf0f89..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/rswebsalomon.png and /dev/null differ diff --git a/public/it4i/img/salomon-1.jpeg b/public/it4i/img/salomon-1.jpeg deleted file mode 100644 index 4d2e1d70aeb1f40ddc0c75bc7cf0b825c1c75151..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/salomon-1.jpeg and /dev/null differ diff --git a/public/it4i/img/salomon-2.jpg b/public/it4i/img/salomon-2.jpg deleted file mode 100644 index 00283bcbb639d32788f9e1171bda7d43f8e486bc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/salomon-2.jpg and /dev/null differ diff --git a/public/it4i/img/salomon-3.jpeg b/public/it4i/img/salomon-3.jpeg deleted file mode 100644 index 1849be79392df2cfa1e14fe42b5cb435b86e89d3..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/salomon-3.jpeg and /dev/null differ diff --git a/public/it4i/img/salomon-4.jpeg b/public/it4i/img/salomon-4.jpeg deleted file mode 100644 index 2df7b232c839cf329f39fadd2407a7f7ddfd799b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/salomon-4.jpeg and /dev/null differ diff --git a/public/it4i/img/salomon.jpg b/public/it4i/img/salomon.jpg deleted file mode 100644 index 9365ab931a49eec462a6f2c24d3a86e5eaa7d9d1..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/salomon.jpg and /dev/null differ diff --git a/public/it4i/img/scheme.png b/public/it4i/img/scheme.png deleted file mode 100644 index 0f23978b92279535e42d93be79db253b03290c31..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/scheme.png and /dev/null differ diff --git a/public/it4i/img/search_icon.png b/public/it4i/img/search_icon.png deleted file mode 100644 index eb31b322f7eb54819810f5013404c6995312ec0a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/search_icon.png and /dev/null differ diff --git a/public/it4i/img/securityg.png b/public/it4i/img/securityg.png deleted file mode 100644 index 1ae4276cdff89edc857ee78764f8ff9be3e48b03..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/securityg.png and /dev/null differ diff --git a/public/it4i/img/securityg1.png b/public/it4i/img/securityg1.png deleted file mode 100644 index 3e5fa233dc073c1d5680ea322a29ea33090d1c61..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/securityg1.png and /dev/null differ diff --git a/public/it4i/img/securityg2.png b/public/it4i/img/securityg2.png deleted file mode 100644 index 085089831189743ead5993ad2eaa0105cb327175..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/securityg2.png and /dev/null differ diff --git a/public/it4i/img/sgi-c1104-gp1.jpeg b/public/it4i/img/sgi-c1104-gp1.jpeg deleted file mode 100644 index 820310be6a6cf96266bf056e6582c54b31185859..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/sgi-c1104-gp1.jpeg and /dev/null differ diff --git a/public/it4i/img/sh.png b/public/it4i/img/sh.png deleted file mode 100644 index f553447d731f19e73e3fb5819a667eda3b1254bd..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/sh.png and /dev/null differ diff --git a/public/it4i/img/ssh.jpg b/public/it4i/img/ssh.jpg deleted file mode 100644 index ee3bfb22fce23afdc485fb14b6b4ebce7fe6744f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/ssh.jpg and /dev/null differ diff --git a/public/it4i/img/sshfs.png b/public/it4i/img/sshfs.png deleted file mode 100644 index 689ea0a6838c56e39a8098cfb0bd7b25c7daa495..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/sshfs.png and /dev/null differ diff --git a/public/it4i/img/sshfs1.png b/public/it4i/img/sshfs1.png deleted file mode 100644 index b582d53506aa30f021ee4f7092c2d549db150d4a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/sshfs1.png and /dev/null differ diff --git a/public/it4i/img/sshfs2.png b/public/it4i/img/sshfs2.png deleted file mode 100644 index 8b1a43a5f7e2f3848fb7a54d7877d3332eedece7..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/sshfs2.png and /dev/null differ diff --git a/public/it4i/img/successfullconnection.jpg b/public/it4i/img/successfullconnection.jpg deleted file mode 100644 index a7e8d5b749f86f54558586158ea7a00bf666961c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/successfullconnection.jpg and /dev/null differ diff --git a/public/it4i/img/successfullinstalation.jpeg b/public/it4i/img/successfullinstalation.jpeg deleted file mode 100644 index efbf8c8571ee9a225493e6f7dac49e594cd7408a..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/successfullinstalation.jpeg and /dev/null differ diff --git a/public/it4i/img/totalview1.png b/public/it4i/img/totalview1.png deleted file mode 100644 index 09678f174b4f5d05ccda08cc11de059ee53e7e09..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/totalview1.png and /dev/null differ diff --git a/public/it4i/img/totalview2.png b/public/it4i/img/totalview2.png deleted file mode 100644 index 9d26ffd97db190a6b8161dd6358fc759ad2cb2ca..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/totalview2.png and /dev/null differ diff --git a/public/it4i/img/turbovncclientsetting.png b/public/it4i/img/turbovncclientsetting.png deleted file mode 100644 index 71a69099299012be590972e22b8120e11127426c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/turbovncclientsetting.png and /dev/null differ diff --git a/public/it4i/img/uv-2000.jpeg b/public/it4i/img/uv-2000.jpeg deleted file mode 100644 index bc6e51cde6ca191e118211763d9e42c097222eaa..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/uv-2000.jpeg and /dev/null differ diff --git a/public/it4i/img/virtualization-job-workflow.png b/public/it4i/img/virtualization-job-workflow.png deleted file mode 100644 index f5602dd43de3879f6599a84170a7156100c27302..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/virtualization-job-workflow.png and /dev/null differ diff --git a/public/it4i/img/viz1-win.png b/public/it4i/img/viz1-win.png deleted file mode 100644 index c840ae208fa0ca9e36c4932b6d43d1786782f88d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz1-win.png and /dev/null differ diff --git a/public/it4i/img/viz1.png b/public/it4i/img/viz1.png deleted file mode 100644 index 689d39c5f39fd23b3b96799f5dd5442f588e2b45..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz1.png and /dev/null differ diff --git a/public/it4i/img/viz2-win.png b/public/it4i/img/viz2-win.png deleted file mode 100644 index b77c8e74e28a00b78f97d7fa46f1536e769e4237..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz2-win.png and /dev/null differ diff --git a/public/it4i/img/viz2.png b/public/it4i/img/viz2.png deleted file mode 100644 index bb78c6d8d27cc94f764f0698497f8aa9500e0e28..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz2.png and /dev/null differ diff --git a/public/it4i/img/viz3-win.png b/public/it4i/img/viz3-win.png deleted file mode 100644 index 04824a328fd13cf62fbbc17578708e93952418a0..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz3-win.png and /dev/null differ diff --git a/public/it4i/img/viz3.png b/public/it4i/img/viz3.png deleted file mode 100644 index c83cadae7d03ab036f6e4ab3d08cce30a2d3052b..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz3.png and /dev/null differ diff --git a/public/it4i/img/viz4-win.png b/public/it4i/img/viz4-win.png deleted file mode 100644 index 8c7f9ff2f9ef9bdec3af76e4e79c3cd108777fec..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz4-win.png and /dev/null differ diff --git a/public/it4i/img/viz5-win.png b/public/it4i/img/viz5-win.png deleted file mode 100644 index b66d45a498481d8e3cd36c0c9d365863ac323216..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz5-win.png and /dev/null differ diff --git a/public/it4i/img/viz6-win.png b/public/it4i/img/viz6-win.png deleted file mode 100644 index cbf7392e4f7172867ddce17bca7f2484d54bfdc6..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz6-win.png and /dev/null differ diff --git a/public/it4i/img/viz7-win.png b/public/it4i/img/viz7-win.png deleted file mode 100644 index f98361f6c84499bb42604bc802e350cab48b788f..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/viz7-win.png and /dev/null differ diff --git a/public/it4i/img/vizsrv_5911.png b/public/it4i/img/vizsrv_5911.png deleted file mode 100644 index d9aff04fccd06c8fc5c57977fb882186dde217da..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vizsrv_5911.png and /dev/null differ diff --git a/public/it4i/img/vizsrv_logout.png b/public/it4i/img/vizsrv_logout.png deleted file mode 100644 index f89ff34252586954c0435d65ed0d277645dfe9d5..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vizsrv_logout.png and /dev/null differ diff --git a/public/it4i/img/vmware.png b/public/it4i/img/vmware.png deleted file mode 100644 index 91a42a278140116832b7872d42f6cc763981d745..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vmware.png and /dev/null differ diff --git a/public/it4i/img/vnc.jpg b/public/it4i/img/vnc.jpg deleted file mode 100644 index 7e3fd8f2be0f6bce75e528bbc17e24045db3b62d..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vnc.jpg and /dev/null differ diff --git a/public/it4i/img/vncviewer.png b/public/it4i/img/vncviewer.png deleted file mode 100644 index 78929324b4ae1156903d309e529eda10b7ccec50..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vncviewer.png and /dev/null differ diff --git a/public/it4i/img/vpnuiV.png b/public/it4i/img/vpnuiV.png deleted file mode 100644 index 076e2c4f9873d72937ecab0bb542a7690f6a70dc..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vpnuiV.png and /dev/null differ diff --git a/public/it4i/img/vtune-amplifier.png b/public/it4i/img/vtune-amplifier.png deleted file mode 100644 index 75ee99d84b87649151f22edad65de021ec348f1c..0000000000000000000000000000000000000000 Binary files a/public/it4i/img/vtune-amplifier.png and /dev/null differ diff --git a/public/it4i/irods.cyberduckprofile b/public/it4i/irods.cyberduckprofile deleted file mode 100644 index 93c44e5bc9ba5029f8ef661d76f8ee6e9518f422..0000000000000000000000000000000000000000 --- a/public/it4i/irods.cyberduckprofile +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ Copyright (c) 2002-2017 iterate GmbH. All rights reserved. - ~ https://cyberduck.io/ - ~ - ~ This program is free software; you can redistribute it and/or modify - ~ it under the terms of the GNU General Public License as published by - ~ the Free Software Foundation; either version 2 of the License, or - ~ (at your option) any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - --> - -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> - <dict> - <key>Protocol</key> - <string>irods</string> - <key>Vendor</key> - <string>it4i</string> - <key>Description</key> - <string>it4iInnovations - VSB - TU Ostrava</string> - <key>Hostname Configurable</key> - <false/> - <key>Port Configurable</key> - <false/> - <key>Default Hostname</key> - <string>irods.it4i.cz</string> - <key>Region</key> - <string>IT4I:it4iResc</string> - <key>Default Port</key> - <string>1247</string> - <key>Authorization</key> - <string>PAM</string> - </dict> -</plist> diff --git a/public/it4i/irods_environment.json b/public/it4i/irods_environment.json deleted file mode 100644 index f8fee06a3c58c522d60d6d1de9e93f4b0c66a906..0000000000000000000000000000000000000000 --- a/public/it4i/irods_environment.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "irods_host": "irods.it4i.cz", - "irods_port": 1247, - "irods_user_name": "some_user", - "irods_zone_name": "IT4I", - "irods_authentication_scheme": "pam_password", - "irods_ssl_verify_server": "cert", - "irods_ssl_ca_certificate_file": "~/.irods/chain_geant_ov_rsa_ca_4_full.pem", - "irods_encryption_algorithm": "AES-256-CBC", - "irods_encryption_key_size": 32, - "irods_encryption_num_hash_rounds": 16, - "irods_encryption_salt_size": 8 -} diff --git a/public/it4i/karolina/.gitkeep b/public/it4i/karolina/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/karolina/img/.gitkeep b/public/it4i/karolina/img/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/karolina/img/apolloproliant.png b/public/it4i/karolina/img/apolloproliant.png deleted file mode 100644 index 72c9ea3bec5498c92239720fca2b7075b7ab5a4c..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/apolloproliant.png and /dev/null differ diff --git a/public/it4i/karolina/img/compute_network_topology_v2.png b/public/it4i/karolina/img/compute_network_topology_v2.png deleted file mode 100644 index 1393236a224c907a2577311d55c48a622788e0f0..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/compute_network_topology_v2.png and /dev/null differ diff --git a/public/it4i/karolina/img/hpeapollo6500.png b/public/it4i/karolina/img/hpeapollo6500.png deleted file mode 100644 index 1f49f6d8c1b74f0fd525850f3b7b7465c79a82a4..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/hpeapollo6500.png and /dev/null differ diff --git a/public/it4i/karolina/img/proliantdl385.png b/public/it4i/karolina/img/proliantdl385.png deleted file mode 100644 index b9120def4f3391d4d4b1a5559edaa6e3187df974..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/proliantdl385.png and /dev/null differ diff --git a/public/it4i/karolina/img/qrtx6000.png b/public/it4i/karolina/img/qrtx6000.png deleted file mode 100644 index 0911ad6b26c3fe5f01c8c5a58ab2801fe78e877a..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/qrtx6000.png and /dev/null differ diff --git a/public/it4i/karolina/img/superdomeflex.png b/public/it4i/karolina/img/superdomeflex.png deleted file mode 100644 index 3287a66e8d759c540b1b6355b36285da75f7b405..0000000000000000000000000000000000000000 Binary files a/public/it4i/karolina/img/superdomeflex.png and /dev/null differ diff --git a/public/it4i/lumi/.gitkeep b/public/it4i/lumi/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/software/chemistry/files-nwchem/h2o.nw b/public/it4i/software/chemistry/files-nwchem/h2o.nw deleted file mode 100644 index cc0e3ad24a1982494636b217bbdc5fd120440eb6..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-nwchem/h2o.nw +++ /dev/null @@ -1,14 +0,0 @@ -# taken from https://nwchemgit.github.io/Sample.html -start h2o -title "Water in 6-31g basis set" - -geometry units au - O 0.00000000 0.00000000 0.00000000 - H 0.00000000 1.43042809 -1.10715266 - H 0.00000000 -1.43042809 -1.10715266 -end -basis - H library 6-31g - O library 6-31g -end -task scf diff --git a/public/it4i/software/chemistry/files-phono3py/INCAR.txt b/public/it4i/software/chemistry/files-phono3py/INCAR.txt deleted file mode 100644 index 4d2848958e6b7333abdb381bb664e1c389360741..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/INCAR.txt +++ /dev/null @@ -1,13 +0,0 @@ - PREC = Accurate - IBRION = -1 - ENCUT = 500 - EDIFF = 1.0e-08 - ISMEAR = 0 - SIGMA = 0.01 - IALGO = 38 - LREAL = .FALSE. - ADDGRID = .TRUE. - LWAVE = .FALSE. - LCHARG = .FALSE. - NCORE = 8 - KPAR = 8 diff --git a/public/it4i/software/chemistry/files-phono3py/KPOINTS.txt b/public/it4i/software/chemistry/files-phono3py/KPOINTS.txt deleted file mode 100644 index cae7400392404a4c9c4e3e7969722ed578825c51..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/KPOINTS.txt +++ /dev/null @@ -1,6 +0,0 @@ -Automatic mesh -0 -Monkhorst Pack - 3 3 3 -0.5 0.5 0.5 - diff --git a/public/it4i/software/chemistry/files-phono3py/POSCAR.txt b/public/it4i/software/chemistry/files-phono3py/POSCAR.txt deleted file mode 100644 index f72a61b992f3348c4260097c12b9bbb2bed40bc3..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/POSCAR.txt +++ /dev/null @@ -1,16 +0,0 @@ - Si - 1.0 - 5.4335600309153529 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 5.4335600309153529 0.0000000000000000 - 0.0000000000000000 0.0000000000000000 5.4335600309153529 - Si - 8 -Direct - 0.8750000000000000 0.8750000000000000 0.8750000000000000 - 0.8750000000000000 0.3750000000000000 0.3750000000000000 - 0.3750000000000000 0.8750000000000000 0.3750000000000000 - 0.3750000000000000 0.3750000000000000 0.8750000000000000 - 0.1250000000000000 0.1250000000000000 0.1250000000000000 - 0.1250000000000000 0.6250000000000000 0.6250000000000000 - 0.6250000000000000 0.1250000000000000 0.6250000000000000 - 0.6250000000000000 0.6250000000000000 0.1250000000000000 diff --git a/public/it4i/software/chemistry/files-phono3py/POTCAR.txt b/public/it4i/software/chemistry/files-phono3py/POTCAR.txt deleted file mode 100644 index e69e8a3044c2885f5fc7d2b1e1c90ba7ffef914a..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/POTCAR.txt +++ /dev/null @@ -1,2208 +0,0 @@ - PAW_PBE Si 05Jan2001 - 4.00000000000000 - parameters from PSCTR are: - VRHFIN =Si: s2p2 - LEXCH = PE - EATOM = 103.0669 eV, 7.5752 Ry - - TITEL = PAW_PBE Si 05Jan2001 - LULTRA = F use ultrasoft PP ? - IUNSCR = 1 unscreen: 0-lin 1-nonlin 2-no - RPACOR = 1.500 partial core radius - POMASS = 28.085; ZVAL = 4.000 mass and valenz - RCORE = 1.900 outmost cutoff radius - RWIGS = 2.480; RWIGS = 1.312 wigner-seitz radius (au A) - ENMAX = 245.345; ENMIN = 184.009 eV - ICORE = 2 local potential - LCOR = T correct aug charges - LPAW = T paw PP - EAUG = 322.069 - DEXC = 0.000 - RMAX = 1.950 core radius for proj-oper - RAUG = 1.300 factor for augmentation sphere - RDEP = 1.993 radius for radial grids - RDEPT = 1.837 core radius for aug-charge - - Atomic configuration - 6 entries - n l j E occ. - 1 0 0.50 -1785.8828 2.0000 - 2 0 0.50 -139.4969 2.0000 - 2 1 1.50 -95.5546 6.0000 - 3 0 0.50 -10.8127 2.0000 - 3 1 0.50 -4.0811 2.0000 - 3 2 1.50 -4.0817 0.0000 - Description - l E TYP RCUT TYP RCUT - 0 -10.8127223 23 1.900 - 0 -7.6451159 23 1.900 - 1 -4.0811372 23 1.900 - 1 2.4879257 23 1.900 - 2 -4.0817478 7 1.900 - Error from kinetic energy argument (eV) - NDATA = 100 - STEP = 20.000 1.050 - 10.1 9.04 8.56 7.65 7.23 6.44 5.73 5.40 - 4.79 4.25 4.00 3.54 3.13 2.77 2.45 2.16 - 1.91 1.69 1.50 1.24 1.10 0.975 0.812 0.718 - 0.636 0.529 0.440 0.388 0.322 0.266 0.219 0.180 - 0.148 0.121 0.986E-01 0.804E-01 0.614E-01 0.504E-01 0.392E-01 0.328E-01 - 0.265E-01 0.220E-01 0.189E-01 0.166E-01 0.149E-01 0.135E-01 0.123E-01 0.109E-01 - 0.977E-02 0.840E-02 0.707E-02 0.605E-02 0.488E-02 0.387E-02 0.290E-02 0.229E-02 - 0.185E-02 0.152E-02 0.134E-02 0.125E-02 0.121E-02 0.117E-02 0.112E-02 0.102E-02 - 0.915E-03 0.776E-03 0.640E-03 0.524E-03 0.425E-03 0.369E-03 0.331E-03 0.310E-03 - 0.294E-03 0.273E-03 0.242E-03 0.210E-03 0.175E-03 0.146E-03 0.124E-03 0.113E-03 - 0.105E-03 0.973E-04 0.879E-04 0.755E-04 0.633E-04 0.539E-04 0.478E-04 0.438E-04 - 0.404E-04 0.362E-04 0.308E-04 0.264E-04 0.229E-04 0.209E-04 0.192E-04 0.170E-04 - 0.145E-04 0.126E-04 0.112E-04 0.103E-04 -END of PSCTR-controll parameters - local part - 98.2657514061040 - 0.84157827E+01 0.84210738E+01 0.84276982E+01 0.84387529E+01 0.84542581E+01 - 0.84742396E+01 0.84987267E+01 0.85277503E+01 0.85613408E+01 0.85995259E+01 - 0.86423293E+01 0.86897698E+01 0.87418601E+01 0.87986073E+01 0.88600119E+01 - 0.89260684E+01 0.89967646E+01 0.90720817E+01 0.91519931E+01 0.92364635E+01 - 0.93254478E+01 0.94188892E+01 0.95167180E+01 0.96188495E+01 0.97251831E+01 - 0.98356006E+01 0.99499656E+01 0.10068122E+02 0.10189896E+02 0.10315092E+02 - 0.10443494E+02 0.10574869E+02 0.10708960E+02 0.10845494E+02 0.10984175E+02 - 0.11124688E+02 0.11266699E+02 0.11409854E+02 0.11553782E+02 0.11698093E+02 - 0.11842379E+02 0.11986220E+02 0.12129179E+02 0.12270807E+02 0.12410647E+02 - 0.12548229E+02 0.12683078E+02 0.12814715E+02 0.12942655E+02 0.13066413E+02 - 0.13185507E+02 0.13299453E+02 0.13407778E+02 0.13510011E+02 0.13605696E+02 - 0.13694386E+02 0.13775649E+02 0.13849071E+02 0.13914257E+02 0.13970832E+02 - 0.14018447E+02 0.14056776E+02 0.14085521E+02 0.14104413E+02 0.14113214E+02 - 0.14111717E+02 0.14099750E+02 0.14077174E+02 0.14043887E+02 0.13999823E+02 - 0.13944953E+02 0.13879287E+02 0.13802871E+02 0.13715791E+02 0.13618172E+02 - 0.13510174E+02 0.13391995E+02 0.13263871E+02 0.13126072E+02 0.12978902E+02 - 0.12822701E+02 0.12657837E+02 0.12484712E+02 0.12303752E+02 0.12115414E+02 - 0.11920177E+02 0.11718542E+02 0.11511032E+02 0.11298186E+02 0.11080557E+02 - 0.10858712E+02 0.10633228E+02 0.10404687E+02 0.10173679E+02 0.99407916E+01 - 0.97066145E+01 0.94717325E+01 0.92367246E+01 0.90021610E+01 0.87686002E+01 - 0.85365875E+01 0.83066515E+01 0.80793028E+01 0.78550311E+01 0.76343038E+01 - 0.74175639E+01 0.72052283E+01 0.69976864E+01 0.67952987E+01 0.65983955E+01 - 0.64072761E+01 0.62222079E+01 0.60434255E+01 0.58711305E+01 0.57054914E+01 - 0.55466428E+01 0.53946864E+01 0.52496904E+01 0.51116908E+01 0.49806913E+01 - 0.48566647E+01 0.47395535E+01 0.46292714E+01 0.45257040E+01 0.44287107E+01 - 0.43381259E+01 0.42537609E+01 0.41754051E+01 0.41028283E+01 0.40357824E+01 - 0.39740032E+01 0.39172126E+01 0.38651205E+01 0.38174269E+01 0.37738239E+01 - 0.37339980E+01 0.36976316E+01 0.36644057E+01 0.36340010E+01 0.36061008E+01 - 0.35803917E+01 0.35565662E+01 0.35343243E+01 0.35133744E+01 0.34934356E+01 - 0.34742386E+01 0.34555273E+01 0.34370594E+01 0.34186082E+01 0.33999625E+01 - 0.33809283E+01 0.33613289E+01 0.33410051E+01 0.33198163E+01 0.32976400E+01 - 0.32743723E+01 0.32499276E+01 0.32242386E+01 0.31972561E+01 0.31689481E+01 - 0.31393000E+01 0.31083133E+01 0.30760055E+01 0.30424088E+01 0.30075693E+01 - 0.29715464E+01 0.29344112E+01 0.28962459E+01 0.28571426E+01 0.28172018E+01 - 0.27765317E+01 0.27352466E+01 0.26934661E+01 0.26513137E+01 0.26089155E+01 - 0.25663991E+01 0.25238926E+01 0.24815235E+01 0.24394172E+01 0.23976965E+01 - 0.23564804E+01 0.23158831E+01 0.22760134E+01 0.22369739E+01 0.21988601E+01 - 0.21617599E+01 0.21257533E+01 0.20909117E+01 0.20572975E+01 0.20249639E+01 - 0.19939549E+01 0.19643047E+01 0.19360380E+01 0.19091702E+01 0.18837070E+01 - 0.18596451E+01 0.18369721E+01 0.18156671E+01 0.17957010E+01 0.17770369E+01 - 0.17596305E+01 0.17434311E+01 0.17283815E+01 0.17144192E+01 0.17014767E+01 - 0.16894823E+01 0.16783606E+01 0.16680337E+01 0.16584212E+01 0.16494414E+01 - 0.16410120E+01 0.16330503E+01 0.16254746E+01 0.16182040E+01 0.16111597E+01 - 0.16042653E+01 0.15974473E+01 0.15906355E+01 0.15837638E+01 0.15767703E+01 - 0.15695978E+01 0.15621942E+01 0.15545124E+01 0.15465111E+01 0.15381545E+01 - 0.15294125E+01 0.15202610E+01 0.15106817E+01 0.15006618E+01 0.14901946E+01 - 0.14792787E+01 0.14679181E+01 0.14561220E+01 0.14439045E+01 0.14312843E+01 - 0.14182845E+01 0.14049320E+01 0.13912573E+01 0.13772941E+01 0.13630790E+01 - 0.13486508E+01 0.13340503E+01 0.13193195E+01 0.13045019E+01 0.12896413E+01 - 0.12747816E+01 0.12599667E+01 0.12452398E+01 0.12306429E+01 0.12162169E+01 - 0.12020007E+01 0.11880315E+01 0.11743438E+01 0.11609698E+01 0.11479386E+01 - 0.11352766E+01 0.11230067E+01 0.11111486E+01 0.10997185E+01 0.10887293E+01 - 0.10781901E+01 0.10681067E+01 0.10584812E+01 0.10493126E+01 0.10405963E+01 - 0.10323245E+01 0.10244864E+01 0.10170684E+01 0.10100541E+01 0.10034245E+01 - 0.99715842E+00 0.99123278E+00 0.98562260E+00 0.98030147E+00 0.97524176E+00 - 0.97041492E+00 0.96579177E+00 0.96134272E+00 0.95703813E+00 0.95284851E+00 - 0.94874481E+00 0.94469866E+00 0.94068261E+00 0.93667036E+00 0.93263699E+00 - 0.92855911E+00 0.92441506E+00 0.92018508E+00 0.91585139E+00 0.91139837E+00 - 0.90681257E+00 0.90208284E+00 0.89720031E+00 0.89215846E+00 0.88695307E+00 - 0.88158221E+00 0.87604623E+00 0.87034764E+00 0.86449105E+00 0.85848310E+00 - 0.85233228E+00 0.84604885E+00 0.83964467E+00 0.83313304E+00 0.82652853E+00 - 0.81984678E+00 0.81310436E+00 0.80631854E+00 0.79950711E+00 0.79268821E+00 - 0.78588011E+00 0.77910103E+00 0.77236900E+00 0.76570163E+00 0.75911595E+00 - 0.75262828E+00 0.74625406E+00 0.74000769E+00 0.73390245E+00 0.72795034E+00 - 0.72216201E+00 0.71654666E+00 0.71111201E+00 0.70586419E+00 0.70080779E+00 - 0.69594576E+00 0.69127948E+00 0.68680873E+00 0.68253171E+00 0.67844512E+00 - 0.67454419E+00 0.67082277E+00 0.66727336E+00 0.66388728E+00 0.66065470E+00 - 0.65756482E+00 0.65460595E+00 0.65176565E+00 0.64903085E+00 0.64638804E+00 - 0.64382333E+00 0.64132264E+00 0.63887182E+00 0.63645681E+00 0.63406371E+00 - 0.63167898E+00 0.62928953E+00 0.62688282E+00 0.62444703E+00 0.62197109E+00 - 0.61944485E+00 0.61685909E+00 0.61420564E+00 0.61147745E+00 0.60866857E+00 - 0.60577426E+00 0.60279097E+00 0.59971637E+00 0.59654936E+00 0.59329001E+00 - 0.58993961E+00 0.58650059E+00 0.58297648E+00 0.57937187E+00 0.57569237E+00 - 0.57194448E+00 0.56813556E+00 0.56427372E+00 0.56036773E+00 0.55642691E+00 - 0.55246106E+00 0.54848032E+00 0.54449508E+00 0.54051586E+00 0.53655323E+00 - 0.53261770E+00 0.52871958E+00 0.52486894E+00 0.52107546E+00 0.51734836E+00 - 0.51369633E+00 0.51012743E+00 0.50664899E+00 0.50326761E+00 0.49998904E+00 - 0.49681819E+00 0.49375905E+00 0.49081466E+00 0.48798714E+00 0.48527765E+00 - 0.48268635E+00 0.48021249E+00 0.47785436E+00 0.47560937E+00 0.47347400E+00 - 0.47144395E+00 0.46951410E+00 0.46767862E+00 0.46593101E+00 0.46426418E+00 - 0.46267051E+00 0.46114196E+00 0.45967012E+00 0.45824631E+00 0.45686165E+00 - 0.45550718E+00 0.45417389E+00 0.45285284E+00 0.45153526E+00 0.45021257E+00 - 0.44887651E+00 0.44751921E+00 0.44613322E+00 0.44471163E+00 0.44324809E+00 - 0.44173687E+00 0.44017292E+00 0.43855189E+00 0.43687018E+00 0.43512494E+00 - 0.43331410E+00 0.43143638E+00 0.42949128E+00 0.42747908E+00 0.42540083E+00 - 0.42325834E+00 0.42105410E+00 0.41879135E+00 0.41647393E+00 0.41410629E+00 - 0.41169346E+00 0.40924092E+00 0.40675463E+00 0.40424087E+00 0.40170626E+00 - 0.39915764E+00 0.39660202E+00 0.39404651E+00 0.39149826E+00 0.38896435E+00 - 0.38645179E+00 0.38396739E+00 0.38151775E+00 0.37910915E+00 0.37674752E+00 - 0.37443839E+00 0.37218682E+00 0.36999739E+00 0.36787410E+00 0.36582042E+00 - 0.36383920E+00 0.36193268E+00 0.36010247E+00 0.35834954E+00 0.35667423E+00 - 0.35507622E+00 0.35355459E+00 0.35210779E+00 0.35073369E+00 0.34942958E+00 - 0.34819223E+00 0.34701790E+00 0.34590241E+00 0.34484115E+00 0.34382917E+00 - 0.34286120E+00 0.34193171E+00 0.34103498E+00 0.34016513E+00 0.33931621E+00 - 0.33848221E+00 0.33765717E+00 0.33683518E+00 0.33601049E+00 0.33517751E+00 - 0.33433089E+00 0.33346559E+00 0.33257685E+00 0.33166032E+00 0.33071204E+00 - 0.32972848E+00 0.32870659E+00 0.32764378E+00 0.32653800E+00 0.32538767E+00 - 0.32419176E+00 0.32294975E+00 0.32166166E+00 0.32032801E+00 0.31894983E+00 - 0.31752862E+00 0.31606638E+00 0.31456552E+00 0.31302889E+00 0.31145970E+00 - 0.30986149E+00 0.30823814E+00 0.30659375E+00 0.30493266E+00 0.30325937E+00 - 0.30157850E+00 0.29989478E+00 0.29821295E+00 0.29653774E+00 0.29487384E+00 - 0.29322581E+00 0.29159810E+00 0.28999494E+00 0.28842037E+00 0.28687815E+00 - 0.28537173E+00 0.28390425E+00 0.28247850E+00 0.28109688E+00 0.27976142E+00 - 0.27847372E+00 0.27723499E+00 0.27604598E+00 0.27490705E+00 0.27381811E+00 - 0.27277867E+00 0.27178782E+00 0.27084424E+00 0.26994624E+00 0.26909178E+00 - 0.26827846E+00 0.26750359E+00 0.26676420E+00 0.26605705E+00 0.26537872E+00 - 0.26472559E+00 0.26409390E+00 0.26347982E+00 0.26287940E+00 0.26228871E+00 - 0.26170380E+00 0.26112078E+00 0.26053582E+00 0.25994525E+00 0.25934552E+00 - 0.25873328E+00 0.25810539E+00 0.25745897E+00 0.25679138E+00 0.25610030E+00 - 0.25538370E+00 0.25463989E+00 0.25386749E+00 0.25306548E+00 0.25223319E+00 - 0.25137030E+00 0.25047681E+00 0.24955311E+00 0.24859991E+00 0.24761822E+00 - 0.24660941E+00 0.24557510E+00 0.24451722E+00 0.24343793E+00 0.24233963E+00 - 0.24122491E+00 0.24009654E+00 0.23895742E+00 0.23781058E+00 0.23665912E+00 - 0.23550619E+00 0.23435497E+00 0.23320861E+00 0.23207023E+00 0.23094290E+00 - 0.22982954E+00 0.22873298E+00 0.22765588E+00 0.22660071E+00 0.22556975E+00 - 0.22456503E+00 0.22358838E+00 0.22264133E+00 0.22172517E+00 0.22084090E+00 - 0.21998924E+00 0.21917062E+00 0.21838518E+00 0.21763278E+00 0.21691298E+00 - 0.21622507E+00 0.21556808E+00 0.21494076E+00 0.21434166E+00 0.21376905E+00 - 0.21322105E+00 0.21269556E+00 0.21219033E+00 0.21170298E+00 0.21123101E+00 - 0.21077184E+00 0.21032282E+00 0.20988128E+00 0.20944453E+00 0.20900989E+00 - 0.20857473E+00 0.20813650E+00 0.20769272E+00 0.20724104E+00 0.20677924E+00 - 0.20630528E+00 0.20581727E+00 0.20531352E+00 0.20479256E+00 0.20425312E+00 - 0.20369419E+00 0.20311496E+00 0.20251488E+00 0.20189363E+00 0.20125114E+00 - 0.20058759E+00 0.19990339E+00 0.19919917E+00 0.19847580E+00 0.19773436E+00 - 0.19697612E+00 0.19620254E+00 0.19541525E+00 0.19461602E+00 0.19380675E+00 - 0.19298946E+00 0.19216623E+00 0.19133925E+00 0.19051071E+00 0.18968285E+00 - 0.18885789E+00 0.18803806E+00 0.18722550E+00 0.18642234E+00 0.18563058E+00 - 0.18485213E+00 0.18408879E+00 0.18334221E+00 0.18261386E+00 0.18190508E+00 - 0.18121702E+00 0.18055061E+00 0.17990663E+00 0.17928561E+00 0.17868791E+00 - 0.17811368E+00 0.17756283E+00 0.17703511E+00 0.17653003E+00 0.17604693E+00 - 0.17558494E+00 0.17514305E+00 0.17472004E+00 0.17431456E+00 0.17392512E+00 - 0.17355012E+00 0.17318784E+00 0.17283649E+00 0.17249419E+00 0.17215904E+00 - 0.17182910E+00 0.17150240E+00 0.17117700E+00 0.17085099E+00 0.17052249E+00 - 0.17018968E+00 0.16985083E+00 0.16950432E+00 0.16914863E+00 0.16878235E+00 - 0.16840425E+00 0.16801322E+00 0.16760831E+00 0.16718876E+00 0.16675395E+00 - 0.16630348E+00 0.16583708E+00 0.16535470E+00 0.16485644E+00 0.16434260E+00 - 0.16381364E+00 0.16327019E+00 0.16271304E+00 0.16214313E+00 0.16156154E+00 - 0.16096948E+00 0.16036827E+00 0.15975933E+00 0.15914418E+00 0.15852437E+00 - 0.15790155E+00 0.15727738E+00 0.15665353E+00 0.15603169E+00 0.15541354E+00 - 0.15480073E+00 0.15419485E+00 0.15359745E+00 0.15300998E+00 0.15243381E+00 - 0.15187022E+00 0.15132035E+00 0.15078523E+00 0.15026574E+00 0.14976264E+00 - 0.14927652E+00 0.14880782E+00 0.14835684E+00 0.14792369E+00 0.14750835E+00 - 0.14711063E+00 0.14673020E+00 0.14636656E+00 0.14601907E+00 0.14568697E+00 - 0.14536935E+00 0.14506518E+00 0.14477334E+00 0.14449260E+00 0.14422166E+00 - 0.14395913E+00 0.14370359E+00 0.14345355E+00 0.14320753E+00 0.14296401E+00 - 0.14272149E+00 0.14247846E+00 0.14223347E+00 0.14198509E+00 0.14173199E+00 - 0.14147286E+00 0.14120650E+00 0.14093181E+00 0.14064779E+00 0.14035355E+00 - 0.14004833E+00 0.13973149E+00 0.13940254E+00 0.13906109E+00 0.13870694E+00 - 0.13833999E+00 0.13796029E+00 0.13756804E+00 0.13716357E+00 0.13674733E+00 - 0.13631991E+00 0.13588203E+00 0.13543449E+00 0.13497823E+00 0.13451425E+00 - 0.13404367E+00 0.13356764E+00 0.13308739E+00 0.13260420E+00 0.13211936E+00 - 0.13163422E+00 0.13115008E+00 0.13066829E+00 0.13019015E+00 0.12971693E+00 - 0.12924988E+00 0.12879016E+00 0.12833890E+00 0.12789711E+00 0.12746576E+00 - 0.12704568E+00 0.12663761E+00 0.12624221E+00 0.12585997E+00 0.12549131E+00 - 0.12513650E+00 0.12479568E+00 0.12446890E+00 0.12415605E+00 0.12385692E+00 - 0.12357117E+00 0.12329835E+00 0.12303789E+00 0.12278912E+00 0.12255128E+00 - 0.12232351E+00 0.12210488E+00 0.12189437E+00 0.12169094E+00 0.12149345E+00 - 0.12130077E+00 0.12111171E+00 0.12092509E+00 0.12073970E+00 0.12055436E+00 - 0.12036791E+00 0.12017920E+00 0.11998713E+00 0.11979067E+00 0.11958882E+00 - 0.11938067E+00 0.11916539E+00 0.11894223E+00 0.11871054E+00 0.11846977E+00 - 0.11821946E+00 0.11795928E+00 0.11768898E+00 0.11740846E+00 0.11711769E+00 - 0.11681676E+00 0.11650590E+00 0.11618540E+00 0.11585569E+00 0.11551727E+00 - 0.11517075E+00 0.11481682E+00 0.11445624E+00 0.11408986E+00 0.11371856E+00 - 0.11334329E+00 0.11296505E+00 0.11258484E+00 0.11220371E+00 0.11182270E+00 - 0.11144287E+00 0.11106526E+00 0.11069088E+00 0.11032073E+00 0.10995575E+00 - 0.10959686E+00 0.10924489E+00 0.10890064E+00 0.10856481E+00 0.10823802E+00 - 0.10792083E+00 0.10761369E+00 0.10731697E+00 0.10703093E+00 0.10675575E+00 - 0.10649150E+00 0.10623816E+00 0.10599560E+00 0.10576362E+00 0.10554191E+00 - 0.10533006E+00 0.10512760E+00 0.10493397E+00 0.10474853E+00 0.10457057E+00 - 0.10439934E+00 0.10423403E+00 0.10407377E+00 0.10391769E+00 0.10376486E+00 - 0.10361436E+00 0.10346525E+00 0.10331660E+00 0.10316749E+00 0.10301700E+00 - 0.10286427E+00 0.10270845E+00 0.10254875E+00 0.10238443E+00 0.10221481E+00 - 0.10203926E+00 0.10185725E+00 0.10166830E+00 0.10147204E+00 0.10126815E+00 - 0.10105642E+00 0.10083671E+00 0.10060898E+00 0.10037327E+00 0.10012971E+00 - 0.99878499E-01 0.99619941E-01 0.99354403E-01 0.99082329E-01 0.98804234E-01 - 0.98520694E-01 0.98232343E-01 0.97939865E-01 0.97643987E-01 0.97345468E-01 - 0.97045098E-01 0.96743682E-01 0.96442039E-01 0.96140988E-01 0.95841346E-01 - 0.95543917E-01 0.95249483E-01 0.94958801E-01 0.94672589E-01 0.94391526E-01 - 0.94116241E-01 0.93847307E-01 0.93585238E-01 0.93330481E-01 0.93083416E-01 - 0.92844349E-01 0.92613514E-01 0.92391067E-01 0.92177088E-01 0.91971582E-01 - 0.91774473E-01 0.91585615E-01 0.91404784E-01 0.91231686E-01 0.91065960E-01 - 0.90907179E-01 0.90754858E-01 0.90608455E-01 0.90467383E-01 0.90331010E-01 - 0.90198671E-01 0.90069670E-01 0.89943293E-01 0.89818810E-01 0.89695483E-01 - 0.89572578E-01 0.89449363E-01 0.89325125E-01 0.89199170E-01 0.89070830E-01 - 0.88939475E-01 0.88804513E-01 0.88665401E-01 0.88521645E-01 0.88372809E-01 - 0.88218518E-01 0.88058459E-01 0.87892386E-01 0.87720120E-01 0.87541552E-01 - 0.87356640E-01 0.87165411E-01 0.86967963E-01 0.86764459E-01 0.86555125E-01 - 0.86340254E-01 0.86120194E-01 0.85895352E-01 0.85666183E-01 0.85433191E-01 - 0.85196919E-01 0.84957943E-01 0.84716871E-01 0.84474330E-01 0.84230965E-01 - 0.83987427E-01 0.83744375E-01 0.83502460E-01 0.83262325E-01 0.83024599E-01 - 0.82789886E-01 0.82558766E-01 0.82331783E-01 0.82109442E-01 0.81892206E-01 - 0.81680487E-01 0.81474646E-01 0.81274989E-01 0.81081762E-01 0.80895153E-01 - 0.80715285E-01 0.80542223E-01 0.80375965E-01 0.80216452E-01 0.80063558E-01 - 0.79917102E-01 0.79776842E-01 0.79642482E-01 0.79513673E-01 0.79390016E-01 - 0.79271070E-01 0.79156353E-01 0.79045348E-01 0.78937510E-01 0.78832270E-01 - 0.78729044E-01 0.78627233E-01 0.78526236E-01 0.78425450E-01 0.78324279E-01 - 0.78222140E-01 0.78118466E-01 0.78012713E-01 0.77904366E-01 0.77792943E-01 - 0.77678000E-01 0.77559135E-01 0.77435994E-01 0.77308271E-01 0.77175713E-01 - 0.77038121E-01 0.76895353E-01 0.76747321E-01 0.76593998E-01 0.76435410E-01 - 0.76271640E-01 0.76102829E-01 0.75929167E-01 0.75750899E-01 0.75568317E-01 - gradient corrections used for XC - 5 - core charge-density (partial) - 0.13681949E+01 0.13676959E+01 0.13662000E+01 0.13637104E+01 0.13602324E+01 - 0.13557734E+01 0.13503428E+01 0.13439523E+01 0.13366153E+01 0.13283472E+01 - 0.13191654E+01 0.13090891E+01 0.12981392E+01 0.12863383E+01 0.12737106E+01 - 0.12602819E+01 0.12460793E+01 0.12311313E+01 0.12154677E+01 0.11991193E+01 - 0.11821181E+01 0.11644969E+01 0.11462894E+01 0.11275300E+01 0.11082538E+01 - 0.10884961E+01 0.10682931E+01 0.10476808E+01 0.10266956E+01 0.10053741E+01 - 0.98375262E+00 0.96186755E+00 0.93975498E+00 0.91745072E+00 0.89499016E+00 - 0.87240821E+00 0.84973922E+00 0.82701686E+00 0.80427411E+00 0.78154316E+00 - 0.75885532E+00 0.73624100E+00 0.71372964E+00 0.69134965E+00 0.66912839E+00 - 0.64709210E+00 0.62526589E+00 0.60367368E+00 0.58233822E+00 0.56128101E+00 - 0.54052235E+00 0.52008128E+00 0.49997557E+00 0.48022176E+00 0.46083511E+00 - 0.44182966E+00 0.42321818E+00 0.40501223E+00 0.38722214E+00 0.36985705E+00 - 0.35292494E+00 0.33643261E+00 0.32038576E+00 0.30478900E+00 0.28964586E+00 - 0.27495885E+00 0.26072948E+00 0.24695831E+00 0.23364497E+00 0.22078821E+00 - 0.20838595E+00 0.19643529E+00 0.18493257E+00 0.17387344E+00 0.16325283E+00 - 0.15306506E+00 0.14330386E+00 0.13396239E+00 0.12503331E+00 0.11650882E+00 - 0.10838067E+00 0.10064023E+00 0.93278518E-01 0.86286246E-01 0.79653843E-01 - 0.73371502E-01 0.67429213E-01 0.61816795E-01 0.56523931E-01 0.51540200E-01 - 0.46855106E-01 0.42458107E-01 0.38338646E-01 0.34486172E-01 0.30890172E-01 - 0.27540190E-01 0.24425849E-01 0.21536878E-01 0.18863124E-01 0.16394576E-01 - 0.14121382E-01 0.12033859E-01 0.10122515E-01 0.83780585E-02 0.67914089E-02 - 0.53537106E-02 0.40563407E-02 0.28909176E-02 0.18493085E-02 0.92363542E-03 - 0.10628041E-03 -0.61011040E-03 -0.12326236E-02 -0.17680763E-02 -0.22230145E-02 - -0.26037132E-02 -0.29161761E-02 -0.31661366E-02 -0.33590602E-02 -0.35001461E-02 - -0.35943308E-02 -0.36462914E-02 -0.36604499E-02 -0.36409778E-02 -0.35918010E-02 - -0.35166057E-02 -0.34188437E-02 -0.33017394E-02 -0.31682955E-02 -0.30213003E-02 - -0.28633343E-02 -0.26967779E-02 -0.25238181E-02 -0.23464567E-02 -0.21665170E-02 - -0.19856524E-02 -0.18053531E-02 -0.16269545E-02 -0.14516446E-02 -0.12804716E-02 - -0.11143515E-02 -0.95407586E-03 -0.80031865E-03 -0.65364404E-03 -0.51451333E-03 - -0.38329200E-03 -0.26025655E-03 -0.14560117E-03 -0.39444206E-04 0.58165511E-04 - 0.14724262E-03 0.22785936E-03 0.30013988E-03 0.36425486E-03 0.42041628E-03 - 0.46887249E-03 0.50990345E-03 0.54381626E-03 0.57094089E-03 0.59162618E-03 - 0.60623606E-03 0.61514598E-03 0.61873965E-03 0.61740590E-03 0.61153586E-03 - 0.60152029E-03 0.58774720E-03 0.57059962E-03 0.55045360E-03 0.52767638E-03 - 0.50262483E-03 0.47564398E-03 0.44706578E-03 0.41720804E-03 0.38637349E-03 - 0.35484905E-03 0.32290520E-03 0.29079554E-03 0.25875640E-03 0.22700668E-03 - 0.19574774E-03 0.16516339E-03 0.13542003E-03 0.10666685E-03 0.79036085E-04 - 0.52643449E-04 0.27588516E-04 0.39552468E-05 -0.18187463E-04 -0.38785176E-04 - -0.57797261E-04 -0.75196218E-04 -0.90966955E-04 -0.10510606E-03 -0.11762103E-03 - -0.12852953E-03 -0.13785857E-03 -0.14564378E-03 -0.15192857E-03 -0.15676342E-03 - -0.16020506E-03 -0.16231574E-03 -0.16316249E-03 -0.16281640E-03 -0.16135194E-03 - -0.15884627E-03 -0.15537858E-03 -0.15102952E-03 -0.14588055E-03 -0.14001345E-03 - -0.13350974E-03 -0.12645021E-03 -0.11891448E-03 -0.11098055E-03 -0.10272444E-03 - -0.94219805E-04 -0.85537640E-04 -0.76745997E-04 -0.67909725E-04 -0.59090261E-04 - -0.50345444E-04 -0.41729365E-04 -0.33292246E-04 -0.25080348E-04 -0.17135911E-04 - -0.94971158E-05 -0.21980783E-05 0.47311370E-05 0.11264478E-04 0.17379845E-04 - 0.23059011E-04 0.28287520E-04 0.33054576E-04 0.37352909E-04 0.41178630E-04 - 0.44531077E-04 0.47412643E-04 0.49828603E-04 0.51786928E-04 0.53298092E-04 - 0.54374882E-04 0.55032192E-04 0.55286830E-04 0.55157307E-04 0.54663644E-04 - 0.53827164E-04 0.52670300E-04 0.51216400E-04 0.49489532E-04 0.47514308E-04 - 0.45315698E-04 0.42918862E-04 0.40348985E-04 0.37631122E-04 0.34790049E-04 - 0.31850125E-04 0.28835161E-04 0.25768302E-04 0.22671916E-04 0.19567494E-04 - 0.16475560E-04 0.13415592E-04 0.10405948E-04 0.74638125E-05 0.46051404E-05 - 0.18446199E-05 -0.80435987E-06 -0.33297298E-05 -0.57207546E-05 -0.79680364E-05 - -0.10063512E-04 -0.12000439E-04 -0.13773380E-04 -0.15378176E-04 -0.16811912E-04 - -0.18072879E-04 -0.19160535E-04 -0.20075450E-04 -0.20819257E-04 -0.21394592E-04 - -0.21805037E-04 -0.22055053E-04 -0.22149916E-04 -0.22095648E-04 -0.21898950E-04 - -0.21567127E-04 -0.21108021E-04 -0.20529939E-04 -0.19841581E-04 -0.19051971E-04 - -0.18170386E-04 -0.17206292E-04 -0.16169276E-04 -0.15068979E-04 -0.13915042E-04 - -0.12717039E-04 -0.11484427E-04 -0.10226489E-04 -0.89522885E-05 -0.76706185E-05 - -0.63899616E-05 -0.51184500E-05 -0.38638298E-05 -0.26334298E-05 -0.14341327E-05 - -0.27235182E-06 0.84599001E-06 0.19154766E-05 0.29312116E-05 0.38888274E-05 - 0.47844916E-05 0.56149086E-05 0.63773189E-05 0.70694951E-05 0.76897347E-05 - 0.82368496E-05 0.87101542E-05 0.91094492E-05 0.94350049E-05 0.96875409E-05 - 0.98682048E-05 0.99785487E-05 0.10020504E-04 0.99963566E-05 0.99087169E-05 - 0.97604941E-05 0.95548658E-05 0.92952492E-05 0.89852707E-05 0.86287363E-05 - 0.82296016E-05 0.77919421E-05 0.73199235E-05 0.68177737E-05 0.62897538E-05 - 0.57401314E-05 0.51731542E-05 0.45930246E-05 0.40038757E-05 0.34097487E-05 - 0.28145712E-05 0.22221377E-05 0.16360907E-05 0.10599042E-05 0.49686836E-06 - -0.49924166E-07 -0.57759007E-06 -0.10834657E-05 -0.15651155E-05 -0.20203390E-05 - -0.24471762E-05 -0.28439108E-05 -0.32090727E-05 -0.35414380E-05 -0.38400284E-05 - -0.41041084E-05 -0.43331817E-05 -0.45269860E-05 -0.46854866E-05 -0.48088687E-05 - -0.48975292E-05 -0.49520669E-05 -0.49732720E-05 -0.49621150E-05 -0.49197346E-05 - -0.48474252E-05 -0.47466237E-05 -0.46188962E-05 -0.44659240E-05 -0.42894896E-05 - -0.40914625E-05 -0.38737847E-05 -0.36384570E-05 -0.33875242E-05 -0.31230617E-05 - -0.28471617E-05 -0.25619195E-05 -0.22694215E-05 -0.19717316E-05 -0.16708804E-05 - -0.13688531E-05 -0.10675792E-05 -0.76892254E-06 -0.47467176E-06 -0.18653194E-06 - 0.93883212E-07 0.36505831E-06 0.62558247E-06 0.87415464E-06 0.11095881E-05 - 0.13308142E-05 0.15368850E-05 0.17269756E-05 0.19003853E-05 0.20565378E-05 - 0.21949812E-05 0.23153867E-05 0.24175470E-05 0.25013740E-05 0.25668951E-05 - 0.26142502E-05 0.26436873E-05 0.26555573E-05 0.26503092E-05 0.26284843E-05 - 0.25907101E-05 0.25376938E-05 0.24702157E-05 0.23891225E-05 0.22953196E-05 - 0.21897645E-05 0.20734587E-05 0.19474410E-05 0.18127797E-05 0.16705653E-05 - 0.15219029E-05 0.13679056E-05 0.12096872E-05 0.10483551E-05 0.88500424E-06 - 0.72071045E-06 0.55652455E-06 0.39346662E-06 0.23252070E-06 0.74629781E-07 - -0.79308742E-07 -0.22844727E-06 -0.37199175E-06 -0.50920498E-06 -0.63940955E-06 - -0.76199023E-06 -0.87639600E-06 -0.98214161E-06 -0.10788087E-05 -0.11660465E-05 - -0.12435720E-05 -0.13111700E-05 -0.13686922E-05 -0.14160566E-05 -0.14532460E-05 - -0.14803064E-05 -0.14973448E-05 -0.15045271E-05 -0.15020754E-05 -0.14902650E-05 - -0.14694215E-05 -0.14399173E-05 -0.14021680E-05 -0.13566289E-05 -0.13037909E-05 - -0.12441768E-05 -0.11783371E-05 -0.11068459E-05 -0.10302970E-05 -0.94929927E-06 - -0.86447309E-06 -0.77644589E-06 -0.68584830E-06 -0.59331013E-06 -0.49945664E-06 - -0.40490479E-06 -0.31025970E-06 -0.21611131E-06 -0.12303113E-06 -0.31569266E-07 - 0.57748381E-07 0.14442270E-06 0.22798371E-06 0.30799268E-06 0.38404401E-06 - 0.45576680E-06 0.52282629E-06 0.58492494E-06 0.64180328E-06 0.69324054E-06 - 0.73905501E-06 0.77910415E-06 0.81328446E-06 0.84153115E-06 0.86381754E-06 - 0.88015423E-06 0.89058818E-06 0.89520142E-06 0.89410976E-06 0.88746116E-06 - 0.87543409E-06 0.85823563E-06 0.83609957E-06 0.80928424E-06 0.77807038E-06 - 0.74275888E-06 0.70366841E-06 0.66113309E-06 0.61550005E-06 0.56712697E-06 - 0.51637969E-06 0.46362977E-06 0.40925206E-06 0.35362237E-06 0.29711511E-06 - 0.24010109E-06 0.18294534E-06 0.12600498E-06 0.69627290E-07 0.14147785E-07 - -0.40111519E-07 -0.92843763E-07 -0.14375875E-06 -0.19258430E-06 -0.23906753E-06 - -0.28297589E-06 -0.32409810E-06 -0.36224497E-06 -0.39725004E-06 -0.42896999E-06 - -0.45728505E-06 -0.48209914E-06 -0.50333992E-06 -0.52095866E-06 -0.53492999E-06 - -0.54525153E-06 -0.55194336E-06 -0.55504738E-06 -0.55462655E-06 -0.55076401E-06 - -0.54356215E-06 -0.53314150E-06 -0.51963959E-06 -0.50320974E-06 -0.48401975E-06 - -0.46225056E-06 -0.43809484E-06 -0.41175556E-06 -0.38344448E-06 -0.35338074E-06 - -0.32178927E-06 -0.28889935E-06 -0.25494309E-06 -0.22015396E-06 -0.18476533E-06 - -0.14900905E-06 -0.11311407E-06 -0.77305131E-07 -0.41801454E-07 -0.68155504E-08 - 0.27447935E-07 0.60793293E-07 0.93034747E-07 0.12399737E-06 0.15351790E-06 - 0.18144551E-06 0.20764241E-06 0.23198445E-06 0.25436152E-06 0.27467799E-06 - 0.29285292E-06 0.30882025E-06 0.32252891E-06 0.33394274E-06 0.34304047E-06 - 0.34981548E-06 0.35427553E-06 0.35644240E-06 0.35635150E-06 0.35405130E-06 - 0.34960280E-06 0.34307888E-06 0.33456360E-06 0.32415144E-06 0.31194653E-06 - 0.29806180E-06 0.28261810E-06 0.26574328E-06 0.24757132E-06 0.22824131E-06 - 0.20789656E-06 0.18668361E-06 0.16475126E-06 0.14224963E-06 0.11932923E-06 - 0.96139992E-07 0.72830423E-07 0.49546690E-07 0.26431790E-07 0.36247474E-08 - -0.18740158E-07 -0.40534108E-07 -0.61634419E-07 -0.81925165E-07 -0.10129775E-06 - -0.11965140E-06 -0.13689367E-06 -0.15294075E-06 -0.16771790E-06 -0.18115965E-06 - -0.19321003E-06 -0.20382275E-06 -0.21296124E-06 -0.22059870E-06 -0.22671807E-06 - -0.23131193E-06 -0.23438237E-06 -0.23594075E-06 -0.23600750E-06 -0.23461175E-06 - -0.23179103E-06 -0.22759087E-06 -0.22206432E-06 -0.21527153E-06 -0.20727922E-06 - -0.19816015E-06 -0.18799254E-06 -0.17685950E-06 -0.16484846E-06 -0.15205046E-06 - -0.13855964E-06 -0.12447252E-06 -0.10988739E-06 -0.94903706E-07 -0.79621417E-07 - -0.64140371E-07 -0.48559705E-07 -0.32977250E-07 -0.17488964E-07 -0.21883816E-08 - 0.12833908E-07 0.27490758E-07 0.41698930E-07 0.55379522E-07 0.68458371E-07 - 0.80866414E-07 0.92540008E-07 0.10342122E-06 0.11345806E-06 0.12260471E-06 - 0.13082166E-06 0.13807583E-06 0.14434068E-06 0.14959621E-06 0.15382899E-06 - 0.15703210E-06 0.15920506E-06 0.16035369E-06 0.16048999E-06 0.15963194E-06 - 0.15780326E-06 0.15503318E-06 0.15135615E-06 0.14681155E-06 0.14144332E-06 - 0.13529964E-06 0.12843256E-06 0.12089760E-06 0.11275334E-06 0.10406101E-06 - 0.94884097E-07 0.85287872E-07 0.75338992E-07 0.65105052E-07 0.54654166E-07 - 0.44054534E-07 0.33374031E-07 0.22679796E-07 0.12037835E-07 0.15126439E-08 - -0.88331616E-08 -0.18939192E-07 -0.28747612E-07 -0.38203448E-07 -0.47254869E-07 - -0.55853449E-07 -0.63954402E-07 -0.71516784E-07 -0.78503682E-07 -0.84882360E-07 - -0.90624389E-07 -0.95705740E-07 -0.10010686E-06 -0.10381269E-06 -0.10681271E-06 - -0.10910090E-06 -0.11067571E-06 -0.11153996E-06 -0.11170080E-06 -0.11116954E-06 - -0.10996154E-06 -0.10809603E-06 -0.10559592E-06 -0.10248761E-06 -0.98800769E-07 - -0.94568084E-07 -0.89825018E-07 -0.84609542E-07 -0.78961861E-07 -0.72924130E-07 - -0.66540164E-07 -0.59855141E-07 -0.52915304E-07 -0.45767663E-07 -0.38459689E-07 - -0.31039024E-07 -0.23553181E-07 -0.16049264E-07 -0.85736810E-08 -0.11718762E-08 - 0.61119303E-08 0.13234992E-07 0.20156272E-07 0.26836663E-07 0.33239193E-07 - 0.39329216E-07 0.45074582E-07 0.50445791E-07 0.55416131E-07 0.59961790E-07 - 0.64061954E-07 0.67698885E-07 0.70857975E-07 0.73527785E-07 0.75700059E-07 - 0.77369725E-07 0.78534868E-07 0.79196695E-07 0.79359470E-07 0.79030440E-07 - 0.78219744E-07 0.76940297E-07 0.75207672E-07 0.73039955E-07 0.70457599E-07 - 0.67483257E-07 0.64141608E-07 0.60459175E-07 0.56464132E-07 0.52186103E-07 - 0.47655963E-07 0.42905624E-07 0.37967827E-07 0.32875928E-07 0.27663683E-07 - 0.22365039E-07 0.17013921E-07 0.11644026E-07 0.62886240E-08 0.98035848E-09 - -0.42489404E-08 -0.93684373E-08 -0.14348464E-07 -0.19160680E-07 -0.23778227E-07 - -0.28175866E-07 -0.32330105E-07 -0.36219319E-07 -0.39823844E-07 -0.43126075E-07 - -0.46110532E-07 -0.48763927E-07 -0.51075207E-07 -0.53035585E-07 -0.54638561E-07 - -0.55879923E-07 -0.56757739E-07 -0.57272329E-07 -0.57426230E-07 -0.57224148E-07 - -0.56672888E-07 -0.55781290E-07 -0.54560132E-07 -0.53022045E-07 -0.51181396E-07 - -0.49054183E-07 -0.46657907E-07 -0.44011441E-07 -0.41134899E-07 -0.38049487E-07 - -0.34777363E-07 -0.31341484E-07 -0.27765453E-07 -0.24073368E-07 -0.20289666E-07 - -0.16438967E-07 -0.12545925E-07 -0.86350721E-08 -0.47306767E-08 -0.85659471E-09 - 0.29638671E-08 0.67080858E-08 0.10354249E-07 0.13881476E-07 0.17269932E-07 - 0.20500930E-07 0.23557030E-07 0.26422126E-07 0.29081523E-07 0.31522008E-07 - 0.33731903E-07 0.35701119E-07 0.37421188E-07 0.38885294E-07 0.40088290E-07 - 0.41026701E-07 0.41698723E-07 0.42104208E-07 0.42244641E-07 0.42123104E-07 - 0.41744237E-07 0.41114183E-07 0.40240531E-07 0.39132246E-07 0.37799597E-07 - 0.36254071E-07 0.34508287E-07 0.32575904E-07 0.30471520E-07 0.28210569E-07 - 0.25809215E-07 0.23284245E-07 0.20652955E-07 0.17933036E-07 0.15142464E-07 - 0.12299384E-07 0.94219950E-08 0.65284431E-08 0.36367075E-08 0.76449490E-09 - -0.20708645E-08 -0.48525176E-08 -0.75641838E-08 -0.10190246E-07 -0.12715838E-07 - -0.15126919E-07 -0.17410355E-07 -0.19553980E-07 -0.21546658E-07 -0.23378335E-07 - -0.25040088E-07 -0.26524159E-07 -0.27823989E-07 -0.28934238E-07 -0.29850803E-07 - -0.30570824E-07 -0.31092680E-07 -0.31415990E-07 -0.31541588E-07 -0.31471507E-07 - -0.31208949E-07 -0.30758244E-07 -0.30124814E-07 -0.29315120E-07 -0.28336610E-07 - -0.27197660E-07 -0.25907508E-07 -0.24476186E-07 -0.22914450E-07 -0.21233701E-07 - -0.19445907E-07 -0.17563525E-07 -0.15599414E-07 -0.13566755E-07 -0.11478964E-07 - -0.93496047E-08 -0.71923085E-08 -0.50206872E-08 -0.28482512E-08 -0.68832844E-09 - 0.14460143E-08 0.35420475E-08 0.55874520E-08 0.75703881E-08 0.94795614E-08 - 0.11304284E-07 0.13034532E-07 0.14660996E-07 0.16175129E-07 0.17569189E-07 - 0.18836272E-07 0.19970348E-07 0.20966280E-07 0.21819847E-07 0.22527754E-07 - 0.23087645E-07 0.23498096E-07 0.23758621E-07 0.23869653E-07 0.23832537E-07 - 0.23649502E-07 0.23323641E-07 0.22858877E-07 0.22259931E-07 0.21532279E-07 - 0.20682110E-07 0.19716280E-07 0.18642260E-07 0.17468081E-07 0.16202279E-07 - 0.14853837E-07 0.13432120E-07 0.11946819E-07 0.10407883E-07 0.88254569E-08 - 0.72098151E-08 0.55712995E-08 0.39202539E-08 0.22669616E-08 0.62158331E-09 - -0.10059033E-08 -0.26057620E-08 -0.41685539E-08 -0.56851915E-08 -0.71469892E-08 - -0.85457109E-08 -0.98736147E-08 -0.11123493E-07 -0.12288710E-07 -0.13363235E-07 - -0.14341670E-07 -0.15219275E-07 -0.15991988E-07 -0.16656443E-07 -0.17209977E-07 - -0.17650642E-07 -0.17977205E-07 -0.18189145E-07 -0.18286649E-07 -0.18270603E-07 - -0.18142574E-07 -0.17904792E-07 -0.17560132E-07 -0.17112083E-07 -0.16564722E-07 - -0.15922679E-07 -0.15191107E-07 -0.14375635E-07 -0.13482335E-07 -0.12517678E-07 - -0.11488487E-07 -0.10401891E-07 -0.92652805E-08 -0.80862565E-08 -0.68725824E-08 - -0.56321344E-08 -0.43728519E-08 -0.31026886E-08 -0.18295637E-08 -0.56131359E-09 - 0.69435411E-09 0.19299065E-08 0.31380291E-08 0.43116674E-08 0.54440667E-08 - 0.65288098E-08 0.75598516E-08 0.85315512E-08 0.94387016E-08 0.10276556E-07 - 0.11040849E-07 0.11727821E-07 0.12334231E-07 0.12857370E-07 0.13295073E-07 - 0.13645724E-07 0.13908258E-07 0.14082165E-07 0.14167479E-07 0.14164779E-07 - 0.14075171E-07 0.13900282E-07 0.13642238E-07 0.13303647E-07 0.12887578E-07 - 0.12397536E-07 0.11837432E-07 0.11211561E-07 0.10524565E-07 0.97814013E-08 - 0.89873121E-08 0.81477851E-08 0.72685186E-08 0.63553840E-08 0.54143881E-08 - 0.44516340E-08 0.34732838E-08 0.24855193E-08 0.14945047E-08 0.50634894E-09 - -0.47293086E-09 -0.14374450E-08 -0.23814654E-08 -0.32994588E-08 -0.41861182E-08 - -0.50363921E-08 -0.58455128E-08 -0.66090213E-08 -0.73227917E-08 -0.79830514E-08 - -0.85864005E-08 -0.91298279E-08 -0.96107249E-08 -0.10026896E-07 -0.10376569E-07 - kinetic energy density (partial) - 0.20835504E+03 0.20828036E+03 0.20805646E+03 0.20768382E+03 0.20716321E+03 - 0.20649571E+03 0.20568271E+03 0.20472590E+03 0.20362725E+03 0.20238902E+03 - 0.20101375E+03 0.19950424E+03 0.19786357E+03 0.19609504E+03 0.19420220E+03 - 0.19218884E+03 0.19005893E+03 0.18781665E+03 0.18546639E+03 0.18301267E+03 - 0.18046020E+03 0.17781381E+03 0.17507846E+03 0.17225923E+03 0.16936128E+03 - 0.16638985E+03 0.16335026E+03 0.16024787E+03 0.15708805E+03 0.15387623E+03 - 0.15061780E+03 0.14731817E+03 0.14398270E+03 0.14061674E+03 0.13722555E+03 - 0.13381436E+03 0.13038829E+03 0.12695239E+03 0.12351160E+03 0.12007077E+03 - 0.11663459E+03 0.11320766E+03 0.10979442E+03 0.10639916E+03 0.10302604E+03 - 0.99679032E+02 0.96361963E+02 0.93078483E+02 0.89832071E+02 0.86626025E+02 - 0.83463466E+02 0.80347331E+02 0.77280372E+02 0.74265159E+02 0.71304074E+02 - 0.68399315E+02 0.65552897E+02 0.62766650E+02 0.60042224E+02 0.57381093E+02 - 0.54784551E+02 0.52253723E+02 0.49789562E+02 0.47392858E+02 0.45064240E+02 - 0.42804181E+02 0.40613001E+02 0.38490877E+02 0.36437844E+02 0.34453799E+02 - 0.32538514E+02 0.30691635E+02 0.28912689E+02 0.27201094E+02 0.25556161E+02 - 0.23977101E+02 0.22463033E+02 0.21012989E+02 0.19625917E+02 0.18300694E+02 - 0.17036125E+02 0.15830955E+02 0.14683869E+02 0.13593503E+02 0.12558445E+02 - 0.11577245E+02 0.10648418E+02 0.97704471E+01 0.89417938E+01 0.81608982E+01 - 0.74261859E+01 0.67360722E+01 0.60889662E+01 0.54832751E+01 0.49174080E+01 - 0.43897800E+01 0.38988154E+01 0.34429512E+01 0.30206401E+01 0.26303538E+01 - 0.22705855E+01 0.19398523E+01 0.16366980E+01 0.13596948E+01 0.11074456E+01 - 0.87858565E+00 0.67178422E+00 0.48574594E+00 0.31921212E+00 0.17096183E+00 - 0.39812801E-01 -0.75377769E-01 -0.17571264E+00 -0.26225402E+00 -0.33602329E+00 - -0.39800073E+00 -0.44912553E+00 -0.49029577E+00 -0.52236862E+00 -0.54616060E+00 - -0.56244795E+00 -0.57196711E+00 -0.57541524E+00 -0.57345089E+00 -0.56669468E+00 - -0.55573011E+00 -0.54110437E+00 -0.52332928E+00 -0.50288217E+00 -0.48020696E+00 - -0.45571513E+00 -0.42978682E+00 -0.40277192E+00 -0.37499119E+00 -0.34673741E+00 - -0.31827653E+00 -0.28984883E+00 -0.26167011E+00 -0.23393286E+00 -0.20680741E+00 - -0.18044314E+00 -0.15496957E+00 -0.13049761E+00 -0.10712057E+00 -0.84915366E-01 - -0.63943573E-01 -0.44252494E-01 -0.25876215E-01 -0.88366140E-02 0.68556445E-02 - 0.21200154E-01 0.34205840E-01 0.45890064E-01 0.56277765E-01 0.65400637E-01 - 0.73296336E-01 0.80007729E-01 0.85582175E-01 0.90070849E-01 0.93528093E-01 - 0.96010816E-01 0.97577916E-01 0.98289755E-01 0.98207654E-01 0.97393432E-01 - 0.95908984E-01 0.93815878E-01 0.91175003E-01 0.88046237E-01 0.84488154E-01 - 0.80557756E-01 0.76310236E-01 0.71798777E-01 0.67074366E-01 0.62185643E-01 - 0.57178774E-01 0.52097343E-01 0.46982274E-01 0.41871767E-01 0.36801261E-01 - 0.31803411E-01 0.26908081E-01 0.22142365E-01 0.17530606E-01 0.13094442E-01 - 0.88528613E-02 0.48222665E-02 0.10165515E-02 -0.25528120E-02 -0.58766813E-02 - -0.89481411E-02 -0.11762397E-01 -0.14316661E-01 -0.16610039E-01 -0.18643408E-01 - -0.20419294E-01 -0.21941748E-01 -0.23216224E-01 -0.24249453E-01 -0.25049318E-01 - -0.25624730E-01 -0.25985512E-01 -0.26142277E-01 -0.26106309E-01 -0.25889459E-01 - -0.25504030E-01 -0.24962671E-01 -0.24278285E-01 -0.23463926E-01 -0.22532710E-01 - -0.21497732E-01 -0.20371987E-01 -0.19168289E-01 -0.17899208E-01 -0.16577007E-01 - -0.15213577E-01 -0.13820394E-01 -0.12408464E-01 -0.10988288E-01 -0.95698218E-02 - -0.81624485E-02 -0.67749510E-02 -0.54154923E-02 -0.40916000E-02 -0.28101553E-02 - -0.15773864E-02 -0.39886651E-03 0.72048473E-03 0.17763955E-02 0.27652328E-02 - 0.36839902E-02 0.45302720E-02 0.53022756E-02 0.59987705E-02 0.66190753E-02 - 0.71630325E-02 0.76309821E-02 0.80237328E-02 0.83425325E-02 0.85890380E-02 - 0.87652830E-02 0.88736459E-02 0.89168179E-02 0.88977699E-02 0.88197199E-02 - 0.86861005E-02 0.85005271E-02 0.82667658E-02 0.79887032E-02 0.76703160E-02 - 0.73156421E-02 0.69287525E-02 0.65137246E-02 0.60746169E-02 0.56154446E-02 - 0.51401571E-02 0.46526166E-02 0.41565790E-02 0.36556751E-02 0.31533950E-02 - 0.26530725E-02 0.21578727E-02 0.16707797E-02 0.11945875E-02 0.73189104E-03 - 0.28508001E-03 -0.14366669E-03 -0.55238445E-03 -0.93932519E-03 -0.13029582E-02 - -0.16419696E-02 -0.19552605E-02 -0.22419442E-02 -0.25013417E-02 -0.27329770E-02 - -0.29365704E-02 -0.31120318E-02 -0.32594528E-02 -0.33790979E-02 -0.34713953E-02 - -0.35369271E-02 -0.35764189E-02 -0.35907293E-02 -0.35808384E-02 -0.35478369E-02 - -0.34929144E-02 -0.34173477E-02 -0.33224897E-02 -0.32097572E-02 -0.30806201E-02 - -0.29365895E-02 -0.27792070E-02 -0.26100340E-02 -0.24306410E-02 -0.22425978E-02 - -0.20474638E-02 -0.18467788E-02 -0.16420544E-02 -0.14347657E-02 -0.12263441E-02 - -0.10181700E-02 -0.81156627E-03 -0.60779290E-03 -0.40804141E-03 -0.21343046E-03 - -0.25001852E-04 0.15628276E-03 0.32954460E-03 0.49398988E-03 0.64891127E-03 - 0.79368888E-03 0.92779059E-03 0.10507719E-02 0.11622751E-02 0.12620285E-02 - 0.13498441E-02 0.14256161E-02 0.14893180E-02 0.15410000E-02 0.15807856E-02 - 0.16088679E-02 0.16255060E-02 0.16310209E-02 0.16257910E-02 0.16102478E-02 - 0.15848710E-02 0.15501843E-02 0.15067498E-02 0.14551636E-02 0.13960508E-02 - 0.13300607E-02 0.12578615E-02 0.11801361E-02 0.10975768E-02 0.10108810E-02 - 0.92074700E-03 0.82786904E-03 0.73293373E-03 0.63661585E-03 0.53957475E-03 - 0.44245079E-03 0.34586214E-03 0.25040173E-03 0.15663455E-03 0.65095164E-04 - -0.23714500E-04 -0.10932708E-03 -0.19131143E-03 -0.26927401E-03 -0.34285994E-03 - -0.41175391E-03 -0.47568067E-03 -0.53440538E-03 -0.58773362E-03 -0.63551122E-03 - -0.67762383E-03 -0.71399622E-03 -0.74459146E-03 -0.76940981E-03 -0.78848749E-03 - -0.80189519E-03 -0.80973655E-03 -0.81214635E-03 -0.80928869E-03 -0.80135496E-03 - -0.78856182E-03 -0.77114897E-03 -0.74937696E-03 -0.72352489E-03 -0.69388808E-03 - -0.66077574E-03 -0.62450863E-03 -0.58541671E-03 -0.54383679E-03 -0.50011029E-03 - -0.45458098E-03 -0.40759277E-03 -0.35948764E-03 -0.31060361E-03 -0.26127274E-03 - -0.21181934E-03 -0.16255822E-03 -0.11379303E-03 -0.65814813E-04 -0.18900553E-04 - 0.26688029E-04 0.70705622E-04 0.11292430E-03 0.15313440E-03 0.19114521E-03 - 0.22678554E-03 0.25990422E-03 0.29037033E-03 0.31807346E-03 0.34292368E-03 - 0.36485151E-03 0.38380771E-03 0.39976294E-03 0.41270738E-03 0.42265015E-03 - 0.42961871E-03 0.43365814E-03 0.43483030E-03 0.43321299E-03 0.42889897E-03 - 0.42199495E-03 0.41262052E-03 0.40090704E-03 0.38699647E-03 0.37104021E-03 - 0.35319789E-03 0.33363614E-03 0.31252735E-03 0.29004850E-03 0.26637987E-03 - 0.24170389E-03 0.21620396E-03 0.19006328E-03 0.16346372E-03 0.13658478E-03 - 0.10960256E-03 0.82688740E-04 0.56009692E-04 0.29725598E-04 0.39896497E-05 - -0.21052691E-04 -0.45264363E-04 -0.68517308E-04 -0.90692998E-04 -0.11168289E-03 - -0.13138883E-03 -0.14972332E-03 -0.16660980E-03 -0.18198279E-03 -0.19578798E-03 - -0.20798226E-03 -0.21853367E-03 -0.22742128E-03 -0.23463504E-03 -0.24017552E-03 - -0.24405359E-03 -0.24629014E-03 -0.24691561E-03 -0.24596960E-03 -0.24350031E-03 - -0.23956409E-03 -0.23422482E-03 -0.22755332E-03 -0.21962678E-03 -0.21052803E-03 - -0.20034496E-03 -0.18916981E-03 -0.17709849E-03 -0.16422991E-03 -0.15066529E-03 - -0.13650745E-03 -0.12186019E-03 -0.10682758E-03 -0.91513375E-04 -0.76020313E-04 - -0.60449570E-04 -0.44900164E-04 -0.29468403E-04 -0.14247369E-04 0.67356873E-06 - 0.15209201E-04 0.29278898E-04 0.42806978E-04 0.55723047E-04 0.67962294E-04 - 0.79465741E-04 0.90180456E-04 0.10005972E-03 0.10906317E-03 0.11715685E-03 - 0.12431330E-03 0.13051151E-03 0.13573694E-03 0.13998141E-03 0.14324297E-03 - 0.14552583E-03 0.14684010E-03 0.14720163E-03 0.14663173E-03 0.14515697E-03 - 0.14280879E-03 0.13962329E-03 0.13564081E-03 0.13090564E-03 0.12546560E-03 - 0.11937169E-03 0.11267772E-03 0.10543985E-03 0.97716257E-04 0.89566681E-04 - 0.81052046E-04 0.72234052E-04 0.63174778E-04 0.53936293E-04 0.44580280E-04 - 0.35167664E-04 0.25758258E-04 0.16410425E-04 0.71807582E-05 -0.18762292E-05 - -0.10708382E-04 -0.19266170E-04 -0.27502926E-04 -0.35375063E-04 -0.42842270E-04 - -0.49867681E-04 -0.56418019E-04 -0.62463713E-04 -0.67978995E-04 -0.72941966E-04 - -0.77334643E-04 -0.81142972E-04 -0.84356829E-04 -0.86969986E-04 -0.88980058E-04 - -0.90388434E-04 -0.91200176E-04 -0.91423905E-04 -0.91071668E-04 -0.90158782E-04 - -0.88703670E-04 -0.86727673E-04 -0.84254855E-04 -0.81311794E-04 -0.77927359E-04 - -0.74132487E-04 -0.69959941E-04 -0.65444073E-04 -0.60620576E-04 -0.55526235E-04 - -0.50198677E-04 -0.44676123E-04 -0.38997144E-04 -0.33200410E-04 -0.27324458E-04 - -0.21407454E-04 -0.15486974E-04 -0.95997806E-05 -0.37816209E-05 0.19329717E-05 - 0.75108618E-05 0.12920483E-04 0.18131998E-04 0.23117441E-04 0.27850849E-04 - 0.32308378E-04 0.36468400E-04 0.40311588E-04 0.43820986E-04 0.46982057E-04 - 0.49782725E-04 0.52213390E-04 0.54266937E-04 0.55938726E-04 0.57226565E-04 - 0.58130670E-04 0.58653618E-04 0.58800272E-04 0.58577711E-04 0.57995133E-04 - 0.57063756E-04 0.55796708E-04 0.54208903E-04 0.52316916E-04 0.50138843E-04 - 0.47694158E-04 0.45003568E-04 0.42088860E-04 0.38972742E-04 0.35678686E-04 - 0.32230771E-04 0.28653522E-04 0.24971746E-04 0.21210383E-04 0.17394344E-04 - 0.13548360E-04 0.96968386E-05 0.58637166E-05 0.20723263E-05 -0.16547360E-05 - -0.52957328E-05 -0.88299004E-05 -0.12237557E-04 -0.15500199E-04 -0.18600592E-04 - -0.21522849E-04 -0.24252503E-04 -0.26776561E-04 -0.29083560E-04 -0.31163602E-04 - -0.33008383E-04 -0.34611214E-04 -0.35967028E-04 -0.37072379E-04 -0.37925428E-04 - -0.38525927E-04 -0.38875183E-04 -0.38976024E-04 -0.38832747E-04 -0.38451068E-04 - -0.37838051E-04 -0.37002046E-04 -0.35952608E-04 -0.34700415E-04 -0.33257184E-04 - -0.31635572E-04 -0.29849087E-04 -0.27911987E-04 -0.25839175E-04 -0.23646098E-04 - -0.21348641E-04 -0.18963022E-04 -0.16505685E-04 -0.13993199E-04 -0.11442146E-04 - -0.88690290E-05 -0.62901661E-05 -0.37215965E-05 -0.11789878E-05 0.13224529E-05 - 0.37680632E-05 0.61438045E-05 0.84363361E-05 0.10633083E-04 0.12722299E-04 - 0.14693121E-04 0.16535621E-04 0.18240847E-04 0.19800862E-04 0.21208768E-04 - 0.22458735E-04 0.23546012E-04 0.24466937E-04 0.25218940E-04 0.25800535E-04 - 0.26211314E-04 0.26451924E-04 0.26524047E-04 0.26430366E-04 0.26174537E-04 - 0.25761142E-04 0.25195645E-04 0.24484347E-04 0.23634324E-04 0.22653376E-04 - 0.21549965E-04 0.20333146E-04 0.19012507E-04 0.17598097E-04 0.16100357E-04 - 0.14530050E-04 0.12898186E-04 0.11215955E-04 0.94946498E-05 0.77456005E-05 - 0.59801006E-05 0.42093402E-05 0.24443392E-05 0.69588305E-06 -0.10255391E-05 - -0.27097932E-05 -0.43471557E-05 -0.59283657E-05 -0.74446735E-05 -0.88878846E-05 - -0.10250400E-04 -0.11525252E-04 -0.12706136E-04 -0.13787435E-04 -0.14764247E-04 - -0.15632395E-04 -0.16388446E-04 -0.17029714E-04 -0.17554268E-04 -0.17960926E-04 - -0.18249251E-04 -0.18419541E-04 -0.18472814E-04 -0.18410788E-04 -0.18235860E-04 - -0.17951076E-04 -0.17560106E-04 -0.17067207E-04 -0.16477189E-04 -0.15795372E-04 - -0.15027551E-04 -0.14179945E-04 -0.13259159E-04 -0.12272129E-04 -0.11226083E-04 - -0.10128482E-04 -0.89869785E-05 -0.78093612E-05 -0.66035078E-05 -0.53773340E-05 - -0.41387451E-05 -0.28955872E-05 -0.16556008E-05 -0.42637512E-06 0.78469609E-06 - 0.19704560E-05 0.31240246E-05 0.42388361E-05 0.53086738E-05 0.63277021E-05 - 0.72904958E-05 0.81920664E-05 0.90278850E-05 0.97939027E-05 0.10486567E-04 - 0.11102835E-04 0.11640184E-04 0.12096617E-04 0.12470670E-04 0.12761405E-04 - 0.12968414E-04 0.13091808E-04 0.13132211E-04 0.13090746E-04 0.12969018E-04 - 0.12769101E-04 0.12493512E-04 0.12145193E-04 0.11727484E-04 0.11244095E-04 - 0.10699079E-04 0.10096800E-04 0.94419040E-05 0.87392820E-05 0.79940391E-05 - 0.72114589E-05 0.63969681E-05 0.55561008E-05 0.46944635E-05 0.38176993E-05 - 0.29314527E-05 0.20413352E-05 0.11528915E-05 0.27156677E-06 -0.59732538E-06 - -0.14486329E-05 -0.22773945E-05 -0.30788666E-05 -0.38485492E-05 -0.45822095E-05 - -0.52759030E-05 -0.59259938E-05 -0.65291711E-05 -0.70824650E-05 -0.75832587E-05 - -0.80292992E-05 -0.84187053E-05 -0.87499729E-05 -0.90219787E-05 -0.92339806E-05 - -0.93856165E-05 -0.94769006E-05 -0.95082170E-05 -0.94803119E-05 -0.93942833E-05 - -0.92515686E-05 -0.90539305E-05 -0.88034415E-05 -0.85024659E-05 -0.81536409E-05 - -0.77598566E-05 -0.73242339E-05 -0.68501020E-05 -0.63409749E-05 -0.58005271E-05 - -0.52325683E-05 -0.46410183E-05 -0.40298813E-05 -0.34032201E-05 -0.27651301E-05 - -0.21197141E-05 -0.14710570E-05 -0.82320100E-06 -0.18012145E-06 0.45429620E-06 - 0.10762789E-05 0.16821875E-05 0.22685368E-05 0.28320144E-05 0.33694988E-05 - 0.38780750E-05 0.43550498E-05 0.47979643E-05 0.52046059E-05 0.55730178E-05 - 0.59015075E-05 0.61886525E-05 0.64333056E-05 0.66345974E-05 0.67919376E-05 - 0.69050145E-05 0.69737925E-05 0.69985083E-05 0.69796653E-05 0.69180270E-05 - 0.68146078E-05 0.66706633E-05 0.64876794E-05 0.62673592E-05 0.60116097E-05 - 0.57225273E-05 0.54023816E-05 0.50535996E-05 0.46787481E-05 0.42805159E-05 - 0.38616961E-05 0.34251668E-05 0.29738728E-05 0.25108063E-05 0.20389878E-05 - 0.15614475E-05 0.10812068E-05 0.60125910E-06 0.12455292E-06 -0.34602614E-06 - -0.80767194E-06 -0.12576738E-05 -0.16934316E-05 -0.21124705E-05 -0.25124536E-05 - -0.28911947E-05 -0.32466697E-05 -0.35770259E-05 -0.38805915E-05 -0.41558832E-05 - -0.44016122E-05 -0.46166896E-05 -0.48002299E-05 -0.49515539E-05 -0.50701897E-05 - -0.51558725E-05 -0.52085437E-05 -0.52283475E-05 -0.52156282E-05 -0.51709243E-05 - -0.50949632E-05 -0.49886534E-05 -0.48530769E-05 -0.46894800E-05 -0.44992632E-05 - -0.42839704E-05 -0.40452779E-05 -0.37849817E-05 -0.35049853E-05 -0.32072862E-05 - -0.28939625E-05 -0.25671593E-05 -0.22290742E-05 -0.18819433E-05 -0.15280272E-05 - -0.11695966E-05 -0.80891805E-06 -0.44824079E-06 -0.89782651E-07 0.26428284E-06 - 0.61183918E-06 0.95083906E-06 0.12793159E-05 0.15953948E-05 0.18973026E-05 - 0.21833778E-05 0.24520784E-05 0.27019904E-05 0.29318344E-05 0.31404715E-05 - 0.33269085E-05 0.34903020E-05 0.36299613E-05 0.37453508E-05 0.38360910E-05 - 0.39019586E-05 0.39428861E-05 0.39589597E-05 0.39504170E-05 0.39176432E-05 - 0.38611669E-05 0.37816552E-05 0.36799070E-05 0.35568472E-05 0.34135188E-05 - 0.32510750E-05 0.30707708E-05 0.28739539E-05 0.26620552E-05 0.24365789E-05 - 0.21990924E-05 0.19512158E-05 0.16946112E-05 0.14309721E-05 0.11620127E-05 - 0.88945703E-06 0.61502809E-06 0.34043765E-06 0.67375715E-07 -0.20249943E-06 - -0.46757098E-06 -0.72627297E-06 -0.97709914E-06 -0.12186114E-05 -0.14494477E-05 - -0.16683294E-05 -0.18740679E-05 -0.20655709E-05 -0.22418477E-05 -0.24020138E-05 - -0.25452953E-05 -0.26710317E-05 -0.27786789E-05 -0.28678107E-05 -0.29381202E-05 - -0.29894195E-05 -0.30216403E-05 -0.30348315E-05 -0.30291587E-05 -0.30049005E-05 - -0.29624463E-05 -0.29022916E-05 -0.28250345E-05 -0.27313699E-05 -0.26220845E-05 - -0.24980506E-05 -0.23602199E-05 -0.22096162E-05 -0.20473288E-05 -0.18745043E-05 - -0.16923396E-05 -0.15020733E-05 -0.13049781E-05 -0.11023521E-05 -0.89551080E-06 - -0.68577898E-06 -0.47448212E-06 -0.26293851E-06 -0.52451208E-07 0.15569972E-06 - 0.36026474E-06 0.56003214E-06 0.75383492E-06 0.94055739E-06 0.11191414E-05 - 0.12885918E-05 0.14479824E-05 0.15964599E-05 0.17332489E-05 0.18576553E-05 - 0.19690697E-05 0.20669698E-05 0.21509228E-05 0.22205870E-05 0.22757124E-05 - 0.23161411E-05 0.23418077E-05 0.23527377E-05 0.23490468E-05 0.23309391E-05 - 0.22987043E-05 0.22527152E-05 0.21934244E-05 0.21213603E-05 0.20371233E-05 - 0.19413808E-05 0.18348627E-05 0.17183559E-05 0.15926988E-05 0.14587758E-05 - 0.13175109E-05 0.11698619E-05 0.10168141E-05 0.85937351E-06 0.69856113E-06 - 0.53540601E-06 0.37093900E-06 0.20618646E-06 0.42164007E-07 -0.12012960E-06 - -0.27971831E-06 -0.43565451E-06 -0.58702449E-06 -0.73295359E-06 -0.87261108E-06 - -0.10052148E-05 -0.11300351E-05 -0.12463990E-05 -0.13536936E-05 -0.14513687E-05 - -0.15389398E-05 -0.16159903E-05 -0.16821729E-05 -0.17372113E-05 -0.17809007E-05 - atomic pseudo charge-density - 0.40000000E+01 0.39865777E+01 0.39466377E+01 0.38811433E+01 0.37916420E+01 - 0.36801845E+01 0.35492225E+01 0.34014950E+01 0.32399100E+01 0.30674335E+01 - 0.28869885E+01 0.27013712E+01 0.25131849E+01 0.23247937E+01 0.21382919E+01 - 0.19554911E+01 0.17779180E+01 0.16068237E+01 0.14431992E+01 0.12877965E+01 - 0.11411517E+01 0.10036103E+01 0.87535141E+00 0.75641221E+00 0.64671002E+00 - 0.54606322E+00 0.45420995E+00 0.37082491E+00 0.29553413E+00 0.22792794E+00 - 0.16757211E+00 0.11401745E+00 0.66807917E-01 0.25487413E-01 -0.10394609E-01 - -0.41278559E-01 -0.67591068E-01 -0.89742136E-01 -0.10812299E+00 -0.12310456E+00 - -0.13503646E+00 -0.14424639E+00 -0.15104001E+00 -0.15570097E+00 -0.15849133E+00 - -0.15965211E+00 -0.15940402E+00 -0.15794831E+00 -0.15546772E+00 -0.15212749E+00 - -0.14807638E+00 -0.14344771E+00 -0.13836047E+00 -0.13292033E+00 -0.12722065E+00 - -0.12134348E+00 -0.11536052E+00 -0.10933401E+00 -0.10331755E+00 -0.97357004E-01 - -0.91491144E-01 -0.85752437E-01 -0.80167665E-01 -0.74758549E-01 -0.69542301E-01 - -0.64532148E-01 -0.59737800E-01 -0.55165888E-01 -0.50820352E-01 -0.46702805E-01 - -0.42812853E-01 -0.39148390E-01 -0.35705857E-01 -0.32480485E-01 -0.29466501E-01 - -0.26657315E-01 -0.24045694E-01 -0.21623903E-01 -0.19383840E-01 -0.17317147E-01 - -0.15415312E-01 -0.13669755E-01 -0.12071903E-01 -0.10613251E-01 -0.92854244E-02 - -0.80802145E-02 -0.69896237E-02 -0.60058937E-02 -0.51215308E-02 -0.43293255E-02 - -0.36223668E-02 -0.29940530E-02 -0.24380979E-02 -0.19485345E-02 -0.15197156E-02 - -0.11463116E-02 -0.82330733E-03 -0.54599558E-03 -0.30997057E-03 -0.11111936E-03 - 0.54387372E-04 0.19010550E-03 0.29932812E-03 0.38509675E-03 0.45021276E-03 - 0.49724905E-03 0.52856181E-03 0.54630218E-03 0.55242796E-03 0.54871497E-03 - 0.53676838E-03 0.51803363E-03 0.49380709E-03 0.46524638E-03 0.43338033E-03 - 0.39911848E-03 0.36326026E-03 0.32650372E-03 0.28945381E-03 0.25263029E-03 - 0.21647518E-03 0.18135979E-03 0.14759134E-03 0.11541921E-03 0.85040745E-04 - 0.56606693E-04 0.30226281E-04 0.59719222E-05 -0.16116422E-04 -0.36027206E-04 - -0.53773582E-04 -0.69389985E-04 -0.82929001E-04 -0.94458506E-04 -0.10405906E-03 - -0.11182154E-03 -0.11784501E-03 -0.12223480E-03 -0.12510074E-03 -0.12655568E-03 - -0.12671406E-03 -0.12569075E-03 -0.12359995E-03 -0.12055428E-03 -0.11666396E-03 - -0.11203618E-03 -0.10677445E-03 -0.10097817E-03 -0.94742200E-04 -0.88156578E-04 - -0.81306252E-04 -0.74270913E-04 -0.67124872E-04 -0.59936998E-04 -0.52770692E-04 - -0.45683909E-04 -0.38729216E-04 -0.31953881E-04 -0.25399987E-04 -0.19104573E-04 - -0.13099795E-04 -0.74131035E-05 -0.20674340E-05 0.29185877E-05 0.75304328E-05 - 0.11757450E-04 0.15592638E-04 0.19032418E-04 0.22076404E-04 0.24727164E-04 - 0.26989996E-04 0.28872695E-04 0.30385326E-04 0.31539999E-04 0.32350652E-04 - 0.32832837E-04 0.33003507E-04 0.32880817E-04 0.32483927E-04 0.31832814E-04 - 0.30948087E-04 0.29850816E-04 0.28562367E-04 0.27104239E-04 0.25497920E-04 - 0.23764744E-04 0.21925760E-04 0.20001608E-04 0.18012403E-04 0.15977634E-04 - 0.13916067E-04 0.11845655E-04 0.97834623E-05 0.77455969E-05 0.57471478E-05 - 0.38021359E-05 0.19234706E-05 0.12291697E-06 -0.15889304E-05 -0.32026639E-05 - -0.47100721E-05 -0.61041411E-05 -0.73790486E-05 -0.85301498E-05 -0.95539581E-05 - -0.10448118E-04 -0.11211371E-04 -0.11843520E-04 -0.12345381E-04 -0.12718740E-04 - -0.12966293E-04 -0.13091593E-04 -0.13098990E-04 -0.12993562E-04 -0.12781054E-04 - -0.12467805E-04 -0.12060682E-04 -0.11567004E-04 -0.10994473E-04 -0.10351102E-04 - -0.96451441E-05 -0.88850170E-05 -0.80792383E-05 -0.72363555E-05 -0.63648798E-05 - -0.54732233E-05 -0.45696380E-05 -0.36621584E-05 -0.27585476E-05 -0.18662470E-05 - -0.99232994E-06 -0.14345991E-06 0.67414724E-06 0.14547563E-05 0.21931413E-05 - 0.28846089E-05 0.35250176E-05 0.41107917E-05 0.46389308E-05 0.51070144E-05 - 0.55132020E-05 0.58562288E-05 0.61353970E-05 0.63505627E-05 0.65021194E-05 - 0.65909775E-05 0.66185401E-05 0.65866761E-05 0.64976905E-05 0.63542912E-05 - 0.61595549E-05 0.59168901E-05 0.56299985E-05 0.53028363E-05 0.49395727E-05 - 0.45445501E-05 0.41222417E-05 0.36772115E-05 0.32140730E-05 0.27374494E-05 - 0.22519349E-05 0.17620572E-05 0.12722412E-05 0.78677566E-06 0.30978034E-06 - -0.15482310E-06 -0.60333860E-06 -0.10323203E-05 -0.14385946E-05 -0.18192788E-05 - -0.21717975E-05 -0.24938958E-05 -0.27836489E-05 -0.30394696E-05 -0.32601119E-05 - -0.34446725E-05 -0.35925882E-05 -0.37036321E-05 -0.37779053E-05 -0.38158276E-05 - -0.38181247E-05 -0.37858135E-05 -0.37201857E-05 -0.36227886E-05 -0.34954051E-05 - -0.33400317E-05 -0.31588555E-05 -0.29542301E-05 -0.27286505E-05 -0.24847277E-05 - -0.22251630E-05 -0.19527218E-05 -0.16702079E-05 -0.13804382E-05 -0.10862172E-05 - -0.79031329E-06 -0.49543528E-06 -0.20421011E-06 0.80837975E-07 0.35730694E-06 - 0.62293496E-06 0.87561665E-06 0.11134176E-05 0.13345872E-05 0.15375689E-05 - 0.17210098E-05 0.18837666E-05 0.20249111E-05 0.21437323E-05 0.22397380E-05 - 0.23126529E-05 0.23624163E-05 0.23891767E-05 0.23932857E-05 0.23752896E-05 - 0.23359196E-05 0.22760813E-05 0.21968416E-05 0.20994157E-05 0.19851524E-05 - 0.18555189E-05 0.17120850E-05 0.15565060E-05 0.13905063E-05 0.12158623E-05 - 0.10343849E-05 0.84790272E-06 0.65824498E-06 0.46722542E-06 0.27662610E-06 - 0.88182235E-07 -0.96432316E-07 -0.27561869E-06 -0.44786563E-06 -0.61176105E-06 - -0.76600248E-06 -0.90940617E-06 -0.10409151E-05 -0.11596055E-05 -0.12646923E-05 - -0.13555325E-05 -0.14316286E-05 -0.14926287E-05 -0.15383273E-05 -0.15686631E-05 - -0.15837168E-05 -0.15837066E-05 -0.15689836E-05 -0.15400253E-05 -0.14974285E-05 - -0.14419012E-05 -0.13742537E-05 -0.12953888E-05 -0.12062916E-05 -0.11080189E-05 - -0.10016876E-05 -0.88846338E-06 -0.76954920E-06 -0.64617321E-06 -0.51957713E-06 - -0.39100463E-06 -0.26168993E-06 -0.13284673E-06 -0.56575985E-08 0.11873617E-06 - 0.23924409E-06 0.35483532E-06 0.46454683E-06 0.56749076E-06 0.66286088E-06 - 0.74993828E-06 0.82809602E-06 0.89680296E-06 0.95562658E-06 0.10042348E-05 - 0.10423970E-05 0.10699838E-05 0.10869664E-05 0.10934144E-05 0.10894933E-05 - 0.10754611E-05 0.10516635E-05 0.10185295E-05 0.97656513E-06 0.92634782E-06 - 0.86851908E-06 0.80377754E-06 0.73287127E-06 0.65658987E-06 0.57575636E-06 - 0.49121891E-06 0.40384252E-06 0.31450065E-06 0.22406708E-06 0.13340778E-06 - 0.43373085E-07 -0.45209802E-07 -0.13154400E-06 -0.21486970E-06 -0.29447041E-06 - -0.36967874E-06 -0.43988155E-06 -0.50452456E-06 -0.56311628E-06 -0.61523130E-06 - -0.66051294E-06 -0.69867516E-06 -0.72950384E-06 -0.75285729E-06 -0.76866619E-06 - -0.77693279E-06 -0.77772948E-06 -0.77119677E-06 -0.75754063E-06 -0.73702932E-06 - -0.70998970E-06 -0.67680308E-06 -0.63790058E-06 -0.59375822E-06 -0.54489163E-06 - -0.49185048E-06 -0.43521276E-06 -0.37557887E-06 -0.31356558E-06 -0.24980003E-06 - -0.18491372E-06 -0.11953651E-06 -0.54290839E-07 0.10213919E-07 0.73386891E-07 - 0.13466084E-06 0.19349698E-06 0.24938949E-06 0.30186957E-06 0.35050912E-06 - 0.39492396E-06 0.43477660E-06 0.46977849E-06 0.49969185E-06 0.52433087E-06 - 0.54356256E-06 0.55730693E-06 0.56553685E-06 0.56827727E-06 0.56560403E-06 - 0.55764226E-06 0.54456431E-06 0.52658722E-06 0.50396998E-06 0.47701026E-06 - 0.44604100E-06 0.41142663E-06 0.37355910E-06 0.33285375E-06 0.28974500E-06 - 0.24468193E-06 0.19812388E-06 0.15053591E-06 0.10238442E-06 0.54132716E-07 - 0.62367788E-08 -0.40858886E-07 -0.86725192E-07 -0.13095221E-06 -0.17315265E-06 - -0.21296511E-06 -0.25005694E-06 -0.28412693E-06 -0.31490750E-06 -0.34216665E-06 - -0.36570951E-06 -0.38537949E-06 -0.40105911E-06 -0.41267040E-06 -0.42017495E-06 - -0.42357360E-06 -0.42290573E-06 -0.41824822E-06 -0.40971413E-06 -0.39745100E-06 - -0.38163883E-06 -0.36248792E-06 -0.34023633E-06 -0.31514719E-06 -0.28750579E-06 - -0.25761658E-06 -0.22579994E-06 -0.19238893E-06 -0.15772595E-06 -0.12215937E-06 - -0.86040187E-07 -0.49718647E-07 -0.13541005E-07 0.22153667E-07 0.57036538E-07 - 0.90791928E-07 0.12312006E-06 0.15373959E-06 0.18238997E-06 0.20883351E-06 - 0.23285726E-06 0.25427458E-06 0.27292648E-06 0.28868261E-06 0.30144207E-06 - 0.31113384E-06 0.31771695E-06 0.32118039E-06 0.32154272E-06 0.31885140E-06 - 0.31318189E-06 0.30463646E-06 0.29334283E-06 0.27945252E-06 0.26313906E-06 - 0.24459602E-06 0.22403482E-06 0.20168251E-06 0.17777935E-06 0.15257633E-06 - 0.12633270E-06 0.99313318E-07 0.71786140E-07 0.44019613E-07 0.16280158E-07 - -0.11170310E-07 -0.38076764E-07 -0.64193365E-07 -0.89285620E-07 -0.11313241E-06 - -0.13552787E-06 -0.15628307E-06 -0.17522752E-06 -0.19221052E-06 -0.20710224E-06 - -0.21979462E-06 -0.23020204E-06 -0.23826179E-06 -0.24393430E-06 -0.24720317E-06 - -0.24807490E-06 -0.24657857E-06 -0.24276514E-06 -0.23670665E-06 -0.22849526E-06 - -0.21824199E-06 -0.20607547E-06 -0.19214040E-06 -0.17659596E-06 -0.15961408E-06 - -0.14137764E-06 -0.12207857E-06 -0.10191591E-06 -0.81093788E-07 -0.59819486E-07 - -0.38301386E-07 -0.16747007E-07 0.46389382E-08 0.25656431E-07 0.46111962E-07 - 0.65820256E-07 0.84605894E-07 0.10230482E-06 0.11876572E-06 0.13385124E-06 - 0.14743910E-06 0.15942300E-06 0.16971338E-06 0.17823805E-06 0.18494256E-06 - 0.18979049E-06 0.19276351E-06 0.19386128E-06 0.19310120E-06 0.19051798E-06 - 0.18616304E-06 0.18010382E-06 0.17242285E-06 0.16321682E-06 0.15259538E-06 - 0.14067999E-06 0.12760255E-06 0.11350404E-06 0.98533033E-07 0.82844184E-07 - 0.66596694E-07 0.49952735E-07 0.33075874E-07 0.16129513E-07 -0.72465324E-09 - -0.17328139E-07 -0.33527119E-07 -0.49173812E-07 -0.64127789E-07 -0.78257197E-07 - -0.91439880E-07 -0.10356439E-06 -0.11453090E-06 -0.12425196E-06 -0.13265316E-06 - -0.13967366E-06 -0.14526653E-06 -0.14939904E-06 -0.15205274E-06 -0.15322347E-06 - -0.15292112E-06 -0.15116943E-06 -0.14800550E-06 -0.14347929E-06 -0.13765294E-06 - -0.13060004E-06 -0.12240475E-06 -0.11316085E-06 -0.10297075E-06 -0.91944386E-07 - -0.80198063E-07 -0.67853283E-07 -0.55035515E-07 -0.41872961E-07 -0.28495302E-07 - -0.15032454E-07 -0.16133352E-08 0.11635336E-07 0.24590209E-07 0.37132420E-07 - 0.49148656E-07 0.60532143E-07 0.71183572E-07 0.81011928E-07 0.89935244E-07 - 0.97881244E-07 0.10478790E-06 0.11060388E-06 0.11528886E-06 0.11881382E-06 - 0.12116109E-06 0.12232439E-06 0.12230878E-06 0.12113038E-06 0.11881613E-06 - 0.11540336E-06 0.11093929E-06 0.10548050E-06 0.99092190E-07 0.91847517E-07 - 0.83826762E-07 0.75116481E-07 0.65808606E-07 0.55999498E-07 0.45788981E-07 - 0.35279347E-07 0.24574360E-07 0.13778250E-07 0.29947206E-08 -0.76740207E-08 - -0.18128214E-07 -0.28271459E-07 -0.38011579E-07 -0.47261440E-07 -0.55939707E-07 - -0.63971541E-07 -0.71289215E-07 -0.77832665E-07 -0.83549956E-07 -0.88397669E-07 - -0.92341195E-07 -0.95354951E-07 -0.97422500E-07 -0.98536589E-07 -0.98699097E-07 - -0.97920896E-07 -0.96221633E-07 -0.93629426E-07 -0.90180493E-07 -0.85918699E-07 - -0.80895042E-07 -0.75167082E-07 -0.68798307E-07 -0.61857456E-07 -0.54417806E-07 - -0.46556413E-07 -0.38353339E-07 -0.29890854E-07 -0.21252631E-07 -0.12522934E-07 - -0.37858156E-08 0.48756775E-08 0.13380276E-07 0.21649236E-07 0.29607050E-07 - 0.37182121E-07 0.44307392E-07 0.50920920E-07 0.56966402E-07 0.62393631E-07 - 0.67158897E-07 0.71225322E-07 0.74563117E-07 0.77149777E-07 0.78970206E-07 - 0.80016760E-07 0.80289232E-07 0.79794755E-07 0.78547650E-07 0.76569190E-07 - 0.73887320E-07 0.70536305E-07 0.66556328E-07 0.61993032E-07 0.56897024E-07 - 0.51323331E-07 0.45330824E-07 0.38981613E-07 0.32340417E-07 0.25473921E-07 - 0.18450117E-07 0.11337647E-07 0.42051412E-08 -0.28794280E-08 -0.98493841E-08 - -0.16639961E-07 -0.23188892E-07 -0.29436970E-07 -0.35328568E-07 -0.40812125E-07 - -0.45840579E-07 -0.50371762E-07 -0.54368736E-07 -0.57800081E-07 -0.60640121E-07 - -0.62869100E-07 -0.64473297E-07 -0.65445078E-07 -0.65782899E-07 -0.65491242E-07 - -0.64580506E-07 -0.63066827E-07 -0.60971865E-07 -0.58322529E-07 -0.55150654E-07 - -0.51492651E-07 -0.47389095E-07 -0.42884300E-07 -0.38025850E-07 -0.32864112E-07 - -0.27451723E-07 -0.21843067E-07 -0.16093737E-07 -0.10259996E-07 -0.43982344E-08 - 0.14355627E-08 0.71863441E-08 0.12800501E-07 0.18226358E-07 0.23414641E-07 - 0.28318911E-07 0.32895976E-07 0.37106258E-07 0.40914127E-07 0.44288191E-07 - 0.47201541E-07 0.49631959E-07 0.51562064E-07 0.52979429E-07 0.53876634E-07 - 0.54251276E-07 0.54105940E-07 0.53448106E-07 0.52290030E-07 0.50648562E-07 - 0.48544941E-07 0.46004535E-07 0.43056558E-07 0.39733743E-07 0.36071996E-07 - 0.32110014E-07 0.27888888E-07 0.23451687E-07 0.18843027E-07 0.14108626E-07 - 0.92948675E-08 0.44483443E-08 -0.38457840E-09 -0.51582018E-08 -0.98279172E-08 - -0.14350616E-07 -0.18685080E-07 -0.22792350E-07 -0.26636066E-07 -0.30182785E-07 - -0.33402261E-07 -0.36267695E-07 -0.38755949E-07 -0.40847725E-07 -0.42527701E-07 - -0.43784631E-07 -0.44611406E-07 -0.45005075E-07 -0.44966822E-07 -0.44501911E-07 - -0.43619591E-07 -0.42332959E-07 -0.40658796E-07 -0.38617367E-07 -0.36232185E-07 - -0.33529757E-07 -0.30539298E-07 -0.27292420E-07 -0.23822813E-07 -0.20165895E-07 - -0.16358462E-07 -0.12438321E-07 -0.84439245E-08 -0.44139948E-08 -0.38715706E-09 - 0.35984264E-08 0.75054122E-08 0.11297620E-07 0.14940364E-07 0.18400759E-07 - 0.21648020E-07 0.24653721E-07 0.27392046E-07 0.29839999E-07 0.31977589E-07 - 0.33787991E-07 0.35257666E-07 0.36376450E-07 0.37137619E-07 0.37537909E-07 - 0.37577509E-07 0.37260025E-07 0.36592399E-07 0.35584817E-07 0.34250568E-07 - 0.32605889E-07 0.30669776E-07 0.28463775E-07 0.26011753E-07 0.23339640E-07 - 0.20475168E-07 0.17447585E-07 0.14287364E-07 0.11025901E-07 0.76952074E-08 - 0.43276014E-08 0.95539922E-09 -0.23893908E-08 -0.56753669E-08 -0.88720247E-08 - -0.11950035E-07 -0.14881510E-07 -0.17640250E-07 -0.20201972E-07 -0.22544524E-07 - -0.24648063E-07 -0.26495225E-07 -0.28071260E-07 -0.29364144E-07 -0.30364661E-07 - -0.31066465E-07 -0.31466104E-07 -0.31563026E-07 -0.31359549E-07 -0.30860813E-07 - -0.30074696E-07 -0.29011715E-07 -0.27684894E-07 -0.26109618E-07 -0.24303457E-07 - -0.22285982E-07 -0.20078552E-07 -0.17704100E-07 -0.15186893E-07 -0.12552291E-07 - -0.98264954E-08 -0.70362916E-08 -0.42087888E-08 -0.13711612E-08 0.14496101E-08 - 0.42269901E-08 0.69351355E-08 0.95491319E-08 0.12045220E-07 0.14401006E-07 - 0.16595662E-07 0.18610102E-07 0.20427146E-07 0.22031661E-07 0.23410684E-07 - 0.24553519E-07 0.25451815E-07 0.26099624E-07 0.26493423E-07 0.26632132E-07 - 0.26517089E-07 0.26152020E-07 0.25542974E-07 0.24698245E-07 0.23628266E-07 - 0.22345494E-07 0.20864267E-07 0.19200649E-07 0.17372264E-07 0.15398111E-07 - 0.13298372E-07 0.11094206E-07 0.88075432E-08 0.64608682E-08 0.40770010E-08 - 0.16788790E-08 -0.71066103E-09 -0.30690973E-08 -0.53744330E-08 -0.76053985E-08 - -0.97416452E-08 -0.11763929E-07 -0.13654278E-07 -0.15396156E-07 -0.16974594E-07 - -0.18376325E-07 -0.19589886E-07 -0.20605711E-07 -0.21416199E-07 -0.22015771E-07 - -0.22400896E-07 -0.22570106E-07 -0.22523988E-07 -0.22265159E-07 -0.21798218E-07 - -0.21129684E-07 -0.20267914E-07 -0.19223007E-07 -0.18006686E-07 -0.16632178E-07 - -0.15114066E-07 -0.13468142E-07 -0.11711246E-07 -0.98610957E-08 -0.79361089E-08 - -0.59552253E-08 -0.39377210E-08 -0.19030235E-08 0.12947253E-09 0.21405877E-08 - 0.41115363E-08 0.60240990E-08 0.78607894E-08 0.96050108E-08 0.11241205E-07 - 0.12754986E-07 0.14133267E-07 0.15364369E-07 0.16438116E-07 0.17345916E-07 - 0.18080829E-07 0.18637614E-07 0.19012761E-07 0.19204509E-07 0.19212846E-07 - 0.19039488E-07 0.18687849E-07 0.18162994E-07 0.17471570E-07 0.16621732E-07 - 0.15623051E-07 0.14486408E-07 0.13223881E-07 0.11848618E-07 0.10374701E-07 - 0.88170072E-08 0.71910591E-08 0.55128719E-08 0.37987983E-08 0.20653706E-08 - 0.32914233E-09 -0.13934677E-08 -0.30863295E-08 -0.47337509E-08 -0.63206208E-08 - -0.78325462E-08 -0.92559808E-08 -0.10578344E-07 -0.11788132E-07 -0.12875014E-07 - -0.13829917E-07 -0.14645103E-07 -0.15314224E-07 -0.15832370E-07 -0.16196103E-07 - -0.16403471E-07 -0.16454014E-07 -0.16348755E-07 -0.16090177E-07 -0.15682179E-07 - -0.15130034E-07 -0.14440317E-07 -0.13620840E-07 -0.12680557E-07 -0.11629478E-07 - 19.8421228800787 T - Non local Part - 0 2 1.03170241276447 - 8.48191517218165 11.7757836767903 11.7757836767903 - 16.3515625171536 - Reciprocal Space Part - 0.59618802E+02 0.58728804E+02 0.56074024E+02 0.51699804E+02 0.45680746E+02 - 0.38119274E+02 0.29143671E+02 0.18905623E+02 0.75773282E+01 -0.46517683E+01 - -0.17578547E+02 -0.30990019E+02 -0.44667277E+02 -0.58389527E+02 -0.71938095E+02 - -0.85100345E+02 -0.97673425E+02 -0.10946776E+03 -0.12031025E+03 -0.13004704E+03 - -0.13854596E+03 -0.14569837E+03 -0.15142064E+03 -0.15565502E+03 -0.15837002E+03 - -0.15956027E+03 -0.15924591E+03 -0.15747139E+03 -0.15430398E+03 -0.14983176E+03 - -0.14416132E+03 -0.13741514E+03 -0.12972880E+03 -0.12124795E+03 -0.11212524E+03 - -0.10251722E+03 -0.92581277E+02 -0.82472653E+02 -0.72341667E+02 -0.62331121E+02 - -0.52573985E+02 -0.43191382E+02 -0.34290898E+02 -0.25965259E+02 -0.18291368E+02 - -0.11329718E+02 -0.51241765E+01 0.29787571E+00 0.49250688E+01 0.87612564E+01 - 0.11824451E+02 0.14145521E+02 0.15766686E+02 0.16739863E+02 0.17124899E+02 - 0.16987748E+02 0.16398621E+02 0.15430172E+02 0.14155746E+02 0.12647730E+02 - 0.10976046E+02 0.92067952E+01 0.74011008E+01 0.56141435E+01 0.38944113E+01 - 0.22831646E+01 0.81411644E+00 -0.48667978E+00 -0.16007453E+01 -0.25169103E+01 - -0.32308862E+01 -0.37446987E+01 -0.40660062E+01 -0.42073286E+01 -0.41852143E+01 - -0.40193711E+01 -0.37317875E+01 -0.33458677E+01 -0.28856034E+01 -0.23748024E+01 - -0.18363896E+01 -0.12917960E+01 -0.76044515E+00 -0.25934295E+00 0.19722322E+00 - 0.59787806E+00 0.93424642E+00 0.12009418E+01 0.13954638E+01 0.15180138E+01 - 0.15712429E+01 0.15599426E+01 0.14906942E+01 0.13714899E+01 0.12113407E+01 - 0.10198828E+01 0.80699697E+00 0.58245003E+00 0.35557023E+00 0.13496271E+00 - Real Space Part - -0.87257185E+03 -0.87217325E+03 -0.87097758E+03 -0.86898535E+03 -0.86619740E+03 - -0.86261493E+03 -0.85823952E+03 -0.85307319E+03 -0.84711839E+03 -0.84037811E+03 - -0.83285587E+03 -0.82455582E+03 -0.81548281E+03 -0.80564241E+03 -0.79504105E+03 - -0.78368604E+03 -0.77158570E+03 -0.75874942E+03 -0.74518776E+03 -0.73091251E+03 - -0.71593685E+03 -0.70027535E+03 -0.68394415E+03 -0.66696100E+03 -0.64934533E+03 - -0.63111840E+03 -0.61230331E+03 -0.59292512E+03 -0.57301089E+03 -0.55258976E+03 - -0.53169298E+03 -0.51035396E+03 -0.48860832E+03 -0.46649386E+03 -0.44405060E+03 - -0.42132076E+03 -0.39834870E+03 -0.37518093E+03 -0.35186599E+03 -0.32845440E+03 - -0.30499855E+03 -0.28155254E+03 -0.25817210E+03 -0.23491433E+03 -0.21183758E+03 - -0.18900121E+03 -0.16646531E+03 -0.14429049E+03 -0.12253758E+03 -0.10126731E+03 - -0.80539962E+02 -0.60415079E+02 -0.40951054E+02 -0.22204768E+02 -0.42311995E+01 - 0.12916980E+02 0.29189809E+02 0.44540445E+02 0.58925573E+02 0.72305804E+02 - 0.84646067E+02 0.95915987E+02 0.10609024E+03 0.11514887E+03 0.12307763E+03 - 0.12986821E+03 0.13551849E+03 0.14003271E+03 0.14342163E+03 0.14570263E+03 - 0.14689971E+03 0.14704353E+03 0.14617130E+03 0.14432667E+03 0.14155957E+03 - 0.13792593E+03 0.13348743E+03 0.12831116E+03 0.12246922E+03 0.11603831E+03 - 0.10909924E+03 0.10173648E+03 0.94037578E+02 0.86092680E+02 0.77993902E+02 - 0.69834817E+02 0.61709839E+02 0.53713688E+02 0.45940793E+02 0.38484762E+02 - 0.31437841E+02 0.24890391E+02 0.18930406E+02 0.13643042E+02 0.91101706E+01 - 0.54100403E+01 0.26168332E+01 0.79835325E+00 0.23427012E-01 0.00000000E+00 - Reciprocal Space Part - -0.36489549E+02 -0.35864156E+02 -0.33998755E+02 -0.30925471E+02 -0.26697153E+02 - -0.21386360E+02 -0.15083959E+02 -0.78973858E+01 0.51413298E-01 0.86282977E+01 - 0.17689472E+02 0.27084188E+02 0.36657552E+02 0.46253383E+02 0.55717063E+02 - 0.64898313E+02 0.73653855E+02 0.81849887E+02 0.89364344E+02 0.96088881E+02 - 0.10193057E+03 0.10681323E+03 0.11067846E+03 0.11348624E+03 0.11521523E+03 - 0.11586261E+03 0.11544365E+03 0.11399089E+03 0.11155304E+03 0.10819353E+03 - 0.10398888E+03 0.99026864E+02 0.93404459E+02 0.87225735E+02 0.80599650E+02 - 0.73637846E+02 0.66452460E+02 0.59154022E+02 0.51849465E+02 0.44640290E+02 - 0.37620922E+02 0.30877278E+02 0.24485577E+02 0.18511398E+02 0.13009009E+02 - 0.80209530E+01 0.35779043E+01 -0.30122499E+00 -0.36089364E+01 -0.63485770E+01 - -0.85335736E+01 -0.10186497E+02 -0.11337984E+02 -0.12025554E+02 -0.12292345E+02 - -0.12185805E+02 -0.11756382E+02 -0.11056219E+02 -0.10137909E+02 -0.90533175E+01 - -0.78525080E+01 -0.65827802E+01 -0.52878430E+01 -0.40071309E+01 -0.27752721E+01 - -0.16217097E+01 -0.57047779E+00 0.35987548E+00 0.11562232E+01 0.18106666E+01 - 0.23202264E+01 0.26864349E+01 0.29148468E+01 0.30144856E+01 0.29972475E+01 - 0.28772789E+01 0.26703472E+01 0.23932227E+01 0.20630867E+01 0.16969795E+01 - 0.13113025E+01 0.92138094E+00 0.54109837E+00 0.18260423E+00 -0.14390035E+00 - -0.43029978E+00 -0.67062595E+00 -0.86104898E+00 -0.99980292E+00 -0.10870535E+01 - -0.11247164E+01 -0.11162365E+01 -0.10663359E+01 -0.98074332E+00 -0.86591280E+00 - -0.72874294E+00 -0.57630417E+00 -0.41558297E+00 -0.25324963E+00 -0.95455204E-01 - Real Space Part - 0.63319797E+03 0.63291041E+03 0.63204781E+03 0.63061056E+03 0.62859924E+03 - 0.62601473E+03 0.62285817E+03 0.61913101E+03 0.61483503E+03 0.60997237E+03 - 0.60454559E+03 0.59855767E+03 0.59201211E+03 0.58491291E+03 0.57726472E+03 - 0.56907280E+03 0.56034314E+03 0.55108251E+03 0.54129849E+03 0.53099960E+03 - 0.52019530E+03 0.50889609E+03 0.49711358E+03 0.48486054E+03 0.47215095E+03 - 0.45900011E+03 0.44542463E+03 0.43144254E+03 0.41707331E+03 0.40233788E+03 - 0.38725874E+03 0.37185991E+03 0.35616701E+03 0.34020723E+03 0.32400934E+03 - 0.30760369E+03 0.29102220E+03 0.27429832E+03 0.25746694E+03 0.24056440E+03 - 0.22362837E+03 0.20669777E+03 0.18981266E+03 0.17301414E+03 0.15634416E+03 - 0.13984541E+03 0.12356113E+03 0.10753493E+03 0.91810566E+02 0.76431735E+02 - 0.61441833E+02 0.46883707E+02 0.32799393E+02 0.19229849E+02 0.62146659E+01 - -0.62082134E+01 -0.18002788E+02 -0.29135292E+02 -0.39574487E+02 -0.49291950E+02 - -0.58262356E+02 -0.66463744E+02 -0.73877778E+02 -0.80489982E+02 -0.86289957E+02 - -0.91271581E+02 -0.95433167E+02 -0.98777602E+02 -0.10131245E+03 -0.10305002E+03 - -0.10400739E+03 -0.10420642E+03 -0.10367366E+03 -0.10244030E+03 -0.10054203E+03 - -0.98018889E+02 -0.94915012E+02 -0.91278431E+02 -0.87160797E+02 -0.82617056E+02 - -0.77705128E+02 -0.72485556E+02 -0.67021113E+02 -0.61376433E+02 -0.55617588E+02 - -0.49811699E+02 -0.44026502E+02 -0.38329965E+02 -0.32789855E+02 -0.27473361E+02 - -0.22446704E+02 -0.17774762E+02 -0.13520724E+02 -0.97457493E+01 -0.65086493E+01 - -0.38656440E+01 -0.18700414E+01 -0.57059033E+00 -0.16714955E-01 0.00000000E+00 - Non local Part - 1 2 1.03170241276447 - 2.65859946877321 4.88238126795342 4.88238126795342 - 8.98435195357541 - Reciprocal Space Part - 0.00000000E+00 0.38861820E+01 0.76566506E+01 0.11198191E+02 0.14402530E+02 - 0.17168669E+02 0.19405054E+02 0.21031535E+02 0.21981079E+02 0.22201184E+02 - 0.21654974E+02 0.20321960E+02 0.18198431E+02 0.15297488E+02 0.11648712E+02 - 0.72974833E+01 0.23039596E+01 -0.32582469E+01 -0.93036735E+01 -0.15736848E+02 - -0.22454324E+02 -0.29346862E+02 -0.36301710E+02 -0.43204929E+02 -0.49943706E+02 - -0.56408622E+02 -0.62495800E+02 -0.68108907E+02 -0.73160964E+02 -0.77575922E+02 - -0.81289979E+02 -0.84252614E+02 -0.86427318E+02 -0.87792019E+02 -0.88339191E+02 - -0.88075654E+02 -0.87022084E+02 -0.85212244E+02 -0.82691957E+02 -0.79517866E+02 - -0.75756000E+02 -0.71480183E+02 -0.66770345E+02 -0.61710747E+02 -0.56388189E+02 - -0.50890222E+02 -0.45303418E+02 -0.39711722E+02 -0.34194931E+02 -0.28827322E+02 - -0.23676453E+02 -0.18802168E+02 -0.14255806E+02 -0.10079632E+02 -0.63064936E+01 - -0.29596904E+01 -0.53068427E-01 0.24086920E+01 0.44295991E+01 0.60217087E+01 - 0.72043400E+01 0.80031754E+01 0.84492707E+01 0.85780039E+01 0.84279913E+01 - 0.80399981E+01 0.74558696E+01 0.67175093E+01 0.58659233E+01 0.49403528E+01 - 0.39775094E+01 0.30109262E+01 0.20704331E+01 0.11817624E+01 0.36628567E+00 - -0.35911990E+00 -0.98208097E+00 -0.14946211E+01 -0.18929483E+01 -0.21771504E+01 - -0.23508116E+01 -0.24205674E+01 -0.23956133E+01 -0.22871843E+01 -0.21080214E+01 - -0.18718417E+01 -0.15928247E+01 -0.12851305E+01 -0.96245910E+00 -0.63766179E+00 - -0.32241090E+00 -0.26933951E-01 0.24018535E+00 0.47213831E+00 0.66395584E+00 - 0.81250966E+00 0.91645487E+00 0.97612004E+00 0.99335246E+00 0.97132649E+00 - Real Space Part - 0.00000000E+00 -0.22186814E+02 -0.44301839E+02 -0.66273522E+02 -0.88030777E+02 - -0.10950322E+03 -0.13062140E+03 -0.15131703E+03 -0.17152321E+03 -0.19117468E+03 - -0.21020799E+03 -0.22856176E+03 -0.24617690E+03 -0.26299679E+03 -0.27896751E+03 - -0.29403802E+03 -0.30816039E+03 -0.32128994E+03 -0.33338548E+03 -0.34440943E+03 - -0.35432799E+03 -0.36311136E+03 -0.37073379E+03 -0.37717380E+03 -0.38241426E+03 - -0.38644250E+03 -0.38925046E+03 -0.39083470E+03 -0.39119654E+03 -0.39034209E+03 - -0.38828229E+03 -0.38503293E+03 -0.38061467E+03 -0.37505301E+03 -0.36837826E+03 - -0.36062551E+03 -0.35183450E+03 -0.34204958E+03 -0.33131954E+03 -0.31969747E+03 - -0.30724063E+03 -0.29401017E+03 -0.28007097E+03 -0.26549136E+03 -0.25034283E+03 - -0.23469974E+03 -0.21863898E+03 -0.20223959E+03 -0.18558239E+03 -0.16874958E+03 - -0.15182426E+03 -0.13489000E+03 -0.11803038E+03 -0.10132845E+03 -0.84866250E+02 - -0.68724282E+02 -0.52980979E+02 -0.37712173E+02 -0.22990566E+02 -0.88851973E+01 - 0.45390663E+01 0.17222034E+02 0.29108671E+02 0.40149550E+02 0.50301273E+02 - 0.59526856E+02 0.67796071E+02 0.75085739E+02 0.81379975E+02 0.86670373E+02 - 0.90956134E+02 0.94244139E+02 0.96548944E+02 0.97892719E+02 0.98305121E+02 - 0.97823113E+02 0.96490698E+02 0.94358601E+02 0.91483927E+02 0.87929701E+02 - 0.83764422E+02 0.79061549E+02 0.73898935E+02 0.68358280E+02 0.62524490E+02 - 0.56485105E+02 0.50329625E+02 0.44148922E+02 0.38034576E+02 0.32078283E+02 - 0.26371234E+02 0.21003526E+02 0.16063609E+02 0.11637728E+02 0.78094126E+01 - 0.46590409E+01 0.22633368E+01 0.69369210E+00 0.17747648E-01 0.00000000E+00 - Reciprocal Space Part - 0.00000000E+00 -0.17868362E+01 -0.35144269E+01 -0.51248277E+01 -0.65626676E+01 - -0.77763629E+01 -0.87192468E+01 -0.93505888E+01 -0.96364809E+01 -0.95505728E+01 - -0.90746384E+01 -0.81989629E+01 -0.69225426E+01 -0.52530936E+01 -0.32068705E+01 - -0.80830207E+00 0.19105496E+01 0.49106895E+01 0.81470351E+01 0.11569385E+02 - 0.15123488E+02 0.18752190E+02 0.22396628E+02 0.25997448E+02 0.29496018E+02 - 0.32835608E+02 0.35962514E+02 0.38827099E+02 0.41384736E+02 0.43596618E+02 - 0.45430445E+02 0.46860950E+02 0.47870266E+02 0.48448142E+02 0.48591976E+02 - 0.48306705E+02 0.47604523E+02 0.46504469E+02 0.45031872E+02 0.43217686E+02 - 0.41097721E+02 0.38711805E+02 0.36102874E+02 0.33316045E+02 0.30397658E+02 - 0.27394336E+02 0.24352070E+02 0.21315355E+02 0.18326389E+02 0.15424354E+02 - 0.12644790E+02 0.10019079E+02 0.75740326E+01 0.53316035E+01 0.33087123E+01 - 0.15171909E+01 -0.36159418E-01 -0.13494048E+01 -0.24252171E+01 -0.32705252E+01 - -0.38960921E+01 -0.43160309E+01 -0.45472742E+01 -0.46090120E+01 -0.45221135E+01 - -0.43085463E+01 -0.39908088E+01 -0.35913863E+01 -0.31322454E+01 -0.26343746E+01 - -0.21173800E+01 -0.15991441E+01 -0.10955499E+01 -0.62027500E+00 -0.18465580E+00 - 0.20237976E+00 0.53431322E+00 0.80697500E+00 0.10184279E+01 0.11688016E+01 - 0.12600861E+01 0.12958921E+01 0.12811875E+01 0.12220191E+01 0.11252269E+01 - 0.99816176E+00 0.84841124E+00 0.68354309E+00 0.51087098E+00 0.33724795E+00 - 0.16889148E+00 0.11242749E-01 -0.13113830E+00 -0.25464171E+00 -0.35664077E+00 - -0.43549155E+00 -0.49050126E+00 -0.52186870E+00 -0.53060095E+00 -0.51841055E+00 - Real Space Part - 0.00000000E+00 0.12161252E+02 0.24283469E+02 0.36327742E+02 0.48255417E+02 - 0.60028220E+02 0.71608383E+02 0.82958767E+02 0.94042991E+02 0.10482555E+03 - 0.11527193E+03 0.12534873E+03 0.13502381E+03 0.14426635E+03 0.15304699E+03 - 0.16133795E+03 0.16911311E+03 0.17634814E+03 0.18302057E+03 0.18910990E+03 - 0.19459770E+03 0.19946767E+03 0.20370573E+03 0.20730009E+03 0.21024135E+03 - 0.21252251E+03 0.21413905E+03 0.21508898E+03 0.21537287E+03 0.21499392E+03 - 0.21395789E+03 0.21227322E+03 0.20995096E+03 0.20700481E+03 0.20345105E+03 - 0.19930856E+03 0.19459875E+03 0.18934552E+03 0.18357519E+03 0.17731641E+03 - 0.17060007E+03 0.16345921E+03 0.15592887E+03 0.14804598E+03 0.13984918E+03 - 0.13137868E+03 0.12267606E+03 0.11378408E+03 0.10474648E+03 0.95607747E+02 - 0.86412883E+02 0.77207157E+02 0.68035844E+02 0.58943963E+02 0.49976000E+02 - 0.41175622E+02 0.32585400E+02 0.24246514E+02 0.16198468E+02 0.84788075E+01 - 0.11228377E+01 -0.58366451E+01 -0.12369614E+02 -0.18449055E+02 -0.24051197E+02 - -0.29155721E+02 -0.33745943E+02 -0.37808973E+02 -0.41335852E+02 -0.44321651E+02 - -0.46765541E+02 -0.48670833E+02 -0.50044982E+02 -0.50899549E+02 -0.51250136E+02 - -0.51116295E+02 -0.50521380E+02 -0.49492378E+02 -0.48059729E+02 -0.46257077E+02 - -0.44121031E+02 -0.41690892E+02 -0.39008342E+02 -0.36117160E+02 -0.33062867E+02 - -0.29892426E+02 -0.26653874E+02 -0.23396010E+02 -0.20168034E+02 -0.17019231E+02 - -0.13998631E+02 -0.11154698E+02 -0.85350264E+01 -0.61860453E+01 -0.41527388E+01 - -0.24784108E+01 -0.12044157E+01 -0.36926989E+00 -0.93979993E-02 0.00000000E+00 - PAW radial sets - 351 0.989218471734280 -(5E20.12) - augmentation charges (non sperical) - -0.118612820244E+00 -0.166184190184E+00 -0.532145144881E-01 -0.101222164724E+00 -0.166184190184E+00 - -0.232848406670E+00 -0.743582353105E-01 -0.141431561143E+00 -0.532145144881E-01 -0.743582353105E-01 - -0.179689550405E-01 -0.343505440708E-01 -0.101222164724E+00 -0.141431561143E+00 -0.343505440708E-01 - -0.655142723317E-01 - uccopancies in atom - 0.200000000235E+01 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.666666668254E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 - grid - 0.353278105438E-04 0.364765828105E-04 0.376627102856E-04 0.388874076671E-04 0.401519291522E-04 - 0.414575697215E-04 0.428056664648E-04 0.441975999512E-04 0.456347956421E-04 0.471187253514E-04 - 0.486509087530E-04 0.502329149365E-04 0.518663640144E-04 0.535529287814E-04 0.552943364272E-04 - 0.570923703053E-04 0.589488717596E-04 0.608657420098E-04 0.628449440985E-04 0.648885049016E-04 - 0.669985172040E-04 0.691771418426E-04 0.714266099194E-04 0.737492250864E-04 0.761473659044E-04 - 0.786234882792E-04 0.811801279764E-04 0.838199032186E-04 0.865455173661E-04 0.893597616862E-04 - 0.922655182109E-04 0.952657626888E-04 0.983635676325E-04 0.101562105465E-03 0.104864651768E-03 - 0.108274588638E-03 0.111795408149E-03 0.115430715926E-03 0.119184234844E-03 0.123059808833E-03 - 0.127061406819E-03 0.131193126789E-03 0.135459199986E-03 0.139863995240E-03 0.144412023447E-03 - 0.149107942186E-03 0.153956560487E-03 0.158962843759E-03 0.164131918874E-03 0.169469079417E-03 - 0.174979791106E-03 0.180669697392E-03 0.186544625235E-03 0.192610591076E-03 0.198873806993E-03 - 0.205340687067E-03 0.212017853948E-03 0.218912145639E-03 0.226030622496E-03 0.233380574462E-03 - 0.240969528530E-03 0.248805256452E-03 0.256895782699E-03 0.265249392676E-03 0.273874641209E-03 - 0.282780361308E-03 0.291975673207E-03 0.301469993709E-03 0.311273045829E-03 0.321394868748E-03 - 0.331845828098E-03 0.342636626573E-03 0.353778314896E-03 0.365282303127E-03 0.377160372357E-03 - 0.389424686766E-03 0.402087806084E-03 0.415162698451E-03 0.428662753701E-03 0.442601797068E-03 - 0.456994103352E-03 0.471854411533E-03 0.487197939863E-03 0.503040401457E-03 0.519398020380E-03 - 0.536287548263E-03 0.553726281459E-03 0.571732078754E-03 0.590323379658E-03 0.609519223288E-03 - 0.629339267864E-03 0.649803810846E-03 0.670933809712E-03 0.692750903429E-03 0.715277434606E-03 - 0.738536472381E-03 0.762551836040E-03 0.787348119413E-03 0.812950716063E-03 0.839385845286E-03 - 0.866680578963E-03 0.894862869287E-03 0.923961577387E-03 0.954006502881E-03 0.985028414399E-03 - 0.101705908109E-02 0.105013130516E-02 0.108427895544E-02 0.111953700213E-02 0.115594155253E-02 - 0.119352988810E-02 0.123234050257E-02 0.127241314140E-02 0.131378884247E-02 0.135650997813E-02 - 0.140062029854E-02 0.144616497653E-02 0.149319065382E-02 0.154174548883E-02 0.159187920594E-02 - 0.164364314647E-02 0.169709032120E-02 0.175227546473E-02 0.180925509145E-02 0.186808755348E-02 - 0.192883310041E-02 0.199155394099E-02 0.205631430683E-02 0.212318051821E-02 0.219222105197E-02 - 0.226350661166E-02 0.233711019991E-02 0.241310719324E-02 0.249157541920E-02 0.257259523611E-02 - 0.265624961535E-02 0.274262422631E-02 0.283180752413E-02 0.292389084032E-02 0.301896847624E-02 - 0.311713779968E-02 0.321849934462E-02 0.332315691413E-02 0.343121768671E-02 0.354279232604E-02 - 0.365799509430E-02 0.377694396919E-02 0.389976076474E-02 0.402657125610E-02 0.415750530828E-02 - 0.429269700920E-02 0.443228480697E-02 0.457641165169E-02 0.472522514185E-02 0.487887767547E-02 - 0.503752660617E-02 0.520133440431E-02 0.537046882339E-02 0.554510307185E-02 0.572541599040E-02 - 0.591159223525E-02 0.610382246712E-02 0.630230354657E-02 0.650723873558E-02 0.671883790569E-02 - 0.693731775293E-02 0.716290201977E-02 0.739582172419E-02 0.763631539635E-02 0.788462932276E-02 - 0.814101779859E-02 0.840574338805E-02 0.867907719326E-02 0.896129913194E-02 0.925269822400E-02 - 0.955357288758E-02 0.986423124464E-02 0.101849914365E-01 0.105161819495E-01 0.108581419519E-01 - 0.112112216404E-01 0.115757825996E-01 0.119521981717E-01 0.123408538391E-01 0.127421476193E-01 - 0.131564904721E-01 0.135843067208E-01 0.140260344867E-01 0.144821261375E-01 0.149530487510E-01 - 0.154392845931E-01 0.159413316118E-01 0.164597039470E-01 0.169949324574E-01 0.175475652638E-01 - 0.181181683104E-01 0.187073259445E-01 0.193156415151E-01 0.199437379906E-01 0.205922585965E-01 - 0.212618674747E-01 0.219532503631E-01 0.226671152982E-01 0.234041933402E-01 0.241652393213E-01 - 0.249510326191E-01 0.257623779547E-01 0.266001062165E-01 0.274650753115E-01 0.283581710436E-01 - 0.292803080210E-01 0.302324305924E-01 0.312155138146E-01 0.322305644506E-01 0.332786220011E-01 - 0.343607597686E-01 0.354780859567E-01 0.366317448050E-01 0.378229177610E-01 0.390528246900E-01 - 0.403227251240E-01 0.416339195521E-01 0.429877507520E-01 0.443856051652E-01 0.458289143166E-01 - 0.473191562810E-01 0.488578571964E-01 0.504465928270E-01 0.520869901769E-01 0.537807291563E-01 - 0.555295443019E-01 0.573352265534E-01 0.591996250870E-01 0.611246492098E-01 0.631122703148E-01 - 0.651645238996E-01 0.672835116512E-01 0.694714035982E-01 0.717304403333E-01 0.740629353074E-01 - 0.764712771991E-01 0.789579323611E-01 0.815254473456E-01 0.841764515121E-01 0.869136597208E-01 - 0.897398751118E-01 0.926579919768E-01 0.956709987225E-01 0.987819809310E-01 0.101994124520E+00 - 0.105310719005E+00 0.108735160869E+00 0.112270957040E+00 0.115921728481E+00 0.119691213902E+00 - 0.123583273585E+00 0.127601893339E+00 0.131751188583E+00 0.136035408556E+00 0.140458940676E+00 - 0.145026315024E+00 0.149742208992E+00 0.154611452068E+00 0.159639030781E+00 0.164830093811E+00 - 0.170189957261E+00 0.175724110099E+00 0.181438219781E+00 0.187338138056E+00 0.193429906954E+00 - 0.199719764979E+00 0.206214153496E+00 0.212919723327E+00 0.219843341560E+00 0.226992098585E+00 - 0.234373315355E+00 0.241994550880E+00 0.249863609972E+00 0.257988551235E+00 0.266377695319E+00 - 0.275039633439E+00 0.283983236179E+00 0.293217662568E+00 0.302752369466E+00 0.312597121246E+00 - 0.322761999795E+00 0.333257414835E+00 0.344094114590E+00 0.355283196787E+00 0.366836120023E+00 - 0.378764715502E+00 0.391081199148E+00 0.403798184116E+00 0.416928693710E+00 0.430486174720E+00 - 0.444484511190E+00 0.458938038641E+00 0.473861558747E+00 0.489270354497E+00 0.505180205845E+00 - 0.521607405869E+00 0.538568777456E+00 0.556081690535E+00 0.574164079857E+00 0.592834463369E+00 - 0.612111961177E+00 0.632016315122E+00 0.652567909002E+00 0.673787789445E+00 0.695697687463E+00 - 0.718320040705E+00 0.741678016440E+00 0.765795535274E+00 0.790697295655E+00 0.816408799161E+00 - 0.842956376619E+00 0.870367215068E+00 0.898669385601E+00 0.927891872115E+00 0.958064600989E+00 - 0.989218471734E+00 0.102138538864E+01 0.105459829343E+01 0.108889119903E+01 0.112429922437E+01 - 0.116085863037E+01 0.119860685704E+01 0.123758256187E+01 0.127782565939E+01 0.131937736205E+01 - 0.136228022242E+01 0.140657817678E+01 0.145231659010E+01 0.149954230253E+01 0.154830367731E+01 - 0.159865065035E+01 0.165063478135E+01 0.170430930661E+01 0.175972919353E+01 0.181695119691E+01 - 0.187603391710E+01 0.193703785995E+01 0.200002549884E+01 0.206506133861E+01 0.213221198164E+01 - 0.220154619607E+01 0.227313498618E+01 0.234705166515E+01 0.242337193012E+01 0.250217393971E+01 - 0.258353839407E+01 - aepotential - 0.249296947974E+05 0.247076561026E+05 0.244443313547E+05 0.241414253640E+05 0.238012309740E+05 - 0.234259813678E+05 0.230181043480E+05 0.225809961616E+05 0.221166800594E+05 0.216286109490E+05 - 0.211196171324E+05 0.205927134571E+05 0.200508445329E+05 0.194969963033E+05 0.189339771311E+05 - 0.183645026186E+05 0.177912890443E+05 0.172167064663E+05 0.166431270260E+05 0.160726862779E+05 - 0.155073402250E+05 0.149488848247E+05 0.143989117768E+05 0.138588393857E+05 0.133298963598E+05 - 0.128131392341E+05 0.123094542557E+05 0.118195679465E+05 0.113440551010E+05 0.108833506728E+05 - 0.104377601662E+05 0.100074714858E+05 0.959256622382E+04 0.919303113611E+04 0.880876923400E+04 - 0.843961046952E+04 0.808532192877E+04 0.774561726178E+04 0.742016531312E+04 0.710859980992E+04 - 0.681052312014E+04 0.652551855157E+04 0.625315022209E+04 0.599297269034E+04 0.574453507071E+04 - 0.550738155297E+04 0.528105943435E+04 0.506512283908E+04 0.485912669119E+04 0.466263692016E+04 - 0.447523241993E+04 0.429649920031E+04 0.412604217009E+04 0.396347085357E+04 0.380841736718E+04 - 0.366052059215E+04 0.351943998366E+04 0.338484550824E+04 0.325642075114E+04 0.313386784458E+04 - 0.301689601724E+04 0.290523717951E+04 0.279862371984E+04 0.269681383135E+04 0.259956791482E+04 - 0.250666289932E+04 0.241788601403E+04 0.233303530109E+04 0.225191811134E+04 0.217435346238E+04 - 0.210016749107E+04 0.202919681943E+04 0.196128648905E+04 0.189628781912E+04 0.183406428064E+04 - 0.177447815378E+04 0.171741030060E+04 0.166273352875E+04 0.161034457319E+04 0.156012716492E+04 - 0.151198483922E+04 0.146582052759E+04 0.142154086395E+04 0.137906097148E+04 0.133829797002E+04 - 0.129917207490E+04 0.126161128619E+04 0.122554324807E+04 0.119090137554E+04 0.115762273768E+04 - 0.112564519634E+04 0.109491260230E+04 0.106536958529E+04 0.103696376209E+04 0.100964626874E+04 - 0.983369386517E+03 0.958088259270E+03 0.933760491469E+03 0.910344918809E+03 0.887802999165E+03 - 0.866097688492E+03 0.845193722659E+03 0.825057486722E+03 0.805656949235E+03 0.786961460988E+03 - 0.768941860254E+03 0.751570280175E+03 0.734820058649E+03 0.718665839953E+03 0.703083242035E+03 - 0.688049142095E+03 0.673541285748E+03 0.659538404365E+03 0.646020181485E+03 0.632967306499E+03 - 0.620361030724E+03 0.608183507242E+03 0.596417880177E+03 0.585047538181E+03 0.574057005309E+03 - 0.563431167138E+03 0.553155596176E+03 0.543216472219E+03 0.533600577089E+03 0.524295096628E+03 - 0.515287864004E+03 0.506567108698E+03 0.498121462758E+03 0.489940202519E+03 0.482012792804E+03 - 0.474329218497E+03 0.466879807157E+03 0.459655277491E+03 0.452646665244E+03 0.445845326919E+03 - 0.439242971301E+03 0.432831556708E+03 0.426603373307E+03 0.420550954576E+03 0.414667100840E+03 - 0.408944864593E+03 0.403377536754E+03 0.397958629585E+03 0.392681872509E+03 0.387541205851E+03 - 0.382530758167E+03 0.377644862756E+03 0.372878015893E+03 0.368224898594E+03 0.363680350460E+03 - 0.359239371823E+03 0.354897097109E+03 0.350648847402E+03 0.346490028292E+03 0.342416224923E+03 - 0.338423107351E+03 0.334506504401E+03 0.330662319969E+03 0.326886614027E+03 0.323175521883E+03 - 0.319525291137E+03 0.315932256738E+03 0.312392876939E+03 0.308903660561E+03 0.305461237806E+03 - 0.302062300261E+03 0.298703633981E+03 0.295382095296E+03 0.292094620152E+03 0.288838215885E+03 - 0.285609957558E+03 0.282406996490E+03 0.279226542503E+03 0.276065876855E+03 0.272922339966E+03 - 0.269793336953E+03 0.266676334707E+03 0.263568857552E+03 0.260468492389E+03 0.257372882929E+03 - 0.254279731763E+03 0.251186799954E+03 0.248091907223E+03 0.244992930370E+03 0.241887805727E+03 - 0.238774528474E+03 0.235651153907E+03 0.232515797559E+03 0.229366637373E+03 0.226201914200E+03 - 0.223019933142E+03 0.219819066345E+03 0.216597753942E+03 0.213354506528E+03 0.210087907601E+03 - 0.206796615859E+03 0.203479368741E+03 0.200134985511E+03 0.196762369494E+03 0.193360514156E+03 - 0.189928504953E+03 0.186465523853E+03 0.182970859195E+03 0.179443901362E+03 0.175884158862E+03 - 0.172291258360E+03 0.168664954571E+03 0.165005135639E+03 0.161311835637E+03 0.157585240450E+03 - 0.153825700617E+03 0.150033742009E+03 0.146210080614E+03 0.142355636015E+03 0.138471547517E+03 - 0.134559194204E+03 0.130620213523E+03 0.126656524279E+03 0.122670351092E+03 0.118664249894E+03 - 0.114641136764E+03 0.110604316344E+03 0.106557510777E+03 0.102504888129E+03 0.984510866673E+02 - 0.944012339330E+02 0.903609560496E+02 0.863363727654E+02 0.823340720461E+02 0.783610582152E+02 - 0.744246635302E+02 0.705324163825E+02 0.666918556889E+02 0.629102857223E+02 0.591944670209E+02 - 0.555502478406E+02 0.519821533052E+02 0.484929672889E+02 0.450833747727E+02 0.417517679667E+02 - 0.384943736779E+02 0.353058990617E+02 0.321809409707E+02 0.291163273793E+02 0.261144332192E+02 - 0.231871490568E+02 0.203596536608E+02 0.176726023843E+02 0.151810750610E+02 0.129490421852E+02 - 0.110393419844E+02 0.950085960920E+01 0.835601618665E+01 0.759220066468E+01 0.716026999428E+01 - 0.698171626746E+01 0.696337605625E+01 0.701521103097E+01 0.706481640894E+01 0.706399982574E+01 - 0.698712687429E+01 0.682461396109E+01 0.657568919727E+01 0.624298320013E+01 0.582958771078E+01 - 0.533805431630E+01 0.477041539462E+01 0.412860168459E+01 0.341481102932E+01 0.263171179070E+01 - 0.178246356837E+01 0.870634857094E+00 -0.999435655628E-01 -0.112531912148E+01 -0.220152950825E+01 - -0.332469240511E+01 -0.449104627091E+01 -0.569696900609E+01 -0.693897492393E+01 -0.821369212013E+01 - -0.951782569431E+01 -0.108481106853E+02 -0.122012544483E+02 -0.135738672328E+02 -0.149623731041E+02 - -0.163629117637E+02 -0.177712183098E+02 -0.191824857852E+02 -0.205912204531E+02 -0.219910948777E+02 - -0.233748286767E+02 -0.247341319073E+02 -0.260597523206E+02 -0.273417023275E+02 -0.285696934068E+02 - -0.297338412853E+02 -0.308256304858E+02 -0.318391158428E+02 -0.327722938273E+02 -0.336286100568E+02 - -0.344184456425E+02 -0.351602597585E+02 -0.358801414497E+02 -0.366068311139E+02 -0.373574865876E+02 - -0.381118852062E+02 -0.387867275622E+02 -0.392441858557E+02 -0.393634905455E+02 -0.391349287148E+02 - -0.386756213346E+02 -0.381417405135E+02 -0.376357899161E+02 -0.371876084550E+02 -0.367857306580E+02 - -0.364089018964E+02 -0.360404071207E+02 -0.356705439437E+02 -0.352947736228E+02 -0.349113814513E+02 - -0.345198082255E+02 -0.341197553652E+02 -0.337108267652E+02 -0.332925072698E+02 -0.328642387355E+02 - -0.324255741088E+02 -0.319762374262E+02 -0.315162189773E+02 -0.310457677673E+02 -0.305653859428E+02 - -0.300757994671E+02 -0.295778859655E+02 -0.290726427811E+02 -0.285611001088E+02 -0.280442533230E+02 - -0.275230192225E+02 -0.269981679715E+02 -0.264702980396E+02 -0.259398216884E+02 -0.254069826533E+02 - -0.248718994035E+02 -0.243346314120E+02 -0.237952586509E+02 -0.232539624826E+02 -0.227110955590E+02 - -0.221672327097E+02 -0.216231877485E+02 -0.210800244667E+02 -0.205390174919E+02 -0.200016158604E+02 - -0.194693867508E+02 - core charge-density - 0.566100408154E-04 0.603274793074E-04 0.642889044283E-04 0.685103166568E-04 0.730087644875E-04 - 0.778024129493E-04 0.829106165872E-04 0.883539971990E-04 0.941545266560E-04 0.100335615085E-03 - 0.106922204822E-03 0.113940870473E-03 0.121419925474E-03 0.129389535603E-03 0.137881839861E-03 - 0.146931079213E-03 0.156573733698E-03 0.166848668447E-03 0.177797289174E-03 0.189463707768E-03 - 0.201894918628E-03 0.215140986428E-03 0.229255246056E-03 0.244294515512E-03 0.260319322588E-03 - 0.277394146221E-03 0.295587673465E-03 0.314973073077E-03 0.335628286780E-03 0.357636339348E-03 - 0.381085668699E-03 0.406070477287E-03 0.432691106152E-03 0.461054433064E-03 0.491274296314E-03 - 0.523471945761E-03 0.557776522887E-03 0.594325571702E-03 0.633265582435E-03 0.674752570119E-03 - 0.718952690251E-03 0.766042893893E-03 0.816211624674E-03 0.869659560374E-03 0.926600401855E-03 - 0.987261712339E-03 0.105188581019E-02 0.112073071853E-02 0.119407117529E-02 0.127219970739E-02 - 0.135542777315E-02 0.144408697705E-02 0.153853036146E-02 0.163913378001E-02 0.174629735768E-02 - 0.186044704296E-02 0.198203625776E-02 0.211154765105E-02 0.224949496259E-02 0.239642500343E-02 - 0.255291976042E-02 0.271959863213E-02 0.289712080418E-02 0.308618777247E-02 0.328754602307E-02 - 0.350198987838E-02 0.373036451926E-02 0.397356919385E-02 0.423256062398E-02 0.450835662100E-02 - 0.480203992329E-02 0.511476226845E-02 0.544774871395E-02 0.580230222061E-02 0.617980851421E-02 - 0.658174124108E-02 0.700966743491E-02 0.746525331166E-02 0.795027041269E-02 0.846660211345E-02 - 0.901625052094E-02 0.960134377894E-02 0.102241438053E-01 0.108870544842E-01 0.115926303386E-01 - 0.123435857075E-01 0.131428044576E-01 0.139933502544E-01 0.148984774251E-01 0.158616424421E-01 - 0.168865160593E-01 0.179769961364E-01 0.191372211820E-01 0.203715846550E-01 0.216847500588E-01 - 0.230816668678E-01 0.245675873256E-01 0.261480841549E-01 0.278290692218E-01 0.296168131969E-01 - 0.315179662576E-01 0.335395798759E-01 0.356891297379E-01 0.379745398409E-01 0.404042078155E-01 - 0.429870315194E-01 0.457324369501E-01 0.486504075246E-01 0.517515147717E-01 0.550469504838E-01 - 0.585485603728E-01 0.622688792735E-01 0.662211679360E-01 0.704194514465E-01 0.748785593126E-01 - 0.796141672432E-01 0.846428406544E-01 0.899820799218E-01 0.956503673943E-01 0.101667216183E+00 - 0.108053220723E+00 0.114830109098E+00 0.122020797119E+00 0.129649444112E+00 0.137741510382E+00 - 0.146323816290E+00 0.155424602864E+00 0.165073593849E+00 0.175302059090E+00 0.186142879083E+00 - 0.197630610560E+00 0.209801552888E+00 0.222693815062E+00 0.236347383047E+00 0.250804187144E+00 - 0.266108169064E+00 0.282305348315E+00 0.299443887476E+00 0.317574155859E+00 0.336748791043E+00 - 0.357022757646E+00 0.378453402702E+00 0.401100506871E+00 0.425026330694E+00 0.450295654993E+00 - 0.476975814429E+00 0.505136723178E+00 0.534850891530E+00 0.566193432183E+00 0.599242054859E+00 - 0.634077047765E+00 0.670781244335E+00 0.709439973560E+00 0.750140992075E+00 0.792974396116E+00 - 0.838032511244E+00 0.885409757763E+00 0.935202489441E+00 0.987508803254E+00 0.104242831757E+01 - 0.110006191624E+01 0.116051145584E+01 0.122387943346E+01 0.129026861193E+01 0.135978160000E+01 - 0.143252038425E+01 0.150858581009E+01 0.158807700896E+01 0.167109076893E+01 0.175772084621E+01 - 0.184805721494E+01 0.194218525332E+01 0.204018486382E+01 0.214212952620E+01 0.224808528199E+01 - 0.235810964998E+01 0.247225047259E+01 0.259054469391E+01 0.271301707089E+01 0.283967882006E+01 - 0.297052620347E+01 0.310553905827E+01 0.324467927606E+01 0.338788923929E+01 0.353509022378E+01 - 0.368618077801E+01 0.384103509149E+01 0.399950136699E+01 0.416140021288E+01 0.432652307442E+01 - 0.449463072490E+01 0.466545184006E+01 0.483868168119E+01 0.501398091525E+01 0.519097460207E+01 - 0.536925138135E+01 0.554836289419E+01 0.572782347558E+01 0.590711015619E+01 0.608566301289E+01 - 0.626288590845E+01 0.643814766086E+01 0.661078368325E+01 0.678009813289E+01 0.694536660815E+01 - 0.710583942709E+01 0.726074551989E+01 0.740929696058E+01 0.755069415923E+01 0.768413172658E+01 - 0.780880501609E+01 0.792391733716E+01 0.802868782233E+01 0.812235991814E+01 0.820421045514E+01 - 0.827355923749E+01 0.832977907498E+01 0.837230616406E+01 0.840065070529E+01 0.841440762640E+01 - 0.841326726196E+01 0.839702582182E+01 0.836559546387E+01 0.831901377096E+01 0.825745241774E+01 - 0.818122480318E+01 0.809079241634E+01 0.798676970036E+01 0.786992718088E+01 0.774119263277E+01 - 0.760165007160E+01 0.745253637713E+01 0.729523538244E+01 0.713126929714E+01 0.696228737445E+01 - 0.679005178084E+01 0.661642068236E+01 0.644332862226E+01 0.627276433103E+01 0.610674617685E+01 - 0.594729553438E+01 0.579640841756E+01 0.565602577058E+01 0.552800288253E+01 0.541407841905E+01 - 0.531584356652E+01 0.523471181475E+01 0.517188988547E+01 0.512835031200E+01 0.510480618875E+01 - 0.510168864942E+01 0.511912769994E+01 0.515693711116E+01 0.521460413879E+01 0.529128484590E+01 - 0.538580571386E+01 0.549667199677E+01 0.562208291152E+01 0.575995334559E+01 0.590794145701E+01 - 0.606348143532E+01 0.622382075557E+01 0.638606135679E+01 0.654720421042E+01 0.670419668250E+01 - 0.685398197262E+01 0.699354974359E+01 0.711998698134E+01 0.723052801287E+01 0.732260261476E+01 - 0.739388115435E+01 0.744231577198E+01 0.746617668668E+01 0.746408283670E+01 0.743502617611E+01 - 0.737838909120E+01 0.729395456103E+01 0.718190882688E+01 0.704283651135E+01 0.687770827554E+01 - 0.668786127413E+01 0.647497281612E+01 0.624102777379E+01 0.598828043165E+01 0.571921157955E+01 - 0.543648173800E+01 0.514288151879E+01 0.484128016393E+01 0.453457335746E+01 0.422563144517E+01 - 0.391724918675E+01 0.361209817668E+01 0.331268302840E+01 0.302130238260E+01 0.274001574527E+01 - 0.247061699977E+01 0.221461533156E+01 0.197322403846E+01 0.174735751206E+01 0.153763599448E+01 - 0.134439801278E+01 0.116771925944E+01 0.100743683521E+01 0.863177139249E+00 0.734385165797E+00 - 0.620352459116E+00 0.520241286779E+00 0.433104991178E+00 0.357908936157E+00 0.293558957004E+00 - 0.238939321053E+00 0.192952592630E+00 0.154550553295E+00 0.122752018839E+00 0.966509407173E-01 - 0.754197350591E-01 0.583105682925E-01 0.446553131657E-01 0.338641471811E-01 0.254227490621E-01 - 0.188882113068E-01 0.138839137385E-01 0.100936590292E-01 0.725537509450E-02 0.515466309716E-02 - 0.361842930266E-02 0.250879268147E-02 0.171741309607E-02 0.116033964584E-02 0.773437417305E-03 - 0.508414784907E-03 0.329443540380E-03 0.210340978410E-03 0.132266603092E-03 0.818759218551E-04 - 0.498690344207E-04 0.298714443437E-04 0.175875916060E-04 0.101729842592E-04 0.577752330293E-05 - 0.321986957660E-05 0.175987680434E-05 0.942778890139E-06 0.494707936977E-06 0.254108048780E-06 - 0.127681574306E-06 0.627159654587E-07 0.300924318689E-07 0.140943050873E-07 0.643877401768E-08 - 0.286674509825E-08 - kinetic energy-density - 0.667225310700E+01 0.673712425060E+01 0.680446712075E+01 0.687435266836E+01 0.694687887984E+01 - 0.702214082218E+01 0.710025487509E+01 0.718131997169E+01 0.726545491156E+01 0.735279351610E+01 - 0.744345621126E+01 0.753759398662E+01 0.763534237524E+01 0.773686628737E+01 0.784232168333E+01 - 0.795188785384E+01 0.806574492238E+01 0.818408265740E+01 0.830710733444E+01 0.843502925423E+01 - 0.856807463323E+01 0.870648022710E+01 0.885049499152E+01 0.900038141274E+01 0.915641556867E+01 - 0.931888763846E+01 0.948810409274E+01 0.966438660997E+01 0.984807420966E+01 0.100395236808E+02 - 0.102391106259E+02 0.104472306217E+02 0.106643002129E+02 0.108907581658E+02 0.111270667128E+02 - 0.113737129173E+02 0.116312100590E+02 0.119000995563E+02 0.121809512045E+02 0.124743676751E+02 - 0.127809824020E+02 0.131014661587E+02 0.134365246352E+02 0.137869037259E+02 0.141533910827E+02 - 0.145368181700E+02 0.149380606607E+02 0.153580481103E+02 0.157977592006E+02 0.162582301660E+02 - 0.167405536651E+02 0.172458849260E+02 0.177754489910E+02 0.183305360512E+02 0.189125147524E+02 - 0.195228293783E+02 0.201630086713E+02 0.208346731063E+02 0.215395302738E+02 0.222793960940E+02 - 0.230561817871E+02 0.238719218157E+02 0.247287599035E+02 0.256289715181E+02 0.265749638623E+02 - 0.275692850611E+02 0.286146340209E+02 0.297138695051E+02 0.308700182642E+02 0.320862867047E+02 - 0.333660717388E+02 0.347129698754E+02 0.361307926843E+02 0.376235764044E+02 0.391956004794E+02 - 0.408513960801E+02 0.425957666062E+02 0.444337942387E+02 0.463708781148E+02 0.484127240612E+02 - 0.505653883328E+02 0.528352819288E+02 0.552292043731E+02 0.577543512402E+02 0.604183612533E+02 - 0.632293138540E+02 0.661957773286E+02 0.693268340532E+02 0.726320939962E+02 0.761217542966E+02 - 0.798066090433E+02 0.836980910427E+02 0.878083249418E+02 0.921501355979E+02 0.967371238079E+02 - 0.101583684198E+03 0.106705064907E+03 0.112117414382E+03 0.117837828166E+03 0.123884409252E+03 - 0.130276320038E+03 0.137033846315E+03 0.144178456681E+03 0.151732871301E+03 0.159721130996E+03 - 0.168168668145E+03 0.177102387622E+03 0.186550741797E+03 0.196543819667E+03 0.207113432275E+03 - 0.218293201433E+03 0.230118672341E+03 0.242627385569E+03 0.255859010707E+03 0.269855440106E+03 - 0.284660908978E+03 0.300322108546E+03 0.316888318424E+03 0.334411529406E+03 0.352946573140E+03 - 0.372551274533E+03 0.393286576958E+03 0.415216695313E+03 0.438409280187E+03 0.462935557123E+03 - 0.488870494758E+03 0.516292978425E+03 0.545285959475E+03 0.575936645981E+03 0.608336673183E+03 - 0.642582272764E+03 0.678774465893E+03 0.717019234895E+03 0.757427713585E+03 0.800116365041E+03 - 0.845207163513E+03 0.892827774214E+03 0.943111730250E+03 0.996198604607E+03 0.105223417127E+04 - 0.111137056935E+04 0.117376644321E+04 0.123958708989E+04 0.130900456745E+04 0.138219781473E+04 - 0.145935272609E+04 0.154066222765E+04 0.162632630841E+04 0.171655203448E+04 0.181155353272E+04 - 0.191155192916E+04 0.201677522893E+04 0.212745822677E+04 0.224384225326E+04 0.236617496487E+04 - 0.249470999554E+04 0.262970664059E+04 0.277142932316E+04 0.292014710882E+04 0.307613311454E+04 - 0.323966371690E+04 0.341101780179E+04 0.359047581918E+04 0.377831874540E+04 0.397482689787E+04 - 0.418027868224E+04 0.439494910623E+04 0.461910823060E+04 0.485301940433E+04 0.509693739042E+04 - 0.535110624785E+04 0.561575714459E+04 0.589110587709E+04 0.617735029231E+04 0.647466747894E+04 - 0.678321077715E+04 0.710310660594E+04 0.743445110603E+04 0.777730657840E+04 0.813169778138E+04 - 0.849760803098E+04 0.887497515215E+04 0.926368732206E+04 0.966357873788E+04 0.100744252544E+05 - 0.104959398994E+05 0.109277683923E+05 0.113694846547E+05 0.118205863594E+05 0.122804905999E+05 - 0.127485296775E+05 0.132239471319E+05 0.137058940235E+05 0.141934255844E+05 0.146854982713E+05 - 0.151809673402E+05 0.156785850245E+05 0.161769993384E+05 0.166747537999E+05 0.171702877851E+05 - 0.176619381795E+05 0.181479417092E+05 0.186264388693E+05 0.190954787135E+05 0.195530252077E+05 - 0.199969649781E+05 0.204251165206E+05 0.208352408440E+05 0.212250539761E+05 0.215922406971E+05 - 0.219344702466E+05 0.222494132725E+05 0.225347605700E+05 0.227882431008E+05 0.230076533887E+05 - 0.231908681093E+05 0.233358716618E+05 0.234407805422E+05 0.235038681649E+05 0.235235900533E+05 - 0.234986087273E+05 0.234278183452E+05 0.233103682573E+05 0.231456854657E+05 0.229334951930E+05 - 0.226738393464E+05 0.223670922687E+05 0.220139733481E+05 0.216155560262E+05 0.211732727643E+05 - 0.206889155309E+05 0.201646315262E+05 0.196029137234E+05 0.190065861750E+05 0.183787838063E+05 - 0.177229268159E+05 0.170426897439E+05 0.163419655306E+05 0.156248249789E+05 0.148954722996E+05 - 0.141581974366E+05 0.134173260145E+05 0.126771691922E+05 0.119419712654E+05 0.112158605109E+05 - 0.105028006708E+05 0.980654494715E+04 0.913059233055E+04 0.847814609089E+04 0.785207437181E+04 - 0.725487344241E+04 0.668863511465E+04 0.615502070274E+04 0.565524418908E+04 0.519006674861E+04 - 0.475980360345E+04 0.436434269355E+04 0.400317323797E+04 0.367542134980E+04 0.337988976738E+04 - 0.311509951930E+04 0.287933230868E+04 0.267067322820E+04 0.248705367813E+04 0.232629416860E+04 - 0.218614663490E+04 0.206433550064E+04 0.195859682514E+04 0.186671473352E+04 0.178655448544E+04 - 0.171609162157E+04 0.165343661643E+04 0.159685503183E+04 0.154478263373E+04 0.149583588863E+04 - 0.144881771439E+04 0.140271881257E+04 0.135671510542E+04 0.131016154370E+04 0.126258277404E+04 - 0.121366142449E+04 0.116322423992E+04 0.111122677010E+04 0.105773711321E+04 0.100291904396E+04 - 0.947015115197E+03 0.890329984746E+03 0.833214293651E+03 0.776049439334E+03 0.719233318915E+03 - 0.663167296841E+03 0.608244410857E+03 0.554838974842E+03 0.503297365412E+03 0.453930342998E+03 - 0.407006607762E+03 0.362747812430E+03 0.321325009274E+03 0.282856892955E+03 0.247409239962E+03 - 0.214996579478E+03 0.185585236387E+03 0.159098170048E+03 0.135421626809E+03 0.114413852193E+03 - 0.959157052909E+02 0.797613940556E+02 0.657850483488E+02 0.538188496239E+02 0.436847852099E+02 - 0.351899899383E+02 0.281331189963E+02 0.223174718914E+02 0.175614959268E+02 0.137029350510E+02 - 0.105987314150E+02 0.812353702200E+01 0.616817828814E+01 0.463832179287E+01 0.345324799301E+01 - 0.254463529365E+01 0.185531917238E+01 0.133803581425E+01 0.954179117826E+00 0.672602600260E+00 - 0.468493246228E+00 0.322336920783E+00 0.218987948819E+00 0.146848889647E+00 0.971612490355E-01 - 0.634035384763E-01 0.407898120808E-01 0.258595430908E-01 0.161483043720E-01 0.992815188083E-02 - 0.600670032098E-02 0.357447468542E-02 0.209108518893E-02 0.120193474515E-02 0.678419162901E-03 - 0.375814762046E-03 0.204197625257E-03 0.108758556747E-03 0.567464770105E-04 0.289864948733E-04 - 0.144858436153E-04 0.707756608346E-05 0.337836787752E-05 0.157431967128E-05 0.715666075556E-06 - 0.317114132527E-06 - mkinetic energy-density pseudized - 0.246124888537E-05 0.262391872705E-05 0.279733980862E-05 0.298222270529E-05 0.317932495590E-05 - 0.338945416684E-05 0.361347132112E-05 0.385229430620E-05 0.410690167493E-05 0.437833665502E-05 - 0.466771142364E-05 0.497621166438E-05 0.530510142550E-05 0.565572829925E-05 0.602952894345E-05 - 0.642803496809E-05 0.685287921091E-05 0.730580242782E-05 0.778866042541E-05 0.830343166499E-05 - 0.885222536910E-05 0.943729016382E-05 0.100610232923E-04 0.107259804372E-04 0.114348861924E-04 - 0.121906452265E-04 0.129963541849E-04 0.138553143773E-04 0.147710453050E-04 0.157472990816E-04 - 0.167880758067E-04 0.178976399559E-04 0.190805378543E-04 0.203416163043E-04 0.216860424450E-04 - 0.231193249240E-04 0.246473364685E-04 0.262763379479E-04 0.280130040275E-04 0.298644505170E-04 - 0.318382635266E-04 0.339425305504E-04 0.361858736043E-04 0.385774845531E-04 0.411271627738E-04 - 0.438453553070E-04 0.467431996630E-04 0.498325694557E-04 0.531261230543E-04 0.566373554487E-04 - 0.603806535444E-04 0.643713551105E-04 0.686258116250E-04 0.731614552728E-04 0.779968703717E-04 - 0.831518695202E-04 0.886475747764E-04 0.945065042035E-04 0.100752664135E-03 0.107411647536E-03 - 0.114510738871E-03 0.122079025894E-03 0.130147518834E-03 0.138749277455E-03 0.147919546515E-03 - 0.157695900175E-03 0.168118395953E-03 0.179229738859E-03 0.191075456367E-03 0.203704084960E-03 - 0.217167368999E-03 0.231520472741E-03 0.246822206364E-03 0.263135266932E-03 0.280526495285E-03 - 0.299067149912E-03 0.318833198917E-03 0.339905631285E-03 0.362370788723E-03 0.386320719425E-03 - 0.411853555224E-03 0.439073913670E-03 0.468093326673E-03 0.499030697487E-03 0.532012787889E-03 - 0.567174737555E-03 0.604660617766E-03 0.644624021702E-03 0.687228693756E-03 0.732649200428E-03 - 0.781071645568E-03 0.832694432884E-03 0.887729078840E-03 0.946401079282E-03 0.100895083333E-02 - 0.107563462835E-02 0.114672568997E-02 0.122251530154E-02 0.130331399757E-02 0.138945283600E-02 - 0.148128475454E-02 0.157918601675E-02 0.168355775354E-02 0.179482760663E-02 0.191345148057E-02 - 0.203991541061E-02 0.217473755390E-02 0.231847031234E-02 0.247170259569E-02 0.263506223425E-02 - 0.280921855092E-02 0.299488510327E-02 0.319282260676E-02 0.340384205113E-02 0.362880802269E-02 - 0.386864224621E-02 0.412432736067E-02 0.439691094468E-02 0.468750980769E-02 0.499731456482E-02 - 0.532759451388E-02 0.567970283464E-02 0.605508213156E-02 0.645527034270E-02 0.688190703890E-02 - 0.733674013923E-02 0.782163306985E-02 0.833857239587E-02 0.888967595726E-02 0.947720154207E-02 - 0.101035561326E-01 0.107713057620E-01 0.114831860220E-01 0.122421132645E-01 0.130511965425E-01 - 0.139137503401E-01 0.148333081420E-01 0.158136368999E-01 0.168587524534E-01 0.179729359683E-01 - 0.191607514608E-01 0.204270644777E-01 0.217770620094E-01 0.232162737168E-01 0.247505945587E-01 - 0.263863089121E-01 0.281301162830E-01 0.299891587134E-01 0.319710499956E-01 0.340839068117E-01 - 0.363363819276E-01 0.387376995728E-01 0.412976931539E-01 0.440268454506E-01 0.469363314614E-01 - 0.500380640699E-01 0.533447427184E-01 0.568699052850E-01 0.606279833752E-01 0.646343612502E-01 - 0.689054386321E-01 0.734586976370E-01 0.783127741083E-01 0.834875336360E-01 0.890041525683E-01 - 0.948852043423E-01 0.101154751478E+00 0.107838443608E+00 0.114963621928E+00 0.122559430498E+00 - 0.130656934825E+00 0.139289248207E+00 0.148491666340E+00 0.158301810719E+00 0.168759781404E+00 - 0.179908319753E+00 0.191792981758E+00 0.204462322680E+00 0.217968093682E+00 0.232365451255E+00 - 0.247713180229E+00 0.264073931251E+00 0.281514473635E+00 0.300105964567E+00 0.319924235688E+00 - 0.341050098153E+00 0.363569667326E+00 0.387574708325E+00 0.413163003732E+00 0.440438744815E+00 - 0.469512947739E+00 0.500503896272E+00 0.533537612614E+00 0.568748358052E+00 0.606279165231E+00 - 0.646282403941E+00 0.688920382391E+00 0.734365986076E+00 0.782803356419E+00 0.834428611485E+00 - 0.889450611177E+00 0.948091769412E+00 0.101058891592E+01 0.107719421035E+01 0.114817611159E+01 - 0.122382040517E+01 0.130443129174E+01 0.139033253996E+01 0.148186870671E+01 0.157940642816E+01 - 0.168333578488E+01 0.179407174448E+01 0.191205568510E+01 0.203775700321E+01 0.217167480907E+01 - 0.231433971309E+01 0.246631570642E+01 0.262820213858E+01 0.280063579506E+01 0.298429307738E+01 - 0.317989228767E+01 0.338819601939E+01 0.361001365538E+01 0.384620397342E+01 0.409767785897E+01 - 0.436540112340E+01 0.465039742506E+01 0.495375128900E+01 0.527661121944E+01 0.562019289718E+01 - 0.598578245173E+01 0.637473979546E+01 0.678850200382E+01 0.722858672211E+01 0.769659557535E+01 - 0.819421755303E+01 0.872323233508E+01 0.928551351943E+01 0.988303170455E+01 0.105178573724E+02 - 0.111921635088E+02 0.119082278868E+02 0.126684349296E+02 0.134752770548E+02 0.143313553888E+02 - 0.152393797229E+02 0.162021675676E+02 0.172226421397E+02 0.183038290954E+02 0.194488518008E+02 - 0.206609249026E+02 0.219433459362E+02 0.232994846736E+02 0.247327698867E+02 0.262466731579E+02 - 0.278446893409E+02 0.295303132271E+02 0.313070119380E+02 0.331781925189E+02 0.351471641660E+02 - 0.372170944806E+02 0.393909591027E+02 0.416714840392E+02 0.440610799768E+02 0.465617678440E+02 - 0.491750948813E+02 0.519020404840E+02 0.547429111112E+02 0.576972236099E+02 0.607635763904E+02 - 0.639395080244E+02 0.672213430148E+02 0.706040247369E+02 0.740809358673E+02 0.776437070298E+02 - 0.812820149008E+02 0.849833716541E+02 0.887329083984E+02 0.925131561972E+02 0.963038293663E+02 - 0.100081617042E+03 0.103819990523E+03 0.107489035592E+03 0.111055320957E+03 0.114481816082E+03 - 0.117727873934E+03 0.120749296619E+03 0.123498504282E+03 0.125924830007E+03 0.127974965523E+03 - 0.129593584125E+03 0.130724168028E+03 0.131310066960E+03 0.131295812806E+03 0.130628710801E+03 - 0.129260720552E+03 0.127150629186E+03 0.124266503311E+03 0.120588385239E+03 0.116111171158E+03 - 0.110847573781E+03 0.104831028760E+03 0.981183527514E+02 0.907919018702E+02 0.829609139133E+02 - 0.747616492584E+02 0.663558786143E+02 0.579272084376E+02 0.496746974883E+02 0.418032150738E+02 - 0.345100415462E+02 0.279673372239E+02 0.223003334013E+02 0.175614569257E+02 0.137029350510E+02 - 0.105987314150E+02 0.812353702200E+01 0.616817828814E+01 0.463832179287E+01 0.345324799301E+01 - 0.254463529365E+01 0.185531917238E+01 0.133803581425E+01 0.954179117826E+00 0.672602600260E+00 - 0.468493246228E+00 0.322336920783E+00 0.218987948819E+00 0.146848889647E+00 0.971612490355E-01 - 0.634035384763E-01 0.407898120808E-01 0.258595430908E-01 0.161483043720E-01 0.992815188083E-02 - 0.600670032098E-02 0.357447468542E-02 0.209108518893E-02 0.120193474515E-02 0.678419162901E-03 - 0.375814762046E-03 0.204197625257E-03 0.108758556747E-03 0.567464770105E-04 0.289864948733E-04 - 0.144858436153E-04 0.707756608346E-05 0.337836787752E-05 0.157431967128E-05 0.715666075556E-06 - 0.317114132527E-06 - local pseudopotential core - -0.170419537102E+03 -0.170420949717E+03 -0.170422317842E+03 -0.170423642879E+03 -0.170424926184E+03 - -0.170426169071E+03 -0.170427372814E+03 -0.170428538644E+03 -0.170429667756E+03 -0.170430761305E+03 - -0.170431820413E+03 -0.170432846163E+03 -0.170433839605E+03 -0.170434801757E+03 -0.170435733605E+03 - -0.170436636101E+03 -0.170437510171E+03 -0.170438356709E+03 -0.170439176583E+03 -0.170439970631E+03 - -0.170440739667E+03 -0.170441484477E+03 -0.170442205825E+03 -0.170442904450E+03 -0.170443581066E+03 - -0.170444236365E+03 -0.170444871020E+03 -0.170445485679E+03 -0.170446080973E+03 -0.170446657509E+03 - -0.170447215878E+03 -0.170447756653E+03 -0.170448280385E+03 -0.170448787612E+03 -0.170449278852E+03 - -0.170449754608E+03 -0.170450215366E+03 -0.170450661599E+03 -0.170451093762E+03 -0.170451512298E+03 - -0.170451917634E+03 -0.170452310186E+03 -0.170452690353E+03 -0.170453058526E+03 -0.170453415081E+03 - -0.170453760381E+03 -0.170454094779E+03 -0.170454418618E+03 -0.170454732227E+03 -0.170455035927E+03 - -0.170455330028E+03 -0.170455614830E+03 -0.170455890623E+03 -0.170456157689E+03 -0.170456416298E+03 - -0.170456666716E+03 -0.170456909196E+03 -0.170457143986E+03 -0.170457371323E+03 -0.170457591439E+03 - -0.170457804557E+03 -0.170458010893E+03 -0.170458210657E+03 -0.170458404049E+03 -0.170458591266E+03 - -0.170458772496E+03 -0.170458947923E+03 -0.170459117722E+03 -0.170459282063E+03 -0.170459441112E+03 - -0.170459595027E+03 -0.170459743963E+03 -0.170459888066E+03 -0.170460027479E+03 -0.170460162341E+03 - -0.170460292785E+03 -0.170460418937E+03 -0.170460540921E+03 -0.170460658856E+03 -0.170460772854E+03 - -0.170460883026E+03 -0.170460989477E+03 -0.170461092306E+03 -0.170461191611E+03 -0.170461287482E+03 - -0.170461380009E+03 -0.170461469275E+03 -0.170461555360E+03 -0.170461638339E+03 -0.170461718285E+03 - -0.170461795264E+03 -0.170461869342E+03 -0.170461940576E+03 -0.170462009025E+03 -0.170462074739E+03 - -0.170462137766E+03 -0.170462198149E+03 -0.170462255930E+03 -0.170462311143E+03 -0.170462363820E+03 - -0.170462413988E+03 -0.170462461669E+03 -0.170462506883E+03 -0.170462549643E+03 -0.170462589958E+03 - -0.170462627833E+03 -0.170462663267E+03 -0.170462696254E+03 -0.170462726785E+03 -0.170462754841E+03 - -0.170462780402E+03 -0.170462803439E+03 -0.170462823919E+03 -0.170462841800E+03 -0.170462857035E+03 - -0.170462869571E+03 -0.170462879345E+03 -0.170462886288E+03 -0.170462890322E+03 -0.170462891361E+03 - -0.170462889311E+03 -0.170462884065E+03 -0.170462875510E+03 -0.170462863519E+03 -0.170462847957E+03 - -0.170462828675E+03 -0.170462805511E+03 -0.170462778292E+03 -0.170462746828E+03 -0.170462710916E+03 - -0.170462670337E+03 -0.170462624855E+03 -0.170462574215E+03 -0.170462518144E+03 -0.170462456350E+03 - -0.170462388516E+03 -0.170462314306E+03 -0.170462233358E+03 -0.170462145285E+03 -0.170462049670E+03 - -0.170461946071E+03 -0.170461834011E+03 -0.170461712983E+03 -0.170461582443E+03 -0.170461441809E+03 - -0.170461290461E+03 -0.170461127736E+03 -0.170460952924E+03 -0.170460765269E+03 -0.170460563963E+03 - -0.170460348143E+03 -0.170460116887E+03 -0.170459869212E+03 -0.170459604070E+03 -0.170459320339E+03 - -0.170459016825E+03 -0.170458692253E+03 -0.170458345262E+03 -0.170457974402E+03 -0.170457578124E+03 - -0.170457154777E+03 -0.170456702599E+03 -0.170456219712E+03 -0.170455704112E+03 -0.170455153662E+03 - -0.170454566083E+03 -0.170453938945E+03 -0.170453269655E+03 -0.170452555451E+03 -0.170451793386E+03 - -0.170450980315E+03 -0.170450112890E+03 -0.170449187536E+03 -0.170448200444E+03 -0.170447147552E+03 - -0.170446024529E+03 -0.170444826756E+03 -0.170443549310E+03 -0.170442186941E+03 -0.170440734052E+03 - -0.170439184675E+03 -0.170437532448E+03 -0.170435770588E+03 -0.170433891862E+03 -0.170431888560E+03 - -0.170429752461E+03 -0.170427474801E+03 -0.170425046235E+03 -0.170422456803E+03 -0.170419695882E+03 - -0.170416752151E+03 -0.170413613538E+03 -0.170410267173E+03 -0.170406699335E+03 -0.170402895397E+03 - -0.170398839763E+03 -0.170394515809E+03 -0.170389905809E+03 -0.170384990867E+03 -0.170379750838E+03 - -0.170374164243E+03 -0.170368208187E+03 -0.170361858259E+03 -0.170355088435E+03 -0.170347870972E+03 - -0.170340176292E+03 -0.170331972863E+03 -0.170323227069E+03 -0.170313903070E+03 -0.170303962662E+03 - -0.170293365112E+03 -0.170282066997E+03 -0.170270022024E+03 -0.170257180840E+03 -0.170243490832E+03 - -0.170228895910E+03 -0.170213336276E+03 -0.170196748182E+03 -0.170179063668E+03 -0.170160210283E+03 - -0.170140110788E+03 -0.170118682843E+03 -0.170095838665E+03 -0.170071484675E+03 -0.170045521109E+03 - -0.170017841614E+03 -0.169988332811E+03 -0.169956873833E+03 -0.169923335828E+03 -0.169887581435E+03 - -0.169849464223E+03 -0.169808828091E+03 -0.169765506630E+03 -0.169719322446E+03 -0.169670086435E+03 - -0.169617597009E+03 -0.169561639280E+03 -0.169501984178E+03 -0.169438387525E+03 -0.169370589035E+03 - -0.169298311258E+03 -0.169221258457E+03 -0.169139115401E+03 -0.169051546092E+03 -0.168958192406E+03 - -0.168858672641E+03 -0.168752579981E+03 -0.168639480855E+03 -0.168518913198E+03 -0.168390384594E+03 - -0.168253370309E+03 -0.168107311204E+03 -0.167951611505E+03 -0.167785636454E+03 -0.167608709804E+03 - -0.167420111171E+03 -0.167219073226E+03 -0.167004778724E+03 -0.166776357364E+03 -0.166532882470E+03 - -0.166273367495E+03 -0.165996762340E+03 -0.165701949473E+03 -0.165387739872E+03 -0.165052868771E+03 - -0.164695991214E+03 -0.164315677437E+03 -0.163910408071E+03 -0.163478569188E+03 -0.163018447220E+03 - -0.162528223759E+03 -0.162005970291E+03 -0.161449642903E+03 -0.160857077032E+03 -0.160225982313E+03 - -0.159553937637E+03 -0.158838386520E+03 -0.158076632925E+03 -0.157265837697E+03 -0.156403015813E+03 - -0.155485034673E+03 -0.154508613712E+03 -0.153470325644E+03 -0.152366599705E+03 -0.151193727316E+03 - -0.149947870610E+03 -0.148625074366E+03 -0.147221281861E+03 -0.145732355265E+03 -0.144154101132E+03 - -0.142482301607E+03 -0.140712751934E+03 -0.138841304820E+03 -0.136863922328E+03 -0.134776736105E+03 - -0.132576117318E+03 -0.130258758637E+03 -0.127821772487E+03 -0.125262812538E+03 -0.122580229059E+03 - -0.119773271760E+03 -0.116842352862E+03 -0.113789370936E+03 -0.110618060917E+03 -0.107334264143E+03 - -0.103945902820E+03 -0.100462343388E+03 -0.968929062687E+02 -0.932448542294E+02 -0.895225733479E+02 - -0.857313037065E+02 -0.818880617199E+02 -0.780358333759E+02 -0.742473243088E+02 -0.706440350099E+02 - -0.673676290197E+02 -0.644619319781E+02 -0.619683360442E+02 -0.599284345816E+02 -0.583796623680E+02 - -0.573483530309E+02 -0.564049902626E+02 -0.546210802335E+02 -0.528996689676E+02 -0.512328440922E+02 - -0.496187824367E+02 -0.480557353139E+02 -0.465420447751E+02 -0.450761138085E+02 -0.436564113209E+02 - -0.422814579106E+02 -0.409498296230E+02 -0.396601648757E+02 -0.384111132984E+02 -0.372014105719E+02 - -0.360298090009E+02 -0.348951073700E+02 -0.337961428427E+02 -0.327317889712E+02 -0.317009553098E+02 - -0.307025861793E+02 -0.297356589850E+02 -0.287991834979E+02 -0.278922006685E+02 -0.270137815368E+02 - -0.261630366058E+02 -0.253390651934E+02 -0.245410526913E+02 -0.237681721638E+02 -0.230196321567E+02 - -0.222946661137E+02 - pspotential valence only - -0.284683254939E+02 -0.284697381271E+02 -0.284711062722E+02 -0.284724313301E+02 -0.284737146577E+02 - -0.284749575687E+02 -0.284761613369E+02 -0.284773271946E+02 -0.284784563356E+02 -0.284795499162E+02 - -0.284806090569E+02 -0.284816348417E+02 -0.284826283219E+02 -0.284835905140E+02 -0.284845224041E+02 - -0.284854249463E+02 -0.284862990646E+02 -0.284871456545E+02 -0.284879655834E+02 -0.284887596902E+02 - -0.284895287887E+02 -0.284902736661E+02 -0.284909950857E+02 -0.284916937861E+02 -0.284923704830E+02 - -0.284930258689E+02 -0.284936606159E+02 -0.284942753734E+02 -0.284948707712E+02 -0.284954474190E+02 - -0.284960059074E+02 -0.284965468085E+02 -0.284970706761E+02 -0.284975780470E+02 -0.284980694407E+02 - -0.284985453605E+02 -0.284990062936E+02 -0.284994527124E+02 -0.284998850740E+02 -0.285003038213E+02 - -0.285007093833E+02 -0.285011021753E+02 -0.285014825995E+02 -0.285018510457E+02 -0.285022078914E+02 - -0.285025535021E+02 -0.285028882318E+02 -0.285032124235E+02 -0.285035264093E+02 -0.285038305108E+02 - -0.285041250397E+02 -0.285044102975E+02 -0.285046865768E+02 -0.285049541606E+02 -0.285052133230E+02 - -0.285054643298E+02 -0.285057074382E+02 -0.285059428973E+02 -0.285061709484E+02 -0.285063918256E+02 - -0.285066057551E+02 -0.285068129563E+02 -0.285070136418E+02 -0.285072080174E+02 -0.285073962824E+02 - -0.285075786302E+02 -0.285077552478E+02 -0.285079263164E+02 -0.285080920118E+02 -0.285082525042E+02 - -0.285084079583E+02 -0.285085585338E+02 -0.285087043857E+02 -0.285088456639E+02 -0.285089825138E+02 - -0.285091150761E+02 -0.285092434873E+02 -0.285093678798E+02 -0.285094883820E+02 -0.285096051179E+02 - -0.285097182082E+02 -0.285098277696E+02 -0.285099339157E+02 -0.285100367561E+02 -0.285101363974E+02 - -0.285102329431E+02 -0.285103264934E+02 -0.285104171457E+02 -0.285105049943E+02 -0.285105901311E+02 - -0.285106726449E+02 -0.285107526223E+02 -0.285108301473E+02 -0.285109053014E+02 -0.285109781641E+02 - -0.285110488125E+02 -0.285111173215E+02 -0.285111837644E+02 -0.285112482121E+02 -0.285113107339E+02 - -0.285113713974E+02 -0.285114302684E+02 -0.285114874111E+02 -0.285115428883E+02 -0.285115967613E+02 - -0.285116490901E+02 -0.285116999333E+02 -0.285117493486E+02 -0.285117973923E+02 -0.285118441197E+02 - -0.285118895855E+02 -0.285119338432E+02 -0.285119769456E+02 -0.285120189449E+02 -0.285120598926E+02 - -0.285120998398E+02 -0.285121388371E+02 -0.285121769347E+02 -0.285122141827E+02 -0.285122506311E+02 - -0.285122863296E+02 -0.285123213283E+02 -0.285123556771E+02 -0.285123894265E+02 -0.285124226271E+02 - -0.285124553304E+02 -0.285124875881E+02 -0.285125194530E+02 -0.285125509785E+02 -0.285125822193E+02 - -0.285126132311E+02 -0.285126440711E+02 -0.285126747978E+02 -0.285127054715E+02 -0.285127361543E+02 - -0.285127669105E+02 -0.285127978063E+02 -0.285128289107E+02 -0.285128602951E+02 -0.285128920341E+02 - -0.285129242051E+02 -0.285129568892E+02 -0.285129901712E+02 -0.285130241396E+02 -0.285130588877E+02 - -0.285130945129E+02 -0.285131311181E+02 -0.285131688112E+02 -0.285132077060E+02 -0.285132479227E+02 - -0.285132895879E+02 -0.285133328354E+02 -0.285133778067E+02 -0.285134246515E+02 -0.285134735280E+02 - -0.285135246042E+02 -0.285135780579E+02 -0.285136340776E+02 -0.285136928634E+02 -0.285137546275E+02 - -0.285138195953E+02 -0.285138880062E+02 -0.285139601145E+02 -0.285140361905E+02 -0.285141165216E+02 - -0.285142014133E+02 -0.285142911905E+02 -0.285143861989E+02 -0.285144868063E+02 -0.285145934040E+02 - -0.285147064088E+02 -0.285148262640E+02 -0.285149534418E+02 -0.285150884449E+02 -0.285152318086E+02 - -0.285153841030E+02 -0.285155459353E+02 -0.285157179524E+02 -0.285159008433E+02 -0.285160953418E+02 - -0.285163022301E+02 -0.285165223414E+02 -0.285167565633E+02 -0.285170058417E+02 -0.285172711848E+02 - -0.285175536665E+02 -0.285178544315E+02 -0.285181746997E+02 -0.285185157709E+02 -0.285188790308E+02 - -0.285192659558E+02 -0.285196781195E+02 -0.285201171993E+02 -0.285205849827E+02 -0.285210833750E+02 - -0.285216144068E+02 -0.285221802425E+02 -0.285227831889E+02 -0.285234257049E+02 -0.285241104112E+02 - -0.285248401009E+02 -0.285256177512E+02 -0.285264465355E+02 -0.285273298358E+02 -0.285282712570E+02 - -0.285292746413E+02 -0.285303440839E+02 -0.285314839493E+02 -0.285326988895E+02 -0.285339938624E+02 - -0.285353741521E+02 -0.285368453903E+02 -0.285384135789E+02 -0.285400851146E+02 -0.285418668143E+02 - -0.285437659428E+02 -0.285457902421E+02 -0.285479479626E+02 -0.285502478960E+02 -0.285526994109E+02 - -0.285553124903E+02 -0.285580977715E+02 -0.285610665889E+02 -0.285642310189E+02 -0.285676039282E+02 - -0.285711990254E+02 -0.285750309147E+02 -0.285791151548E+02 -0.285834683196E+02 -0.285881080644E+02 - -0.285930531950E+02 -0.285983237421E+02 -0.286039410397E+02 -0.286099278085E+02 -0.286163082449E+02 - -0.286231081153E+02 -0.286303548557E+02 -0.286380776784E+02 -0.286463076848E+02 -0.286550779846E+02 - -0.286644238234E+02 -0.286743827172E+02 -0.286849945954E+02 -0.286963019524E+02 -0.287083500084E+02 - -0.287211868802E+02 -0.287348637617E+02 -0.287494351160E+02 -0.287649588782E+02 -0.287814966715E+02 - -0.287991140354E+02 -0.288178806686E+02 -0.288378706855E+02 -0.288591628897E+02 -0.288818410637E+02 - -0.289059942762E+02 -0.289317172092E+02 -0.289591105063E+02 -0.289882811421E+02 -0.290193428172E+02 - -0.290524163789E+02 -0.290876302704E+02 -0.291251210119E+02 -0.291650337155E+02 -0.292075226382E+02 - -0.292527517763E+02 -0.293008955057E+02 -0.293521392725E+02 -0.294066803402E+02 -0.294647285981E+02 - -0.295265074381E+02 -0.295922547054E+02 -0.296622237316E+02 -0.297366844547E+02 -0.298159246331E+02 - -0.299002511574E+02 -0.299899914619E+02 -0.300854950331E+02 -0.301871350062E+02 -0.302953098315E+02 - -0.304104449766E+02 -0.305329946137E+02 -0.306634432095E+02 -0.308023068980E+02 -0.309501344631E+02 - -0.311075076831E+02 -0.312750406914E+02 -0.314533778800E+02 -0.316431897005E+02 -0.318451655059E+02 - -0.320600023150E+02 -0.322883880770E+02 -0.325309776931E+02 -0.327883597634E+02 -0.330610118773E+02 - -0.333492424278E+02 -0.336531176630E+02 -0.339723743103E+02 -0.343063208921E+02 -0.346537346687E+02 - -0.350127648590E+02 -0.353808530483E+02 -0.357546715064E+02 -0.361300480027E+02 -0.365017784125E+02 - -0.368631247339E+02 -0.372047035859E+02 -0.375125522453E+02 -0.377657441997E+02 -0.379353184151E+02 - -0.379879389853E+02 -0.378969925173E+02 -0.376572676136E+02 -0.372895576797E+02 -0.368609888139E+02 - -0.364580391316E+02 -0.360705398812E+02 -0.356893344048E+02 -0.353112759769E+02 -0.349371692593E+02 - -0.345669009289E+02 -0.341257389052E+02 -0.337108267652E+02 -0.332925072698E+02 -0.328642387355E+02 - -0.324255741088E+02 -0.319762374261E+02 -0.315162189773E+02 -0.310457677673E+02 -0.305653859428E+02 - -0.300757994671E+02 -0.295778859655E+02 -0.290726427811E+02 -0.285611001088E+02 -0.280442533230E+02 - -0.275230192225E+02 -0.269981679715E+02 -0.264702980396E+02 -0.259398216884E+02 -0.254069826533E+02 - -0.248718994035E+02 -0.243346314120E+02 -0.237952586509E+02 -0.232539624826E+02 -0.227110955590E+02 - -0.221672327097E+02 -0.216231877485E+02 -0.210800244667E+02 -0.205390174919E+02 -0.200016158604E+02 - -0.194693867508E+02 - core charge-density (pseudized) - 0.158850899689E-07 0.169349736624E-07 0.180542466866E-07 0.192474951488E-07 0.205196082630E-07 - 0.218757983829E-07 0.233216223594E-07 0.248630043089E-07 0.265062598867E-07 0.282581221651E-07 - 0.301257692211E-07 0.321168535480E-07 0.342395334107E-07 0.365025062734E-07 0.389150444365E-07 - 0.414870330287E-07 0.442290105108E-07 0.471522118554E-07 0.502686145814E-07 0.535909878306E-07 - 0.571329446878E-07 0.609089979589E-07 0.649346196361E-07 0.692263042922E-07 0.738016366658E-07 - 0.786793637127E-07 0.838794714198E-07 0.894232666954E-07 0.953334646720E-07 0.101634281779E-06 - 0.108351534969E-06 0.115512747495E-06 0.123147261690E-06 0.131286359191E-06 0.139963389111E-06 - 0.149213904686E-06 0.159075808951E-06 0.169589510039E-06 0.180798086755E-06 0.192747465083E-06 - 0.205486606363E-06 0.219067707906E-06 0.233546416867E-06 0.248982058249E-06 0.265437877988E-06 - 0.282981302089E-06 0.301684212902E-06 0.321623243648E-06 0.342880092415E-06 0.365541856912E-06 - 0.389701391334E-06 0.415457686827E-06 0.442916277090E-06 0.472189670789E-06 0.503397812546E-06 - 0.536668574398E-06 0.572138279738E-06 0.609952261885E-06 0.650265459564E-06 0.693243051754E-06 - 0.739061134484E-06 0.787907442368E-06 0.839982117817E-06 0.895498531103E-06 0.954684154611E-06 - 0.101778149488E-05 0.108504908622E-05 0.115676255007E-05 0.123321572426E-05 0.131472186699E-05 - 0.140161494038E-05 0.149425097881E-05 0.159300954771E-05 0.169829529876E-05 0.181053962793E-05 - 0.193020244302E-05 0.205777404804E-05 0.219377715217E-05 0.233876901146E-05 0.249334371211E-05 - 0.265813460454E-05 0.283381689853E-05 0.302111042968E-05 0.322078260881E-05 0.343365156625E-05 - 0.366058950397E-05 0.390252626918E-05 0.416045316422E-05 0.443542700810E-05 0.472857446660E-05 - 0.504109666844E-05 0.537427412660E-05 0.572947198482E-05 0.610814561085E-05 0.651184655941E-05 - 0.694222892908E-05 0.740105613948E-05 0.789020815618E-05 0.841168919314E-05 0.896763592422E-05 - 0.956032623723E-05 0.101921885666E-04 0.108658118429E-04 0.115839560993E-04 0.123495637799E-04 - 0.131657717945E-04 0.140359243703E-04 0.149635867530E-04 0.159525598129E-04 0.170068956168E-04 - 0.181309140281E-04 0.193292204042E-04 0.206067244636E-04 0.219686603991E-04 0.234206083207E-04 - 0.249685171141E-04 0.266187288110E-04 0.283780045687E-04 0.302535523666E-04 0.322530565318E-04 - 0.343847092167E-04 0.366572439552E-04 0.390799714357E-04 0.416628176384E-04 0.444163644905E-04 - 0.473518932085E-04 0.504814305022E-04 0.538177978316E-04 0.573746639168E-04 0.611666007161E-04 - 0.652091431015E-04 0.695188524752E-04 0.741133845867E-04 0.790115618292E-04 0.842334503093E-04 - 0.898004420053E-04 0.957353423503E-04 0.102062463597E-03 0.108807724347E-03 0.115998755648E-03 - 0.123665014094E-03 0.131837902394E-03 0.140550897889E-03 0.149839689558E-03 0.159742324059E-03 - 0.170299361400E-03 0.181554040889E-03 0.193552458017E-03 0.206343753015E-03 0.219980311839E-03 - 0.234517980402E-03 0.250016292931E-03 0.266538715372E-03 0.284152904832E-03 0.302930986106E-03 - 0.322949846427E-03 0.344291449616E-03 0.367043170908E-03 0.391298153825E-03 0.417155690514E-03 - 0.444721627115E-03 0.474108795766E-03 0.505437475018E-03 0.538835880487E-03 0.574440687740E-03 - 0.612397589507E-03 0.652861889451E-03 0.695999134887E-03 0.741985790982E-03 0.791009959124E-03 - 0.843272142330E-03 0.898986060746E-03 0.958379520474E-03 0.102169533918E-02 0.108919233216E-02 - 0.116114636271E-02 0.123785146100E-02 0.131962101582E-02 0.140678904387E-02 0.149971154154E-02 - 0.159876792447E-02 0.170436256045E-02 0.181692640162E-02 0.193691872220E-02 0.206482896848E-02 - 0.220117872808E-02 0.234652382591E-02 0.250145655494E-02 0.266660804989E-02 0.284265081290E-02 - 0.303030140045E-02 0.323032328145E-02 0.344352987696E-02 0.367078779245E-02 0.391302025435E-02 - 0.417121076298E-02 0.444640697483E-02 0.473972482752E-02 0.505235292185E-02 0.538555717557E-02 - 0.574068576454E-02 0.611917436752E-02 0.652255173154E-02 0.695244557544E-02 0.741058885008E-02 - 0.789882637401E-02 0.841912186447E-02 0.897356538393E-02 0.956438122282E-02 0.101939362401E-01 - 0.108647486828E-01 0.115794975075E-01 0.123410322246E-01 0.131523832881E-01 0.140167730542E-01 - 0.149376273269E-01 0.159185875152E-01 0.169635234187E-01 0.180765466621E-01 0.192620247931E-01 - 0.205245960596E-01 0.218691848759E-01 0.233010179867E-01 0.248256413302E-01 0.264489375990E-01 - 0.281771444893E-01 0.300168736216E-01 0.319751301066E-01 0.340593327208E-01 0.362773346404E-01 - 0.386374446716E-01 0.411484488953E-01 0.438196326246E-01 0.466608025533E-01 0.496823089450E-01 - 0.528950676826E-01 0.563105819652E-01 0.599409633995E-01 0.637989521880E-01 0.678979360665E-01 - 0.722519675861E-01 0.768757792715E-01 0.817847961130E-01 0.869951447703E-01 0.925236587738E-01 - 0.983878789095E-01 0.104606047856E+00 0.111197098026E+00 0.118180631410E+00 0.125576890089E+00 - 0.133406715896E+00 0.141691497534E+00 0.150453103263E+00 0.159713797041E+00 0.169496135792E+00 - 0.179822845227E+00 0.190716671374E+00 0.202200204726E+00 0.214295673644E+00 0.227024703349E+00 - 0.240408036607E+00 0.254465211927E+00 0.269214194858E+00 0.284670957798E+00 0.300849003557E+00 - 0.317758827869E+00 0.335407316081E+00 0.353797069410E+00 0.372925656495E+00 0.392784786538E+00 - 0.413359401140E+00 0.434626683071E+00 0.456554981802E+00 0.479102657604E+00 0.502216848651E+00 - 0.525832168810E+00 0.549869347839E+00 0.574233830650E+00 0.598814358233E+00 0.623481559867E+00 - 0.648086594575E+00 0.672459889336E+00 0.696410032536E+00 0.719722893489E+00 0.742161052417E+00 - 0.763463640029E+00 0.783346701288E+00 0.801504213699E+00 0.817609905660E+00 0.831320034071E+00 - 0.842277290994E+00 0.850116014825E+00 0.854468879722E+00 0.854975224885E+00 0.851291158898E+00 - 0.843101529429E+00 0.830133779791E+00 0.812173615663E+00 0.789082271343E+00 0.760814989247E+00 - 0.727440103218E+00 0.689157841522E+00 0.646317637620E+00 0.599432358703E+00 0.549187442962E+00 - 0.496442495144E+00 0.442222457189E+00 0.387695093883E+00 0.334131279817E+00 0.282844534494E+00 - 0.235106544671E+00 0.192036181160E+00 0.154460929685E+00 0.122751894914E+00 0.966509407173E-01 - 0.754197350591E-01 0.583105682925E-01 0.446553131657E-01 0.338641471811E-01 0.254227490621E-01 - 0.188882113068E-01 0.138839137385E-01 0.100936590292E-01 0.725537509450E-02 0.515466309716E-02 - 0.361842930266E-02 0.250879268147E-02 0.171741309607E-02 0.116033964584E-02 0.773437417305E-03 - 0.508414784907E-03 0.329443540380E-03 0.210340978410E-03 0.132266603092E-03 0.818759218551E-04 - 0.498690344207E-04 0.298714443437E-04 0.175875916060E-04 0.101729842592E-04 0.577752330293E-05 - 0.321986957660E-05 0.175987680434E-05 0.942778890139E-06 0.494707936977E-06 0.254108048780E-06 - 0.127681574306E-06 0.627159654587E-07 0.300924318689E-07 0.140943050873E-07 0.643877401768E-08 - 0.286674509825E-08 - pseudo wavefunction - 0.575355347414E-04 0.594064467959E-04 0.613381962429E-04 0.633327613625E-04 0.653921847638E-04 - 0.675185754763E-04 0.697141111098E-04 0.719810400846E-04 0.743216839340E-04 0.767384396819E-04 - 0.792337822973E-04 0.818102672291E-04 0.844705330228E-04 0.872173040230E-04 0.900533931633E-04 - 0.929817048467E-04 0.960052379201E-04 0.991270887455E-04 0.102350454371E-03 0.105678635804E-03 - 0.109115041394E-03 0.112663190320E-03 0.116326716196E-03 0.120109370793E-03 0.124015027879E-03 - 0.128047687189E-03 0.132211478517E-03 0.136510665951E-03 0.140949652232E-03 0.145532983271E-03 - 0.150265352799E-03 0.155151607175E-03 0.160196750351E-03 0.165405948993E-03 0.170784537776E-03 - 0.176338024845E-03 0.182072097454E-03 0.187992627794E-03 0.194105679006E-03 0.200417511387E-03 - 0.206934588804E-03 0.213663585314E-03 0.220611391995E-03 0.227785124008E-03 0.235192127880E-03 - 0.242839989029E-03 0.250736539531E-03 0.258889866144E-03 0.267308318583E-03 0.276000518079E-03 - 0.284975366201E-03 0.294242053974E-03 0.303810071296E-03 0.313689216649E-03 0.323889607138E-03 - 0.334421688850E-03 0.345296247555E-03 0.356524419746E-03 0.368117704048E-03 0.380087972993E-03 - 0.392447485177E-03 0.405208897814E-03 0.418385279700E-03 0.431990124593E-03 0.446037365035E-03 - 0.460541386620E-03 0.475517042723E-03 0.490979669714E-03 0.506945102664E-03 0.523429691556E-03 - 0.540450318037E-03 0.558024412700E-03 0.576169972936E-03 0.594905581365E-03 0.614250424868E-03 - 0.634224314231E-03 0.654847704436E-03 0.676141715611E-03 0.698128154653E-03 0.720829537562E-03 - 0.744269112502E-03 0.768470883604E-03 0.793459635553E-03 0.819260958964E-03 0.845901276593E-03 - 0.873407870393E-03 0.901808909454E-03 0.931133478849E-03 0.961411609419E-03 0.992674308528E-03 - 0.102495359182E-02 0.105828251598E-02 0.109269521264E-02 0.112822692327E-02 0.116491403530E-02 - 0.120279411939E-02 0.124190596788E-02 0.128228963454E-02 0.132398647555E-02 0.136703919190E-02 - 0.141149187307E-02 0.145739004223E-02 0.150478070279E-02 0.155371238660E-02 0.160423520360E-02 - 0.165640089318E-02 0.171026287709E-02 0.176587631424E-02 0.182329815708E-02 0.188258721000E-02 - 0.194380418952E-02 0.200701178645E-02 0.207227473008E-02 0.213965985449E-02 0.220923616697E-02 - 0.228107491867E-02 0.235524967759E-02 0.243183640385E-02 0.251091352754E-02 0.259256202897E-02 - 0.267686552162E-02 0.276391033773E-02 0.285378561671E-02 0.294658339640E-02 0.304239870730E-02 - 0.314132966987E-02 0.324347759500E-02 0.334894708771E-02 0.345784615425E-02 0.357028631269E-02 - 0.368638270708E-02 0.380625422530E-02 0.393002362081E-02 0.405781763827E-02 0.418976714331E-02 - 0.432600725647E-02 0.446667749152E-02 0.461192189824E-02 0.476188920988E-02 0.491673299540E-02 - 0.507661181657E-02 0.524168939035E-02 0.541213475631E-02 0.558812244973E-02 0.576983268009E-02 - 0.595745151554E-02 0.615117107322E-02 0.635118971583E-02 0.655771225459E-02 0.677095015869E-02 - 0.699112177165E-02 0.721845253461E-02 0.745317521688E-02 0.769553015401E-02 0.794576549352E-02 - 0.820413744857E-02 0.847091055996E-02 0.874635796647E-02 0.903076168407E-02 0.932441289409E-02 - 0.962761224075E-02 0.994067013832E-02 0.102639070882E-01 0.105976540061E-01 0.109422525603E-01 - 0.112980555200E-01 0.116654271158E-01 0.120447434111E-01 0.124363926859E-01 0.128407758327E-01 - 0.132583067657E-01 0.136894128422E-01 0.141345352983E-01 0.145941296989E-01 0.150686664009E-01 - 0.155586310324E-01 0.160645249872E-01 0.165868659342E-01 0.171261883444E-01 0.176830440334E-01 - 0.182580027226E-01 0.188516526171E-01 0.194646010028E-01 0.200974748619E-01 0.207509215086E-01 - 0.214256092443E-01 0.221222280340E-01 0.228414902039E-01 0.235841311607E-01 0.243509101343E-01 - 0.251426109430E-01 0.259600427831E-01 0.268040410429E-01 0.276754681426E-01 0.285752143996E-01 - 0.295041989207E-01 0.304633705225E-01 0.314537086791E-01 0.324762244998E-01 0.335319617355E-01 - 0.346219978170E-01 0.357474449230E-01 0.369094510819E-01 0.381092013054E-01 0.393479187556E-01 - 0.406268659478E-01 0.419473459869E-01 0.433107038408E-01 0.447183276504E-01 0.461716500761E-01 - 0.476721496838E-01 0.492213523683E-01 0.508208328170E-01 0.524722160129E-01 0.541771787786E-01 - 0.559374513607E-01 0.577548190562E-01 0.596311238795E-01 0.615682662727E-01 0.635682068564E-01 - 0.656329682232E-01 0.677646367731E-01 0.699653645899E-01 0.722373713589E-01 0.745829463247E-01 - 0.770044502882E-01 0.795043176423E-01 0.820850584435E-01 0.847492605189E-01 0.874995916053E-01 - 0.903388015194E-01 0.932697243532E-01 0.962952806953E-01 0.994184798691E-01 0.102642422187E+00 - 0.105970301215E+00 0.109405406033E+00 0.112951123506E+00 0.116610940521E+00 0.120388446224E+00 - 0.124287334210E+00 0.128311404677E+00 0.132464566515E+00 0.136750839334E+00 0.141174355391E+00 - 0.145739361417E+00 0.150450220313E+00 0.155311412692E+00 0.160327538239E+00 0.165503316871E+00 - 0.170843589644E+00 0.176353319387E+00 0.182037591014E+00 0.187901611466E+00 0.193950709243E+00 - 0.200190333447E+00 0.206626052301E+00 0.213263551044E+00 0.220108629141E+00 0.227167196717E+00 - 0.234445270112E+00 0.241948966447E+00 0.249684497087E+00 0.257658159858E+00 0.265876329868E+00 - 0.274345448775E+00 0.283072012294E+00 0.292062555759E+00 0.301323637496E+00 0.310861819756E+00 - 0.320683646913E+00 0.330795620636E+00 0.341204171652E+00 0.351915627735E+00 0.362936177473E+00 - 0.374271829350E+00 0.385928365590E+00 0.397911290193E+00 0.410225770506E+00 0.422876571603E+00 - 0.435867982691E+00 0.449203734658E+00 0.462886907800E+00 0.476919828678E+00 0.491303954927E+00 - 0.506039746769E+00 0.521126523834E+00 0.536562305798E+00 0.552343635204E+00 0.568465380740E+00 - 0.584920519078E+00 0.601699893320E+00 0.618791945934E+00 0.636182424019E+00 0.653854054636E+00 - 0.671786187949E+00 0.689954405900E+00 0.708330094256E+00 0.726879976015E+00 0.745565604418E+00 - 0.764342814255E+00 0.783161130667E+00 0.801963135452E+00 0.820683791893E+00 0.839249730401E+00 - 0.857578498949E+00 0.875577784285E+00 0.893144612430E+00 0.910164539979E+00 0.926510851286E+00 - 0.942043780836E+00 0.956609784897E+00 0.970040892017E+00 0.982154168004E+00 0.992751337569E+00 - 0.100161861173E+01 0.100852677707E+01 0.101323160973E+01 0.101547468295E+01 0.101498464155E+01 - 0.101147901924E+01 0.100466111497E+01 0.994375950448E+00 0.980707901591E+00 0.963803639329E+00 - 0.943836461172E+00 0.921004116597E+00 0.895526241359E+00 0.867641520215E+00 0.837604615000E+00 - 0.805682938619E+00 0.772153342384E+00 0.737298744582E+00 0.701404760904E+00 0.664756390336E+00 - 0.627634741711E+00 0.590313873286E+00 0.553057756365E+00 0.516117401327E+00 0.479728188657E+00 - 0.444107456577E+00 0.409452404308E+00 0.375938372688E+00 0.343717559055E+00 0.312918210115E+00 - 0.283644316716E+00 0.255975805584E+00 0.229969207138E+00 0.205658740221E+00 0.183057753088E+00 - 0.162160440109E+00 - ae wavefunction - 0.723210491956E-03 0.746578583770E-03 0.770700951993E-03 0.795601892227E-03 0.821306479369E-03 - 0.847840592488E-03 0.875230940375E-03 0.903505087772E-03 0.932691482807E-03 0.962819484716E-03 - 0.993919392949E-03 0.102602247680E-02 0.105916100625E-02 0.109336828344E-02 0.112867867548E-02 - 0.116512764795E-02 0.120275179956E-02 0.124158889799E-02 0.128167791659E-02 0.132305907237E-02 - 0.136577386512E-02 0.140986511768E-02 0.145537701746E-02 0.150235515925E-02 0.155084658925E-02 - 0.160089985052E-02 0.165256502971E-02 0.170589380529E-02 0.176093949712E-02 0.181775711760E-02 - 0.187640342429E-02 0.193693697409E-02 0.199941817908E-02 0.206390936390E-02 0.213047482499E-02 - 0.219918089139E-02 0.227009598742E-02 0.234329069717E-02 0.241883783086E-02 0.249681249307E-02 - 0.257729215303E-02 0.266035671683E-02 0.274608860172E-02 0.283457281255E-02 0.292589702034E-02 - 0.302015164303E-02 0.311742992854E-02 0.321782804011E-02 0.332144514397E-02 0.342838349946E-02 - 0.353874855160E-02 0.365264902612E-02 0.377019702712E-02 0.389150813722E-02 0.401670152049E-02 - 0.414590002798E-02 0.427923030608E-02 0.441682290755E-02 0.455881240553E-02 0.470533751028E-02 - 0.485654118900E-02 0.501257078845E-02 0.517357816061E-02 0.533971979149E-02 0.551115693279E-02 - 0.568805573680E-02 0.587058739433E-02 0.605892827584E-02 0.625326007563E-02 0.645376995923E-02 - 0.666065071397E-02 0.687410090265E-02 0.709432502044E-02 0.732153365478E-02 0.755594364866E-02 - 0.779777826652E-02 0.804726736390E-02 0.830464755909E-02 0.857016240900E-02 0.884406258640E-02 - 0.912660606132E-02 0.941805828423E-02 0.971869237195E-02 0.100287892964E-01 0.103486380750E-01 - 0.106785359635E-01 0.110187886512E-01 0.113697104566E-01 0.117316245259E-01 0.121048630323E-01 - 0.124897673751E-01 0.128866883819E-01 0.132959865080E-01 0.137180320384E-01 0.141532052878E-01 - 0.146018967997E-01 0.150645075448E-01 0.155414491166E-01 0.160331439246E-01 0.165400253848E-01 - 0.170625381058E-01 0.176011380701E-01 0.181562928105E-01 0.187284815799E-01 0.193181955137E-01 - 0.199259377844E-01 0.205522237464E-01 0.211975810705E-01 0.218625498668E-01 0.225476827944E-01 - 0.232535451563E-01 0.239807149791E-01 0.247297830737E-01 0.255013530778E-01 0.262960414763E-01 - 0.271144775983E-01 0.279573035892E-01 0.288251743544E-01 0.297187574729E-01 0.306387330781E-01 - 0.315857937031E-01 0.325606440870E-01 0.335640009402E-01 0.345965926640E-01 0.356591590220E-01 - 0.367524507593E-01 0.378772291652E-01 0.390342655757E-01 0.402243408110E-01 0.414482445436E-01 - 0.427067745919E-01 0.440007361337E-01 0.453309408352E-01 0.466982058883E-01 0.481033529513E-01 - 0.495472069857E-01 0.510305949826E-01 0.525543445725E-01 0.541192825097E-01 0.557262330238E-01 - 0.573760160317E-01 0.590694451993E-01 0.608073258461E-01 0.625904526816E-01 0.644196073662E-01 - 0.662955558838E-01 0.682190457186E-01 0.701908028232E-01 0.722115283678E-01 0.742818952600E-01 - 0.764025444212E-01 0.785740808093E-01 0.807970691759E-01 0.830720295419E-01 0.853994323839E-01 - 0.877796935126E-01 0.902131686350E-01 0.927001475833E-01 0.952408481994E-01 0.978354098603E-01 - 0.100483886632E+00 0.103186240036E+00 0.105942331426E+00 0.108751913939E+00 0.111614624041E+00 - 0.114529972627E+00 0.117497335686E+00 0.120515944498E+00 0.123584875391E+00 0.126703039005E+00 - 0.129869169099E+00 0.133081810868E+00 0.136339308790E+00 0.139639793985E+00 0.142981171101E+00 - 0.146361104728E+00 0.149777005361E+00 0.153226014901E+00 0.156704991737E+00 0.160210495417E+00 - 0.163738770941E+00 0.167285732697E+00 0.170846948100E+00 0.174417620953E+00 0.177992574602E+00 - 0.181566234937E+00 0.185132613303E+00 0.188685289405E+00 0.192217394292E+00 0.195721593504E+00 - 0.199190070517E+00 0.202614510568E+00 0.205986085027E+00 0.209295436430E+00 0.212532664351E+00 - 0.215687312275E+00 0.218748355654E+00 0.221704191362E+00 0.224542628748E+00 0.227250882534E+00 - 0.229815567796E+00 0.232222697309E+00 0.234457681522E+00 0.236505331475E+00 0.238349864969E+00 - 0.239974916327E+00 0.241363550084E+00 0.242498278978E+00 0.243361086622E+00 0.243933455227E+00 - 0.244196398801E+00 0.244130502213E+00 0.243715966544E+00 0.242932661134E+00 0.241760182755E+00 - 0.240177922301E+00 0.238165139411E+00 0.235701045406E+00 0.232764894903E+00 0.229336086443E+00 - 0.225394272444E+00 0.220919478726E+00 0.215892233821E+00 0.210293708226E+00 0.204105863651E+00 - 0.197311612280E+00 0.189894985941E+00 0.181841314980E+00 0.173137416545E+00 0.163771791829E+00 - 0.153734831728E+00 0.143019030191E+00 0.131619204408E+00 0.119532720834E+00 0.106759725824E+00 - 0.933033795277E-01 0.791700914244E-01 0.643697556857E-01 0.489159842511E-01 0.328263352024E-01 - 0.161225336665E-01 -0.116931789868E-02 -0.190185435298E-01 -0.373897154028E-01 -0.562424969619E-01 - -0.755315106483E-01 -0.952062321565E-01 -0.115210911281E+00 -0.135484517197E+00 -0.155960704264E+00 - -0.176567794242E+00 -0.197228773280E+00 -0.217861307379E+00 -0.238377787431E+00 -0.258685422148E+00 - -0.278686401205E+00 -0.298278148790E+00 -0.317353678585E+00 -0.335802047802E+00 -0.353508896551E+00 - -0.370357054796E+00 -0.386227202908E+00 -0.400998578759E+00 -0.414549729935E+00 -0.426759311736E+00 - -0.437506930652E+00 -0.446674029444E+00 -0.454144808540E+00 -0.459807175066E+00 -0.463553710585E+00 - -0.465282647871E+00 -0.464898847424E+00 -0.462314764450E+00 -0.457451398192E+00 -0.450239215408E+00 - -0.440619040450E+00 -0.428542905017E+00 -0.413974850508E+00 -0.396891676564E+00 -0.377283628995E+00 - -0.355155020605E+00 -0.330524777997E+00 -0.303426906672E+00 -0.273910866599E+00 -0.242041849499E+00 - -0.207900947753E+00 -0.171585205060E+00 -0.133207537940E+00 -0.928965176587E-01 -0.507960038343E-01 - -0.706462318874E-02 0.381249082892E-01 0.845866157243E-01 0.132122236961E+00 0.180522317286E+00 - 0.229567404370E+00 0.279029321687E+00 0.328672508685E+00 0.378255438406E+00 0.427532163428E+00 - 0.476254096171E+00 0.524172207141E+00 0.571039903275E+00 0.616616865042E+00 0.660673900196E+00 - 0.702998097735E+00 0.743396073735E+00 0.781691755158E+00 0.817716506082E+00 0.851295262156E+00 - 0.882238303138E+00 0.910345746539E+00 0.935421494478E+00 0.957287301571E+00 0.975791215624E+00 - 0.990810703323E+00 0.100225314176E+01 0.101005569110E+01 0.101418535318E+01 0.101463927790E+01 - 0.101144510801E+01 0.100466111497E+01 0.994375950448E+00 0.980707901591E+00 0.963803639329E+00 - 0.943836461172E+00 0.921004116597E+00 0.895526241359E+00 0.867641520215E+00 0.837604615000E+00 - 0.805682938619E+00 0.772153342384E+00 0.737298744582E+00 0.701404760904E+00 0.664756390336E+00 - 0.627634741711E+00 0.590313873286E+00 0.553057756365E+00 0.516117401327E+00 0.479728188657E+00 - 0.444107456577E+00 0.409452404308E+00 0.375938372688E+00 0.343717559055E+00 0.312918210115E+00 - 0.283644316716E+00 0.255975805584E+00 0.229969207138E+00 0.205658740221E+00 0.183057753088E+00 - 0.162160440109E+00 - pseudo wavefunction - 0.815477257113E-04 0.841994543121E-04 0.869374105116E-04 0.897643982160E-04 0.926833125078E-04 - 0.956971426101E-04 0.988089749485E-04 0.102021996311E-03 0.105339497112E-03 0.108764874763E-03 - 0.112301637149E-03 0.115953406224E-03 0.119723921719E-03 0.123617044970E-03 0.127636762877E-03 - 0.131787191981E-03 0.136072582684E-03 0.140497323602E-03 0.145065946054E-03 0.149783128710E-03 - 0.154653702376E-03 0.159682654946E-03 0.164875136506E-03 0.170236464611E-03 0.175772129729E-03 - 0.181487800864E-03 0.187389331363E-03 0.193482764908E-03 0.199774341708E-03 0.206270504887E-03 - 0.212977907082E-03 0.219903417260E-03 0.227054127747E-03 0.234437361494E-03 0.242060679579E-03 - 0.249931888944E-03 0.258059050395E-03 0.266450486854E-03 0.275114791884E-03 0.284060838489E-03 - 0.293297788203E-03 0.302835100467E-03 0.312682542321E-03 0.322850198405E-03 0.333348481284E-03 - 0.344188142117E-03 0.355380281661E-03 0.366936361642E-03 0.378868216494E-03 0.391188065475E-03 - 0.403908525185E-03 0.417042622483E-03 0.430603807827E-03 0.444605969054E-03 0.459063445594E-03 - 0.473991043162E-03 0.489404048917E-03 0.505318247117E-03 0.521749935286E-03 0.538715940900E-03 - 0.556233638623E-03 0.574320968101E-03 0.592996452329E-03 0.612279216623E-03 0.632189008208E-03 - 0.652746216436E-03 0.673971893671E-03 0.695887776845E-03 0.718516309720E-03 0.741880665872E-03 - 0.766004772421E-03 0.790913334538E-03 0.816631860740E-03 0.843186689018E-03 0.870605013804E-03 - 0.898914913826E-03 0.928145380856E-03 0.958326349405E-03 0.989488727376E-03 0.102166442772E-02 - 0.105488640110E-02 0.108918866967E-02 0.112460636188E-02 0.116117574846E-02 0.119893427959E-02 - 0.123792062320E-02 0.127817470463E-02 0.131973774745E-02 0.136265231574E-02 0.140696235763E-02 - 0.145271325033E-02 0.149995184660E-02 0.154872652270E-02 0.159908722798E-02 0.165108553598E-02 - 0.170477469728E-02 0.176020969402E-02 0.181744729618E-02 0.187654611977E-02 0.193756668679E-02 - 0.200057148727E-02 0.206562504320E-02 0.213279397464E-02 0.220214706796E-02 0.227375534621E-02 - 0.234769214192E-02 0.242403317215E-02 0.250285661605E-02 0.258424319488E-02 0.266827625473E-02 - 0.275504185178E-02 0.284462884051E-02 0.293712896461E-02 0.303263695098E-02 0.313125060667E-02 - 0.323307091910E-02 0.333820215938E-02 0.344675198915E-02 0.355883157079E-02 0.367455568123E-02 - 0.379404282948E-02 0.391741537797E-02 0.404479966782E-02 0.417632614823E-02 0.431212951000E-02 - 0.445234882345E-02 0.459712768080E-02 0.474661434319E-02 0.490096189243E-02 0.506032838775E-02 - 0.522487702760E-02 0.539477631671E-02 0.557020023861E-02 0.575132843370E-02 0.593834638314E-02 - 0.613144559871E-02 0.633082381885E-02 0.653668521102E-02 0.674924058070E-02 0.696870758709E-02 - 0.719531096592E-02 0.742928275939E-02 0.767086255365E-02 0.792029772395E-02 0.817784368774E-02 - 0.844376416603E-02 0.871833145320E-02 0.900182669552E-02 0.929454017879E-02 0.959677162528E-02 - 0.990883050022E-02 0.102310363284E-01 0.105637190207E-01 0.109072192118E-01 0.112618886081E-01 - 0.116280903475E-01 0.120061993704E-01 0.123966028031E-01 0.127997003533E-01 0.132159047187E-01 - 0.136456420083E-01 0.140893521779E-01 0.145474894794E-01 0.150205229247E-01 0.155089367643E-01 - 0.160132309818E-01 0.165339218041E-01 0.170715422280E-01 0.176266425639E-01 0.181997909971E-01 - 0.187915741665E-01 0.194025977634E-01 0.200334871477E-01 0.206848879853E-01 0.213574669051E-01 - 0.220519121780E-01 0.227689344162E-01 0.235092672965E-01 0.242736683058E-01 0.250629195101E-01 - 0.258778283492E-01 0.267192284556E-01 0.275879804997E-01 0.284849730625E-01 0.294111235351E-01 - 0.303673790471E-01 0.313547174243E-01 0.323741481766E-01 0.334267135170E-01 0.345134894124E-01 - 0.356355866676E-01 0.367941520430E-01 0.379903694070E-01 0.392254609246E-01 0.405006882824E-01 - 0.418173539515E-01 0.431768024894E-01 0.445804218815E-01 0.460296449237E-01 0.475259506471E-01 - 0.490708657851E-01 0.506659662856E-01 0.523128788672E-01 0.540132826228E-01 0.557689106695E-01 - 0.575815518475E-01 0.594530524680E-01 0.613853181118E-01 0.633803154786E-01 0.654400742896E-01 - 0.675666892425E-01 0.697623220209E-01 0.720292033587E-01 0.743696351597E-01 0.767859926737E-01 - 0.792807267296E-01 0.818563660248E-01 0.845155194735E-01 0.872608786111E-01 0.900952200573E-01 - 0.930214080363E-01 0.960423969533E-01 0.991612340281E-01 0.102381061984E+00 0.105705121788E+00 - 0.109136755450E+00 0.112679408862E+00 0.116336634695E+00 0.120112095333E+00 0.124009565855E+00 - 0.128032937043E+00 0.132186218436E+00 0.136473541398E+00 0.140899162210E+00 0.145467465175E+00 - 0.150182965720E+00 0.155050313498E+00 0.160074295467E+00 0.165259838936E+00 0.170612014565E+00 - 0.176136039306E+00 0.181837279254E+00 0.187721252402E+00 0.193793631261E+00 0.200060245332E+00 - 0.206527083389E+00 0.213200295545E+00 0.220086195059E+00 0.227191259846E+00 0.234522133635E+00 - 0.242085626730E+00 0.249888716306E+00 0.257938546178E+00 0.266242425963E+00 0.274807829557E+00 - 0.283642392830E+00 0.292753910429E+00 0.302150331579E+00 0.311839754749E+00 0.321830421030E+00 - 0.332130706074E+00 0.342749110390E+00 0.353694247819E+00 0.364974831931E+00 0.376599660114E+00 - 0.388577595046E+00 0.400917543253E+00 0.413628430375E+00 0.426719172761E+00 0.440198644933E+00 - 0.454075642432E+00 0.468358839485E+00 0.483056740881E+00 0.498177627359E+00 0.513729493745E+00 - 0.529719978972E+00 0.546156287045E+00 0.563045097863E+00 0.580392466756E+00 0.598203711387E+00 - 0.616483284604E+00 0.635234631621E+00 0.654460029761E+00 0.674160408817E+00 0.694335149890E+00 - 0.714981860357E+00 0.736096122431E+00 0.757671212527E+00 0.779697788452E+00 0.802163541211E+00 - 0.825052808008E+00 0.848346142836E+00 0.872019840898E+00 0.896045412985E+00 0.920389005890E+00 - 0.945010765014E+00 0.969864135460E+00 0.994895098271E+00 0.102004133900E+01 0.104523134664E+01 - 0.107038344193E+01 0.109540473587E+01 0.112019002089E+01 0.114462060011E+01 0.116856306300E+01 - 0.119186802024E+01 0.121436881520E+01 0.123588023556E+01 0.125619725611E+01 0.127509385139E+01 - 0.129232192750E+01 0.130761043238E+01 0.132066471690E+01 0.133116623170E+01 0.133877265895E+01 - 0.134311859223E+01 0.134381689101E+01 0.134046084846E+01 0.133262731962E+01 0.131988096144E+01 - 0.130177973302E+01 0.127788310298E+01 0.124791979347E+01 0.121195594119E+01 0.117012955700E+01 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 - ae wavefunction - 0.100411206031E-02 0.103655653257E-02 0.107004824907E-02 0.110462094206E-02 0.114030942574E-02 - 0.117714963085E-02 0.121517864012E-02 0.125443472469E-02 0.129495738219E-02 0.133678737526E-02 - 0.137996677192E-02 0.142453898676E-02 0.147054882368E-02 0.151804251972E-02 0.156706779045E-02 - 0.161767387661E-02 0.166991159220E-02 0.172383337419E-02 0.177949333353E-02 0.183694730789E-02 - 0.189625291594E-02 0.195746961331E-02 0.202065875021E-02 0.208588363083E-02 0.215320957455E-02 - 0.222270397899E-02 0.229443638492E-02 0.236847854317E-02 0.244490448353E-02 0.252379058570E-02 - 0.260521565239E-02 0.268926098453E-02 0.277601045878E-02 0.286555060725E-02 0.295797069967E-02 - 0.305336282787E-02 0.315182199281E-02 0.325344619405E-02 0.335833652195E-02 0.346659725239E-02 - 0.357833594433E-02 0.369366354008E-02 0.381269446850E-02 0.393554675108E-02 0.406234211102E-02 - 0.419320608539E-02 0.432826814042E-02 0.446766179001E-02 0.461152471742E-02 0.475999890040E-02 - 0.491323073976E-02 0.507137119125E-02 0.523457590114E-02 0.540300534538E-02 0.557682497239E-02 - 0.575620534963E-02 0.594132231403E-02 0.613235712617E-02 0.632949662853E-02 0.653293340765E-02 - 0.674286596037E-02 0.695949886420E-02 0.718304295172E-02 0.741371548940E-02 0.765174036045E-02 - 0.789734825209E-02 0.815077684708E-02 0.841227101959E-02 0.868208303549E-02 0.896047275693E-02 - 0.924770785137E-02 0.954406400502E-02 0.984982514059E-02 0.101652836394E-01 0.104907405678E-01 - 0.108265059081E-01 0.111728987934E-01 0.115302477462E-01 0.118988909230E-01 0.122791763595E-01 - 0.126714622234E-01 0.130761170679E-01 0.134935200904E-01 0.139240613943E-01 0.143681422534E-01 - 0.148261753797E-01 0.152985851939E-01 0.157858080982E-01 0.162882927509E-01 0.168065003429E-01 - 0.173409048755E-01 0.178919934394E-01 0.184602664931E-01 0.190462381422E-01 0.196504364175E-01 - 0.202734035517E-01 0.209156962543E-01 0.215778859835E-01 0.222605592145E-01 0.229643177037E-01 - 0.236897787473E-01 0.244375754327E-01 0.252083568839E-01 0.260027884966E-01 0.268215521644E-01 - 0.276653464924E-01 0.285348869993E-01 0.294309063035E-01 0.303541542937E-01 0.313053982813E-01 - 0.322854231324E-01 0.332950313775E-01 0.343350432971E-01 0.354062969793E-01 0.365096483489E-01 - 0.376459711628E-01 0.388161569716E-01 0.400211150407E-01 0.412617722306E-01 0.425390728318E-01 - 0.438539783489E-01 0.452074672324E-01 0.466005345522E-01 0.480341916085E-01 0.495094654752E-01 - 0.510273984710E-01 0.525890475524E-01 0.541954836221E-01 0.558477907490E-01 0.575470652892E-01 - 0.592944149057E-01 0.610909574763E-01 0.629378198839E-01 0.648361366790E-01 0.667870486093E-01 - 0.687917010039E-01 0.708512420048E-01 0.729668206361E-01 0.751395846992E-01 0.773706784836E-01 - 0.796612402836E-01 0.820123997070E-01 0.844252747640E-01 0.869009687250E-01 0.894405667320E-01 - 0.920451321506E-01 0.947157026489E-01 0.974532859865E-01 0.100258855501E+00 0.103133345273E+00 - 0.106077644955E+00 0.109092594252E+00 0.112178977021E+00 0.115337514994E+00 0.118568861090E+00 - 0.121873592304E+00 0.125252202151E+00 0.128705092655E+00 0.132232565851E+00 0.135834814797E+00 - 0.139511914062E+00 0.143263809684E+00 0.147090308573E+00 0.150991067341E+00 0.154965580557E+00 - 0.159013168383E+00 0.163132963604E+00 0.167323898026E+00 0.171584688232E+00 0.175913820679E+00 - 0.180309536147E+00 0.184769813516E+00 0.189292352876E+00 0.193874557970E+00 0.198513517983E+00 - 0.203205988665E+00 0.207948372826E+00 0.212736700201E+00 0.217566606727E+00 0.222433313240E+00 - 0.227331603655E+00 0.232255802656E+00 0.237199752953E+00 0.242156792174E+00 0.247119729454E+00 - 0.252080821818E+00 0.257031750433E+00 0.261963596859E+00 0.266866819394E+00 0.271731229666E+00 - 0.276545969613E+00 0.281299489013E+00 0.285979523755E+00 0.290573075042E+00 0.295066389746E+00 - 0.299444942160E+00 0.303693417394E+00 0.307795696707E+00 0.311734845064E+00 0.315493101250E+00 - 0.319051870893E+00 0.322391722743E+00 0.325492388640E+00 0.328332767535E+00 0.330890934065E+00 - 0.333144152089E+00 0.335068893704E+00 0.336640864237E+00 0.337835033734E+00 0.338625675483E+00 - 0.338986412149E+00 0.338890270056E+00 0.338309742224E+00 0.337216860715E+00 0.335583278886E+00 - 0.333380364113E+00 0.330579301540E+00 0.327151209410E+00 0.323067266460E+00 0.318298851881E+00 - 0.312817698250E+00 0.306596057794E+00 0.299606882299E+00 0.291824016847E+00 0.283222407513E+00 - 0.273778323006E+00 0.263469590136E+00 0.252275842824E+00 0.240178784252E+00 0.227162461529E+00 - 0.213213552127E+00 0.198321661083E+00 0.182479627800E+00 0.165683841030E+00 0.147934560383E+00 - 0.129236242450E+00 0.109597869328E+00 0.890332769980E-01 0.675614806516E-01 0.452069935885E-01 - 0.220001358488E-01 -0.202267179947E-02 -0.268186333727E-01 -0.523383278445E-01 -0.785254890752E-01 - -0.105316819838E+00 -0.132641842628E+00 -0.160422787359E+00 -0.188574512968E+00 -0.217004457521E+00 - -0.245612611158E+00 -0.274291509649E+00 -0.302926253778E+00 -0.331394570066E+00 -0.359566938358E+00 - -0.387306817382E+00 -0.414470996398E+00 -0.440910088322E+00 -0.466469161094E+00 -0.490988488296E+00 - -0.514304394485E+00 -0.536250175925E+00 -0.556657087061E+00 -0.575355390912E+00 -0.592175474576E+00 - -0.606949029250E+00 -0.619510290028E+00 -0.629697327922E+00 -0.637353382408E+00 -0.642328222232E+00 - -0.644479521263E+00 -0.643674236664E+00 -0.639789976727E+00 -0.632716347271E+00 -0.622356265451E+00 - -0.608627230644E+00 -0.591462542992E+00 -0.570812459931E+00 -0.546645281908E+00 -0.518948357967E+00 - -0.487729002212E+00 -0.453015311567E+00 -0.414856874075E+00 -0.373325356806E+00 -0.328514960967E+00 - -0.280542730002E+00 -0.229548696640E+00 -0.175695853364E+00 -0.119169931471E+00 -0.601789761144E-01 - 0.104729211497E-02 0.642583319031E-01 0.129183846977E+00 0.195535047578E+00 0.263006083041E+00 - 0.331275614340E+00 0.400008497553E+00 0.468857563600E+00 0.537465511386E+00 0.605466987922E+00 - 0.672491005793E+00 0.738163955532E+00 0.802113577363E+00 0.863974274314E+00 0.923393832698E+00 - 0.980040530008E+00 0.103360754150E+01 0.108380973017E+01 0.113036987200E+01 0.117299954389E+01 - 0.121138806437E+01 0.124520914300E+01 0.127414049534E+01 0.129788344230E+01 0.131617463165E+01 - 0.132879041294E+01 0.133554760128E+01 0.133630339312E+01 0.133095550857E+01 0.131944261315E+01 - 0.130174470424E+01 0.127788310298E+01 0.124791979347E+01 0.121195594119E+01 0.117012955700E+01 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 - pseudo wavefunction - 0.291401325933E-08 0.310660738532E-08 0.331193051905E-08 0.353082395115E-08 0.376418457520E-08 - 0.401296856259E-08 0.427819528042E-08 0.456095146815E-08 0.486239569049E-08 0.518376308447E-08 - 0.552637042028E-08 0.589162149659E-08 0.628101289253E-08 0.669614009969E-08 0.713870405956E-08 - 0.761051813289E-08 0.811351552983E-08 0.864975723099E-08 0.922144043214E-08 0.983090754699E-08 - 0.104806558050E-07 0.111733474834E-07 0.119118208158E-07 0.126991016216E-07 0.135384157035E-07 - 0.144332020655E-07 0.153871270036E-07 0.164040991280E-07 0.174882853783E-07 0.186441280971E-07 - 0.198763632322E-07 0.211900397413E-07 0.225905402799E-07 0.240836032562E-07 0.256753463434E-07 - 0.273722915463E-07 0.291813919246E-07 0.311100600826E-07 0.331661985409E-07 0.353582321169E-07 - 0.376951424442E-07 0.401865047739E-07 0.428425272086E-07 0.456740925285E-07 0.486928027827E-07 - 0.519110268276E-07 0.553419510066E-07 0.589996331800E-07 0.628990603257E-07 0.670562099465E-07 - 0.714881155364E-07 0.762129363737E-07 0.812500319263E-07 0.866200411755E-07 0.923449671818E-07 - 0.984482672403E-07 0.104954948994E-06 0.111891672901E-06 0.119286861471E-06 0.127170815725E-06 - 0.135575839351E-06 0.144536371063E-06 0.154089125712E-06 0.164273244717E-06 0.175130456449E-06 - 0.186705247203E-06 0.199045043477E-06 0.212200406300E-06 0.226225238396E-06 0.241177005044E-06 - 0.257116969541E-06 0.274110444214E-06 0.292227058035E-06 0.311541041917E-06 0.332131532864E-06 - 0.354082898227E-06 0.377485081388E-06 0.402433970297E-06 0.429031790352E-06 0.457387523265E-06 - 0.487617353594E-06 0.519845144797E-06 0.554202946748E-06 0.590831536791E-06 0.629880996560E-06 - 0.671511326916E-06 0.715893103531E-06 0.763208175796E-06 0.813650411926E-06 0.867426493305E-06 - 0.924756761334E-06 0.985876120248E-06 0.105103499960E-05 0.112050038036E-05 0.119455688881E-05 - 0.127350796280E-05 0.135767709497E-05 0.144740915825E-05 0.154307181892E-05 0.164505704302E-05 - 0.175378270241E-05 0.186969428687E-05 0.199326672943E-05 0.212500635232E-05 0.226545294151E-05 - 0.241518195837E-05 0.257480689749E-05 0.274498180033E-05 0.292640393503E-05 0.311981665323E-05 - 0.332601243583E-05 0.354583613993E-05 0.378018846037E-05 0.403002962015E-05 0.429638330457E-05 - 0.458034085547E-05 0.488306574269E-05 0.520579833094E-05 0.554986096174E-05 0.591666337125E-05 - 0.630770846606E-05 0.672459848077E-05 0.716904154238E-05 0.764285866862E-05 0.814799122864E-05 - 0.868650889678E-05 0.926061813200E-05 0.987267121753E-05 0.105251758980E-04 0.112208056533E-04 - 0.119624106514E-04 0.127530294250E-04 0.135959013195E-04 0.144944797639E-04 0.154524464180E-04 - 0.164737262553E-04 0.175625036414E-04 0.187232394758E-04 0.199606894654E-04 0.212799236061E-04 - 0.226863469507E-04 0.241857217502E-04 0.257841910562E-04 0.274883038842E-04 0.293050420377E-04 - 0.312418487062E-04 0.333066589503E-04 0.355079322021E-04 0.378546869117E-04 0.403565374822E-04 - 0.430237336441E-04 0.458672024310E-04 0.488985929263E-04 0.521303239658E-04 0.555756349902E-04 - 0.592486402555E-04 0.631643866225E-04 0.673389151628E-04 0.717893268303E-04 0.765338524702E-04 - 0.815919274473E-04 0.869842712009E-04 0.927329720510E-04 0.988615775995E-04 0.105395191097E-03 - 0.112360574171E-03 0.119786256323E-03 0.127702651659E-03 0.136142183310E-03 0.145139416064E-03 - 0.154731197738E-03 0.164956809872E-03 0.175858128359E-03 0.187479794654E-03 0.199869398273E-03 - 0.213077671305E-03 0.227158695740E-03 0.242170124453E-03 0.258173416722E-03 0.275234089266E-03 - 0.293421983779E-03 0.312811552079E-03 0.333482159993E-03 0.355518411228E-03 0.379010492513E-03 - 0.404054541419E-03 0.430753038322E-03 0.459215224092E-03 0.489557545183E-03 0.521904127897E-03 - 0.556387283727E-03 0.593148047805E-03 0.632336752571E-03 0.674113638984E-03 0.718649507668E-03 - 0.766126412590E-03 0.816738400009E-03 0.870692295607E-03 0.928208542896E-03 0.989522096188E-03 - 0.105488337163E-02 0.112455925999E-02 0.119883420516E-02 0.127801135246E-02 0.136241377136E-02 - 0.145238575706E-02 0.154829421610E-02 0.165053014116E-02 0.175951018072E-02 0.187567830934E-02 - 0.199950760496E-02 0.213150213972E-02 0.227219899132E-02 0.242217038221E-02 0.258202595451E-02 - 0.275241518875E-02 0.293402997498E-02 0.312760734560E-02 0.333393237906E-02 0.355384128481E-02 - 0.378822467978E-02 0.403803106746E-02 0.430427053110E-02 0.458801865300E-02 0.489042067249E-02 - 0.521269589551E-02 0.555614236937E-02 0.592214183672E-02 0.631216498309E-02 0.672777699290E-02 - 0.717064342923E-02 0.764253645283E-02 0.814534139630E-02 0.868106370932E-02 0.925183629115E-02 - 0.985992722626E-02 0.105077479391E-01 0.111978617832E-01 0.119329930798E-01 0.127160366201E-01 - 0.135500676430E-01 0.144383523024E-01 0.153843586304E-01 0.163917680069E-01 0.174644871387E-01 - 0.186066605500E-01 0.198226835816E-01 0.211172158919E-01 0.224951954467E-01 0.239618529776E-01 - 0.255227268840E-01 0.271836785399E-01 0.289509079627E-01 0.308309697832E-01 0.328307894472E-01 - 0.349576795609E-01 0.372193562769E-01 0.396239555947E-01 0.421800494316E-01 0.448966612888E-01 - 0.477832813164E-01 0.508498805412E-01 0.541069239936E-01 0.575653824260E-01 0.612367422726E-01 - 0.651330134572E-01 0.692667345974E-01 0.736509751040E-01 0.782993336099E-01 0.832259320992E-01 - 0.884454050389E-01 0.939728827426E-01 0.998239681194E-01 0.106014705886E+00 0.112561543240E+00 - 0.119481280915E+00 0.126791013465E+00 0.134508057562E+00 0.142649867018E+00 0.151233933217E+00 - 0.160277669592E+00 0.169798278812E+00 0.179812601329E+00 0.190336944040E+00 0.201386887920E+00 - 0.212977073642E+00 0.225120964474E+00 0.237830586025E+00 0.251116242866E+00 0.264986212540E+00 - 0.279446418120E+00 0.294500081243E+00 0.310147358389E+00 0.326384964240E+00 0.343205787016E+00 - 0.360598501964E+00 0.378547190403E+00 0.397030973061E+00 0.416023667596E+00 0.435493481275E+00 - 0.455402750406E+00 0.475707738325E+00 0.496358503092E+00 0.517298844394E+00 0.538466336048E+00 - 0.559792445588E+00 0.581202735249E+00 0.602617128756E+00 0.623950215269E+00 0.645111545175E+00 - 0.666005852012E+00 0.686533110574E+00 0.706588313742E+00 0.726060820598E+00 0.744833097986E+00 - 0.762778649522E+00 0.779758904490E+00 0.795618829863E+00 0.810181039602E+00 0.823238215978E+00 - 0.834543739524E+00 0.843795380124E+00 0.850759109567E+00 0.855372161004E+00 0.857616014165E+00 - 0.857488659294E+00 0.855004671928E+00 0.850195047582E+00 0.843106865393E+00 0.833802777701E+00 - 0.822360362211E+00 0.808871363829E+00 0.793440811751E+00 0.776186049690E+00 0.757235651501E+00 - 0.736728220047E+00 0.714811061352E+00 0.691638711026E+00 0.667371314245E+00 0.642172855225E+00 - 0.616209261527E+00 0.589646422683E+00 0.562648185013E+00 0.535374398390E+00 0.507979097643E+00 - 0.480608903449E+00 0.453401664511E+00 0.426485488588E+00 0.399978037834E+00 0.373986187145E+00 - 0.348605971935E+00 - ae wavefunction - -0.227640005255E-06 -0.241553109009E-06 -0.256238555862E-06 -0.271743807437E-06 -0.288119059293E-06 - -0.305417409476E-06 -0.323695040919E-06 -0.343011420299E-06 -0.363429495424E-06 -0.385015922933E-06 - -0.407841293332E-06 -0.431980383418E-06 -0.457512411824E-06 -0.484521323890E-06 -0.513096081958E-06 - -0.543330981917E-06 -0.575325988290E-06 -0.609187085051E-06 -0.645026656992E-06 -0.682963888178E-06 - -0.723125189070E-06 -0.765644650027E-06 -0.810664522779E-06 -0.858335733716E-06 -0.908818428675E-06 - -0.962282552862E-06 -0.101890846811E-05 -0.107888760881E-05 -0.114242318028E-05 -0.120973090157E-05 - -0.128103979581E-05 -0.135659303138E-05 -0.143664881687E-05 -0.152148135361E-05 -0.161138184934E-05 - -0.170665959719E-05 -0.180764312397E-05 -0.191468141270E-05 -0.202814520350E-05 -0.214842837891E-05 - -0.227594943811E-05 -0.241115306706E-05 -0.255451180887E-05 -0.270652784384E-05 -0.286773488278E-05 - -0.303870018477E-05 -0.322002670283E-05 -0.341235537132E-05 -0.361636753939E-05 -0.383278756495E-05 - -0.406238557063E-05 -0.430598038508E-05 -0.456444267121E-05 -0.483869825746E-05 -0.512973168541E-05 - -0.543858998763E-05 -0.576638670788E-05 -0.611430618730E-05 -0.648360812039E-05 -0.687563241512E-05 - -0.729180435834E-05 -0.773364012362E-05 -0.820275263428E-05 -0.870085779960E-05 -0.922978116481E-05 - -0.979146498304E-05 -0.103879757491E-04 -0.110215122190E-04 -0.116944139499E-04 -0.124091703881E-04 - -0.131684305501E-04 -0.139750133231E-04 -0.148319184326E-04 -0.157423381229E-04 -0.167096695752E-04 - -0.177375281589E-04 -0.188297614847E-04 -0.199904644287E-04 -0.212239950522E-04 -0.225349916140E-04 - -0.239283906270E-04 -0.254094460867E-04 -0.269837499631E-04 -0.286572539548E-04 -0.304362926902E-04 - -0.323276083849E-04 -0.343383770722E-04 -0.364762365488E-04 -0.387493160542E-04 -0.411662678874E-04 - -0.437363010297E-04 -0.464692168819E-04 -0.493754473295E-04 -0.524660951748E-04 -0.557529771750E-04 - -0.592486697906E-04 -0.629665578455E-04 -0.669208862560E-04 -0.711268150389E-04 -0.756004777882E-04 - -0.803590438379E-04 -0.854207843420E-04 -0.908051425042E-04 -0.965328082167E-04 -0.102625797380E-03 - -0.109107536177E-03 -0.116002950618E-03 -0.123338561665E-03 -0.131142586270E-03 -0.139445044700E-03 - -0.148277874493E-03 -0.157675051496E-03 -0.167672718328E-03 -0.178309320794E-03 -0.189625752649E-03 - -0.201665509253E-03 -0.214474850611E-03 -0.228102974334E-03 -0.242602199160E-03 -0.258028159541E-03 - -0.274440012047E-03 -0.291900654171E-03 -0.310476956278E-03 -0.330240007458E-03 -0.351265376027E-03 - -0.373633385506E-03 -0.397429406962E-03 -0.422744168568E-03 -0.449674083345E-03 -0.478321596087E-03 - -0.508795550462E-03 -0.541211577400E-03 -0.575692505860E-03 -0.612368797176E-03 -0.651379004183E-03 - -0.692870256384E-03 -0.736998772502E-03 -0.783930401758E-03 -0.833841195310E-03 -0.886918009300E-03 - -0.943359141058E-03 -0.100337499998E-02 -0.106718881472E-02 -0.113503737838E-02 -0.120717183327E-02 - -0.128385849716E-02 -0.136537973262E-02 -0.145203486135E-02 -0.154414112528E-02 -0.164203469631E-02 - -0.174607173654E-02 -0.185662951080E-02 -0.197410755347E-02 -0.209892889124E-02 -0.223154132379E-02 - -0.237241876400E-02 -0.252206263958E-02 -0.268100335757E-02 -0.284980183333E-02 -0.302905108546E-02 - -0.321937789790E-02 -0.342144455020E-02 -0.363595061718E-02 -0.386363483818E-02 -0.410527705682E-02 - -0.436170023094E-02 -0.463377251275E-02 -0.492240939836E-02 -0.522857594571E-02 -0.555328905920E-02 - -0.589761983893E-02 -0.626269599168E-02 -0.664970430008E-02 -0.705989314585E-02 -0.749457508176E-02 - -0.795512944634E-02 -0.844300501417E-02 -0.895972267341E-02 -0.950687812113E-02 -0.100861445655E-01 - -0.106992754225E-01 -0.113481069932E-01 -0.120345611055E-01 -0.127606477039E-01 -0.135284673660E-01 - -0.143402137256E-01 -0.151981757772E-01 -0.161047400361E-01 -0.170623925242E-01 -0.180737205506E-01 - -0.191414142506E-01 -0.202682678463E-01 -0.214571805872E-01 -0.227111573254E-01 -0.240333086777E-01 - -0.254268507220E-01 -0.268951041730E-01 -0.284414929755E-01 -0.300695422528E-01 -0.317828755418E-01 - -0.335852112415E-01 -0.354803581988E-01 -0.374722103520E-01 -0.395647403441E-01 -0.417619920209E-01 - -0.440680717173E-01 -0.464871382391E-01 -0.490233914373E-01 -0.516810592766E-01 -0.544643832889E-01 - -0.573776023104E-01 -0.604249343909E-01 -0.636105567713E-01 -0.669385838208E-01 -0.704130428314E-01 - -0.740378475674E-01 -0.778167694752E-01 -0.817534064637E-01 -0.858511491736E-01 -0.901131446652E-01 - -0.945422574669E-01 -0.991410279388E-01 -0.103911627924E+00 -0.108855813683E+00 -0.113974876119E+00 - -0.119269588339E+00 -0.124740150612E+00 -0.130386132824E+00 -0.136206414546E+00 -0.142199122910E+00 - -0.148361568461E+00 -0.154690179275E+00 -0.161180433629E+00 -0.167826791604E+00 -0.174622626074E+00 - -0.181560153598E+00 -0.188630365898E+00 -0.195822962666E+00 -0.203126286646E+00 -0.210527262067E+00 - -0.218011337617E+00 -0.225562435281E+00 -0.233162906153E+00 -0.240793494317E+00 -0.248433308678E+00 - -0.256059802119E+00 -0.263648755337E+00 -0.271174261340E+00 -0.278608705431E+00 -0.285922735843E+00 - -0.293085222680E+00 -0.300063207642E+00 -0.306821853310E+00 -0.313324406907E+00 -0.319532197048E+00 - -0.325404681082E+00 -0.330899553728E+00 -0.335972916269E+00 -0.340579493605E+00 -0.344672879916E+00 - -0.348205795435E+00 -0.351130344647E+00 -0.353398274582E+00 -0.354961236968E+00 -0.355771059088E+00 - -0.355780026627E+00 -0.354941178528E+00 -0.353208612936E+00 -0.350537800929E+00 -0.346885905093E+00 - -0.342212099803E+00 -0.336477890709E+00 -0.329647431117E+00 -0.321687833920E+00 -0.312569477680E+00 - -0.302266305867E+00 -0.290756118642E+00 -0.278020856318E+00 -0.264046873976E+00 -0.248825206279E+00 - -0.232351821598E+00 -0.214627864069E+00 -0.195659881552E+00 -0.175460037164E+00 -0.154046301204E+00 - -0.131442619230E+00 -0.107679051851E+00 -0.827918807912E-01 -0.568236757344E-01 -0.298233169267E-01 - -0.184596946076E-02 0.270469925154E-01 0.567881103967E-01 0.873040093439E-01 0.118515601298E+00 - 0.150338311437E+00 0.182682317934E+00 0.215452801690E+00 0.248550217585E+00 0.281870625756E+00 - 0.315306159094E+00 0.348745757632E+00 0.382076358511E+00 0.415184751019E+00 0.447960169991E+00 - 0.480297184335E+00 0.512097402331E+00 0.543267514780E+00 0.573711997895E+00 0.603322786216E+00 - 0.631972550728E+00 0.659516794793E+00 0.685802869564E+00 0.710679507526E+00 0.734002706130E+00 - 0.755638016764E+00 0.775461068324E+00 0.793357768618E+00 0.809224794004E+00 0.822970440992E+00 - 0.834515701559E+00 0.843795380124E+00 0.850759109567E+00 0.855372161004E+00 0.857616014165E+00 - 0.857488659294E+00 0.855004671928E+00 0.850195047582E+00 0.843106865393E+00 0.833802777701E+00 - 0.822360362211E+00 0.808871363829E+00 0.793440811751E+00 0.776186049690E+00 0.757235651501E+00 - 0.736728220047E+00 0.714811061352E+00 0.691638711026E+00 0.667371314245E+00 0.642172855225E+00 - 0.616209261527E+00 0.589646422683E+00 0.562648185013E+00 0.535374398390E+00 0.507979097643E+00 - 0.480608903449E+00 0.453401664511E+00 0.426485488588E+00 0.399978037834E+00 0.373986187145E+00 - 0.348605971935E+00 - pseudo wavefunction - 0.571859011433E-08 0.609654545181E-08 0.649948076408E-08 0.692904703757E-08 0.738700437639E-08 - 0.787522921411E-08 0.839572200233E-08 0.895061540728E-08 0.954218304822E-08 0.101728488133E-07 - 0.108451967914E-07 0.115619818599E-07 0.123261409726E-07 0.131408051936E-07 0.140093125268E-07 - 0.149352215925E-07 0.159223262088E-07 0.169746709363E-07 0.180965676505E-07 0.192926132088E-07 - 0.205677082861E-07 0.219270774547E-07 0.233762905912E-07 0.249212856987E-07 0.265683932374E-07 - 0.283243620625E-07 0.301963870773E-07 0.321921387136E-07 0.343197943601E-07 0.365880718690E-07 - 0.390062652761E-07 0.415842828822E-07 0.443326878514E-07 0.472627414928E-07 0.503864494020E-07 - 0.537166106534E-07 0.572668702427E-07 0.610517749960E-07 0.650868331739E-07 0.693885780150E-07 - 0.739746354790E-07 0.788637964676E-07 0.840760938177E-07 0.896328843845E-07 0.955569365484E-07 - 0.101872523507E-06 0.108605522730E-06 0.115783521992E-06 0.123435932409E-06 0.131594108947E-06 - 0.140291478898E-06 0.149563678840E-06 0.159448700661E-06 0.169987047220E-06 0.181221898307E-06 - 0.193199287567E-06 0.205968291118E-06 0.219581228634E-06 0.234093877719E-06 0.249565702454E-06 - 0.266060097037E-06 0.283644645541E-06 0.302391398829E-06 0.322377169775E-06 0.343683847994E-06 - 0.366398735382E-06 0.390614903817E-06 0.416431576518E-06 0.443954534597E-06 0.473296550488E-06 - 0.504577850014E-06 0.537926605003E-06 0.573479458457E-06 0.611382084429E-06 0.651789784903E-06 - 0.694868126132E-06 0.740793617018E-06 0.789754432343E-06 0.841951183784E-06 0.897597741903E-06 - 0.956922112447E-06 0.102016737058E-05 0.108759265684E-05 0.115947423894E-05 0.123610664376E-05 - 0.131780386409E-05 0.140490064518E-05 0.149775385636E-05 0.159674395320E-05 0.170227653640E-05 - 0.181478401368E-05 0.193472737149E-05 0.206259806386E-05 0.219892002601E-05 0.234425182114E-05 - 0.249918892902E-05 0.266436618586E-05 0.284046038547E-05 0.302819305228E-05 0.322833339765E-05 - 0.344170147158E-05 0.366917152271E-05 0.391167558034E-05 0.417020727329E-05 0.444582590101E-05 - 0.473966077387E-05 0.505291584021E-05 0.538687461930E-05 0.574290546014E-05 0.612246714800E-05 - 0.652711488135E-05 0.695850664388E-05 0.741840999759E-05 0.790870932483E-05 0.843141354897E-05 - 0.898866436529E-05 0.958274501585E-05 0.102160896442E-04 0.108912932684E-04 0.116111224130E-04 - 0.123785264438E-04 0.131966496516E-04 0.140688441343E-04 0.149986835308E-04 0.159899776617E-04 - 0.170467881383E-04 0.181734450030E-04 0.193745644683E-04 0.206550678297E-04 0.220202016265E-04 - 0.234755591366E-04 0.250271032906E-04 0.266811910997E-04 0.284445996990E-04 0.303245541103E-04 - 0.323287568402E-04 0.344654194334E-04 0.367432961109E-04 0.391717196309E-04 0.417606395186E-04 - 0.445206628220E-04 0.474630975606E-04 0.505999990437E-04 0.539442192495E-04 0.575094594655E-04 - 0.613103264068E-04 0.653623920412E-04 0.696822573653E-04 0.742876203945E-04 0.791973486423E-04 - 0.844315563875E-04 0.900116870435E-04 0.959606009681E-04 0.102302669071E-03 0.109063872604E-03 - 0.116271909536E-03 0.123956307960E-03 0.132148546974E-03 0.140882185556E-03 0.150192999936E-03 - 0.160119130038E-03 0.170701235589E-03 0.181982662526E-03 0.194009620390E-03 0.206831371412E-03 - 0.220500432088E-03 0.235072788041E-03 0.250608123054E-03 0.267170063210E-03 0.284826437132E-03 - 0.303649553366E-03 0.323716496065E-03 0.345109440149E-03 0.367915987228E-03 0.392229523661E-03 - 0.418149602194E-03 0.445782348728E-03 0.475240895864E-03 0.506645844977E-03 0.540125758697E-03 - 0.575817685783E-03 0.613867720498E-03 0.654431598766E-03 0.697675333489E-03 0.743775891598E-03 - 0.792921915550E-03 0.845314492176E-03 0.901167971957E-03 0.960710842010E-03 0.102418665628E-02 - 0.109185502664E-02 0.116399267887E-02 0.124089457767E-02 0.132287512520E-02 0.141026943799E-02 - 0.150343470699E-02 0.160275164648E-02 0.170862603724E-02 0.182149037022E-02 0.194180559698E-02 - 0.207006299390E-02 0.220678614720E-02 0.235253306661E-02 0.250789843574E-02 0.267351600781E-02 - 0.285006115589E-02 0.303825358734E-02 0.323886023271E-02 0.345269831994E-02 0.368063864538E-02 - 0.392360905372E-02 0.418259813975E-02 0.445865918532E-02 0.475291434595E-02 0.506655910210E-02 - 0.540086699085E-02 0.575719463481E-02 0.613698708574E-02 0.654178350122E-02 0.697322317377E-02 - 0.743305193259E-02 0.792312893904E-02 0.844543389789E-02 0.900207470735E-02 0.959529557187E-02 - 0.102274856023E-01 0.109011879290E-01 0.116191093550E-01 0.123841305757E-01 0.131993169929E-01 - 0.140679301526E-01 0.149934398347E-01 0.159795368236E-01 0.170301463902E-01 0.181494425124E-01 - 0.193418628649E-01 0.206121246052E-01 0.219652409824E-01 0.234065387949E-01 0.249416767187E-01 - 0.265766645285E-01 0.283178832261E-01 0.301721060910E-01 0.321465206585E-01 0.342487516267E-01 - 0.364868846862E-01 0.388694912556E-01 0.414056540969E-01 0.441049937706E-01 0.469776958777E-01 - 0.500345390167E-01 0.532869233644E-01 0.567468997676E-01 0.604271992062E-01 0.643412624556E-01 - 0.685032697477E-01 0.729281701846E-01 0.776317106202E-01 0.826304636723E-01 0.879418544734E-01 - 0.935841857035E-01 0.995766603828E-01 0.105939401817E+00 0.112693470009E+00 0.119860873746E+00 - 0.127464577480E+00 0.135528501980E+00 0.144077517640E+00 0.153137429157E+00 0.162734950176E+00 - 0.172897666316E+00 0.183653984845E+00 0.195033069077E+00 0.207064755401E+00 0.219779450647E+00 - 0.233208007313E+00 0.247381573997E+00 0.262331418175E+00 0.278088718331E+00 0.294684322281E+00 - 0.312148468415E+00 0.330510466534E+00 0.349798334922E+00 0.370038390351E+00 0.391254787886E+00 - 0.413469007585E+00 0.436699285593E+00 0.460959987670E+00 0.486260923917E+00 0.512606604396E+00 - 0.539995436506E+00 0.568418866379E+00 0.597860468269E+00 0.628294987815E+00 0.659687347350E+00 - 0.691991623811E+00 0.725150012533E+00 0.759091792928E+00 0.793732314786E+00 0.828972026523E+00 - 0.864695568746E+00 0.900770957920E+00 0.937048885087E+00 0.973362153233E+00 0.100952527329E+01 - 0.104533423238E+01 0.108056643801E+01 0.111498082794E+01 0.114831811634E+01 0.118030112315E+01 - 0.121063510361E+01 0.123900796074E+01 0.126509018530E+01 0.128853432805E+01 0.130897377168E+01 - 0.132602054064E+01 0.133926187406E+01 0.134825530053E+01 0.135252200835E+01 0.135153841669E+01 - 0.134472604132E+01 0.133144140608E+01 0.131113985918E+01 0.128359157702E+01 0.124863807676E+01 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 - ae wavefunction - -0.419591673479E-06 -0.445236660954E-06 -0.472305250687E-06 -0.500884925173E-06 -0.531068206171E-06 - -0.562952965377E-06 -0.596642760627E-06 -0.632247202450E-06 -0.669882317876E-06 -0.709670970157E-06 - -0.751743273549E-06 -0.796237058589E-06 -0.843298343123E-06 -0.893081857389E-06 -0.945751579095E-06 - -0.100148131688E-05 -0.106045532797E-05 -0.112286896479E-05 -0.118892937793E-05 -0.125885625057E-05 - -0.133288258579E-05 -0.141125554245E-05 -0.149423732267E-05 -0.158210611794E-05 -0.167515711327E-05 - -0.177370355614E-05 -0.187807789421E-05 -0.198863298444E-05 -0.210574338018E-05 -0.222980670049E-05 - -0.236124508686E-05 -0.250050675369E-05 -0.264806763788E-05 -0.280443315455E-05 -0.297014006557E-05 - -0.314575846823E-05 -0.333189391186E-05 -0.352918965126E-05 -0.373832904445E-05 -0.396003810621E-05 - -0.419508822539E-05 -0.444429905901E-05 -0.470854161112E-05 -0.498874151386E-05 -0.528588251725E-05 - -0.560101020839E-05 -0.593523596640E-05 -0.628974117866E-05 -0.666578172614E-05 -0.706469276477E-05 - -0.748789380520E-05 -0.793689413439E-05 -0.841329858154E-05 -0.891881365848E-05 -0.945525409868E-05 - -0.100245498207E-04 -0.106287533383E-04 -0.112700476609E-04 -0.119507546913E-04 -0.126733441838E-04 - -0.134404432655E-04 -0.142548465883E-04 -0.151195271357E-04 -0.160376477180E-04 -0.170125732291E-04 - -0.180478836822E-04 -0.191473880961E-04 -0.203151392770E-04 -0.215554495594E-04 -0.228729075576E-04 - -0.242723960099E-04 -0.257591107648E-04 -0.273385809967E-04 -0.290166907359E-04 -0.307997017578E-04 - -0.326942780077E-04 -0.347075115045E-04 -0.368469500336E-04 -0.391206264891E-04 -0.415370902338E-04 - -0.441054403792E-04 -0.468353612296E-04 -0.497371600521E-04 -0.528218071755E-04 -0.561009787541E-04 - -0.595871022176E-04 -0.632934046196E-04 -0.672339641473E-04 -0.714237648284E-04 -0.758787548062E-04 - -0.806159083152E-04 -0.856532915520E-04 -0.910101328385E-04 -0.967068971463E-04 -0.102765365426E-03 - -0.109208718933E-03 -0.116061628915E-03 -0.123350351965E-03 -0.131102831408E-03 -0.139348805092E-03 - -0.148119919962E-03 -0.157449853863E-03 -0.167374444991E-03 -0.177931829462E-03 -0.189162587521E-03 - -0.201109898875E-03 -0.213819707747E-03 -0.227340898203E-03 -0.241725480395E-03 -0.257028788379E-03 - -0.273309690165E-03 -0.290630810807E-03 -0.309058769194E-03 -0.328664429493E-03 -0.349523167966E-03 - -0.371715156200E-03 -0.395325661615E-03 -0.420445366275E-03 -0.447170705143E-03 -0.475604224753E-03 - -0.505854963647E-03 -0.538038855679E-03 -0.572279157541E-03 -0.608706901916E-03 -0.647461377632E-03 - -0.688690638341E-03 -0.732552041357E-03 -0.779212818233E-03 -0.828850678842E-03 -0.881654450829E-03 - -0.937824756232E-03 -0.997574727349E-03 -0.106113076385E-02 -0.112873333333E-02 -0.120063781758E-02 - -0.127711540679E-02 -0.135845404425E-02 -0.144495942405E-02 -0.153695604425E-02 -0.163478831840E-02 - -0.173882174815E-02 -0.184944415970E-02 -0.196706700731E-02 -0.209212674663E-02 -0.222508628119E-02 - -0.236643648517E-02 -0.251669780565E-02 -0.267642194774E-02 -0.284619364598E-02 -0.302663252522E-02 - -0.321839505467E-02 -0.342217659827E-02 -0.363871356504E-02 -0.386878566260E-02 -0.411321825733E-02 - -0.437288484423E-02 -0.464870962994E-02 -0.494167023156E-02 -0.525280049427E-02 -0.558319343043E-02 - -0.593400428227E-02 -0.630645371041E-02 -0.670183110977E-02 -0.712149805405E-02 -0.756689186960E-02 - -0.803952933881E-02 -0.854101053252E-02 -0.907302277019E-02 -0.963734470585E-02 -0.102358505368E-01 - -0.108705143308E-01 -0.115434144674E-01 -0.122567381851E-01 -0.130127862287E-01 -0.138139775855E-01 - -0.146628542996E-01 -0.155620863515E-01 -0.165144765871E-01 -0.175229656786E-01 -0.185906370974E-01 - -0.197207220752E-01 -0.209166045292E-01 -0.221818259204E-01 -0.235200900133E-01 -0.249352675010E-01 - -0.264314004551E-01 -0.280127065554E-01 -0.296835830510E-01 -0.314486103986E-01 -0.333125555181E-01 - -0.352803746019E-01 -0.373572154063E-01 -0.395484189494E-01 -0.418595205316E-01 -0.442962499902E-01 - -0.468645310902E-01 -0.495704799483E-01 -0.524204023797E-01 -0.554207900464E-01 -0.585783152843E-01 - -0.618998244709E-01 -0.653923297941E-01 -0.690629992720E-01 -0.729191448635E-01 -0.769682085087E-01 - -0.812177459231E-01 -0.856754079688E-01 -0.903489194169E-01 -0.952460549124E-01 -0.100374611944E+00 - -0.105742380623E+00 -0.111357110073E+00 -0.117226471226E+00 -0.123358015834E+00 -0.129759131487E+00 - -0.136436992474E+00 -0.143398506273E+00 -0.150650255536E+00 -0.158198435396E+00 -0.166048785958E+00 - -0.174206519886E+00 -0.182676244971E+00 -0.191461881646E+00 -0.200566575426E+00 -0.209992604279E+00 - -0.219741281025E+00 -0.229812850838E+00 -0.240206384069E+00 -0.250919664576E+00 -0.261949073908E+00 - -0.273289471686E+00 -0.284934072667E+00 -0.296874321046E+00 -0.309099762684E+00 -0.321597916090E+00 - -0.334354143130E+00 -0.347351520683E+00 -0.360570714663E+00 -0.373989858114E+00 -0.387584435372E+00 - -0.401327174519E+00 -0.415187950525E+00 -0.429133701186E+00 -0.443128357849E+00 -0.457132790725E+00 - -0.471104767691E+00 -0.484998921703E+00 -0.498766719483E+00 -0.512356422012E+00 -0.525713027989E+00 - -0.538778196066E+00 -0.551490150480E+00 -0.563783586393E+00 -0.575589602443E+00 -0.586835694684E+00 - -0.597445844316E+00 -0.607340718942E+00 -0.616437986018E+00 -0.624652715226E+00 -0.631897834510E+00 - -0.638084607775E+00 -0.643123116697E+00 -0.646922744393E+00 -0.649392668142E+00 -0.650442370237E+00 - -0.649982173269E+00 -0.647923800099E+00 -0.644180957099E+00 -0.638669934919E+00 -0.631310221677E+00 - -0.622025123195E+00 -0.610742386067E+00 -0.597394819740E+00 -0.581920915553E+00 -0.564265460645E+00 - -0.544380145344E+00 -0.522224163384E+00 -0.497764803837E+00 -0.470978034224E+00 -0.441849073512E+00 - -0.410372953728E+00 -0.376555068042E+00 -0.340411701856E+00 -0.301970542890E+00 -0.261271164549E+00 - -0.218365474934E+00 -0.173318123362E+00 -0.126206854463E+00 -0.771227997739E-01 -0.261706977118E-01 - 0.265309653866E-01 0.808498960908E-01 0.136640013874E+00 0.193741540297E+00 0.251981141124E+00 - 0.311172100787E+00 0.371114512072E+00 0.431595477829E+00 0.492389350851E+00 0.553258089799E+00 - 0.613951880087E+00 0.674210269543E+00 0.733764172796E+00 0.792339126527E+00 0.849659904580E+00 - 0.905455616556E+00 0.959462488428E+00 0.101141974424E+01 0.106105567211E+01 0.110806847980E+01 - 0.115211437455E+01 0.119281223958E+01 0.122976095463E+01 0.126255737984E+01 0.129080748835E+01 - 0.131413097418E+01 0.133216280306E+01 0.134455435589E+01 0.135097524786E+01 0.135111592592E+01 - 0.134469077582E+01 0.133144140608E+01 0.131113985918E+01 0.128359157702E+01 0.124863807676E+01 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 - 0.000000000000E+00 - End of Dataset diff --git a/public/it4i/software/chemistry/files-phono3py/gofree-cond1.sh b/public/it4i/software/chemistry/files-phono3py/gofree-cond1.sh deleted file mode 100644 index 8dbf6d276685a7f2275a97e568bc18014c1a31c8..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/gofree-cond1.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#PBS -A OPEN-6-23 -#PBS -N Si-test1 -#PBS -q qfree -#PBS -l select=1:ncpus=24:mpiprocs=24:ompthreads=1 -#PBS -l walltime=01:59:59 -##PBS-l mem=6gb -#PBS -j oe -#PBS -S /bin/bash -module purge -module load phono3py/0.9.14-ictce-7.3.5-Python-2.7.9 -export OMP_NUM_THREADS=1 -export I_MPI_COMPATIBILITY=4 -##export OMP_STACKSIZE=10gb -##0 1 2 3 4 10 11 12 13 20 21 22 30 31 40 91 92 93 94 101 102 103 111 112 121 182 183 184 192 193 202 273 274 283 364 -cd $PBS_O_WORKDIR -phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="0 1 3 4 10" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="11 12 13 20 21" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="21 22 30 31 40" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="91 92 93 94 101" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="102 103 111 112 121" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="182 183 184 192 193" -#phono3py --fc3 --fc2 --dim="2 2 2" --mesh="9 9 9" -c POSCAR --sigma 0.1 --br --write_gamma --gp="202 273 274 283 364" diff --git a/public/it4i/software/chemistry/files-phono3py/prepare.sh b/public/it4i/software/chemistry/files-phono3py/prepare.sh deleted file mode 100644 index a057dbbadd94d0298e7a4ba19244cb753bea7a9f..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/prepare.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -P=`pwd` - -# number of displacements -poc=9 - - for i in `seq 1 $poc `; - do - cd $P - mkdir disp-0000"$i" - cd disp-0000"$i" - cp ../KPOINTS . - cp ../INCAR . - cp ../POTCAR . - cp ../POSCAR-0000"$i" POSCAR - echo $i - done - -poc=99 - - for i in `seq 10 $poc `; - do - cd $P - mkdir disp-000"$i" - cd disp-000"$i" - cp ../KPOINTS . - cp ../INCAR . - cp ../POTCAR . - cp ../POSCAR-000"$i" POSCAR - echo $i - done -poc=111 - - for i in `seq 100 $poc `; - do - cd $P - mkdir disp-00"$i" - cd disp-00"$i" - cp ../KPOINTS . - cp ../INCAR . - cp ../POTCAR . - cp ../POSCAR-00"$i" POSCAR - echo $i - done diff --git a/public/it4i/software/chemistry/files-phono3py/run.sh b/public/it4i/software/chemistry/files-phono3py/run.sh deleted file mode 100644 index 63faf63ba41f0f6846c8b59030a64ae9c1415a55..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/run.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -#PBS -A IT4I-9-11 -#PBS -N Si-test -#PBS -q qprod -#PBS -l select=8:ncpus=16:mpiprocs=16:ompthreads=1 -#PBS -l walltime=23:59:59 -##PBS-l mem=6gb -#PBS -j oe -#PBS -S /bin/bash -module load impi/4.1.1.036 intel/13.5.192 fftw3-mpi/3.3.3-icc -export OMP_NUM_THREADS=1 -export I_MPI_COMPATIBILITY=4 -##export OMP_STACKSIZE=10gb -b=`basename $PBS_O_WORKDIR` -echo $b >log.vasp -SCRDIR=/scratch/$USER/$b -mkdir -p $SCRDIR -cd $SCRDIR || exit - -# copy input file to scratch -cp $PBS_O_WORKDIR/* . - -mpirun ~/bin/vasp5.4.1 > log.exc - -# copy output file to home -cp * $PBS_O_WORKDIR/. && cd .. - -rm -rf "$SCRDIR" - -#exit -exit diff --git a/public/it4i/software/chemistry/files-phono3py/submit.sh b/public/it4i/software/chemistry/files-phono3py/submit.sh deleted file mode 100644 index 12fa02ecc489a10df486cfd2fc55065c02d4eea4..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phono3py/submit.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -P=`pwd` - -# number of displacements -poc=9 - - for i in `seq 1 $poc `; - do - cd $P - cd disp-0000"$i" - cp ../run.sh . - qsub run.sh - echo $i - done - -poc=99 - - for i in `seq 10 $poc `; - do - cd $P - cd disp-000"$i" - cp ../run.sh . - qsub run.sh - echo $i - done -poc=111 - - for i in `seq 100 $poc `; - do - cd $P - cd disp-00"$i" - cp ../run.sh . - qsub run.sh - echo $i - done diff --git a/public/it4i/software/chemistry/files-phonopy/INCAR.txt b/public/it4i/software/chemistry/files-phonopy/INCAR.txt deleted file mode 100644 index 03a9c7a37710f56364693bcd4260356787b2dc73..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phonopy/INCAR.txt +++ /dev/null @@ -1,16 +0,0 @@ -# General Setup -SYSTEM = Aluminum # Calculation Title -PREC = Accurate # Options: Low, Medium, High, Normal, accurate -ENCUT = 350 # Kinetic Energy Cutoff in eV - -# Electronic Relaxation -NELMIN = 5 # Min Number of ESC steps -EDIFF = 1E-8 # Global Break Condition for the Elec SC-loop -LREAL = .FALSE. # Real Space Projection -ADDGRID = .TRUE. # Improve the Grid Accuracy - -# Ionic Relaxation - we need to calculate one displacement -SIGMA = 0.1 # Insulators/semiconductors=0.1 metals=0.05 -ISMEAR = 1 -IBRION = -1 - diff --git a/public/it4i/software/chemistry/files-phonopy/KPOINTS.txt b/public/it4i/software/chemistry/files-phonopy/KPOINTS.txt deleted file mode 100644 index b56ceb877ef74965aedbb9bdcffcb06057da7d58..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phonopy/KPOINTS.txt +++ /dev/null @@ -1,4 +0,0 @@ -Auto corresponding to 8 8 8 -0 -Auto -35 diff --git a/public/it4i/software/chemistry/files-phonopy/POSCAR.txt b/public/it4i/software/chemistry/files-phonopy/POSCAR.txt deleted file mode 100644 index 41a59b6536fefb03f70bb9b3d2b44656094f7c12..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phonopy/POSCAR.txt +++ /dev/null @@ -1,12 +0,0 @@ -Al4 - 1.00000000000000 - 4.0432254711710000 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 4.0432254711710000 0.0000000000000000 - 0.0000000000000000 0.0000000000000000 4.0432254711710000 - Al - 4 -Direct - 0.0000000000000000 0.0000000000000000 0.0000000000000000 - 0.0000000000000000 0.5000000000000000 0.5000000000000000 - 0.5000000000000000 0.0000000000000000 0.5000000000000000 - 0.5000000000000000 0.5000000000000000 0.0000000000000000 diff --git a/public/it4i/software/chemistry/files-phonopy/mesh.conf b/public/it4i/software/chemistry/files-phonopy/mesh.conf deleted file mode 100644 index 34bf660fd8af1d6b0b3288442c02533c34aa7f12..0000000000000000000000000000000000000000 --- a/public/it4i/software/chemistry/files-phonopy/mesh.conf +++ /dev/null @@ -1,5 +0,0 @@ -ATOM_NAME = Al -DIM = 2 2 2 -MESH = 12 12 12 -DISPLACEMENT_DISTANCE = 0.01 -PRIMITIVE_AXES = Auto diff --git a/public/it4i/software/data-science/imgs/dask-arch.svg b/public/it4i/software/data-science/imgs/dask-arch.svg deleted file mode 100644 index dc8e36cc125782b4fed453060f1af67317e9b103..0000000000000000000000000000000000000000 --- a/public/it4i/software/data-science/imgs/dask-arch.svg +++ /dev/null @@ -1,920 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="/home/spirali/tmp/arch.png" - sodipodi:docname="arch1.svg" - inkscape:version="1.0.2 (1.0.2+r75+1)" - id="svg8" - version="1.1" - viewBox="0 0 234.37095 116.09758" - height="116.09756mm" - width="234.37096mm"> - <defs - id="defs2"> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="marker8919" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path8917" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Lstart" - orient="auto" - refY="0" - refX="0" - id="marker8909" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path8907" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(1.1,0,0,1.1,1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker8197" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path8195" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker8187" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path8185" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker7243" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path7241" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker7233" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path7231" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker5579" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path5577" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker5569" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path5567" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker5221" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path5219" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker5211" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path5209" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="marker4895" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path4893" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lstart" - orient="auto" - refY="0" - refX="0" - id="marker4885" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path4883" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(1.1,0,0,1.1,1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker4505" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path4503" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker4495" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path4493" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="marker4375" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path4373" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lstart" - orient="auto" - refY="0" - refX="0" - id="marker4365" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path4363" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(1.1,0,0,1.1,1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:collect="always" - inkscape:isstock="true" - style="overflow:visible" - id="marker3649" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path3647" /> - </marker> - <marker - inkscape:collect="always" - inkscape:isstock="true" - style="overflow:visible" - id="marker3639" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path3637" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="marker3323" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path3321" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:collect="always" - inkscape:stockid="Arrow2Lstart" - orient="auto" - refY="0" - refX="0" - id="marker3313" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path3311" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(1.1,0,0,1.1,1.1,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker1869" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1867" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker1859" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1857" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:collect="always" - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow1Lend" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow1Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - id="path1449" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker1709" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow1Lstart"> - <path - inkscape:connector-curvature="0" - transform="matrix(0.8,0,0,0.8,10,0)" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - id="path1446" /> - </marker> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="marker5201" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path5199" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="marker4135" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path4133" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(0.8,0,0,0.8,10,0)" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker3541" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path3539" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="marker3471" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path3469" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(0.8,0,0,0.8,10,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="marker2271" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path2269" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(0.8,0,0,0.8,10,0)" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="marker2153" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path2151" /> - </marker> - <marker - inkscape:collect="always" - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lend" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lend"> - <path - inkscape:connector-curvature="0" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path880" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9-7" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3-8" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9-7-3" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3-8-6" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9-7-3-3" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3-8-6-2" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9-7-5" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3-8-5" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:isstock="true" - style="overflow:visible" - id="Arrow2Lstart-9-7-3-6" - refX="0" - refY="0" - orient="auto" - inkscape:stockid="Arrow2Lstart"> - <path - transform="matrix(1.1,0,0,1.1,1.1,0)" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - id="path1464-3-8-6-9" - inkscape:connector-curvature="0" /> - </marker> - </defs> - <sodipodi:namedview - inkscape:document-rotation="0" - fit-margin-bottom="2" - fit-margin-right="10" - fit-margin-left="10" - fit-margin-top="2" - inkscape:window-maximized="1" - inkscape:window-y="32" - inkscape:window-x="0" - inkscape:window-height="1131" - inkscape:window-width="1600" - showgrid="false" - inkscape:current-layer="layer1" - inkscape:document-units="mm" - inkscape:cy="346.18045" - inkscape:cx="145.60755" - inkscape:zoom="0.70710678" - inkscape:pageshadow="2" - inkscape:pageopacity="0.0" - borderopacity="1.0" - bordercolor="#666666" - pagecolor="#ffffff" - id="base" /> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - transform="translate(-49.357762,-18.315286)" - id="layer1" - inkscape:groupmode="layer" - inkscape:label="Layer 1"> - <g - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - transform="rotate(-90,98.055536,42.96916)" - id="g1036"> - <rect - rx="4.5357141" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - id="rect815" - width="34.773808" - height="24.568455" - x="4.7662115" - y="-109.93287" - ry="4.5357141" - transform="rotate(90)" /> - <text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - x="11.947762" - y="-94.813812" - id="text819" - transform="rotate(90)"><tspan - sodipodi:role="line" - id="tspan817" - x="11.947762" - y="-94.813812" - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1">Client</tspan></text> - </g> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path857" - d="M 136.8065,43.376049 H 95.424473" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)" /> - <g - transform="rotate(-90,106.55797,34.466718)" - id="g1041"> - <text - id="text843" - y="-95.569778" - x="73.935844" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve" - transform="rotate(90)"><tspan - style="stroke-width:0.264583px" - y="-95.569778" - x="73.935844" - id="tspan841" - sodipodi:role="line">Server</tspan></text> - <rect - rx="4.5357141" - ry="4.5357141" - y="-109.93287" - x="65.620377" - height="24.568459" - width="37.797623" - id="rect920" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - transform="rotate(90)" /> - </g> - <g - id="g3273" - transform="rotate(-90,143.24932,0.81892398)"> - <text - transform="rotate(90)" - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="75.80127" - y="-98.484352" - id="text3269"><tspan - sodipodi:role="line" - id="tspan3267" - x="75.80127" - y="-98.484352" - style="stroke-width:0.264583px">Worker</tspan></text> - <rect - transform="rotate(90)" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - id="rect3271" - width="43.929955" - height="17.480896" - x="65.620377" - y="-109.93287" - ry="4.5357141" - rx="4.5357141" /> - <text - id="text3277" - y="-76.44973" - x="75.80127" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve" - transform="rotate(90)"><tspan - style="stroke-width:0.264583px" - y="-76.44973" - x="75.80127" - id="tspan3275" - sodipodi:role="line">Worker</tspan></text> - <rect - rx="4.5357141" - ry="4.5357141" - y="-87.898247" - x="65.620377" - height="17.480896" - width="43.929955" - id="rect3279" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - transform="rotate(90)" /> - <rect - rx="0" - ry="0" - y="-113.58769" - x="57.881962" - height="46.451172" - width="62.246155" - id="rect3295" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.16103995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - transform="rotate(90)" /> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker3313);marker-end:url(#marker3323)" - d="M 207.3022,43.376049 175.69463,39.148507" - id="path3309" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <g - transform="rotate(-90,169.26264,26.83224)" - id="g3621"> - <text - id="text3609" - y="-98.484352" - x="75.80127" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve" - transform="rotate(90)"><tspan - style="stroke-width:0.264583px" - y="-98.484352" - x="75.80127" - id="tspan3607" - sodipodi:role="line">Worker</tspan></text> - <rect - rx="4.5357141" - ry="4.5357141" - y="-109.93287" - x="65.620377" - height="17.480896" - width="43.929955" - id="rect3611" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - transform="rotate(90)" /> - <text - transform="rotate(90)" - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="75.80127" - y="-76.44973" - id="text3615"><tspan - sodipodi:role="line" - id="tspan3613" - x="75.80127" - y="-76.44973" - style="stroke-width:0.264583px">Worker</tspan></text> - <rect - transform="rotate(90)" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - id="rect3617" - width="43.929955" - height="17.480896" - x="65.620377" - y="-87.898247" - ry="4.5357141" - rx="4.5357141" /> - <rect - transform="rotate(90)" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.16103995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" - id="rect3619" - width="62.246155" - height="46.451172" - x="57.881962" - y="-113.58769" - ry="0" - rx="0" /> - </g> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path3635" - d="M 207.3022,65.549829 175.69463,42.960123" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker3639);marker-end:url(#marker3649)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4365);marker-end:url(#marker4375)" - d="M 207.3022,94.825981 175.69463,47.511548" - id="path3901" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path4491" - d="M 207.3022,117.1646 175.69463,53.755312" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4495);marker-end:url(#marker4505)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4885);marker-end:url(#marker4895)" - d="m 253.55589,65.568192 c 18.19456,-0.990507 34.05618,-18.885798 -0.55595,-23.043826" - id="path4881" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" - id="path5565" - d="M 253.55589,117.68378 C 264.33601,106.90366 275.1499,91.650086 252.99994,69.500126" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5569);marker-end:url(#marker5579)" /> - <g - id="g5961" - transform="rotate(-90,127.91362,60.358087)"> - <text - transform="rotate(90)" - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="133.41148" - y="-162.54834" - id="text5957"><tspan - sodipodi:role="line" - id="tspan5955" - x="133.41148" - y="-162.54834" - style="stroke-width:0.264583px">Computing Node</tspan></text> - </g> - <g - id="g5969" - transform="rotate(-90,104.10113,112.75608)"> - <text - transform="rotate(90)" - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="73.935844" - y="-95.569778" - id="text5965" /> - </g> - <text - id="text5981" - y="133.43214" - x="65.54464" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.40833px;line-height:125%;font-family:Raleway-v4020;-inkscape-font-specification:Raleway-v4020;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve" /> - <text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Raleway;-inkscape-font-specification:'Raleway, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:lining-nums;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" - x="105.69199" - y="41.064568" - id="text1510"><tspan - sodipodi:role="line" - id="tspan1508" - x="105.69199" - y="41.064568" - style="font-size:6.35px;stroke-width:0.264583">TCP/IP</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Raleway;-inkscape-font-specification:'Raleway, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:lining-nums;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" - x="176.5417" - y="36.430691" - id="text1510-5"><tspan - sodipodi:role="line" - id="tspan1508-0" - x="176.5417" - y="36.430691" - style="font-size:6.35px;stroke-width:0.264583">TCP/IP</tspan></text> - <image - width="50.874741" - height="50.874741" - preserveAspectRatio="none" - style="image-rendering:optimizeQuality" - xlink:href="data:image/png;base64,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 " - id="image12799" - x="51.80212" - y="19.917583" /> - </g> -</svg> diff --git a/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.html b/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.html deleted file mode 100644 index ce60070a9ee25a91973a577fd048d88f31d4680e..0000000000000000000000000000000000000000 --- a/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.html +++ /dev/null @@ -1,610 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<title>mympiprog.x - Performance Report</title> -<style type="text/css"> -body { - font-family: "Lucida Grande", "Lucida Sans Unicode", "Bitstream Vera Sans",sans-serif; - font-size: 1em; - color: #2c1a0a; -} -div#content { - width: 900px; - margin-left: auto; - margin-right: auto; -} -.header { - padding-top: 16px; -} -.header_left { - float:left; - width: 532px; -} -.logo { - float: left; -} -.logo img { height: 150px; } -#time_radar { - float: right; -} -#time_radar .legend_CPU { fill: #4fd32e; font-size: 1.5em; } -#time_radar .legend_MPI { fill: #409ded; font-size: 1.5em; } -#time_radar .legend_IO { fill: #ed8140; font-size: 1.5em; } -.clear { - clear: both; -} -table { - border-spacing: 0; -} -td { - padding-left: 0; - padding-right: 16px; - padding-top: 1px; - padding-bottom: 1px; -} -#error { - border: 1px solid; - margin: 16px 0px; - padding: 16px 16px 16px 16px; - color: #C80000; - background-color: #FFC0C0; -} -#error p { - margin: 8px; -} -.application_details { - margin-top: 8px; - margin-left: 16px; - margin-right: 16px; -} -.application_details .details_key { width: 100px; color: #bdc4d5;} -.application_details table { - table-layout: fixed; - width: 100%; - color: #37537b; -} -.application_details #cmdline { - word-wrap: break-word; -} -.application_details #exe_path { - word-wrap: break-word; -} -.summary { -} -hr { - margin-top: 32px; - margin-bottom: 32px; - visibility: hidden; -} -.summary .heading { - font-family: inherit; - font-size: 1.8em; - padding-bottom: 8px; -} -#summary_cpu_class { - font-weight: bold; -} -#summary_mpi_class { - font-weight: bold; -} -#summary_io_class { - font-weight: bold; -} -.overview_general_advice p { - margin-top: 8px; - margin-bottom: 8px; -} -.subsections { - margin-bottom: 32px; -} -.subsections .heading { - font-family: inherit; - font-size: 2em; - padding-bottom: 8px; -} -.subsections .heading_cpu { - padding-bottom: 8px; -} -.subsections .heading_mpi { - padding-bottom: 8px; -} -.subsections .heading_ram { - padding-bottom: 8px; -} -.subsections .heading_io { - padding-bottom: 8px; -} -.subsections .explanation { - font-size: 0.9em; - color: #404040; - padding-top: 8px; -} - -.ltcol, .ctcol { float: left; width: 436px; padding-right: 16px; } -.rtcol { float: right; width: 436px; } - -.heading_cpu { color: #4fd32e; font-size: 1.5em; } -.heading_mpi { color: #409ded; font-size: 1.5em; } -.heading_ram { color: #ed4040; font-size: 1.5em; } -.heading_io { color: #ed8140; font-size: 1.5em; } -.cpu_span { color: #4fd32e; } -.mpi_span { color: #409ded; } -.ram { color: #ed4040; } -.io_span { color: #ed8140; } -.bar_graph { width: 200px; } -#cpu_bar { background-color: #4fd32e; width: 0; height: 2em; } -#mpi_bar { background-color: #409ded; width: 0; height: 2em; } -#io_bar { background-color: #ed8140; width: 0; height: 2em; } -.summary_table { padding-top: 16px; padding-bottom: 8px; } -.summary_table td p { margin: 0px; margin-bottom: 4px; } -.summary_table td { padding-bottom: 8px; } -.summary_table .details { font-size: 0.9em; } -.balanced_span { color: #bb58d6; } -.right_cell { text-align: right; } - -#cpu_chart { padding-top: 8px; } -#cpu_chart td { font-size: 0.9em; padding-bottom: 8px; } -.mini_bar_graph { width: 50px; } -#cpu_num_bar { background-color: #4fd32e; width: 0; height: 1em; } -#cpu_vec_bar { background-color: #3c9f23; width: 0; height: 1em; } -#cpu_mem_bar { background-color: #266516; width: 0; height: 1em; } -#cpu_other_bar { background-color: #808080; width: 0; height: 1em; } -.cpu_num_span { color: #4fd32e; } -.cpu_vec_span { color: #3c9f23; } -.cpu_mem_span { color: #266516; } -.cpu_other_span { color: #808080; } - -#mpi_chart { padding-top: 8px; } -#mpi_chart td { font-size: 0.9em; padding-bottom: 8px; } -#mpi_col_bar { background-color: #409ded; width: 0; height: 1em; } -#mpi_p2p_bar { background-color: #2f73ad; width: 0; height: 1em; } -#mpi_colrate_bar { background-color: #255a87; width: 0; height: 1em; } -#mpi_p2prate_bar { background-color: #1f4a70; width: 0; height: 1em; } -.mpi_col_span { color: #409ded; } -.mpi_p2p_span { color: #2f73ad; } -.mpi_colrate_span { color: #255a87; } -.mpi_p2prate_span { color: #1f4a70; } - -#ram_chart { padding-top: 8px; } -#ram_chart td { font-size: 0.9em; padding-bottom: 8px; } -#ram_mean_bar { background-color: #ed4040; width: 0; height: 1em; } -#ram_peak_bar { background-color: #b53131; width: 0; height: 1em; } -#ram_node_bar { background-color: #742020; width: 0; height: 1em; } -.ram_mean_span { color: #ed4040; } -.ram_peak_span { color: #b53131; } -.ram_node_span { color: #742020; } - -#io_chart { padding-top: 8px; } -#io_chart td { font-size: 0.9em; padding-bottom: 8px; } -#io_read_bar { background-color: #ed8140; width: 0; height: 1em; } -#io_write_bar { background-color: #a95e0b; width: 0; height: 1em; } -#io_readrate_bar { background-color: #9b7c14; width: 0; height: 1em; } -#io_writerate_bar { background-color: #7b6210; width: 0; height: 1em; } -.io_read_span { color: #ed8140; } -.io_write_span { color: #a95e0b; } -.io_readrate_span { color: #9b7c14; } -.io_writerate_span { color: #7b6210; } - -</style> -<script type="text/javascript">d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=la.length;r>e;++e){var u=la[e]+t;if(u in n)return u}}function c(){}function s(){}function l(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function f(){$o.event.preventDefault()}function h(){for(var n,t=$o.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new s,e=0,r=arguments.length;++e<r;)t[arguments[e]]=l(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=$o.event;u.target=n,$o.event=u,t[u.type].apply(e,r)}finally{$o.event=i}}},t}function p(n){return ha(n,ma),n}function v(n){return"function"==typeof n?n:function(){return ga(n,this)}}function d(n){return"function"==typeof n?n:function(){return pa(n,this)}}function m(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=$o.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\s+/g," ")}function x(n){return new RegExp("(?:^|\\s+)"+$o.requote(n)+"(?:\\s+|$)","g")}function M(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\s+/).map(_);var u=n.length;return"function"==typeof t?r:e}function _(n){var t=x(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",y(u+" "+n))):e.setAttribute("class",y(u.replace(t," ")))}}function b(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function w(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function S(n){return"function"==typeof n?n:(n=$o.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function k(n){return{__data__:n}}function E(n){return function(){return da(this,n)}}function A(n){return arguments.length||(n=$o.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function C(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function N(n){return ha(n,xa),n}function L(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function T(){var n=this.__transition__;n&&++n.active}function q(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=s(t,Wo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+$o.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),s=z;a>0&&(n=n.substring(0,a));var l=_a.get(n);return l&&(n=l,s=R),a?t?u:r:t?c:i}function z(n,t){return function(e){var r=$o.event;$o.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{$o.event=r}}}function R(n,t){var e=z(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function D(){var n=".dragsuppress-"+ ++wa,t="click"+n,e=$o.select(Ko).on("touchmove"+n,f).on("dragstart"+n,f).on("selectstart"+n,f);if(ba){var r=Go.style,u=r[ba];r[ba]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),ba&&(r[ba]=u),i&&(e.on(t,function(){f(),o()},!0),setTimeout(o,0))}}function P(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Sa&&(Ko.scrollX||Ko.scrollY)){e=$o.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();Sa=!(u.f||u.e),e.remove()}return Sa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function U(n){return n>0?1:0>n?-1:0}function j(n){return n>1?0:-1>n?ka:Math.acos(n)}function H(n){return n>1?Aa:-1>n?-Aa:Math.asin(n)}function F(n){return((n=Math.exp(n))-1/n)/2}function O(n){return((n=Math.exp(n))+1/n)/2}function Y(n){return((n=Math.exp(2*n))-1)/(n+1)}function I(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=La)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*Oa,r=tt(r)*Ya,i=tt(i)*Ia,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n>0?B(Math.atan2(e,t)*Ta,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n>>16,255&n>>8,255&n)}function it(n){return ut(n)+""}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function st(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=Xa.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function lt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/Oa),u=et((.2126729*n+.7151522*t+.072175*e)/Ya),i=et((.0193339*n+.119192*t+.9503041*e)/Ia);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function vt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=$o.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Ko.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=$o.event;$o.event=n;try{o.progress.call(i,c)}finally{$o.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Wo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},$o.rebind(i,o,"on"),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function xt(){var n=Mt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(Ja),Ja=setTimeout(xt,t)),Wa=0):(Wa=1,Ka(xt))}function Mt(){var n=Date.now();for(Ga=$a;Ga;)n>=Ga.t&&(Ga.f=Ga.c(n-Ga.t)),Ga=Ga.n;return n}function _t(){for(var n,t=$a,e=1/0;t;)t.f?t=n?n.n=t.n:$a=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Ba=n,e}function bt(n,t){var e=Math.pow(10,3*aa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function wt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function St(n){return n+""}function kt(){}function Et(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function At(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function Ct(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function Nt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Ct(n[e],t,1);t.polygonEnd()}function Lt(){function n(n,t){n*=La,t=t*La/2+ka/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,s=u*o+c*Math.cos(e),l=c*Math.sin(e);hc.add(Math.atan2(l,s)),r=n,u=o,i=a}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*La,u=Math.cos(a=(e=a)*La/2+ka/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function Tt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function qt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function zt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Rt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Dt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Pt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Ut(n){return[Math.atan2(n[1],n[0]),H(n[2])]}function jt(n,t){return aa(n[0]-t[0])<Ca&&aa(n[1]-t[1])<Ca}function Ht(n,t){n*=La;var e=Math.cos(t*=La);Ft(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Ft(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function Ot(){function n(n,u){n*=La;var i=Math.cos(u*=La),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),Ft(t,e,r)}var t,e,r;kc.point=function(u,i){u*=La;var o=Math.cos(i*=La);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,Ft(t,e,r)}}function Yt(){kc.point=Ht}function It(){function n(n,t){n*=La;var e=Math.cos(t*=La),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-j(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),Ft(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=La;var c=Math.cos(a*=La);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Ft(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Yt,kc.point=Ht}}function Zt(){return!0}function Vt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(jt(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new $t(e,n,null,!0),s=new $t(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new $t(r,n,null,!1),s=new $t(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Xt(i),Xt(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Xt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function $t(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=$o.merge(g);var n=Kt(m,p);g.length?Vt(g,Gt,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Jt(),M=t(x);return y}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.x)[0]<0?n[1]-Aa-Ca:Aa-n[1])-((t=t.x)[0]<0?t[1]-Aa-Ca:Aa-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+ka/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+ka/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=aa(_)>ka,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?Ea:-Ea):_,b^h>=e^m>=e){var S=zt(Tt(f),Tt(n));Pt(S);var k=zt(u,S);Pt(k);var E=(b^_>=0?-1:1)*H(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ca>i||Ca>i&&0>hc)^1&o}function Qt(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?ka:-ka,c=aa(i-e);aa(c-ka)<Ca?(n.point(e,r=(r+o)/2>0?Aa:-Aa),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=ka&&(aa(e-u)<Ca&&(e-=u*Ca),aa(i-a)<Ca&&(i-=a*Ca),r=ne(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var u,i,o=Math.sin(n-e);return aa(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function te(n,t,e,r){var u;if(null==n)u=e*Aa,r.point(-ka,u),r.point(0,u),r.point(ka,u),r.point(ka,0),r.point(ka,-u),r.point(0,-u),r.point(-ka,-u),r.point(-ka,0),r.point(-ka,u);else if(aa(n[0]-t[0])>Ca){var i=n[0]<t[0]?ka:-ka;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?ka:-ka),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(jt(e,g)||jt(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&jt(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=Tt(n),u=Tt(t),o=[1,0,0],a=zt(r,u),c=qt(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=zt(o,a),p=Dt(o,f),v=Dt(a,h);Rt(p,v);var d=g,m=qt(p,d),y=qt(d,d),x=m*m-y*(qt(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=Dt(d,(-m-M)/y);if(Rt(_,p),_=Ut(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=aa(A-ka)<Ca,N=C||Ca>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(aa(_[0]-w)<Ca?k:E):k<=_[1]&&_[1]<=E:A>ka^(w<=_[0]&&_[0]<=S)){var L=Dt(d,(-m+M)/y);return Rt(L,p),[_,Ut(L)]}}}function u(t,e){var r=o?n:ka-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=aa(i)>Ca,c=Le(n,6*La);return Bt(t,e,c,o?[0,-n]:[-ka,n-ka])}function re(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function ue(n,t,e,r){function u(r,u){return aa(r[0]-n)<Ca?u>0?0:3:aa(r[0]-e)<Ca?u>0?2:1:aa(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=m.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=m[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&s(l,i,n)>0&&++t:i[1]<=r&&s(l,i,n)<0&&--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function l(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function f(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function h(n,t){f(n,t)&&a.point(n,t)}function g(){L.point=v,m&&m.push(y=[]),k=!0,S=!1,b=w=0/0}function p(){d&&(v(x,M),_&&S&&C.rejoin(),d.push(C.buffer())),L.point=h,S&&a.lineEnd()}function v(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=f(n,t);if(m&&y.push([n,t]),k)x=n,M=t,_=e,k=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&S)a.point(n,t);else{var r={a:{x:b,y:w},b:{x:n,y:t}};N(r)?(S||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),E=!1):e&&(a.lineStart(),a.point(n,t),E=!1)}b=n,w=t,S=e}var d,m,y,x,M,_,b,w,S,k,E,A=a,C=Jt(),N=re(n,t,e,r),L={point:h,lineStart:g,lineEnd:p,polygonStart:function(){a=C,d=[],m=[],E=!0},polygonEnd:function(){a=A,d=$o.merge(d);var t=c([n,r]),e=E&&t,u=d.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Vt(d,i,t,l,a),a.polygonEnd()),d=m=y=null}};return L}}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=ka/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ka/180,e=n[1]*ka/180):[180*(t/ka),180*(e/ka)]},u}function ae(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,H((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function se(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),Tc>t&&(Tc=t),t>zc&&(zc=t)}function le(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=fe(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=fe(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function fe(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function he(n,t){dc+=n,mc+=t,++yc}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,he(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,he(t=r,e=u)}}function pe(){Pc.point=he}function ve(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,he(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,he(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function de(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Ea)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:c};return a}function me(n){function t(n){return(a?r:e)(n)}function e(t){return Me(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=Tt([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=aa(aa(w)-1)<Ca?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M>i||aa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*La),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function ye(n){var t=me(function(t,e){return n([t*Ta,e*Ta])});return function(n){return we(t(n))}}function xe(n){this.stream=n}function Me(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function _e(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*La,n[1]*La),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*Ta,n[1]*Ta]}function r(){a=ie(o=Ee(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=vt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=we(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):ee((b=+n)*La),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?ue(n[0][0],n[0][1],n[1][0],n[1][1]):vt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*La,d=n[1]%360*La,r()):[v*Ta,d*Ta]},t.rotate=function(n){return arguments.length?(m=n[0]%360*La,y=n[1]%360*La,x=n.length>2?n[2]%360*La:0,r()):[m*Ta,y*Ta,x*Ta]},$o.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function we(n){return Me(n,function(t,e){n.point(t*La,e*La)})}function Se(n,t){return[n,t]}function ke(n,t){return[n>ka?n-Ea:-ka>n?n+Ea:n,t]}function Ee(n,t,e){return n?t||e?ie(Ce(n),Ne(t,e)):Ce(n):t||e?Ne(t,e):ke}function Ae(n){return function(t,e){return t+=n,[t>ka?t-Ea:-ka>t?t+Ea:t,e]}}function Ce(n){var t=Ae(n);return t.invert=Ae(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),H(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),H(l*r-a*u)]},e}function Le(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=Te(e,u),i=Te(e,i),(o>0?i>u:u>i)&&(u+=o*Ea)):(u=n+o*Ea,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=Ut([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function Te(n,t){var e=Tt(t);e[0]-=n,Pt(e);var r=j(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function qe(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ze(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Re(n){return n.source}function De(n){return n.target}function Pe(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(I(r-t)+u*o*I(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ta,Math.atan2(o,Math.sqrt(r*r+u*u))*Ta]}:function(){return[n*Ta,t*Ta]};return p.distance=h,p}function Ue(){function n(n,u){var i=Math.sin(u*=La),o=Math.cos(u),a=aa((n*=La)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*La,e=Math.sin(i*=La),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=c}}function je(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function He(n,t){function e(n,t){var e=aa(aa(t)-Aa)<Ca?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ka/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=U(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Aa]},e):Oe}function Fe(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return aa(u)<Ca?Se:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-U(u)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(ka/4+t/2))]}function Ye(n){var t,e=_e(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=ka*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n,t,e,r){var u,i,o,a,c,s,l;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],s=u[0],l=u[1],(l-o)*(a-i)-(c-o)*(s-i)>0}function $e(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Be(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function We(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Je(){mr(this),this.edge=this.site=this.circle=null}function Ge(n){var t=Jc.pop()||new Je;return t.site=n,t}function Ke(n){cr(n),$c.remove(n),Jc.push(n),mr(n)}function Qe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Ke(n);for(var c=i;c.circle&&aa(e-c.circle.x)<Ca&&aa(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Ke(c),c=i;a.unshift(c),cr(c);for(var s=o;s.circle&&aa(e-s.circle.x)<Ca&&aa(r-s.circle.cy)<Ca;)o=s.N,a.push(s),Ke(s),s=o;a.push(s),cr(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],pr(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=hr(c.site,s.site,null,u),ar(c),ar(s)}function nr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=tr(a,o)-i,r>Ca)a=a.L;else{if(u=i-er(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Ge(n);if($c.insert(t,c),t||e){if(t===e)return cr(t),e=Ge(t.site),$c.insert(c,e),c.edge=e.edge=hr(t.site,c.site),ar(t),ar(e),void 0;if(!e)return c.edge=hr(t.site,c.site),void 0;cr(t),cr(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};pr(e.edge,s,p,M),c.edge=hr(s,n,null,M),e.edge=hr(n,p,null,M),ar(t),ar(e)}}function tr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function er(n,t){var e=n.N;if(e)return tr(e,t);var r=n.site;return r.y===t?r.x:1/0}function rr(n){this.site=n,this.edges=[]}function ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(aa(r-t)>Ca||aa(u-e)>Ca)&&(a.splice(o,0,new vr(gr(i.site,l,aa(r-f)<Ca&&p-u>Ca?{x:f,y:aa(t-f)<Ca?e:p}:aa(u-p)<Ca&&h-r>Ca?{x:aa(e-p)<Ca?t:h,y:p}:aa(r-h)<Ca&&u-g>Ca?{x:h,y:aa(t-h)<Ca?e:g}:aa(u-g)<Ca&&r-f>Ca?{x:aa(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function ir(n,t){return t.angle-n.angle}function or(){mr(this),this.x=this.y=this.arc=this.site=this.cy=null}function ar(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-Na)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new or;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function cr(n){var t=n.circle;t&&(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),mr(t),n.circle=null)}function sr(n){for(var t,e=Vc,r=re(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!lr(t,n)||!r(t)||aa(t.a.x-t.b.x)<Ca&&aa(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function lr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2; -if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function fr(n,t){this.l=n,this.r=t,this.a=this.b=null}function hr(n,t,e,r){var u=new fr(n,t);return Vc.push(u),e&&pr(u,n,t,e),r&&pr(u,t,n,r),Xc[n.i].edges.push(new vr(u,n,t)),Xc[t.i].edges.push(new vr(u,t,n)),u}function gr(n,t,e){var r=new fr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function pr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function vr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function dr(){this._=null}function mr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function yr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function xr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function Mr(n){for(;n.L;)n=n.L;return n}function _r(n,t){var e,r,u,i=n.sort(br).pop();for(Vc=[],Xc=new Array(n.length),$c=new dr,Wc=new dr;;)if(u=Bc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Xc[i.i]=new rr(i),nr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Qe(u.arc)}t&&(sr(t),ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function br(n,t){return t.y-n.y||t.x-n.x}function wr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function Sr(n){return n.x}function kr(n){return n.y}function Er(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Ar(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&Ar(n,c[0],e,r,o,a),c[1]&&Ar(n,c[1],o,r,u,a),c[2]&&Ar(n,c[2],e,a,o,i),c[3]&&Ar(n,c[3],o,a,u,i)}}function Cr(n,t){n=$o.rgb(n),t=$o.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function Nr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=qr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function Lr(n,t){return t-=n=+n,function(e){return n+t*e}}function Tr(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=Lr(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function qr(n,t){for(var e,r=$o.interpolators.length;--r>=0&&!(e=$o.interpolators[r](n,t)););return e}function zr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(qr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Rr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Dr(n){return function(t){return 1-n(1-t)}}function Pr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Ur(n){return n*n}function jr(n){return n*n*n}function Hr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Fr(n){return function(t){return Math.pow(t,n)}}function Or(n){return 1-Math.cos(n*Aa)}function Yr(n){return Math.pow(2,10*(n-1))}function Ir(n){return 1-Math.sqrt(1-n*n)}function Zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ea*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ea/t)}}function Vr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Xr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function $r(n,t){n=$o.hcl(n),t=$o.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+""}}function Br(n,t){n=$o.hsl(n),t=$o.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+""}}function Wr(n,t){n=$o.lab(n),t=$o.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return Q(e+i*n,r+o*n,u+a*n)+""}}function Jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Gr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Qr(t),u=Kr(t,e),i=Qr(nu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ta,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ta:0}function Kr(n,t){return n[0]*t[0]+n[1]*t[1]}function Qr(n){var t=Math.sqrt(Kr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function nu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function tu(n,t){var e,r=[],u=[],i=$o.transform(n),o=$o.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:Lr(a[0],c[0])},{i:3,x:Lr(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:Lr(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:Lr(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:Lr(g[0],p[0])},{i:e-2,x:Lr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function eu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function ru(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function uu(n){for(var t=n.source,e=n.target,r=ou(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function iu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function ou(n,t){if(n===t)return n;for(var e=iu(n),r=iu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function au(n){n.fixed|=2}function cu(n){n.fixed&=-7}function su(n){n.fixed|=4,n.px=n.x,n.py=n.y}function lu(n){n.fixed&=-5}function fu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(fu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function hu(n,t){return $o.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=du,n}function gu(n){return n.children}function pu(n){return n.value}function vu(n,t){return t.value-n.value}function du(n){return $o.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function mu(n){return n.x}function yu(n){return n.y}function xu(n,t,e){n.y0=t,n.y=e}function Mu(n){return $o.range(n.length)}function _u(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function bu(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function wu(n){return n.reduce(Su,0)}function Su(n,t){return n+t[1]}function ku(n,t){return Eu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Eu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function Au(n){return[$o.min(n),$o.max(n)]}function Cu(n,t){return n.parent==t.parent?1:2}function Nu(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function Lu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function Tu(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=Tu(e[i],t),n)>0&&(n=r);return n}function qu(n,t){return n.x-t.x}function zu(n,t){return t.x-n.x}function Ru(n,t){return n.depth-t.depth}function Du(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Pu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function Uu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function ju(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Hu(n,t){return n.value-t.value}function Fu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Ou(n,t){n._pack_next=t,t._pack_prev=n}function Yu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Iu(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Zu),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],$u(r,u,i),t(i),Fu(r,i),r._pack_prev=i,Fu(i,u),u=r._pack_next,o=3;s>o;o++){$u(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Yu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Yu(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Ou(r,u=a):Ou(r=c,u),o--):(Fu(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Vu)}}function Zu(n){n._pack_next=n._pack_prev=n}function Vu(n){delete n._pack_next,delete n._pack_prev}function Xu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)Xu(u[i],t,e,r)}function $u(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Bu(n){return 1+$o.max(n,function(n){return n.y})}function Wu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ju(n){var t=n.children;return t&&t.length?Ju(t[0]):n}function Gu(n){var t,e=n.children;return e&&(t=e.length)?Gu(e[t-1]):n}function Ku(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Qu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ni(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function ti(n){return n.rangeExtent?n.rangeExtent():ni(n.range())}function ei(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function ri(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ss}function ii(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=$o.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function oi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?ii:ei,c=r?ru:eu;return o=u(n,t,c,e),a=u(t,n,c,qr),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return li(n,t)},i.tickFormat=function(t,e){return fi(n,t,e)},i.nice=function(t){return ci(n,t),u()},i.copy=function(){return oi(n,t,e,r)},u()}function ai(n,t){return $o.rebind(n,t,"range","rangeRound","interpolate","clamp")}function ci(n,t){return ri(n,ui(si(n,t)[2]))}function si(n,t){null==t&&(t=10);var e=ni(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function li(n,t){return $o.range.apply($o,si(n,t))}function fi(n,t,e){var r=si(n,t);return $o.format(e?e.replace(uc,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+gi(l,r),l].join("")}):",."+hi(r[2])+"f")}function hi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function gi(n,t){var e=hi(t[2]);return n in ls?Math.abs(e-hi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function pi(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=ri(r.map(u),e?Math:hs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=ni(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return fs;arguments.length<2?t=fs:"function"!=typeof t&&(t=$o.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return pi(n.copy(),t,e,r)},ai(o,n)}function vi(n,t,e){function r(t){return n(u(t))}var u=di(t),i=di(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return li(e,n)},r.tickFormat=function(n,t){return fi(e,n,t)},r.nice=function(n){return r.domain(ci(e,n))},r.exponent=function(o){return arguments.length?(u=di(t=o),i=di(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return vi(n.copy(),t,e)},ai(r,n)}function di(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function mi(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return $o.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+s)/2:c+l*i/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return ni(t.a[0])},e.copy=function(){return mi(n,t)},e.domain(n)}function yi(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=$o.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[$o.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort($o.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return yi(n,t)},e()}function xi(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return xi(n,t,e)},u()}function Mi(n,t){function e(e){return e>=e?t[$o.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Mi(n,t)},e}function _i(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return li(n,t)},t.tickFormat=function(t,e){return fi(n,t,e)},t.copy=function(){return _i(n)},t}function bi(n){return n.innerRadius}function wi(n){return n.outerRadius}function Si(n){return n.startAngle}function ki(n){return n.endAngle}function Ei(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=Ze,r=Ve,u=Zt,i=Ai,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=xs.get(n)||Ai).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ai(n){return n.join("L")}function Ci(n){return Ai(n)+"Z"}function Ni(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function Li(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Ti(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function qi(n,t){return n.length<4?Ai(n):n[1]+Di(n.slice(1,n.length-1),Pi(n,t))}function zi(n,t){return n.length<3?Ai(n):n[0]+Di((n.push(n[0]),n),Pi([n[n.length-2]].concat(n,[n[1]]),t))}function Ri(n,t){return n.length<3?Ai(n):n[0]+Di(n,Pi(n,t))}function Di(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Ai(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function Pi(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function Ui(n){if(n.length<3)return Ai(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Oi(bs,o),",",Oi(bs,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Yi(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ji(n){if(n.length<4)return Ai(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Oi(bs,i)+","+Oi(bs,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Yi(e,i,o);return e.join("")}function Hi(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Oi(bs,o),",",Oi(bs,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Yi(t,o,a);return t.join("")}function Fi(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return Ui(n)}function Oi(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Yi(n,t,e){n.push("C",Oi(Ms,t),",",Oi(Ms,e),",",Oi(_s,t),",",Oi(_s,e),",",Oi(bs,t),",",Oi(bs,e))}function Ii(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Zi(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=Ii(u,i);++t<e;)r[t]=(o+(o=Ii(u=i,i=n[t+1])))/2;return r[t]=o,r}function Vi(n){for(var t,e,r,u,i=[],o=Zi(n),a=-1,c=n.length-1;++a<c;)t=Ii(n[a],n[a+1]),aa(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Xi(n){return n.length<3?Ai(n):n[0]+Di(n,Vi(n))}function $i(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+ms,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Bi(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=pt(e),_=pt(u),b=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ze,r=Ze,u=0,i=Ve,o=Zt,a=Ai,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=xs.get(n)||Ai).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Wi(n){return n.radius}function Ji(n){return[n.x,n.y]}function Gi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ms;return[e*Math.cos(r),e*Math.sin(r)]}}function Ki(){return 64}function Qi(){return"circle"}function no(n){var t=Math.sqrt(n/ka);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function to(n,t){return ha(n,Cs),n.id=t,n}function eo(n,t,e,r){var u=n.id;return C(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function ro(n){return null==n&&(n=""),function(){this.textContent=n}}function uo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,$o.timer(function(r){function u(r){return i.active>e?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),$o.timer(function(){return p.c=c(r||1)?Zt:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ga,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function io(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function oo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function ao(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function co(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new Ds(e-1)),1),e}function i(n,e){return t(n=new Ds(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Ds=ao;var r=new ao;return r._=n,o(r,t,e)}finally{Ds=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=so(n);return c.floor=c,c.round=so(r),c.ceil=so(u),c.offset=so(i),c.range=a,n}function so(n){return function(t,e){try{Ds=ao;var r=new ao;return r._=t,n(r,e)._}finally{Ds=Date}}}function lo(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a<e;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=nl[r=n.charAt(++a)])&&(r=n.charAt(++a)),(i=tl[r])&&(r=i(t,null==u?"e"===r?" ":"0":u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=fo(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=null!=e.Z&&Ds!==ao,i=new(u?ao:Ds);return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function fo(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=el[o in nl?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function ho(n){return new RegExp("^(?:"+n.map($o.requote).join("|")+")","i")}function go(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function po(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function vo(n,t,e){$s.lastIndex=0;var r=$s.exec(t.substring(e));return r?(n.w=Bs.get(r[0].toLowerCase()),e+r[0].length):-1}function mo(n,t,e){Vs.lastIndex=0;var r=Vs.exec(t.substring(e));return r?(n.w=Xs.get(r[0].toLowerCase()),e+r[0].length):-1}function yo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function xo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Mo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function _o(n,t,e){Gs.lastIndex=0;var r=Gs.exec(t.substring(e));return r?(n.m=Ks.get(r[0].toLowerCase()),e+r[0].length):-1}function bo(n,t,e){Ws.lastIndex=0;var r=Ws.exec(t.substring(e));return r?(n.m=Js.get(r[0].toLowerCase()),e+r[0].length):-1}function wo(n,t,e){return fo(n,tl.c.toString(),t,e)}function So(n,t,e){return fo(n,tl.x.toString(),t,e)}function ko(n,t,e){return fo(n,tl.X.toString(),t,e)}function Eo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ao(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.y=No(+r[0]),e+r[0].length):-1}function Co(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function No(n){return n+(n>68?1900:2e3)}function Lo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function To(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function qo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function zo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Ro(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Do(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Po(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function Uo(n,t,e){var r=ul.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function jo(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(aa(t)/60),u=aa(t)%60;return e+po(r,"0",2)+po(u,"0",2)}function Ho(n,t,e){Qs.lastIndex=0;var r=Qs.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function Fo(n){function t(n){try{Ds=ao;var t=new Ds;return t._=n,e(t)}finally{Ds=Date}}var e=lo(n);return t.parse=function(n){try{Ds=ao;var t=e.parse(n);return t&&t._}finally{Ds=Date}},t.toString=e.toString,t}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=$o.bisect(ol,u);return i==ol.length?[t.year,si(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/ol[i-1]<ol[i]/u?i-1:i]:[ll,si(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=ni(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(ri(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ni(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},ai(r,n)}function Io(n){return new Date(n)}function Zo(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function Vo(n){return JSON.parse(n.responseText)}function Xo(n){var t=Jo.createRange();return t.selectNode(Jo.body),t.createContextualFragment(n.responseText)}var $o={version:"3.3.9"};Date.now||(Date.now=function(){return+new Date});var Bo=[].slice,Wo=function(n){return Bo.call(n)},Jo=document,Go=Jo.documentElement,Ko=window;try{Wo(Go.childNodes)[0].nodeType}catch(Qo){Wo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Jo.createElement("div").style.setProperty("opacity",0,"")}catch(na){var ta=Ko.Element.prototype,ea=ta.setAttribute,ra=ta.setAttributeNS,ua=Ko.CSSStyleDeclaration.prototype,ia=ua.setProperty;ta.setAttribute=function(n,t){ea.call(this,n,t+"")},ta.setAttributeNS=function(n,t,e){ra.call(this,n,t,e+"")},ua.setProperty=function(n,t,e){ia.call(this,n,t+"",e)}}$o.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},$o.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},$o.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},$o.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},$o.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},$o.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},$o.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},$o.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r; -return i?u+i*(n[r]-u):u},$o.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?$o.quantile(t.sort($o.ascending),.5):void 0},$o.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var oa=$o.bisector(function(n){return n});$o.bisectLeft=oa.left,$o.bisect=$o.bisectRight=oa.right,$o.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},$o.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},$o.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},$o.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=$o.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},$o.transpose=function(n){return $o.zip.apply($o,n)},$o.keys=function(n){var t=[];for(var e in n)t.push(e);return t},$o.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},$o.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},$o.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var aa=Math.abs;$o.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(aa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},$o.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return ca+n in this},get:function(n){return this[ca+n]},set:function(n,t){return this[ca+n]=t},remove:function(n){return n=ca+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1),this[t])}});var ca="\x00",sa=ca.charCodeAt(0);$o.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n($o.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},$o.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(i,{has:function(n){return ca+n in this},add:function(n){return this[ca+n]=!0,n},remove:function(n){return n=ca+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1))}}),$o.behavior={},$o.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var la=["webkit","ms","moz","Moz","o","O"];$o.dispatch=function(){for(var n=new s,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=l(n);return n},s.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},$o.event=null,$o.requote=function(n){return n.replace(fa,"\\$&")};var fa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ha={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ga=function(n,t){return t.querySelector(n)},pa=function(n,t){return t.querySelectorAll(n)},va=Go[a(Go,"matchesSelector")],da=function(n,t){return va.call(n,t)};"function"==typeof Sizzle&&(ga=function(n,t){return Sizzle(n,t)[0]||null},pa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},da=Sizzle.matchesSelector),$o.selection=function(){return Ma};var ma=$o.selection.prototype=[];ma.select=function(n){var t,e,r,u,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return p(i)},ma.selectAll=function(n){var t,e,r=[];n=d(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Wo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var ya={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};$o.ns={prefix:ya,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ya.hasOwnProperty(e)?{space:ya[e],local:n}:n}},ma.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=$o.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},ma.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!x(n[u]).test(t))return!1;return!0}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},ma.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(b(e,n[e],t));return this}if(2>r)return Ko.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(b(n,t,e))},ma.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},ma.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},ma.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},ma.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ma.insert=function(n,t){return n=S(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ma.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},ma.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r<a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r<f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=k(o)),y.set(d,o),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=k(o);for(;f>r;++r)p[r]=k(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=N([]),s=p([]),l=p([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},ma.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},ma.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return p(u)},ma.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ma.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},ma.each=function(n){return C(this,function(t,e,r){n.call(t,t.__data__,e,r)})},ma.call=function(n){var t=Wo(arguments);return n.apply(t[0]=this,t),this},ma.empty=function(){return!this.node()},ma.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ma.size=function(){var n=0;return this.each(function(){++n}),n};var xa=[];$o.selection.enter=N,$o.selection.enter.prototype=xa,xa.append=ma.append,xa.empty=ma.empty,xa.node=ma.node,xa.call=ma.call,xa.size=ma.size,xa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return p(o)},xa.insert=function(n,t){return arguments.length<2&&(t=L(this)),ma.insert.call(this,n,t)},ma.transition=function(){for(var n,t,e=Ss||++Ns,r=[],u=ks||{time:Date.now(),ease:Hr,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&uo(t,c,e,u),n.push(t)}return to(r,e)},ma.interrupt=function(){return this.each(T)},$o.select=function(n){var t=["string"==typeof n?ga(n,Jo):n];return t.parentNode=Go,p([t])},$o.selectAll=function(n){var t=Wo("string"==typeof n?pa(n,Jo):n);return t.parentNode=Go,p([t])};var Ma=$o.select(Go);ma.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(q(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(q(n,t,e))};var _a=$o.map({mouseenter:"mouseover",mouseleave:"mouseout"});_a.forEach(function(n){"on"+n in Jo&&_a.remove(n)});var ba="onselectstart"in Jo?null:a(Go.style,"userSelect"),wa=0;$o.mouse=function(n){return P(n,h())};var Sa=/WebKit/.test(Ko.navigator.userAgent)?-1:0;$o.touches=function(n,t){return arguments.length<2&&(t=h().touches),t?Wo(t).map(function(t){var e=P(n,t);return e.identifier=t.identifier,e}):[]},$o.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return $o.event.changedTouches[0].identifier}function e(n,t){return $o.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&$o.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=$o.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=$o.select(Ko).on(e+"."+p,o).on(r+"."+p,a),y=D();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=g(n,"drag","dragstart","dragend"),i=null,o=r(c,$o.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},$o.rebind(n,u,"on")};var ka=Math.PI,Ea=2*ka,Aa=ka/2,Ca=1e-6,Na=Ca*Ca,La=ka/180,Ta=180/ka,qa=Math.SQRT2,za=2,Ra=4;$o.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=O(v),o=i/(za*h)*(e*Y(qa*t+v)-F(v));return[r+o*s,u+o*l,i*e/O(qa*t+v)]}return[r+n*s,u+n*l,i*Math.exp(qa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ra*f)/(2*i*za*h),p=(c*c-i*i-Ra*f)/(2*c*za*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/qa;return e.duration=1e3*y,e},$o.behavior.zoom=function(){function n(n){n.on(A,s).on(Ua+".zoom",h).on(C,p).on("dblclick.zoom",v).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u($o.mouse(r),h),a(i)}function e(){f.on(C,Ko===r?p:null).on(N,null),g(l&&$o.event.target===s),c(i)}var r=this,i=q.of(r,arguments),s=$o.event.target,l=0,f=$o.select(Ko).on(C,n).on(N,e),h=t($o.mouse(r)),g=D();T.call(r),o(i)}function l(){function n(){var n=$o.touches(p);return g=S.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=t(n))}),n}function e(){for(var t=$o.event.changedTouches,e=0,i=t.length;i>e;++e)d[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=d[s.identifier];r(2*S.k),u(s,l),f(),a(v)}x=c}else if(o.length>1){var s=o[0],h=o[1],g=s[0]-h[0],p=s[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=$o.touches(p),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}x=null,u(n,t),a(v)}function h(){if($o.event.touches.length){for(var t=$o.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(v)}var g,p=this,v=q.of(p,arguments),d={},m=0,y=$o.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=$o.select(Ko).on(M,i).on(_,h),w=$o.select(p).on(A,null).on(L,e),k=D();T.call(p),e(),o(v)}function h(){var n=q.of(this,arguments);y?clearTimeout(y):(T.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||$o.mouse(this);d||(d=t(e)),r(Math.pow(2,.002*Da())*S.k),u(e,d),a(n)}function p(){d=null}function v(){var n=q.of(this,arguments),e=$o.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,$o.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var d,m,y,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Pa,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",q=g(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=q.of(this,arguments),t=S;Ss?$o.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=$o.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Pa:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},$o.rebind(n,q,"on")};var Da,Pa=[0,1/0],Ua="onwheel"in Jo?(Da=function(){return-$o.event.deltaY*($o.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Jo?(Da=function(){return $o.event.wheelDelta},"mousewheel"):(Da=function(){return-$o.event.detail},"MozMousePixelScroll");Z.prototype.toString=function(){return this.rgb()+""},$o.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):st(""+n,lt,V):V(+n,+t,+e)};var ja=X.prototype=new Z;ja.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},ja.rgb=function(){return $(this.h,this.s,this.l)},$o.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=$o.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var Ha=W.prototype=new Z;Ha.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+Fa*(arguments.length?n:1)))},Ha.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-Fa*(arguments.length?n:1)))},Ha.rgb=function(){return J(this.h,this.c,this.l).rgb()},$o.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=$o.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var Fa=18,Oa=.95047,Ya=1,Ia=1.08883,Za=K.prototype=new Z;Za.brighter=function(n){return G(Math.min(100,this.l+Fa*(arguments.length?n:1)),this.a,this.b)},Za.darker=function(n){return G(Math.max(0,this.l-Fa*(arguments.length?n:1)),this.a,this.b)},Za.rgb=function(){return Q(this.l,this.a,this.b)},$o.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):st(""+n,ot,$):ot(~~n,~~t,~~e)};var Va=at.prototype=new Z;Va.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},Va.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Va.hsl=function(){return lt(this.r,this.g,this.b)},Va.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var Xa=$o.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Xa.forEach(function(n,t){Xa.set(n,ut(t))}),$o.functor=pt,$o.xhr=dt(vt),$o.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=$o.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),s=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=c)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==s)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(o).join("\n")},e},$o.csv=$o.dsv(",","text/csv"),$o.tsv=$o.dsv(" ","text/tab-separated-values");var $a,Ba,Wa,Ja,Ga,Ka=Ko[a(Ko,"requestAnimationFrame")]||function(n){setTimeout(n,17)};$o.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Ba?Ba.n=i:$a=i,Ba=i,Wa||(Ja=clearTimeout(Ja),Wa=1,Ka(xt))},$o.timer.flush=function(){Mt(),_t()};var Qa=".",nc=",",tc=[3,3],ec="$",rc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(bt);$o.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=$o.round(n,wt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),rc[8+e/3]},$o.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},$o.format=function(n){var t=uc.exec(n),e=t[1]||" ",r=t[2]||">",u=t[3]||"",i=t[4]||"",o=t[5],a=+t[6],c=t[7],s=t[8],l=t[9],f=1,h="",g=!1;switch(s&&(s=+s.substring(1)),(o||"0"===e&&"="===r)&&(o=e="0",r="=",c&&(a-=Math.floor((a-1)/4))),l){case"n":c=!0,l="g";break;case"%":f=100,h="%",l="f";break;case"p":f=100,h="%",l="r";break;case"b":case"o":case"x":case"X":"#"===i&&(i="0"+l.toLowerCase());case"c":case"d":g=!0,s=0;break;case"s":f=-1,l="r"}"#"===i?i="":"$"===i&&(i=ec),"r"!=l||s||(l="g"),null!=s&&("g"==l?s=Math.max(1,Math.min(21,s)):("e"==l||"f"==l)&&(s=Math.max(0,Math.min(20,s)))),l=ic.get(l)||St;var p=o&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):u;if(0>f){var v=$o.formatPrefix(n,s);n=v.scale(n),h=v.symbol}else n*=f;n=l(n,s);var d=n.lastIndexOf("."),m=0>d?n:n.substring(0,d),y=0>d?"":Qa+n.substring(d+1);!o&&c&&(m=oc(m));var x=i.length+m.length+y.length+(p?0:t.length),M=a>x?new Array(x=a-x+1).join(e):"";return p&&(m=oc(M+m)),t+=i,n=m+y,("<"===r?t+n+M:">"===r?M+t+n:"^"===r?M.substring(0,x>>=1)+t+n+M.substring(x):t+(p?n:M+n))+h}};var uc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ic=$o.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=$o.round(n,wt(n,t))).toFixed(Math.max(0,Math.min(20,wt(n*(1+1e-15),t))))}}),oc=vt;if(tc){var ac=tc.length;oc=function(n){for(var t=n.length,e=[],r=0,u=tc[0];t>0&&u>0;)e.push(n.substring(t-=u,t+u)),u=tc[r=(r+1)%ac];return e.reverse().join(nc)}}$o.geo={},kt.prototype={s:0,t:0,add:function(n){Et(n,this.t,cc),Et(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new kt;$o.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):At(n,t)};var sc={Feature:function(n,t){At(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)At(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Ct(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Ct(e[r],t,0)},Polygon:function(n,t){Nt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Nt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)At(e[r],t)}};$o.geo.area=function(n){return fc=0,$o.geo.stream(n,gc),fc};var fc,hc=new kt,gc={sphere:function(){fc+=4*ka},point:c,lineStart:c,lineEnd:c,polygonStart:function(){hc.reset(),gc.lineStart=Lt},polygonEnd:function(){var n=2*hc;fc+=0>n?4*ka+n:n,gc.lineStart=gc.lineEnd=gc.point=c}};$o.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=Tt([t*La,e*La]);if(m){var u=zt(m,r),i=[u[1],-u[0],0],o=zt(i,u);Pt(o),o=Ut(o);var c=t-p,s=c>0?1:-1,v=o[0]*Ta*s,d=aa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*Ta;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*Ta;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=aa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),aa(y)>Ca&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>hc?(l=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],$o.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),$o.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Na>u&&(t=xc,e=Mc,r=_c,Ca>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Na>u)?[0/0,0/0]:[Math.atan2(e,t)*Ta,H(r/Math.sqrt(u))*Ta]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:c,point:Ht,lineStart:Ot,lineEnd:Yt,polygonStart:function(){kc.lineStart=It},polygonEnd:function(){kc.lineStart=Ot}},Ec=Bt(Zt,Qt,te,[-ka,-ka/2]),Ac=1e9;$o.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=ue(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},($o.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,$o.geo.albers=function(){return $o.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},$o.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=$o.geo.albers(),o=$o.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=$o.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Ca,f+.12*s+Ca],[l-.214*s-Ca,f+.234*s-Ca]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Ca,f+.166*s+Ca],[l-.115*s-Ca,f+.234*s-Ca]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Nc=0,Rc.lineStart=ce},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=c,Cc+=aa(Nc/2)}},Dc={point:se,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},Pc={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){Pc.lineStart=ve},polygonEnd:function(){Pc.point=he,Pc.lineStart=ge,Pc.lineEnd=pe}};$o.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),$o.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,$o.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),$o.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||ye(n):vt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new le:new de(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection($o.geo.albersUsa()).context(null)},$o.geo.transform=function(n){return{stream:function(t){var e=new xe(t);for(var r in n)e[r]=n[r];return e}}},xe.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart() -},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},$o.geo.projection=_e,$o.geo.projectionMutator=be,($o.geo.equirectangular=function(){return _e(Se)}).raw=Se.invert=Se,$o.geo.rotation=function(n){function t(t){return t=n(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t}return n=Ee(n[0]%360*La,n[1]*La,n.length>2?n[2]*La:0),t.invert=function(t){return t=n.invert(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t},t},ke.invert=Se,$o.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*La,-n[1]*La,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ta,n[1]*=Ta}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Le((t=+r)*La,u*La),n):t},n.precision=function(r){return arguments.length?(e=Le(t*La,(u=+r)*La),n):u},n.angle(90)},$o.geo.distance=function(n,t){var e,r=(t[0]-n[0])*La,u=n[1]*La,i=t[1]*La,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},$o.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return $o.range(Math.ceil(i/d)*d,u,d).map(h).concat($o.range(Math.ceil(s/m)*m,c,m).map(g)).concat($o.range(Math.ceil(r/p)*p,e,p).filter(function(n){return aa(n%d)>Ca}).map(l)).concat($o.range(Math.ceil(a/v)*v,o,v).filter(function(n){return aa(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=qe(a,o,90),f=ze(r,e,y),h=qe(s,c,90),g=ze(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},$o.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Re,u=De;return n.distance=function(){return $o.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},$o.geo.interpolate=function(n,t){return Pe(n[0]*La,n[1]*La,t[0]*La,t[1]*La)},$o.geo.length=function(n){return Uc=0,$o.geo.stream(n,jc),Uc};var Uc,jc={sphere:c,point:c,lineStart:Ue,lineEnd:c,polygonStart:c,polygonEnd:c},Hc=je(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});($o.geo.azimuthalEqualArea=function(){return _e(Hc)}).raw=Hc;var Fc=je(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},vt);($o.geo.azimuthalEquidistant=function(){return _e(Fc)}).raw=Fc,($o.geo.conicConformal=function(){return oe(He)}).raw=He,($o.geo.conicEquidistant=function(){return oe(Fe)}).raw=Fe;var Oc=je(function(n){return 1/n},Math.atan);($o.geo.gnomonic=function(){return _e(Oc)}).raw=Oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Aa]},($o.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var Yc=je(function(){return 1},Math.asin);($o.geo.orthographic=function(){return _e(Yc)}).raw=Yc;var Ic=je(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});($o.geo.stereographic=function(){return _e(Ic)}).raw=Ic,Ie.invert=function(n,t){return[Math.atan2(F(n),Math.cos(t)),H(Math.sin(t)/O(n))]},($o.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,$o.geom={},$o.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,o,a,c,s,l,f,h,g,p,v=pt(e),d=pt(r),m=n.length,y=m-1,x=[],M=[],_=0;if(v===Ze&&r===Ve)t=n;else for(i=0,t=[];m>i;++i)t.push([+v.call(this,u=n[i],i),+d.call(this,u,i)]);for(i=1;m>i;++i)(t[i][1]<t[_][1]||t[i][1]==t[_][1]&&t[i][0]<t[_][0])&&(_=i);for(i=0;m>i;++i)i!==_&&(c=t[i][1]-t[_][1],a=t[i][0]-t[_][0],x.push({angle:Math.atan2(c,a),index:i}));for(x.sort(function(n,t){return n.angle-t.angle}),g=x[0].angle,h=x[0].index,f=0,i=1;y>i;++i){if(o=x[i].index,g==x[i].angle){if(a=t[h][0]-t[_][0],c=t[h][1]-t[_][1],s=t[o][0]-t[_][0],l=t[o][1]-t[_][1],a*a+c*c>=s*s+l*l){x[i].index=-1;continue}x[f].index=-1}g=x[i].angle,f=i,h=o}for(M.push(_),i=0,o=0;2>i;++o)x[o].index>-1&&(M.push(x[o].index),i++);for(p=M.length;y>o;++o)if(!(x[o].index<0)){for(;!Xe(M[p-2],M[p-1],x[o].index,t);)--p;M[p++]=x[o].index}var b=[];for(i=p-1;i>=0;--i)b.push(n[M[i]]);return b}var e=Ze,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},$o.geom.polygon=function(n){return ha(n,Zc),n};var Zc=$o.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=We(n),c=-1,s=this.length-We(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],$e(o,l,u)?($e(i,l,u)||n.push(Be(i,o,l,u)),n.push(o)):$e(i,l,u)&&n.push(Be(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];rr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(ir),t.length},vr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},dr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Mr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(yr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,xr(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(xr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,yr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Mr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,yr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,xr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,yr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,xr(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,yr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,xr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},$o.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return _r(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ze,u=Ve,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return _r(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return _r(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(ir),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&wr(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=pt(r=n),t):r},t.y=function(n){return arguments.length?(o=pt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Kc?null:a&&a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];$o.geom.delaunay=function(n){return $o.geom.voronoi().triangles(n)},$o.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(aa(c-e)+aa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Er()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=pt(a),M=pt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=Er();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){Ar(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=Sr,c=kr,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},$o.interpolateRgb=Cr,$o.interpolateObject=Nr,$o.interpolateNumber=Lr,$o.interpolateString=Tr;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;$o.interpolate=qr,$o.interpolators=[function(n,t){var e=typeof t;return("string"===e?Xa.has(t)||/^(#|rgb\(|hsl\()/.test(t)?Cr:Tr:t instanceof Z?Cr:"object"===e?Array.isArray(t)?zr:Nr:Lr)(n,t)}],$o.interpolateArray=zr;var ns=function(){return vt},ts=$o.map({linear:ns,poly:Fr,quad:function(){return Ur},cubic:function(){return jr},sin:function(){return Or},exp:function(){return Yr},circle:function(){return Ir},elastic:Zr,back:Vr,bounce:function(){return Xr}}),es=$o.map({"in":vt,out:Dr,"in-out":Pr,"out-in":function(n){return Pr(Dr(n))}});$o.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||vt,Rr(r(e.apply(null,Bo.call(arguments,1))))},$o.interpolateHcl=$r,$o.interpolateHsl=Br,$o.interpolateLab=Wr,$o.interpolateRound=Jr,$o.transform=function(n){var t=Jo.createElementNS($o.ns.prefix.svg,"g");return($o.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Gr(e?e.matrix:rs)})(n)},Gr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};$o.interpolateTransform=tu,$o.layout={},$o.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(uu(n[e]));return t}},$o.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=$o.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push($o.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Ea-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},$o.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=1/Math.sqrt(i*i+o*o);if(v>(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&&isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=$o.event.x,n.py=$o.event.y,a.resume()}var e,r,u,i,o,a={},c=$o.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=.1,v=.8,d=[],m=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,v,y,x,M,_=d.length,b=m.length;for(e=0;b>e;++e)a=m[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(v=x*x+M*M)&&(v=r*i[e]*((v=Math.sqrt(v))-u[e])/v,x*=v,M*=v,h.x-=x*(y=f.weight/(h.weight+f.weight)),h.y-=M*y,f.x+=x*(y=1-y),f.y+=M*y);if((y=r*p)&&(x=s[0]/2,M=s[1]/2,e=-1,y))for(;++e<_;)a=d[e],a.x+=(x-a.x)*y,a.y+=(M-a.y)*y;if(g)for(fu(t=$o.geom.quadtree(d),r,o),e=-1;++e<_;)(a=d[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=d[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(d=n,a):d},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(v=+n,a):v},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),$o.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=m[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=d.length,l=m.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=d[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=m[t],"number"==typeof r.source&&(r.source=d[r.source]),"number"==typeof r.target&&(r.target=d[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=d[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,m[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,m[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,d[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=$o.behavior.drag().origin(vt).on("dragstart.force",au).on("drag.force",t).on("dragend.force",cu)),arguments.length?(this.on("mouseover.force",su).on("mouseout.force",lu).call(e),void 0):e},$o.rebind(a,c,"on")};var us=20,is=1;$o.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=vu,u=gu,i=pu;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},$o.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=$o.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},hu(e,r)},$o.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/$o.sum(o),s=$o.range(i.length);null!=e&&s.sort(e===os?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=os,r=0,u=Ea;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var os={};$o.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=$o.permute(s,f),l=$o.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=vt,e=Mu,r=_u,u=xu,i=mu,o=yu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:as.get(t)||Mu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:cs.get(t)||_u,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var as=$o.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(bu),i=n.map(wu),o=$o.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return $o.range(n.length).reverse()},"default":Mu}),cs=$o.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:_u});$o.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[$o.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=Au,u=ku;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return Eu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},$o.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;Pu(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=Lu(a),i=Nu(i),a&&i;)c=Nu(c),o=Lu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(Uu(ju(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!Lu(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!Nu(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];Du(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=Tu(l,zu),h=Tu(l,qu),g=Tu(l,Ru),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return Du(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Du(a,function(n){n.r=+l(n.value)}),Du(a,Iu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;Du(a,function(n){n.r+=f}),Du(a,Iu),Du(a,function(n){n.r-=f})}return Xu(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=$o.layout.hierarchy().sort(Hu),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},hu(n,e)},$o.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;Du(c,function(n){var t=n.children;t&&t.length?(n.x=Wu(t),n.y=Bu(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ju(c),f=Gu(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return Du(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=$o.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ku,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ku(t):Qu(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Qu(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ku:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},hu(i,a)},$o.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=$o.random.normal.apply($o,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},$o.scale={};var ss={floor:vt,ceil:vt};$o.scale.linear=function(){return oi([0,1],[0,1],qr,!1)};var ls={s:1,g:1,p:1,r:1,e:1};$o.scale.log=function(){return pi($o.scale.linear().domain([0,1]),10,!0,[1,10])};var fs=$o.format(".0e"),hs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};$o.scale.pow=function(){return vi($o.scale.linear(),1,[0,1])},$o.scale.sqrt=function(){return $o.scale.pow().exponent(.5)},$o.scale.ordinal=function(){return mi([],{t:"range",a:[[]]})},$o.scale.category10=function(){return $o.scale.ordinal().range(gs)},$o.scale.category20=function(){return $o.scale.ordinal().range(ps)},$o.scale.category20b=function(){return $o.scale.ordinal().range(vs)},$o.scale.category20c=function(){return $o.scale.ordinal().range(ds)};var gs=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),ps=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),vs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),ds=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);$o.scale.quantile=function(){return yi([],[])},$o.scale.quantize=function(){return xi(0,1,[0,1])},$o.scale.threshold=function(){return Mi([.5],[0,1])},$o.scale.identity=function(){return _i([0,1])},$o.svg={},$o.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ms,a=u.apply(this,arguments)+ms,c=(o>a&&(c=o,o=a,a=c),a-o),s=ka>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=ys?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=bi,e=wi,r=Si,u=ki;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ms;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ms=-Aa,ys=Ea-Ca;$o.svg.line=function(){return Ei(vt)};var xs=$o.map({linear:Ai,"linear-closed":Ci,step:Ni,"step-before":Li,"step-after":Ti,basis:Ui,"basis-open":ji,"basis-closed":Hi,bundle:Fi,cardinal:Ri,"cardinal-open":qi,"cardinal-closed":zi,monotone:Xi});xs.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ms=[0,2/3,1/3,0],_s=[0,1/3,2/3,0],bs=[0,1/6,2/3,1/6];$o.svg.line.radial=function(){var n=Ei($i);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},Li.reverse=Ti,Ti.reverse=Li,$o.svg.area=function(){return Bi(vt)},$o.svg.area.radial=function(){var n=Bi($i);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},$o.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ms,l=s.call(n,u,r)+ms;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ka)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Re,o=De,a=Wi,c=Si,s=ki;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(s=pt(t),n):s},n},$o.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=Re,e=De,r=Ji;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},$o.svg.diagonal.radial=function(){var n=$o.svg.diagonal(),t=Ji,e=n.projection;return n.projection=function(n){return arguments.length?e(Gi(t=n)):t},n},$o.svg.symbol=function(){function n(n,r){return(ws.get(t.call(this,n,r))||no)(e.call(this,n,r))}var t=Qi,e=Ki;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var ws=$o.map({circle:no,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*As)),e=t*As;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});$o.svg.symbolTypes=ws.keys();var Ss,ks,Es=Math.sqrt(3),As=Math.tan(30*La),Cs=[],Ns=0; -Cs.call=ma.call,Cs.empty=ma.empty,Cs.node=ma.node,Cs.size=ma.size,$o.transition=function(n){return arguments.length?Ss?n.transition():n:Ma.transition()},$o.transition.prototype=Cs,Cs.select=function(n){var t,e,r,u=this.id,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),uo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return to(i,u)},Cs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=d(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&uo(u,g,o,i),t.push(u)}return to(a,o)},Cs.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return to(u,this.id)},Cs.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):C(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Cs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?tu:qr,a=$o.ns.qualify(n);return eo(this,"attr."+n,t,a.local?i:u)},Cs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=$o.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Cs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Ko.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=qr(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return eo(this,"style."+n,t,u)},Cs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Ko.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Cs.text=function(n){return eo(this,"text",n,ro)},Cs.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Cs.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=$o.ease.apply($o,arguments)),C(this,function(e){e.__transition__[t].ease=n}))},Cs.delay=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Cs.duration=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Cs.each=function(n,t){var e=this.id;if(arguments.length<2){var r=ks,u=Ss;Ss=e,C(this,function(t,r,u){ks=t.__transition__[e],n.call(t,t.__data__,r,u)}),ks=r,Ss=u}else C(this,function(r){var u=r.__transition__[e];(u.event||(u.event=$o.dispatch("start","end"))).on(n,t)});return this},Cs.transition=function(){for(var n,t,e,r,u=this.id,i=++Ns,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,uo(e,s,i,r)),n.push(e)}return to(o,i)},$o.svg.axis=function(){function n(n){n.each(function(){var n,s=$o.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):vt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=$o.transition(p.exit()).style("opacity",Ca).remove(),m=$o.transition(p).style("opacity",1),y=ti(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),$o.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=io,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=io,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=oo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=oo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f.rangeBand()/2,A=function(n){return f(n)+E};v.call(n,A),m.call(n,A)}else v.call(n,l),m.call(n,f),d.call(n,f)})}var t,e=$o.scale.linear(),r=Ls,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ts?t+"":Ls,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ls="bottom",Ts={top:1,right:1,bottom:1,left:1};$o.svg.brush=function(){function n(i){i.each(function(){var i=$o.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(d,vt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return qs[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=$o.transition(i),h=$o.transition(o);c&&(l=ti(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=ti(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==$o.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=h[1],C=2),f())}function g(){32==$o.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=h[1],C=0,f())}function d(){var n=$o.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||($o.event.altKey?(x||(x=[(l[0]+l[1])/2,(h[0]+h[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=h[+(n[1]<x[1])]):x=null),E&&m(n,c,0)&&(e(S),u=!0),A&&m(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,a=ti(t),c=a[0],s=a[1],f=L[e],g=e?h:l,d=g[1]-g[0];return C&&(c-=f,s-=d+f),r=(e?v:p)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=f)+d:(x&&(f=Math.max(c,Math.min(s,2*x[e]-r))),r>f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){d(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),$o.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=$o.select($o.event.target),w=a.of(_,arguments),S=$o.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=D(),L=$o.mouse(_),T=$o.select(Ko).on("keydown.brush",u).on("keyup.brush",g);if($o.event.changedTouches?T.on("touchmove.brush",d).on("touchend.brush",y):T.on("mousemove.brush",d).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=h[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],h[1-z]-L[1]],L[0]=l[q],L[1]=h[z]}else $o.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),$o.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),d()}var i,o,a=g(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],h=[0,0],p=!0,v=!0,d=zs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ss?$o.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=zr(l,t.x),r=zr(h,t.y);return i=o=null,function(u){l=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,d=zs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,d=zs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(p=!!t[0],v=!!t[1]):c?p=!!t:s&&(v=!!t),n):c&&s?[p,v]:c?p:s?v:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(f=e,e=r,r=f),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&&(h=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(f=e,e=r,r=f))),s&&(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(f=u,u=a,a=f))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&h[0]==h[1]},$o.rebind(n,a,"on")};var qs={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},zs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Rs=$o.time={},Ds=Date,Ps=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ao.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Us.setUTCDate.apply(this._,arguments)},setDay:function(){Us.setUTCDay.apply(this._,arguments)},setFullYear:function(){Us.setUTCFullYear.apply(this._,arguments)},setHours:function(){Us.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Us.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Us.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Us.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Us.setUTCSeconds.apply(this._,arguments)},setTime:function(){Us.setTime.apply(this._,arguments)}};var Us=Date.prototype,js="%a %b %e %X %Y",Hs="%m/%d/%Y",Fs="%H:%M:%S",Os=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ys=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Is=["January","February","March","April","May","June","July","August","September","October","November","December"],Zs=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Rs.year=co(function(n){return n=Rs.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Rs.years=Rs.year.range,Rs.years.utc=Rs.year.utc.range,Rs.day=co(function(n){var t=new Ds(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Rs.days=Rs.day.range,Rs.days.utc=Rs.day.utc.range,Rs.dayOfYear=function(n){var t=Rs.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Ps.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Rs[n]=co(function(n){return(n=Rs.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Rs[n+"s"]=e.range,Rs[n+"s"].utc=e.utc.range,Rs[n+"OfYear"]=function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)}}),Rs.week=Rs.sunday,Rs.weeks=Rs.sunday.range,Rs.weeks.utc=Rs.sunday.utc.range,Rs.weekOfYear=Rs.sundayOfYear,Rs.format=lo;var Vs=ho(Os),Xs=go(Os),$s=ho(Ys),Bs=go(Ys),Ws=ho(Is),Js=go(Is),Gs=ho(Zs),Ks=go(Zs),Qs=/^%/,nl={"-":"",_:" ",0:"0"},tl={a:function(n){return Ys[n.getDay()]},A:function(n){return Os[n.getDay()]},b:function(n){return Zs[n.getMonth()]},B:function(n){return Is[n.getMonth()]},c:lo(js),d:function(n,t){return po(n.getDate(),t,2)},e:function(n,t){return po(n.getDate(),t,2)},H:function(n,t){return po(n.getHours(),t,2)},I:function(n,t){return po(n.getHours()%12||12,t,2)},j:function(n,t){return po(1+Rs.dayOfYear(n),t,3)},L:function(n,t){return po(n.getMilliseconds(),t,3)},m:function(n,t){return po(n.getMonth()+1,t,2)},M:function(n,t){return po(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return po(n.getSeconds(),t,2)},U:function(n,t){return po(Rs.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return po(Rs.mondayOfYear(n),t,2)},x:lo(Hs),X:lo(Fs),y:function(n,t){return po(n.getFullYear()%100,t,2)},Y:function(n,t){return po(n.getFullYear()%1e4,t,4)},Z:jo,"%":function(){return"%"}},el={a:vo,A:mo,b:_o,B:bo,c:wo,d:To,e:To,H:zo,I:zo,j:qo,L:Po,m:Lo,M:Ro,p:Uo,S:Do,U:xo,w:yo,W:Mo,x:So,X:ko,y:Ao,Y:Eo,Z:Co,"%":Ho},rl=/^\s*\d+/,ul=$o.map({am:0,pm:1});lo.utc=Fo;var il=Fo("%Y-%m-%dT%H:%M:%S.%LZ");lo.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:il,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=il.toString,Rs.second=co(function(n){return new Ds(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Rs.seconds=Rs.second.range,Rs.seconds.utc=Rs.second.utc.range,Rs.minute=co(function(n){return new Ds(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Rs.minutes=Rs.minute.range,Rs.minutes.utc=Rs.minute.utc.range,Rs.hour=co(function(n){var t=n.getTimezoneOffset()/60;return new Ds(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Rs.hours=Rs.hour.range,Rs.hours.utc=Rs.hour.utc.range,Rs.month=co(function(n){return n=Rs.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Rs.months=Rs.month.range,Rs.months.utc=Rs.month.utc.range;var ol=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],al=[[Rs.second,1],[Rs.second,5],[Rs.second,15],[Rs.second,30],[Rs.minute,1],[Rs.minute,5],[Rs.minute,15],[Rs.minute,30],[Rs.hour,1],[Rs.hour,3],[Rs.hour,6],[Rs.hour,12],[Rs.day,1],[Rs.day,2],[Rs.week,1],[Rs.month,1],[Rs.month,3],[Rs.year,1]],cl=[[lo("%Y"),Zt],[lo("%B"),function(n){return n.getMonth()}],[lo("%b %d"),function(n){return 1!=n.getDate()}],[lo("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[lo("%I %p"),function(n){return n.getHours()}],[lo("%I:%M"),function(n){return n.getMinutes()}],[lo(":%S"),function(n){return n.getSeconds()}],[lo(".%L"),function(n){return n.getMilliseconds()}]],sl=Zo(cl);al.year=Rs.year,Rs.scale=function(){return Yo($o.scale.linear(),al,sl)};var ll={range:function(n,t,e){return $o.range(+n,+t,e).map(Io)}},fl=al.map(function(n){return[n[0].utc,n[1]]}),hl=[[Fo("%Y"),Zt],[Fo("%B"),function(n){return n.getUTCMonth()}],[Fo("%b %d"),function(n){return 1!=n.getUTCDate()}],[Fo("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[Fo("%I %p"),function(n){return n.getUTCHours()}],[Fo("%I:%M"),function(n){return n.getUTCMinutes()}],[Fo(":%S"),function(n){return n.getUTCSeconds()}],[Fo(".%L"),function(n){return n.getUTCMilliseconds()}]],gl=Zo(hl);return fl.year=Rs.year.utc,Rs.scale.utc=function(){return Yo($o.scale.linear(),fl,gl)},$o.text=dt(function(n){return n.responseText}),$o.json=function(n,t){return mt(n,"application/json",Vo,t)},$o.html=function(n,t){return mt(n,"text/html",Xo,t)},$o.xml=dt(function(n){return n.responseXML}),$o}();</script> -<script type="text/javascript">var RadarChart = { - draw: function(id, d, options){ - var cfg = { - radius: 5, - w: 600, - h: 600, - factor: .95, - factorLegend: 1, - levels: 3, - maxValue: 0, - radians: 2 * Math.PI, - opacityArea: 0.5, - color: d3.scale.category10(), - fontSize: 10 - }; - if('undefined' !== typeof options){ - for(var i in options){ - if('undefined' !== typeof options[i]){ - cfg[i] = options[i]; - } - } - } - cfg.maxValue = Math.max(cfg.maxValue, d3.max(d, function(i){return d3.max(i.map(function(o){return o.value;}))})); - var allAxis = (d[0].map(function(i, j){return i.axis})); - var total = allAxis.length; - var radius = cfg.factor*Math.min(cfg.w/2, cfg.h/2); - d3.select(id).select("svg").remove(); - var g = d3.select(id).append("svg").attr("width", cfg.w).attr("height", 0.75 * cfg.h).append("g"); - - var tooltip; - function getPosition(i, range, factor, func){ - factor = typeof factor !== 'undefined' ? factor : 1; - return range * (1 - factor * func(i * cfg.radians / total)); - } - function getHorizontalPosition(i, range, factor){ - return getPosition(i, range, factor, Math.sin); - } - function getVerticalPosition(i, range, factor){ - return getPosition(i, range, factor, Math.cos); - } - - for(var j=0; j<cfg.levels; j++){ - var levelFactor = radius*((j+1)/cfg.levels); - g.selectAll(".levels").data(allAxis).enter().append("svg:line") - .attr("x1", function(d, i){return getHorizontalPosition(i, levelFactor);}) - .attr("y1", function(d, i){return getVerticalPosition(i, levelFactor);}) - .attr("x2", function(d, i){return getHorizontalPosition(i+1, levelFactor);}) - .attr("y2", function(d, i){return getVerticalPosition(i+1, levelFactor);}) - .attr("class", "line").style("stroke", "grey").style("stroke-width", "0.5px").attr("transform", "translate(" + (cfg.w/2-levelFactor) + ", " + (cfg.h/2-levelFactor) + ")"); - - } - - series = 0; - - var axis = g.selectAll(".axis").data(allAxis).enter().append("g").attr("class", "axis"); - - axis.append("line") - .attr("x1", cfg.w/2) - .attr("y1", cfg.h/2) - .attr("x2", function(j, i){return getHorizontalPosition(i, cfg.w/2, cfg.factor);}) - .attr("y2", function(j, i){return getVerticalPosition(i, cfg.h/2, cfg.factor);}) - .attr("class", "line").style("stroke", "grey").style("stroke-width", "1px"); - - axis.append("text").attr("class", function(d){ return "legend_" + d.replace("/", "") }) - .text(function(d){return d}) - .style("font-size", cfg.fontSize + "px") - .style("text-anchor", function(d, i){ - var p = getHorizontalPosition(i, 0.5); - return (p < 0.4) ? "start" : ((p > 0.6) ? "end" : "middle"); - }) - .attr("transform", function(d, i){ - var p = getVerticalPosition(i, cfg.h / 2); - return p < cfg.fontSize ? "translate(0, " + (cfg.fontSize - p) + ")" : ""; - }) - .attr("x", function(d, i){return getHorizontalPosition(i, cfg.w / 2, cfg.factorLegend);}) - .attr("y", function(d, i){return getVerticalPosition(i, cfg.h / 2, cfg.factorLegend);}); - - d.forEach(function(y, x){ - dataValues = []; - g.selectAll(".nodes") - .data(y, function(j, i){ - dataValues.push([ - getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), - getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) - ]); - }); - dataValues.push(dataValues[0]); - g.selectAll(".area") - .data([dataValues]) - .enter() - .append("polygon") - .attr("class", "radar-chart-serie"+series) - .style("stroke-width", "2px") - .style("stroke", cfg.color(series)) - .attr("points",function(d) { - var str=""; - for(var pti=0;pti<d.length;pti++){ - str=str+d[pti][0]+","+d[pti][1]+" "; - } - return str; - }) - .style("fill", function(j, i){return cfg.color(series)}) - .style("fill-opacity", cfg.opacityArea) - .on('mouseover', function (d){ - z = "polygon."+d3.select(this).attr("class"); - g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); - g.selectAll(z).transition(200).style("fill-opacity", .7); - }) - .on('mouseout', function(){ - g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); - }); - series++; - }); - series=0; - - - d.forEach(function(y, x){ - g.selectAll(".nodes") - .data(y).enter() - .append("svg:circle").attr("class", "radar-chart-serie"+series) - .attr('r', cfg.radius) - .attr("alt", function(j){return Math.max(j.value, 0)}) - .attr("cx", function(j, i){ - dataValues.push([ - getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), - getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) - ]); - return getHorizontalPosition(i, cfg.w/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); - }) - .attr("cy", function(j, i){ - return getVerticalPosition(i, cfg.h/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); - }) - .attr("data-id", function(j){return j.axis}) - .style("fill", cfg.color(series)).style("fill-opacity", .9) - .on('mouseover', function (d){ - newX = parseFloat(d3.select(this).attr('cx')) - 10; - newY = parseFloat(d3.select(this).attr('cy')) - 5; - tooltip.attr('x', newX).attr('y', newY).text(d.value).transition(200).style('opacity', 1); - z = "polygon."+d3.select(this).attr("class"); - g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); - g.selectAll(z).transition(200).style("fill-opacity", .7); - }) - .on('mouseout', function(){ - tooltip.transition(200).style('opacity', 0); - g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); - }) - .append("svg:title") - .text(function(j){return Math.max(j.value, 0)}); - - series++; - }); - //Tooltip - tooltip = g.append('text').style('opacity', 0).style('font-family', 'sans-serif').style('font-size', '13px'); - } -} - -</script> -<script type="text/javascript">window.onload = function() { - var cpu = 88.6; - var mpi = 11.4; - var io = 0.0; - - // Draw radar chart, choose its color based on application classification - var radar_data = [[ { axis: "CPU", value: cpu }, - { axis: "MPI", value: mpi }, - { axis: "I/O", value: io } ]]; - var radar_options = { w: 200, h: 200, factor: 0.7, fontSize: 16, radius: 0, - opacityArea: 0.64, maxValue: 100, - color: function() { - if ("cpu" == "io") return "#ed8140"; - if ("cpu" == "cpu") return "#4fd32e"; - if ("cpu" == "mpi") return "#409ded"; - else return "#bb58d6"; - } - }; - RadarChart.draw("#time_radar", radar_data, radar_options); - - // Wrap the exe path on slashes if necessary - var exe_path = document.getElementById("exe_path"); - exe_path.innerHTML = exe_path.innerHTML.replace(/\//g, '/​'); // insert a zero width space after slashes as a word wrap hint - - // Format our byte value numbers to show at most 2 decimal places, but only if required to attain 3 digits of precision - // 1234.56 -> "1234" - // 12.3456 -> "12.3" - // 1.23456 -> "1.23" - // 0.00000 -> "0.00" - var formatNumber = function(num) { - if (num > 100) return new Number(num).toFixed(0); // 1234.56 -> 1234 - if (num > 10) return new Number(num).toFixed(1); // 12.3456 -> 12.3 - else return new Number(num).toFixed(2); // 1.23456 -> 1.23 and 0 -> 0.00 - } - - // Parse a number, but return 0 for invalid numbers, not NaN - var toNumber = function(num_str) { - var num = Number(num_str) - return isNaN(num) ? 0 : num; - } - - // Scale byte values to bytes, kB, MB or GB as appropriate - var fillBytes = function(base_name, bytes_str, per_second) { - var units = "bytes"; - var scale = 1.0; - var bytes = Number(bytes_str) - if (isNaN(bytes) ) { units = "" ; } - else if (bytes > 1000000000) { units = "GB"; scale = 1*1000*1000*1000; } - else if (bytes > 1000000 ) { units = "MB"; scale = 1*1000*1000 } - else if (bytes > 1000 ) { units = "kB"; scale = 1*1000 } - var num = isNaN(bytes) ? bytes_str : formatNumber(bytes / scale); - var elementNum = document.getElementById(base_name + "_num"); - elementNum.innerHTML = num; - var elementUnits = document.getElementById(base_name + "_units"); - elementUnits.innerHTML = units + (per_second && !isNaN(bytes) ? "/s" : ""); - }; - - // Fill all the byte numbers and their units with the scaled values - fillBytes("mpi_colrate", "1.65e+02", true); - fillBytes("mpi_p2prate", "0.00e+00", true); - fillBytes("io_readrate", "0.00e+00", true); - fillBytes("io_writerate", "0.00e+00", true); - fillBytes("ram_mean", "2.33e+07", false); - fillBytes("ram_peak", "2.35e+07", false); - - // Set widths for all graphs - var bar = function(name, width) { - var rounded = Math.round(width); - if (!isFinite(rounded) || rounded < 1) - document.getElementById(name).style.width = "1px" - else - document.getElementById(name).style.width = rounded + "px"; - }; - bar("cpu_bar", cpu * 2); - bar("mpi_bar", mpi * 2); - bar("io_bar", io * 2); - - bar("cpu_num_bar", toNumber("50.0") / 2); - bar("cpu_vec_bar", toNumber("50.0") / 2); - bar("cpu_mem_bar", toNumber("0.0") / 2); - bar("cpu_other_bar", toNumber("0.0") / 2); - - bar("mpi_col_bar", toNumber("100.0") / 2); - bar("mpi_p2p_bar", toNumber("0.0") / 2); - var mpi_scale = Math.max(toNumber("1.65e+02"), toNumber("0.00e+00")); - bar("mpi_colrate_bar", 50 * toNumber("1.65e+02") / mpi_scale); - bar("mpi_p2prate_bar", 50 * toNumber("0.00e+00") / mpi_scale); - - bar("io_read_bar", toNumber("0.0") / 2); - bar("io_write_bar", toNumber("0.0") / 2); - var io_scale = Math.max(toNumber("0.00e+00"), toNumber("0.00e+00")); - bar("io_readrate_bar", 50 * toNumber("0.00e+00") / io_scale); - bar("io_writerate_bar", 50 * toNumber("0.00e+00") / io_scale); - - bar("ram_mean_bar", 50 * toNumber("2.33e+07") / toNumber("2.35e+07")); - bar("ram_peak_bar", 50); - bar("ram_node_bar", toNumber("2.8") / 2); - - // Formatting replacement helper function - var replaceIn = function(elementId, re, new_text) { - element = document.getElementById(elementId); - element.innerHTML = element.innerHTML.replace(re, new_text); - }; - - // Add formatting for the overview advice section - replaceIn('overview_advice', /CPU/g, '<span class="cpu_span">CPU</span>'); - replaceIn('overview_advice', /MPI/g, '<span class="mpi_span">MPI</span>'); - replaceIn('overview_advice', /I\/O/g, '<span class="io_span">I\/O</span>'); - - // Add formatting for the CPU advice section - if ( 88.6 < 0.05 ) - replaceIn('cpu_explanation', /application code/g, '<span class="cpu_span">application code</span>'); - replaceIn('cpu_explanation', /vectorized instructions/g, '<span class="cpu_vec_span">vectorized instructions</span>'); - replaceIn('cpu_explanation', /memory accesses/g, '<span class="cpu_mem_span">memory accesses</span>'); - replaceIn('cpu_explanation', /memory-bound/g, '<span class="cpu_mem_span">memory-bound</span>'); - replaceIn('cpu_explanation', /arithmetic-bound/g, '<span class="cpu_num_span">arithmetic-bound</span>'); - replaceIn('cpu_explanation', /numerical computation/g, '<span class="cpu_num_span">numerical computation</span>'); - - // Add formatting for the MPI advice section - if ( 11.4 < 0.05 ) - replaceIn('mpi_explanation', /MPI/g, '<span class="mpi_span">MPI</span>'); - replaceIn('mpi_explanation', /collective calls/g, '<span class="mpi_col_span">collective calls</span>'); - replaceIn('mpi_explanation', /point-to-point calls/g, '<span class="mpi_p2p_span">point-to-point calls</span>'); - replaceIn('mpi_explanation', / very low/g, ' <span class="mpi_colrate_span">very low</span>'); - replaceIn('mpi_explanation', / low/g, ' <span class="mpi_colrate_span">low</span>'); - replaceIn('mpi_explanation', / average/g, ' <span class="mpi_colrate_span">average</span>'); - replaceIn('mpi_explanation', / very high/g, ' <span class="mpi_colrate_span">very high</span>'); - replaceIn('mpi_explanation', / high/g, ' <span class="mpi_colrate_span">high</span>'); - - // Add formatting for the I/O advice section - if ( 0.0 < 0.05 ) - replaceIn('io_explanation', /I\/O/g, '<span class="io_span">I/O</span>'); - replaceIn('io_explanation', /read operations/g, '<span class="io_read_span">read operations</span>'); - replaceIn('io_explanation', /write operations/g, '<span class="io_write_span">write operations</span>'); - replaceIn('io_explanation', / very low/g, ' <span class="io_readrate_span">very low</span>'); - replaceIn('io_explanation', / low/g, ' <span class="io_readrate_span">low</span>'); - replaceIn('io_explanation', / average/g, ' <span class="io_readrate_span">average</span>'); - replaceIn('io_explanation', / very high/g, ' <span class="io_readrate_span">very high</span>'); - replaceIn('io_explanation', / high/g, ' <span class="io_readrate_span">high</span>'); - - // Add formatting for the RAM advice section - replaceIn('ram_explanation', /high/g, ' <span class="ram_node_span">high</span>'); - replaceIn('ram_explanation', /well-balanced/g, '<span class="ram_peak_span">well-balanced</span>'); - replaceIn('ram_explanation', /significant variation/g, '<span class="ram_peak_span">significant variation</span>'); - replaceIn('ram_explanation', /peak node memory usage/g, '<span class="ram_node_span">peak node memory usage</span>'); - - // Hide the error warning if the script got this far - document.getElementById('error').style.display = 'none'; -}; -</script> -</head> - -<body> -<div id="content"> - -<div class="header"> - <div class="logo"><img src="http://content.allinea.com/downloads/performance-report-logo.png" alt="Allinea Performance Reports" /></div> - <div class="header_left"> - <div class="application_details"> - <table> - <tr><td class="details_key">Executable:</td><td id="exe_name">mympiprog.x</td></tr> - <tr><td class="details_key">Resources:</td><td id="num_procs">32 processes, 2 nodes</td></tr> - <tr><td class="details_key">Machine:</td><td id="machine_name">cn182</td></tr> - <tr><td class="details_key">Start time:</td><td id="start_date">Wed Oct 15 16:56:23 2014</td></tr> - <tr><td class="details_key">Total time:</td><td id="time_string">7 seconds (0 minutes)</td></tr> - <tr><td class="details_key">Full path:</td><td id="exe_path">/home/user</td></tr> - <tr><td class="details_key">Notes:</td><td id="notes"></td></tr> - </table> - </div> - </div> - <div id="time_radar"></div> - <div class="clear"></div> -</div> -<hr /> -<div id="error"> -<p><strong>Error: javascript is not running</strong></p> -<p>The graphs in this Performance Report require <strong>javascript</strong>, which is disabled or not working.</p> -<p>Check whether your javascript support is enabled or try another browser.<p> -<p>Remember, you can always contact <a href="mailto:support@allinea.com">support@allinea.com</a>, we're very nice!</p> -</div> -<div class="summary"> - <div class="heading">Summary: mympiprog.x is <span class="cpu_span">CPU-bound</span> in this configuration</div> - <div>The total wallclock time was spent as follows:</div> - <table class="summary_table"> - <tr><td class="heading_cpu">CPU</td><td class="percent">88.6%</td><td class="bar_graph"><div id="cpu_bar" /></td> - <td class="details"><p>Time spent running application code. High values are usually good.</p><p>This is <span id="summary_cpu_class">high</span>; check the CPU performance section for optimization advice.</p></td></tr> - <tr><td class="heading_mpi">MPI</td><td class="percent">11.4%</td><td class="bar_graph"><div id="mpi_bar" /></td> - <td class="details"><p>Time spent in MPI calls. High values are usually bad.</p><p>This is <span id="summary_mpi_class">very low</span>; this code may benefit from increasing the process count.</p></td></tr> - <tr><td class="heading_io">I/O</td><td class="percent">0.0%</td><td class="bar_graph"><div id="io_bar" /></td> - <td class="details"><p>Time spent in filesystem I/O. High values are usually bad.</p><p>This is <span id="summary_io_class">negligible</span>; there's no need to investigate I/O performance.</p></td></tr> - </table> - <div class="overview_general_advice"><p>This application run was <span class="cpu_span">CPU-bound</span>. A breakdown of this time and advice for investigating further is in the <span class="cpu_span">CPU</span> section below.</p><p id="overview_advice">As very little time is spent in MPI calls, this code may also benefit from running at larger scales.</p></div> -</div> -<hr /> -<div class="subsections"> - <div class="ltcol"> - <div class="heading_cpu">CPU</div> - <div>A breakdown of how the <span class="cpu_span">88.6</span>% total CPU time was spent:</div> - <table id="cpu_chart"> - <tr><td>Scalar numeric ops</td><td class="right_cell"><span class="cpu_num_span">50.0</span>%</td><td class="mini_bar_graph"><div id="cpu_num_bar" /></td></tr> - <tr><td>Vector numeric ops</td><td class="right_cell"><span class="cpu_vec_span">50.0</span>%</td><td class="mini_bar_graph"><div id="cpu_vec_bar" /></td></tr> - <tr><td>Memory accesses</td><td class="right_cell"><span class="cpu_mem_span">0.0</span>%</td><td class="mini_bar_graph"><div id="cpu_mem_bar" /></td></tr> - <tr><td>Other</td><td class="right_cell"><span class="cpu_other_span">0.0</span>%</td><td class="mini_bar_graph"><div id="cpu_other_bar" /></td></tr> - </table> - <div id="cpu_explanation"> - <div class="explanation">The per-core performance is arithmetic-bound. Try to increase the amount of time spent in vectorized instructions by analyzing the compiler's vectorization reports.</div> - <div class="explanation"></div> - </div> - </div> - <div class="rtcol"> - <div class="heading_mpi">MPI</div> - <div>Of the <span class="mpi_span">11.4</span>% total time spent in MPI calls:</div> - <table id="mpi_chart"> - <tr><td>Time in collective calls</td><td class="right_cell"><span class="mpi_col_span">100.0</span>%</td><td class="mini_bar_graph"><div id="mpi_col_bar" /></td></tr> - <tr><td>Time in point-to-point calls</td><td class="right_cell"><span class="mpi_p2p_span">0.0</span>%</td><td class="mini_bar_graph"><div id="mpi_p2p_bar" /></td></tr> - <tr><td>Effective process collective rate</td><td class="right_cell"><span class="mpi_colrate_span"><span id="mpi_colrate_num">1.65e+02</span></span> <span id="mpi_colrate_units"></span></td><td class="mini_bar_graph"><div id="mpi_colrate_bar" /></td></tr> - <tr><td>Effective process point-to-point rate</td><td class="right_cell"><span class="mpi_p2prate_span"><span id="mpi_p2prate_num">0.00e+00</span></span> <span id="mpi_p2prate_units"></span></td><td class="mini_bar_graph"><div id="mpi_p2prate_bar" /></td></tr> - </table> - <div id="mpi_explanation"> - <div class="explanation">Most of the time is spent in collective calls with a very low transfer rate. This suggests load imbalance is causing synchonization overhead; use an MPI profiler to investigate further.</div> - <div class="explanation"></div> - </div> - </div> - <div class="clear"></div> -</div> -<div class="subsections"> - <div class="ltcol"> - <div class="heading_io">I/O</div> - <div>A breakdown of how the <span class="io_span">0.0</span>% total I/O time was spent:</div> - <table id="io_chart"> - <tr><td>Time in reads</td><td class="right_cell"><span class="io_read_span">0.0</span>%</td><td class="mini_bar_graph"><div id="io_read_bar" /></td></tr> - <tr><td>Time in writes</td><td class="right_cell"><span class="io_write_span">0.0</span>%</td><td class="mini_bar_graph"><div id="io_write_bar" /></td></tr> - <tr><td>Effective process read rate</td><td class="right_cell"><span class="io_readrate_span"><span id="io_readrate_num">0.00e+00</span></span> <span id="io_readrate_units"></span></td><td class="mini_bar_graph"><div id="io_readrate_bar" /></td></tr> - <tr><td>Effective process write rate</td><td class="right_cell"><span class="io_writerate_span"><span id="io_writerate_num">0.00e+00</span></span> <span id="io_writerate_units"></span></td><td class="mini_bar_graph"><div id="io_writerate_bar" /></td></tr> - </table> - <div id="io_explanation"> - <div class="explanation">No time is spent in I/O operations. There's nothing to optimize here!</div> - <div class="explanation"></div> - </div> - </div> - <div class="rtcol"> - <div class="heading_ram">Memory</div> - <div>Per-process memory usage may also affect scaling:</div> - <table id="ram_chart"> - <tr><td>Mean process memory usage</td><td class="right_cell"><span class="ram_mean_span"><span id="ram_mean_num">2.33e+07</span></span> <span id="ram_mean_units"></span></td><td class="mini_bar_graph"><div id="ram_mean_bar" /></td></tr> - <tr><td>Peak process memory usage</td><td class="right_cell"><span class="ram_peak_span"><span id="ram_peak_num">2.35e+07</span></span> <span id="ram_peak_units"></span></td><td class="mini_bar_graph"><div id="ram_peak_bar" /></td></tr> - <tr><td>Peak node memory usage</td><td class="right_cell"><span class="ram_node_span">2.8</span>%</td><td class="mini_bar_graph"><div id="ram_node_bar" /></td></tr> - </table> - <div id="ram_explanation"> - <div class="explanation">The peak node memory usage is very low. You may be able to reduce the amount of allocation time used by running with fewer MPI processes and more data on each process.</div> - <div class="explanation"></div> - </div> - </div> - <div class="clear"></div> -</div> -</div> <!-- content --> -</body> -</html> diff --git a/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.txt b/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.txt deleted file mode 100644 index de8449179640fd943a9f007f9eda084b11f2a455..0000000000000000000000000000000000000000 --- a/public/it4i/software/debuggers/mympiprog_32p_2014-10-15_16-56.txt +++ /dev/null @@ -1,50 +0,0 @@ -Executable: mympiprog.x -Resources: 32 processes, 2 nodes -Machine: cn182 -Started on: Wed Oct 15 16:56:23 2014 -Total time: 7 seconds (0 minutes) -Full path: /home/user -Notes: - -Summary: mympiprog.x is CPU-bound in this configuration -CPU: 88.6% |========| -MPI: 11.4% || -I/O: 0.0% | -This application run was CPU-bound. A breakdown of this time and advice for investigating further is found in the CPU section below. -As very little time is spent in MPI calls, this code may also benefit from running at larger scales. - -CPU: -A breakdown of how the 88.6% total CPU time was spent: -Scalar numeric ops: 50.0% |====| -Vector numeric ops: 50.0% |====| -Memory accesses: 0.0% | -Other: 0.0% | -The per-core performance is arithmetic-bound. Try to increase the amount of time spent in vectorized instructions by analyzing the compiler's vectorization reports. - - -MPI: -A breakdown of how the 11.4% total MPI time was spent: -Time in collective calls: 100.0% |=========| -Time in point-to-point calls: 0.0% | -Effective collective rate: 1.65e+02 bytes/s -Effective point-to-point rate: 0.00e+00 bytes/s -Most of the time is spent in collective calls with a very low transfer rate. This suggests load imbalance is causing synchonization overhead; use an MPI profiler to investigate further. - - -I/O: -A breakdown of how the 0.0% total I/O time was spent: -Time in reads: 0.0% | -Time in writes: 0.0% | -Effective read rate: 0.00e+00 bytes/s -Effective write rate: 0.00e+00 bytes/s -No time is spent in I/O operations. There's nothing to optimize here! - - -Memory: -Per-process memory usage may also affect scaling: -Mean process memory usage: 2.33e+07 bytes -Peak process memory usage: 2.35e+07 bytes -Peak node memory usage: 2.8% | -The peak node memory usage is very low. You may be able to reduce the amount of allocation time used by running with fewer MPI processes and more data on each process. - - diff --git a/public/it4i/software/lang/winston.svg b/public/it4i/software/lang/winston.svg deleted file mode 100644 index cb8c06c2a4ba3cfe94eac6b131819376d8bf0a35..0000000000000000000000000000000000000000 --- a/public/it4i/software/lang/winston.svg +++ /dev/null @@ -1,120 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450pt" height="300pt" viewBox="0 0 450 300" version="1.1"> -<defs> -<g> -<symbol overflow="visible" id="glyph0-0"> -<path style="stroke:none;" d="M 0.640625 2.296875 L 0.640625 -9.171875 L 7.140625 -9.171875 L 7.140625 2.296875 Z M 1.375 1.578125 L 6.421875 1.578125 L 6.421875 -8.4375 L 1.375 -8.4375 Z M 1.375 1.578125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-1"> -<path style="stroke:none;" d="M 1.375 -4.609375 L 9.515625 -4.609375 L 9.515625 -3.53125 L 1.375 -3.53125 Z M 1.375 -4.609375 "/> -</symbol> -<symbol overflow="visible" id="glyph0-2"> -<path style="stroke:none;" d="M 4.90625 -8.359375 L 1.671875 -3.296875 L 4.90625 -3.296875 Z M 4.578125 -9.484375 L 6.1875 -9.484375 L 6.1875 -3.296875 L 7.546875 -3.296875 L 7.546875 -2.234375 L 6.1875 -2.234375 L 6.1875 0 L 4.90625 0 L 4.90625 -2.234375 L 0.640625 -2.234375 L 0.640625 -3.46875 Z M 4.578125 -9.484375 "/> -</symbol> -<symbol overflow="visible" id="glyph0-3"> -<path style="stroke:none;" d="M 2.5 -1.078125 L 6.96875 -1.078125 L 6.96875 0 L 0.953125 0 L 0.953125 -1.078125 C 1.441406 -1.578125 2.101562 -2.25 2.9375 -3.09375 C 3.78125 -3.945312 4.3125 -4.5 4.53125 -4.75 C 4.9375 -5.207031 5.21875 -5.597656 5.375 -5.921875 C 5.539062 -6.242188 5.625 -6.554688 5.625 -6.859375 C 5.625 -7.367188 5.445312 -7.78125 5.09375 -8.09375 C 4.75 -8.40625 4.289062 -8.5625 3.71875 -8.5625 C 3.3125 -8.5625 2.882812 -8.492188 2.4375 -8.359375 C 2 -8.222656 1.523438 -8.007812 1.015625 -7.71875 L 1.015625 -9.015625 C 1.535156 -9.222656 2.019531 -9.378906 2.46875 -9.484375 C 2.914062 -9.597656 3.320312 -9.65625 3.6875 -9.65625 C 4.675781 -9.65625 5.460938 -9.40625 6.046875 -8.90625 C 6.628906 -8.414062 6.921875 -7.757812 6.921875 -6.9375 C 6.921875 -6.550781 6.847656 -6.179688 6.703125 -5.828125 C 6.554688 -5.484375 6.289062 -5.078125 5.90625 -4.609375 C 5.800781 -4.484375 5.460938 -4.125 4.890625 -3.53125 C 4.328125 -2.945312 3.53125 -2.128906 2.5 -1.078125 Z M 2.5 -1.078125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-4"> -<path style="stroke:none;" d="M 4.125 -8.640625 C 3.46875 -8.640625 2.972656 -8.3125 2.640625 -7.65625 C 2.304688 -7.007812 2.140625 -6.035156 2.140625 -4.734375 C 2.140625 -3.429688 2.304688 -2.453125 2.640625 -1.796875 C 2.972656 -1.148438 3.46875 -0.828125 4.125 -0.828125 C 4.789062 -0.828125 5.289062 -1.148438 5.625 -1.796875 C 5.957031 -2.453125 6.125 -3.429688 6.125 -4.734375 C 6.125 -6.035156 5.957031 -7.007812 5.625 -7.65625 C 5.289062 -8.3125 4.789062 -8.640625 4.125 -8.640625 Z M 4.125 -9.65625 C 5.1875 -9.65625 6 -9.234375 6.5625 -8.390625 C 7.125 -7.546875 7.40625 -6.328125 7.40625 -4.734375 C 7.40625 -3.140625 7.125 -1.921875 6.5625 -1.078125 C 6 -0.234375 5.1875 0.1875 4.125 0.1875 C 3.070312 0.1875 2.265625 -0.234375 1.703125 -1.078125 C 1.140625 -1.921875 0.859375 -3.140625 0.859375 -4.734375 C 0.859375 -6.328125 1.140625 -7.546875 1.703125 -8.390625 C 2.265625 -9.234375 3.070312 -9.65625 4.125 -9.65625 Z M 4.125 -9.65625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-5"> -<path style="stroke:none;" d="M 4.296875 -5.25 C 3.710938 -5.25 3.253906 -5.050781 2.921875 -4.65625 C 2.585938 -4.257812 2.421875 -3.722656 2.421875 -3.046875 C 2.421875 -2.359375 2.585938 -1.816406 2.921875 -1.421875 C 3.253906 -1.023438 3.710938 -0.828125 4.296875 -0.828125 C 4.867188 -0.828125 5.320312 -1.023438 5.65625 -1.421875 C 5.988281 -1.816406 6.15625 -2.359375 6.15625 -3.046875 C 6.15625 -3.722656 5.988281 -4.257812 5.65625 -4.65625 C 5.320312 -5.050781 4.867188 -5.25 4.296875 -5.25 Z M 6.84375 -9.265625 L 6.84375 -8.09375 C 6.519531 -8.25 6.191406 -8.363281 5.859375 -8.4375 C 5.535156 -8.519531 5.210938 -8.5625 4.890625 -8.5625 C 4.046875 -8.5625 3.398438 -8.273438 2.953125 -7.703125 C 2.503906 -7.140625 2.25 -6.28125 2.1875 -5.125 C 2.4375 -5.488281 2.75 -5.769531 3.125 -5.96875 C 3.5 -6.164062 3.914062 -6.265625 4.375 -6.265625 C 5.320312 -6.265625 6.070312 -5.972656 6.625 -5.390625 C 7.175781 -4.816406 7.453125 -4.035156 7.453125 -3.046875 C 7.453125 -2.066406 7.160156 -1.28125 6.578125 -0.6875 C 6.003906 -0.101562 5.242188 0.1875 4.296875 0.1875 C 3.191406 0.1875 2.347656 -0.234375 1.765625 -1.078125 C 1.191406 -1.921875 0.90625 -3.140625 0.90625 -4.734375 C 0.90625 -6.222656 1.257812 -7.414062 1.96875 -8.3125 C 2.6875 -9.207031 3.644531 -9.65625 4.84375 -9.65625 C 5.15625 -9.65625 5.472656 -9.617188 5.796875 -9.546875 C 6.128906 -9.484375 6.476562 -9.390625 6.84375 -9.265625 Z M 6.84375 -9.265625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-6"> -<path style="stroke:none;" d="M 4.125 -4.5 C 3.519531 -4.5 3.039062 -4.332031 2.6875 -4 C 2.34375 -3.675781 2.171875 -3.234375 2.171875 -2.671875 C 2.171875 -2.097656 2.34375 -1.644531 2.6875 -1.3125 C 3.039062 -0.988281 3.519531 -0.828125 4.125 -0.828125 C 4.738281 -0.828125 5.21875 -0.988281 5.5625 -1.3125 C 5.914062 -1.644531 6.09375 -2.097656 6.09375 -2.671875 C 6.09375 -3.234375 5.914062 -3.675781 5.5625 -4 C 5.21875 -4.332031 4.738281 -4.5 4.125 -4.5 Z M 2.84375 -5.046875 C 2.300781 -5.179688 1.875 -5.4375 1.5625 -5.8125 C 1.257812 -6.1875 1.109375 -6.644531 1.109375 -7.1875 C 1.109375 -7.945312 1.375 -8.546875 1.90625 -8.984375 C 2.445312 -9.429688 3.1875 -9.65625 4.125 -9.65625 C 5.070312 -9.65625 5.8125 -9.429688 6.34375 -8.984375 C 6.882812 -8.546875 7.15625 -7.945312 7.15625 -7.1875 C 7.15625 -6.644531 7 -6.1875 6.6875 -5.8125 C 6.382812 -5.4375 5.960938 -5.179688 5.421875 -5.046875 C 6.035156 -4.898438 6.515625 -4.617188 6.859375 -4.203125 C 7.203125 -3.785156 7.375 -3.273438 7.375 -2.671875 C 7.375 -1.742188 7.09375 -1.035156 6.53125 -0.546875 C 5.976562 -0.0546875 5.175781 0.1875 4.125 0.1875 C 3.082031 0.1875 2.28125 -0.0546875 1.71875 -0.546875 C 1.15625 -1.035156 0.875 -1.742188 0.875 -2.671875 C 0.875 -3.273438 1.046875 -3.785156 1.390625 -4.203125 C 1.742188 -4.617188 2.226562 -4.898438 2.84375 -5.046875 Z M 2.375 -7.078125 C 2.375 -6.578125 2.523438 -6.191406 2.828125 -5.921875 C 3.140625 -5.648438 3.570312 -5.515625 4.125 -5.515625 C 4.675781 -5.515625 5.109375 -5.648438 5.421875 -5.921875 C 5.734375 -6.191406 5.890625 -6.578125 5.890625 -7.078125 C 5.890625 -7.566406 5.734375 -7.945312 5.421875 -8.21875 C 5.109375 -8.5 4.675781 -8.640625 4.125 -8.640625 C 3.570312 -8.640625 3.140625 -8.5 2.828125 -8.21875 C 2.523438 -7.945312 2.375 -7.566406 2.375 -7.078125 Z M 2.375 -7.078125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-7"> -<path style="stroke:none;" d="M 1.609375 -1.078125 L 3.703125 -1.078125 L 3.703125 -8.3125 L 1.421875 -7.859375 L 1.421875 -9.015625 L 3.6875 -9.484375 L 4.984375 -9.484375 L 4.984375 -1.078125 L 7.078125 -1.078125 L 7.078125 0 L 1.609375 0 Z M 1.609375 -1.078125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-8"> -<path style="stroke:none;" d="M 5.28125 -5.109375 C 5.894531 -4.972656 6.375 -4.695312 6.71875 -4.28125 C 7.0625 -3.875 7.234375 -3.363281 7.234375 -2.75 C 7.234375 -1.820312 6.910156 -1.097656 6.265625 -0.578125 C 5.617188 -0.0664062 4.703125 0.1875 3.515625 0.1875 C 3.117188 0.1875 2.707031 0.144531 2.28125 0.0625 C 1.863281 -0.0078125 1.429688 -0.125 0.984375 -0.28125 L 0.984375 -1.53125 C 1.347656 -1.320312 1.738281 -1.160156 2.15625 -1.046875 C 2.582031 -0.941406 3.023438 -0.890625 3.484375 -0.890625 C 4.285156 -0.890625 4.894531 -1.046875 5.3125 -1.359375 C 5.738281 -1.679688 5.953125 -2.144531 5.953125 -2.75 C 5.953125 -3.3125 5.753906 -3.75 5.359375 -4.0625 C 4.972656 -4.375 4.429688 -4.53125 3.734375 -4.53125 L 2.625 -4.53125 L 2.625 -5.59375 L 3.78125 -5.59375 C 4.414062 -5.59375 4.898438 -5.71875 5.234375 -5.96875 C 5.566406 -6.21875 5.734375 -6.582031 5.734375 -7.0625 C 5.734375 -7.539062 5.5625 -7.910156 5.21875 -8.171875 C 4.875 -8.429688 4.378906 -8.5625 3.734375 -8.5625 C 3.378906 -8.5625 3 -8.523438 2.59375 -8.453125 C 2.195312 -8.378906 1.757812 -8.257812 1.28125 -8.09375 L 1.28125 -9.25 C 1.757812 -9.382812 2.210938 -9.484375 2.640625 -9.546875 C 3.066406 -9.617188 3.46875 -9.65625 3.84375 -9.65625 C 4.820312 -9.65625 5.59375 -9.429688 6.15625 -8.984375 C 6.726562 -8.546875 7.015625 -7.945312 7.015625 -7.1875 C 7.015625 -6.664062 6.863281 -6.222656 6.5625 -5.859375 C 6.257812 -5.492188 5.832031 -5.242188 5.28125 -5.109375 Z M 5.28125 -5.109375 "/> -</symbol> -<symbol overflow="visible" id="glyph0-9"> -<path style="stroke:none;" d="M 1.40625 -9.484375 L 6.4375 -9.484375 L 6.4375 -8.390625 L 2.578125 -8.390625 L 2.578125 -6.078125 C 2.765625 -6.140625 2.953125 -6.1875 3.140625 -6.21875 C 3.328125 -6.25 3.507812 -6.265625 3.6875 -6.265625 C 4.75 -6.265625 5.585938 -5.972656 6.203125 -5.390625 C 6.828125 -4.816406 7.140625 -4.035156 7.140625 -3.046875 C 7.140625 -2.023438 6.820312 -1.226562 6.1875 -0.65625 C 5.550781 -0.09375 4.65625 0.1875 3.5 0.1875 C 3.101562 0.1875 2.695312 0.148438 2.28125 0.078125 C 1.863281 0.015625 1.4375 -0.0820312 1 -0.21875 L 1 -1.515625 C 1.382812 -1.304688 1.78125 -1.148438 2.1875 -1.046875 C 2.59375 -0.941406 3.019531 -0.890625 3.46875 -0.890625 C 4.207031 -0.890625 4.789062 -1.082031 5.21875 -1.46875 C 5.644531 -1.851562 5.859375 -2.378906 5.859375 -3.046875 C 5.859375 -3.703125 5.644531 -4.222656 5.21875 -4.609375 C 4.789062 -4.992188 4.207031 -5.1875 3.46875 -5.1875 C 3.125 -5.1875 2.78125 -5.144531 2.4375 -5.0625 C 2.101562 -4.988281 1.757812 -4.875 1.40625 -4.71875 Z M 1.40625 -9.484375 "/> -</symbol> -</g> -<clipPath id="clip1"> - <path d="M 53 166 L 166 166 L 166 265.75 L 53 265.75 Z M 53 166 "/> -</clipPath> -<clipPath id="clip2"> - <path d="M 318 15 L 423 15 L 423 153 L 318 153 Z M 318 15 "/> -</clipPath> -</defs> -<g id="surface45"> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.746094 184.742188 L 66.4375 187.765625 L 67.128906 186.746094 L 67.820312 178.636719 L 68.507812 187.574219 L 69.199219 196.019531 L 69.890625 204.5 L 70.582031 203.855469 L 71.269531 204.714844 L 71.960938 200.078125 L 72.652344 208.082031 L 73.34375 206.835938 L 74.03125 198.875 L 74.722656 195.683594 L 75.414062 188.042969 L 76.105469 194.558594 L 76.792969 189.554688 L 77.484375 192.332031 L 78.175781 190.027344 L 78.867188 194.230469 L 79.554688 200.730469 L 80.246094 197.371094 L 80.9375 198.34375 L 81.628906 204.410156 L 82.316406 199.839844 L 83.007812 200.503906 L 83.699219 202.144531 L 84.390625 202.300781 L 85.078125 200.015625 L 85.769531 203.554688 L 86.460938 211.707031 L 87.152344 219.273438 L 87.839844 212.527344 L 88.53125 219.097656 L 89.222656 222.40625 L 89.914062 220.824219 L 90.601562 221.734375 L 91.292969 224.421875 L 91.984375 225.644531 L 92.675781 227.585938 L 93.363281 225.769531 L 94.054688 218.96875 L 94.746094 218.160156 L 95.4375 211.414062 L 96.128906 204.007812 L 96.816406 207.203125 L 97.507812 213.332031 L 98.199219 204.328125 L 98.890625 199.023438 L 99.578125 206.480469 L 100.269531 199.015625 L 100.960938 203.097656 L 101.652344 209.425781 L 102.339844 217.5 L 103.03125 211.09375 L 103.722656 213.789062 L 104.414062 211.347656 L 105.101562 217.386719 L 105.792969 219.132812 L 106.484375 219.339844 L 107.175781 212.023438 L 107.863281 204.355469 L 108.554688 196.28125 L 109.246094 200.84375 L 109.9375 196.429688 L 110.625 194.125 L 111.316406 201.539062 L 112.007812 201.007812 L 112.699219 194.28125 L 113.386719 201.957031 L 114.078125 203.238281 L 114.769531 202.875 L 115.460938 205.628906 L 116.148438 201.074219 L 116.839844 205.359375 L 117.53125 209.160156 L 118.222656 208.898438 L 118.910156 215.582031 L 119.601562 221.285156 L 120.292969 213.707031 L 120.984375 213.035156 L 121.671875 214.113281 L 122.363281 215.179688 L 123.054688 212.726562 L 123.746094 206.707031 L 124.433594 202.972656 L 125.125 201.636719 L 125.816406 204.148438 L 126.507812 207.515625 L 127.195312 208.179688 L 127.886719 212.183594 L 128.578125 207.226562 L 129.269531 207.117188 L 129.957031 200.328125 L 130.648438 192.488281 L 131.339844 198.480469 L 132.03125 205.988281 L 132.71875 197.113281 L 133.410156 203.714844 L 134.101562 195.613281 L 134.792969 190.847656 L 135.480469 194.273438 L 136.171875 200.6875 L 136.863281 195.222656 L 137.554688 190.21875 L 138.242188 183.472656 L 138.933594 182.324219 L 139.625 190.910156 L 140.316406 188.316406 L 141.003906 190.277344 L 141.695312 199.34375 L 142.386719 205.507812 L 143.078125 210.085938 L 143.765625 219.046875 L 144.457031 218.640625 L 145.148438 210.242188 L 145.839844 213.558594 L 146.527344 206.863281 L 147.21875 204.960938 L 147.910156 196.65625 L 148.601562 190.046875 L 149.289062 181.253906 L 149.980469 186.496094 L 150.671875 186.851562 L 151.363281 182.386719 L 152.050781 182.757812 L 152.742188 177.558594 L 153.433594 176.535156 "/> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 153.433594 176.535156 L 154.125 168.285156 L 154.8125 167.597656 L 155.503906 175.214844 L 156.195312 173.621094 L 156.886719 182.082031 L 157.574219 180.375 L 158.265625 179.5625 L 158.957031 173.746094 L 159.648438 174.769531 L 160.335938 169.75 L 161.027344 164 L 161.71875 163.308594 L 162.410156 156.359375 L 163.097656 151.125 L 163.789062 145.957031 L 164.480469 142.183594 L 165.171875 140.875 L 165.859375 143.761719 L 166.550781 144.023438 L 167.242188 147.230469 L 167.933594 155.320312 L 168.621094 148.609375 L 169.3125 145.84375 L 170.003906 139.675781 L 170.695312 141.980469 L 171.382812 136.6875 L 172.074219 133.65625 L 172.765625 128.714844 L 173.457031 135.691406 L 174.144531 136.4375 L 174.835938 139.320312 L 175.527344 135.953125 L 176.21875 138.007812 L 176.90625 140.066406 L 177.597656 134.910156 L 178.289062 142.886719 L 178.980469 138.234375 L 179.667969 135.234375 L 180.359375 137.515625 L 181.050781 135.601562 L 181.742188 140.246094 L 182.429688 148.335938 L 183.121094 141.140625 L 183.8125 134.304688 L 184.503906 127.488281 L 185.191406 123.042969 L 185.882812 118.960938 L 186.574219 122.175781 L 187.265625 120.308594 L 187.953125 116.695312 L 188.644531 117.011719 L 189.335938 119.125 L 190.027344 124.566406 L 190.714844 123.664062 L 191.40625 115.644531 L 192.097656 120.910156 L 192.789062 124.535156 L 193.476562 128.125 L 194.167969 131.527344 L 194.859375 125.199219 L 195.550781 122.703125 L 196.238281 124.199219 L 196.929688 131.503906 L 197.621094 130.402344 L 198.3125 137.035156 L 199 135.289062 L 199.691406 129.230469 L 200.382812 132.425781 L 201.074219 141.371094 L 201.761719 138.039062 L 202.453125 143.988281 L 203.144531 145.058594 L 203.835938 144.875 L 204.523438 146.152344 L 205.214844 139.28125 L 205.90625 135.128906 L 206.597656 133.832031 L 207.285156 137.761719 L 207.976562 138.421875 L 208.667969 143.476562 L 209.359375 150.480469 L 210.046875 152.226562 L 210.738281 145.195312 L 211.429688 149.625 L 212.121094 151.285156 L 212.808594 147.300781 L 213.5 141.644531 L 214.191406 141.265625 L 214.882812 139.1875 L 215.570312 138.652344 L 216.261719 137.773438 L 216.953125 146.65625 L 217.644531 149.929688 L 218.332031 150.292969 L 219.023438 154.644531 L 219.714844 148.371094 L 220.40625 151.523438 L 221.09375 151.179688 L 221.785156 151.097656 L 222.476562 150.289062 L 223.167969 146.742188 L 223.855469 137.851562 L 224.546875 136.085938 L 225.238281 129.226562 L 225.929688 124.425781 L 226.617188 131.222656 L 227.308594 140.300781 L 228 133.355469 L 228.691406 141.476562 L 229.378906 147.816406 L 230.070312 140.972656 L 230.761719 140.488281 L 231.453125 149.542969 L 232.140625 145.988281 L 232.832031 138.644531 L 233.523438 146.386719 L 234.214844 147.886719 L 234.902344 142.21875 L 235.59375 141.796875 L 236.285156 140.109375 L 236.976562 143.632812 L 237.664062 137.074219 L 238.355469 143.300781 L 239.046875 141.550781 L 239.738281 140.425781 L 240.425781 139.738281 L 241.117188 138.433594 L 241.808594 136.894531 "/> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 241.808594 136.894531 L 242.5 129.683594 L 243.1875 137.179688 L 243.878906 130.164062 L 244.570312 131.421875 L 245.261719 135.050781 L 245.949219 138.792969 L 246.640625 145.089844 L 247.332031 143.746094 L 248.023438 136.125 L 248.710938 144.503906 L 249.402344 148.210938 L 250.09375 142.414062 L 250.785156 146.457031 L 251.472656 144.902344 L 252.164062 140.238281 L 252.855469 141.289062 L 253.546875 132.667969 L 254.234375 135.585938 L 254.925781 138.679688 L 255.617188 140.894531 L 256.308594 148.578125 L 256.996094 149.164062 L 257.6875 157.507812 L 258.378906 149.835938 L 259.070312 156.96875 L 259.757812 153.074219 L 260.449219 159.882812 L 261.140625 162.398438 L 261.832031 171.417969 L 262.519531 177.835938 L 263.210938 182.8125 L 263.902344 191.789062 L 264.59375 183.96875 L 265.28125 180.496094 L 265.972656 179.453125 L 266.664062 175.453125 L 267.355469 183.210938 L 268.042969 187.597656 L 268.734375 192.375 L 269.425781 183.394531 L 270.117188 180.175781 L 270.804688 184.003906 L 271.496094 187.015625 L 272.1875 183.257812 L 272.878906 189.703125 L 273.566406 182.753906 L 274.257812 186.5 L 274.949219 182.53125 L 275.640625 176.492188 L 276.328125 179.402344 L 277.019531 178.808594 L 277.710938 177.519531 L 278.402344 170.457031 L 279.089844 163.746094 L 279.78125 169.625 L 280.472656 173.15625 L 281.164062 177.953125 L 281.851562 172.8125 L 282.542969 164.695312 L 283.234375 157.472656 L 283.925781 164.429688 L 284.613281 156.175781 L 285.304688 147.363281 L 285.996094 152.285156 L 286.6875 160.066406 L 287.375 169 L 288.066406 165.839844 L 288.757812 169.378906 L 289.449219 172.585938 L 290.136719 175.90625 L 290.828125 180.761719 L 291.519531 174.199219 L 292.210938 177.667969 L 292.898438 181.410156 L 293.589844 175.261719 L 294.28125 175.332031 L 294.972656 177.566406 L 295.660156 169.265625 L 296.351562 166.886719 L 297.042969 167.371094 L 297.734375 166.578125 L 298.421875 174.105469 L 299.113281 176.136719 L 299.804688 176.894531 L 300.496094 175.128906 L 301.183594 175.910156 L 301.875 176.871094 L 302.566406 172.15625 L 303.257812 172.570312 L 303.945312 179.945312 L 304.636719 177.316406 L 305.328125 177.015625 L 306.019531 178.082031 L 306.707031 173.449219 L 307.398438 180.046875 L 308.089844 178.339844 L 308.78125 174.292969 L 309.46875 177.949219 L 310.160156 186.863281 L 310.851562 192.355469 L 311.542969 188.714844 L 312.230469 192.617188 L 312.921875 199.609375 L 313.613281 208.039062 L 314.304688 214.246094 L 314.992188 212.972656 L 315.683594 216.734375 L 316.375 213.171875 L 317.066406 204.636719 L 317.753906 204.726562 L 318.445312 199.898438 L 319.136719 198.328125 L 319.828125 191.9375 L 320.515625 186.582031 L 321.207031 190.640625 L 321.898438 191.414062 L 322.589844 188.019531 L 323.277344 191.566406 L 323.96875 182.792969 L 324.660156 176.511719 L 325.351562 170.613281 L 326.039062 178.75 L 326.730469 181.421875 L 327.421875 176.726562 L 328.113281 169.871094 L 328.800781 164.429688 L 329.492188 156.359375 L 330.183594 152.730469 "/> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 330.183594 152.730469 L 330.875 155.539062 L 331.5625 151.082031 L 332.253906 142.398438 L 332.945312 141.886719 L 333.636719 136.871094 L 334.324219 141.507812 L 335.015625 147.171875 L 335.707031 149.445312 L 336.398438 152.960938 L 337.085938 159.335938 L 337.777344 154.445312 L 338.46875 156.84375 L 339.160156 163.132812 L 339.847656 168.179688 L 340.539062 162.445312 L 341.230469 158.65625 L 341.921875 164.984375 L 342.613281 172.832031 L 343.300781 167.492188 L 343.992188 160.441406 L 344.683594 162.65625 L 345.375 154.714844 L 346.0625 162.320312 L 346.753906 170.28125 L 347.445312 176.398438 L 348.136719 184.726562 L 348.824219 181.957031 L 349.515625 182.4375 L 350.207031 188.382812 L 350.898438 187.082031 L 351.585938 192.40625 L 352.277344 188.882812 L 352.96875 197.636719 L 353.660156 190.6875 L 354.347656 191.171875 L 355.039062 184.800781 L 355.730469 189.382812 L 356.421875 182.878906 L 357.109375 177.5625 L 357.800781 182.644531 L 358.492188 190.351562 L 359.183594 188.03125 L 359.871094 191.125 L 360.5625 192.300781 L 361.253906 186.410156 L 361.945312 180.582031 L 362.632812 174.015625 L 363.324219 177.296875 L 364.015625 170.597656 L 364.707031 165.183594 L 365.394531 166.808594 L 366.085938 164.929688 L 366.777344 162.636719 L 367.46875 166.890625 L 368.15625 172.363281 L 368.847656 163.570312 L 369.539062 168.335938 L 370.230469 164.480469 L 370.917969 158.753906 L 371.609375 164.199219 L 372.300781 168.226562 L 372.992188 168.992188 L 373.679688 167.523438 L 374.371094 174.425781 L 375.0625 166.335938 L 375.753906 157.558594 L 376.441406 154.59375 L 377.132812 153.90625 L 377.824219 151.363281 L 378.515625 154.195312 L 379.203125 146.785156 L 379.894531 151.203125 L 380.585938 155.789062 L 381.277344 157.175781 L 381.964844 158.609375 L 382.65625 154.980469 L 383.347656 161.558594 L 384.039062 155.097656 L 384.726562 159.085938 L 385.417969 152.277344 L 386.109375 160.808594 L 386.800781 167.421875 L 387.488281 170.699219 L 388.179688 175.917969 L 388.871094 178.355469 L 389.5625 174.632812 L 390.25 182.910156 L 390.941406 181.777344 L 391.632812 184.28125 L 392.324219 177.515625 L 393.011719 169.648438 L 393.703125 162.761719 L 394.394531 165.328125 L 395.085938 165.929688 L 395.773438 167.757812 L 396.464844 158.839844 L 397.15625 156.054688 L 397.847656 154.359375 L 398.535156 153.445312 L 399.226562 154.105469 L 399.917969 148.242188 L 400.609375 139.882812 L 401.296875 136.238281 L 401.988281 139.890625 L 402.679688 143.039062 L 403.371094 145.253906 L 404.058594 139.445312 L 404.75 132.792969 L 405.441406 141.859375 L 406.132812 132.972656 L 406.820312 137.332031 L 407.511719 143.351562 L 408.203125 143.84375 L 408.894531 140.710938 L 409.582031 146.609375 L 410.273438 150.082031 "/> -<g clip-path="url(#clip1)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.746094 192.507812 L 66.4375 200.253906 L 67.128906 202.152344 L 67.820312 196.925781 L 68.507812 202.089844 L 69.199219 208.316406 L 69.890625 212.085938 L 70.582031 209.59375 L 71.269531 204.332031 L 71.960938 203.140625 L 72.652344 209.046875 L 73.34375 210.300781 L 74.03125 210.863281 L 74.722656 210.296875 L 75.414062 210.675781 L 76.105469 219.632812 L 76.792969 217.78125 L 77.484375 212.75 L 78.175781 207.828125 L 78.867188 211.441406 L 79.554688 219.683594 L 80.246094 213.011719 L 80.9375 205.667969 L 81.628906 207.335938 L 82.316406 198.714844 L 83.007812 189.828125 L 83.699219 194.488281 L 84.390625 191.011719 L 85.078125 196.386719 L 85.769531 199.855469 L 86.460938 201.445312 L 87.152344 204.941406 L 87.839844 212.835938 L 88.53125 216.574219 L 89.222656 219.425781 L 89.914062 217.308594 L 90.601562 218.773438 L 91.292969 222.109375 L 91.984375 219.320312 L 92.675781 226.335938 L 93.363281 223.527344 L 94.054688 226.328125 L 94.746094 221.375 L 95.4375 225.976562 L 96.128906 226.726562 L 96.816406 219.613281 L 97.507812 224.785156 L 98.199219 230.058594 L 98.890625 232.777344 L 99.578125 234.066406 L 100.269531 225.09375 L 100.960938 223.195312 L 101.652344 224.753906 L 102.339844 224.527344 L 103.03125 227.644531 L 103.722656 222.59375 L 104.414062 214.5 L 105.101562 222.925781 L 105.792969 229.871094 L 106.484375 221.257812 L 107.175781 213.601562 L 107.863281 213.757812 L 108.554688 211.378906 L 109.246094 212.527344 L 109.9375 212.96875 L 110.625 216.363281 L 111.316406 214.28125 L 112.007812 214.351562 L 112.699219 222.597656 L 113.386719 216.53125 L 114.078125 219.125 L 114.769531 217.179688 L 115.460938 224.660156 L 116.148438 221.804688 L 116.839844 230.082031 L 117.53125 228.398438 L 118.222656 235.882812 L 118.910156 233.195312 L 119.601562 233.914062 L 120.292969 242.691406 L 120.984375 244.21875 L 121.671875 250.613281 L 122.363281 252.925781 L 123.054688 248.847656 L 123.746094 254.351562 L 124.433594 251.617188 L 125.125 243.886719 L 125.816406 245.074219 L 126.507812 249.519531 L 127.195312 252.457031 L 127.886719 249.488281 L 128.578125 244.472656 L 129.269531 237.101562 L 129.957031 229.367188 L 130.648438 232.988281 L 131.339844 230.9375 L 132.03125 237.367188 L 132.71875 236.808594 L 133.410156 231.011719 L 134.101562 229.964844 L 134.792969 229.976562 L 135.480469 226.984375 L 136.171875 225.515625 L 136.863281 217.007812 L 137.554688 222.183594 L 138.242188 213.144531 L 138.933594 210.878906 L 139.625 206.179688 L 140.316406 199.5 L 141.003906 199.253906 L 141.695312 198.214844 L 142.386719 191.222656 L 143.078125 186.929688 L 143.765625 178.628906 L 144.457031 178.972656 L 145.148438 184.9375 L 145.839844 190.875 L 146.527344 191.109375 L 147.21875 199.160156 L 147.910156 197.207031 L 148.601562 204.183594 L 149.289062 209.488281 L 149.980469 202.878906 L 150.671875 203.539062 L 151.363281 209.351562 L 152.050781 210.644531 L 152.742188 203.960938 L 153.433594 204.585938 "/> -</g> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 153.433594 204.585938 L 154.125 210.578125 L 154.8125 213.5625 L 155.503906 220.292969 L 156.195312 222.894531 L 156.886719 215.640625 L 157.574219 212.410156 L 158.265625 220.785156 L 158.957031 222.460938 L 159.648438 229.878906 L 160.335938 225.117188 L 161.027344 218.386719 L 161.71875 221.699219 L 162.410156 215.746094 L 163.097656 209.574219 L 163.789062 217.546875 L 164.480469 225.105469 L 165.171875 226.425781 L 165.859375 226.253906 L 166.550781 221.828125 L 167.242188 228.101562 L 167.933594 223.230469 L 168.621094 224.109375 L 169.3125 229.121094 L 170.003906 236.175781 L 170.695312 233.9375 L 171.382812 224.96875 L 172.074219 231.132812 L 172.765625 222.339844 L 173.457031 223.144531 L 174.144531 228.441406 L 174.835938 224.191406 L 175.527344 218.132812 L 176.21875 221.558594 L 176.90625 213.128906 L 177.597656 205.621094 L 178.289062 209.238281 L 178.980469 210.09375 L 179.667969 204.164062 L 180.359375 195.890625 L 181.050781 190.617188 L 181.742188 196.0625 L 182.429688 200.851562 L 183.121094 198.675781 L 183.8125 206.820312 L 184.503906 200.125 L 185.191406 208.722656 L 185.882812 201.953125 L 186.574219 205.777344 L 187.265625 202.722656 L 187.953125 200.523438 L 188.644531 193.285156 L 189.335938 201.75 L 190.027344 205.53125 L 190.714844 204.214844 L 191.40625 206.800781 L 192.097656 214.09375 L 192.789062 221.367188 L 193.476562 214.945312 L 194.167969 215.753906 L 194.859375 222.40625 L 195.550781 226.863281 L 196.238281 234.238281 L 196.929688 228.847656 L 197.621094 230.871094 L 198.3125 231.621094 L 199 236.925781 L 199.691406 241.046875 L 200.382812 233.394531 L 201.074219 228.484375 L 201.761719 228.917969 L 202.453125 234.34375 L 203.144531 233.550781 L 203.835938 232.269531 L 204.523438 237.25 L 205.214844 242.472656 L 205.90625 234.179688 L 206.597656 230.476562 L 207.285156 239.210938 L 207.976562 233.519531 L 208.667969 224.769531 L 209.359375 215.761719 L 210.046875 218.96875 L 210.738281 218.441406 L 211.429688 225.402344 L 212.121094 232.144531 L 212.808594 230.960938 L 213.5 225.164062 L 214.191406 233.503906 L 214.882812 229.03125 L 215.570312 225.285156 L 216.261719 221.125 L 216.953125 217.164062 L 217.644531 211.164062 L 218.332031 214.890625 L 219.023438 209.019531 L 219.714844 201.679688 L 220.40625 201.058594 L 221.09375 193.894531 L 221.785156 186.066406 L 222.476562 184.925781 L 223.167969 183.976562 L 223.855469 180.28125 L 224.546875 173.257812 L 225.238281 164.21875 L 225.929688 171.367188 L 226.617188 164.679688 L 227.308594 157.253906 L 228 151.546875 L 228.691406 156.777344 L 229.378906 153.394531 L 230.070312 145.808594 L 230.761719 142.304688 L 231.453125 135.855469 L 232.140625 135.027344 L 232.832031 141.507812 L 233.523438 145.203125 L 234.214844 141.699219 L 234.902344 147.410156 L 235.59375 145.082031 L 236.285156 144.042969 L 236.976562 147.566406 L 237.664062 151.875 L 238.355469 151.984375 L 239.046875 145.511719 L 239.738281 146.03125 L 240.425781 140.980469 L 241.117188 132.839844 L 241.808594 136.949219 "/> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 241.808594 136.949219 L 242.5 134.265625 L 243.1875 131.84375 L 243.878906 135.738281 L 244.570312 142.734375 L 245.261719 149.179688 L 245.949219 153.242188 L 246.640625 150.707031 L 247.332031 152.886719 L 248.023438 160.671875 L 248.710938 153.894531 L 249.402344 158.996094 L 250.09375 152.289062 L 250.785156 149.214844 L 251.472656 143.230469 L 252.164062 142.453125 L 252.855469 150.40625 L 253.546875 143.269531 L 254.234375 147.199219 L 254.925781 142.191406 L 255.617188 146.519531 L 256.308594 142.96875 L 256.996094 144.835938 L 257.6875 137.421875 L 258.378906 141.699219 L 259.070312 145.875 L 259.757812 140.589844 L 260.449219 132.890625 L 261.140625 131.054688 L 261.832031 133.25 L 262.519531 127.933594 L 263.210938 125.039062 L 263.902344 121.078125 L 264.59375 122.414062 L 265.28125 124.511719 L 265.972656 117.363281 L 266.664062 124.984375 L 267.355469 130.753906 L 268.042969 128.324219 L 268.734375 132.589844 L 269.425781 128.015625 L 270.117188 128.464844 L 270.804688 122.265625 L 271.496094 117.820312 L 272.1875 111.15625 L 272.878906 102.300781 L 273.566406 104.175781 L 274.257812 102.289062 L 274.949219 99.125 L 275.640625 94.910156 L 276.328125 88.675781 L 277.019531 80.964844 L 277.710938 75.609375 L 278.402344 82.628906 L 279.089844 90.617188 L 279.78125 82.570312 L 280.472656 90.300781 L 281.164062 87.984375 L 281.851562 79.660156 L 282.542969 83.074219 L 283.234375 78.050781 L 283.925781 86.925781 L 284.613281 81.019531 L 285.304688 86.675781 L 285.996094 83.359375 L 286.6875 85.621094 L 287.375 80.488281 L 288.066406 75.273438 L 288.757812 68.578125 L 289.449219 67.226562 L 290.136719 75.203125 L 290.828125 68.792969 L 291.519531 69.640625 L 292.210938 78.585938 L 292.898438 82.164062 L 293.589844 90.925781 L 294.28125 86.347656 L 294.972656 89.820312 L 295.660156 94.816406 L 296.351562 96.597656 L 297.042969 101.660156 L 297.734375 96.582031 L 298.421875 98.472656 L 299.113281 104.304688 L 299.804688 96.355469 L 300.496094 99.960938 L 301.183594 105.734375 L 301.875 99.207031 L 302.566406 104.410156 L 303.257812 104.335938 L 303.945312 105.027344 L 304.636719 101.480469 L 305.328125 107.769531 L 306.019531 109.089844 L 306.707031 101.988281 L 307.398438 94.320312 L 308.089844 101.777344 L 308.78125 97.550781 L 309.46875 92.0625 L 310.160156 94.390625 L 310.851562 86.695312 L 311.542969 85.785156 L 312.230469 94.210938 L 312.921875 87.546875 L 313.613281 89.488281 L 314.304688 81.589844 L 314.992188 86.492188 L 315.683594 80.632812 L 316.375 87.648438 L 317.066406 95.816406 L 317.753906 99.675781 L 318.445312 101.753906 L 319.136719 106.117188 L 319.828125 109.15625 L 320.515625 106.492188 L 321.207031 106.894531 L 321.898438 107.855469 L 322.589844 113.316406 L 323.277344 120.496094 L 323.96875 111.503906 L 324.660156 117.074219 L 325.351562 117.914062 L 326.039062 124.390625 L 326.730469 127.039062 L 327.421875 128.71875 L 328.113281 127 L 328.800781 133.769531 L 329.492188 139.566406 L 330.183594 140.496094 "/> -<g clip-path="url(#clip2)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.853645;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 330.183594 140.496094 L 330.875 134.402344 L 331.5625 127.617188 L 332.253906 124.976562 L 332.945312 132.210938 L 333.636719 128.21875 L 334.324219 120.890625 L 335.015625 117.351562 L 335.707031 113.066406 L 336.398438 120.929688 L 337.085938 115.011719 L 337.777344 108.089844 L 338.46875 107.992188 L 339.160156 108.558594 L 339.847656 117.0625 L 340.539062 119.738281 L 341.230469 124.585938 L 341.921875 122.5 L 342.613281 115.695312 L 343.300781 116.578125 L 343.992188 122.257812 L 344.683594 128.835938 L 345.375 129.257812 L 346.0625 133.730469 L 346.753906 125.894531 L 347.445312 127.886719 L 348.136719 123.839844 L 348.824219 121.496094 L 349.515625 129.117188 L 350.207031 136.519531 L 350.898438 128.757812 L 351.585938 131.039062 L 352.277344 124.648438 L 352.96875 124.203125 L 353.660156 115.886719 L 354.347656 108.660156 L 355.039062 113.949219 L 355.730469 108.867188 L 356.421875 108.835938 L 357.109375 101.648438 L 357.800781 96.644531 L 358.492188 103.375 L 359.183594 97.042969 L 359.871094 97.316406 L 360.5625 100.078125 L 361.253906 91.8125 L 361.945312 86.304688 L 362.632812 83.757812 L 363.324219 74.890625 L 364.015625 73.632812 L 364.707031 71.542969 L 365.394531 75.726562 L 366.085938 72.945312 L 366.777344 64.292969 L 367.46875 56.5625 L 368.15625 60.433594 L 368.847656 55.367188 L 369.539062 57.308594 L 370.230469 61.507812 L 370.917969 67.558594 L 371.609375 66.648438 L 372.300781 72.792969 L 372.992188 72.117188 L 373.679688 72.382812 L 374.371094 72.675781 L 375.0625 67.886719 L 375.753906 75.253906 L 376.441406 82.488281 L 377.132812 76.109375 L 377.824219 82.207031 L 378.515625 80.402344 L 379.203125 87.070312 L 379.894531 82.875 L 380.585938 89.9375 L 381.277344 97.882812 L 381.964844 93.449219 L 382.65625 85.320312 L 383.347656 81.507812 L 384.039062 81.546875 L 384.726562 74.398438 L 385.417969 81.605469 L 386.109375 86.925781 L 386.800781 81.277344 L 387.488281 90.042969 L 388.179688 83.351562 L 388.871094 75.625 L 389.5625 69.75 L 390.25 74.546875 L 390.941406 73.339844 L 391.632812 75.621094 L 392.324219 71.421875 L 393.011719 74.226562 L 393.703125 74.640625 L 394.394531 69.957031 L 395.085938 71.074219 L 395.773438 64.96875 L 396.464844 63.308594 L 397.15625 69.375 L 397.847656 61.972656 L 398.535156 54.789062 L 399.226562 46.726562 L 399.917969 49.550781 L 400.609375 53.683594 L 401.296875 62.152344 L 401.988281 53.222656 L 402.679688 61.878906 L 403.371094 66.929688 L 404.058594 62.246094 L 404.75 60.601562 L 405.441406 51.851562 L 406.132812 44.886719 L 406.820312 38.675781 L 407.511719 33.242188 L 408.203125 30.820312 L 408.894531 31.585938 L 409.582031 26.398438 L 410.273438 31.789062 "/> -</g> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 427.5 261.613281 L 424.300781 261.613281 M 427.5 252.527344 L 424.300781 252.527344 M 427.5 243.441406 L 424.300781 243.441406 M 427.5 234.355469 L 424.300781 234.355469 M 427.5 225.269531 L 424.300781 225.269531 M 427.5 216.183594 L 424.300781 216.183594 M 427.5 207.097656 L 424.300781 207.097656 M 427.5 198.011719 L 424.300781 198.011719 M 427.5 188.925781 L 424.300781 188.925781 M 427.5 179.839844 L 424.300781 179.839844 M 427.5 170.753906 L 424.300781 170.753906 M 427.5 161.667969 L 424.300781 161.667969 M 427.5 152.585938 L 424.300781 152.585938 M 427.5 143.5 L 424.300781 143.5 M 427.5 134.414062 L 424.300781 134.414062 M 427.5 125.328125 L 424.300781 125.328125 M 427.5 116.242188 L 424.300781 116.242188 M 427.5 107.15625 L 424.300781 107.15625 M 427.5 98.070312 L 424.300781 98.070312 M 427.5 88.984375 L 424.300781 88.984375 M 427.5 79.898438 L 424.300781 79.898438 M 427.5 70.8125 L 424.300781 70.8125 M 427.5 61.726562 L 424.300781 61.726562 M 427.5 52.640625 L 424.300781 52.640625 M 427.5 43.554688 L 424.300781 43.554688 M 427.5 34.46875 L 424.300781 34.46875 M 427.5 25.382812 L 424.300781 25.382812 M 427.5 16.296875 L 424.300781 16.296875 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 427.5 261.613281 L 421.097656 261.613281 M 427.5 225.269531 L 421.097656 225.269531 M 427.5 188.925781 L 421.097656 188.925781 M 427.5 152.585938 L 421.097656 152.585938 M 427.5 116.242188 L 421.097656 116.242188 M 427.5 79.898438 L 421.097656 79.898438 M 427.5 43.554688 L 421.097656 43.554688 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 427.5 265.75 L 427.5 15 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 51.25 15 L 51.25 18.199219 M 65.058594 15 L 65.058594 18.199219 M 78.867188 15 L 78.867188 18.199219 M 92.675781 15 L 92.675781 18.199219 M 106.484375 15 L 106.484375 18.199219 M 120.292969 15 L 120.292969 18.199219 M 134.101562 15 L 134.101562 18.199219 M 147.910156 15 L 147.910156 18.199219 M 161.71875 15 L 161.71875 18.199219 M 175.527344 15 L 175.527344 18.199219 M 189.335938 15 L 189.335938 18.199219 M 203.144531 15 L 203.144531 18.199219 M 216.953125 15 L 216.953125 18.199219 M 230.761719 15 L 230.761719 18.199219 M 244.570312 15 L 244.570312 18.199219 M 258.378906 15 L 258.378906 18.199219 M 272.1875 15 L 272.1875 18.199219 M 285.996094 15 L 285.996094 18.199219 M 299.804688 15 L 299.804688 18.199219 M 313.613281 15 L 313.613281 18.199219 M 327.421875 15 L 327.421875 18.199219 M 341.230469 15 L 341.230469 18.199219 M 355.039062 15 L 355.039062 18.199219 M 368.847656 15 L 368.847656 18.199219 M 382.65625 15 L 382.65625 18.199219 M 396.464844 15 L 396.464844 18.199219 M 410.273438 15 L 410.273438 18.199219 M 424.082031 15 L 424.082031 18.199219 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.058594 15 L 65.058594 21.402344 M 134.101562 15 L 134.101562 21.402344 M 203.144531 15 L 203.144531 21.402344 M 272.1875 15 L 272.1875 21.402344 M 341.230469 15 L 341.230469 21.402344 M 410.273438 15 L 410.273438 21.402344 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.523438 15 L 427.5 15 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.523438 261.613281 L 51.722656 261.613281 M 48.523438 252.527344 L 51.722656 252.527344 M 48.523438 243.441406 L 51.722656 243.441406 M 48.523438 234.355469 L 51.722656 234.355469 M 48.523438 225.269531 L 51.722656 225.269531 M 48.523438 216.183594 L 51.722656 216.183594 M 48.523438 207.097656 L 51.722656 207.097656 M 48.523438 198.011719 L 51.722656 198.011719 M 48.523438 188.925781 L 51.722656 188.925781 M 48.523438 179.839844 L 51.722656 179.839844 M 48.523438 170.753906 L 51.722656 170.753906 M 48.523438 161.667969 L 51.722656 161.667969 M 48.523438 152.585938 L 51.722656 152.585938 M 48.523438 143.5 L 51.722656 143.5 M 48.523438 134.414062 L 51.722656 134.414062 M 48.523438 125.328125 L 51.722656 125.328125 M 48.523438 116.242188 L 51.722656 116.242188 M 48.523438 107.15625 L 51.722656 107.15625 M 48.523438 98.070312 L 51.722656 98.070312 M 48.523438 88.984375 L 51.722656 88.984375 M 48.523438 79.898438 L 51.722656 79.898438 M 48.523438 70.8125 L 51.722656 70.8125 M 48.523438 61.726562 L 51.722656 61.726562 M 48.523438 52.640625 L 51.722656 52.640625 M 48.523438 43.554688 L 51.722656 43.554688 M 48.523438 34.46875 L 51.722656 34.46875 M 48.523438 25.382812 L 51.722656 25.382812 M 48.523438 16.296875 L 51.722656 16.296875 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.523438 261.613281 L 54.925781 261.613281 M 48.523438 225.269531 L 54.925781 225.269531 M 48.523438 188.925781 L 54.925781 188.925781 M 48.523438 152.585938 L 54.925781 152.585938 M 48.523438 116.242188 L 54.925781 116.242188 M 48.523438 79.898438 L 54.925781 79.898438 M 48.523438 43.554688 L 54.925781 43.554688 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.523438 265.75 L 48.523438 15 "/> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="23.121094" y="265.999023"/> - <use xlink:href="#glyph0-2" x="33.856445" y="265.999023"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="23.121094" y="229.655273"/> - <use xlink:href="#glyph0-3" x="33.856445" y="229.655273"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-4" x="33.121094" y="193.311523"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-3" x="33.121094" y="156.97168"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="33.121094" y="120.62793"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-5" x="33.121094" y="84.28418"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-6" x="33.121094" y="47.94043"/> -</g> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 51.25 265.75 L 51.25 262.550781 M 65.058594 265.75 L 65.058594 262.550781 M 78.867188 265.75 L 78.867188 262.550781 M 92.675781 265.75 L 92.675781 262.550781 M 106.484375 265.75 L 106.484375 262.550781 M 120.292969 265.75 L 120.292969 262.550781 M 134.101562 265.75 L 134.101562 262.550781 M 147.910156 265.75 L 147.910156 262.550781 M 161.71875 265.75 L 161.71875 262.550781 M 175.527344 265.75 L 175.527344 262.550781 M 189.335938 265.75 L 189.335938 262.550781 M 203.144531 265.75 L 203.144531 262.550781 M 216.953125 265.75 L 216.953125 262.550781 M 230.761719 265.75 L 230.761719 262.550781 M 244.570312 265.75 L 244.570312 262.550781 M 258.378906 265.75 L 258.378906 262.550781 M 272.1875 265.75 L 272.1875 262.550781 M 285.996094 265.75 L 285.996094 262.550781 M 299.804688 265.75 L 299.804688 262.550781 M 313.613281 265.75 L 313.613281 262.550781 M 327.421875 265.75 L 327.421875 262.550781 M 341.230469 265.75 L 341.230469 262.550781 M 355.039062 265.75 L 355.039062 262.550781 M 368.847656 265.75 L 368.847656 262.550781 M 382.65625 265.75 L 382.65625 262.550781 M 396.464844 265.75 L 396.464844 262.550781 M 410.273438 265.75 L 410.273438 262.550781 M 424.082031 265.75 L 424.082031 262.550781 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.058594 265.75 L 65.058594 259.347656 M 134.101562 265.75 L 134.101562 259.347656 M 203.144531 265.75 L 203.144531 259.347656 M 272.1875 265.75 L 272.1875 259.347656 M 341.230469 265.75 L 341.230469 259.347656 M 410.273438 265.75 L 410.273438 259.347656 "/> -<path style="fill:none;stroke-width:0.640234;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 48.523438 265.75 L 427.5 265.75 "/> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-4" x="60.558594" y="284.038086"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-7" x="121.601562" y="284.038086"/> - <use xlink:href="#glyph0-4" x="129.75293" y="284.038086"/> - <use xlink:href="#glyph0-4" x="137.904297" y="284.038086"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-3" x="190.644531" y="284.038086"/> - <use xlink:href="#glyph0-4" x="198.795898" y="284.038086"/> - <use xlink:href="#glyph0-4" x="206.947266" y="284.038086"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-8" x="259.6875" y="284.038086"/> - <use xlink:href="#glyph0-4" x="267.838867" y="284.038086"/> - <use xlink:href="#glyph0-4" x="275.990234" y="284.038086"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="328.730469" y="284.038086"/> - <use xlink:href="#glyph0-4" x="336.881836" y="284.038086"/> - <use xlink:href="#glyph0-4" x="345.033203" y="284.038086"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-9" x="397.773438" y="284.038086"/> - <use xlink:href="#glyph0-4" x="405.924805" y="284.038086"/> - <use xlink:href="#glyph0-4" x="414.076172" y="284.038086"/> -</g> -</g> -</svg> diff --git a/public/it4i/software/mpi/img/jupyter_new.png b/public/it4i/software/mpi/img/jupyter_new.png deleted file mode 100644 index 6ca7601671c60098ef8023d9f417dcba106fb1e3..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/mpi/img/jupyter_new.png and /dev/null differ diff --git a/public/it4i/software/mpi/img/jupyter_ood_start.png b/public/it4i/software/mpi/img/jupyter_ood_start.png deleted file mode 100644 index 0b8868fea230307a25a9103a1aa9e4ec91af90b8..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/mpi/img/jupyter_ood_start.png and /dev/null differ diff --git a/public/it4i/software/mpi/img/jupyter_run.png b/public/it4i/software/mpi/img/jupyter_run.png deleted file mode 100644 index 15bdc0d850036bf8fe6e0ab727be67a73e506fbd..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/mpi/img/jupyter_run.png and /dev/null differ diff --git a/public/it4i/software/mpi/img/ood_jupyter.png b/public/it4i/software/mpi/img/ood_jupyter.png deleted file mode 100644 index faad0701cb42ac1fa2d8ed1e3e16604b5226c406..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/mpi/img/ood_jupyter.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/CMakeLists.txt b/public/it4i/software/viz/insitu/CMakeLists.txt deleted file mode 100644 index b0b7d630a00e55b1ca20af86995cc7dae5648194..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cmake_minimum_required(VERSION 3.3) -project(CatalystCxxFullExample) - -set(USE_CATALYST ON CACHE BOOL "Link the simulator with Catalyst") -if(USE_CATALYST) - find_package(ParaView 5.6 REQUIRED COMPONENTS vtkPVPythonCatalyst) - include("${PARAVIEW_USE_FILE}") - set(Adaptor_SRCS - FEAdaptor.cxx - ) - add_library(CxxFullExampleAdaptor ${Adaptor_SRCS}) - target_link_libraries(CxxFullExampleAdaptor vtkPVPythonCatalyst vtkParallelMPI) - add_definitions("-DUSE_CATALYST") - if(NOT PARAVIEW_USE_MPI) - message(SEND_ERROR "ParaView must be built with MPI enabled") - endif() -else() - find_package(MPI REQUIRED) - include_directories(${MPI_C_INCLUDE_PATH}) -endif() - -add_executable(CxxFullExample FEDriver.cxx FEDataStructures.cxx) -if(USE_CATALYST) - target_link_libraries(CxxFullExample LINK_PRIVATE CxxFullExampleAdaptor) - include(vtkModuleMacros) - include(vtkMPI) - vtk_mpi_link(CxxFullExample) -else() - target_link_libraries(CxxFullExample LINK_PRIVATE ${MPI_LIBRARIES}) -endif() - -option(BUILD_TESTING "Build Testing" OFF) -# Setup testing. -if (BUILD_TESTING) - include(CTest) - add_test(NAME CxxFullExampleTest COMMAND CxxFullExample ${CMAKE_CURRENT_SOURCE_DIR}/feslicescript.py) - set_tests_properties(CxxFullExampleTest PROPERTIES LABELS "PARAVIEW;CATALYST") -endif() diff --git a/public/it4i/software/viz/insitu/FEAdaptor.cxx b/public/it4i/software/viz/insitu/FEAdaptor.cxx deleted file mode 100644 index a3fc3a9d4b6127b43a250905eb0feb6e36d22756..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/FEAdaptor.cxx +++ /dev/null @@ -1,160 +0,0 @@ -#include "FEAdaptor.h" -#include "FEDataStructures.h" -#include <iostream> - -#include <vtkCPDataDescription.h> -#include <vtkCPInputDataDescription.h> -#include <vtkCPProcessor.h> -#include <vtkCPPythonScriptPipeline.h> -#include <vtkCellData.h> -#include <vtkCellType.h> -#include <vtkDoubleArray.h> -#include <vtkFloatArray.h> -#include <vtkNew.h> -#include <vtkPointData.h> -#include <vtkPoints.h> -#include <vtkUnstructuredGrid.h> - -namespace -{ -vtkCPProcessor* Processor = NULL; -vtkUnstructuredGrid* VTKGrid; - -void BuildVTKGrid(Grid& grid) -{ - // create the points information - vtkNew<vtkDoubleArray> pointArray; - pointArray->SetNumberOfComponents(3); - pointArray->SetArray( - grid.GetPointsArray(), static_cast<vtkIdType>(grid.GetNumberOfPoints() * 3), 1); - vtkNew<vtkPoints> points; - points->SetData(pointArray.GetPointer()); - VTKGrid->SetPoints(points.GetPointer()); - - // create the cells - size_t numCells = grid.GetNumberOfCells(); - VTKGrid->Allocate(static_cast<vtkIdType>(numCells * 9)); - for (size_t cell = 0; cell < numCells; cell++) - { - unsigned int* cellPoints = grid.GetCellPoints(cell); - vtkIdType tmp[8] = { cellPoints[0], cellPoints[1], cellPoints[2], cellPoints[3], cellPoints[4], - cellPoints[5], cellPoints[6], cellPoints[7] }; - VTKGrid->InsertNextCell(VTK_HEXAHEDRON, 8, tmp); - } -} - -void UpdateVTKAttributes(Grid& grid, Attributes& attributes, vtkCPInputDataDescription* idd) -{ - if (idd->IsFieldNeeded("velocity", vtkDataObject::POINT) == true) - { - if (VTKGrid->GetPointData()->GetNumberOfArrays() == 0) - { - // velocity array - vtkNew<vtkDoubleArray> velocity; - velocity->SetName("velocity"); - velocity->SetNumberOfComponents(3); - velocity->SetNumberOfTuples(static_cast<vtkIdType>(grid.GetNumberOfPoints())); - VTKGrid->GetPointData()->AddArray(velocity.GetPointer()); - } - vtkDoubleArray* velocity = - vtkDoubleArray::SafeDownCast(VTKGrid->GetPointData()->GetArray("velocity")); - // The velocity array is ordered as vx0,vx1,vx2,..,vy0,vy1,vy2,..,vz0,vz1,vz2,.. - // so we need to create a full copy of it with VTK's ordering of - // vx0,vy0,vz0,vx1,vy1,vz1,.. - double* velocityData = attributes.GetVelocityArray(); - vtkIdType numTuples = velocity->GetNumberOfTuples(); - for (vtkIdType i = 0; i < numTuples; i++) - { - double values[3] = { velocityData[i], velocityData[i + numTuples], - velocityData[i + 2 * numTuples] }; - velocity->SetTypedTuple(i, values); - } - } - if (idd->IsFieldNeeded("pressure", vtkDataObject::CELL) == true) - { - if (VTKGrid->GetCellData()->GetNumberOfArrays() == 0) - { - // pressure array - vtkNew<vtkFloatArray> pressure; - pressure->SetName("pressure"); - pressure->SetNumberOfComponents(1); - VTKGrid->GetCellData()->AddArray(pressure.GetPointer()); - } - vtkFloatArray* pressure = - vtkFloatArray::SafeDownCast(VTKGrid->GetCellData()->GetArray("pressure")); - // The pressure array is a scalar array so we can reuse - // memory as long as we ordered the points properly. - float* pressureData = attributes.GetPressureArray(); - pressure->SetArray(pressureData, static_cast<vtkIdType>(grid.GetNumberOfCells()), 1); - } -} - -void BuildVTKDataStructures(Grid& grid, Attributes& attributes, vtkCPInputDataDescription* idd) -{ - if (VTKGrid == NULL) - { - // The grid structure isn't changing so we only build it - // the first time it's needed. If we needed the memory - // we could delete it and rebuild as necessary. - VTKGrid = vtkUnstructuredGrid::New(); - BuildVTKGrid(grid); - } - UpdateVTKAttributes(grid, attributes, idd); -} -} - -namespace FEAdaptor -{ - -void Initialize(char* script) -{ - if (Processor == NULL) - { - Processor = vtkCPProcessor::New(); - Processor->Initialize(); - } - else - { - Processor->RemoveAllPipelines(); - } - - vtkNew<vtkCPPythonScriptPipeline> pipeline; - pipeline->Initialize(script); - Processor->AddPipeline(pipeline.GetPointer()); -} - -void Finalize() -{ - if (Processor) - { - Processor->Delete(); - Processor = NULL; - } - if (VTKGrid) - { - VTKGrid->Delete(); - VTKGrid = NULL; - } -} - -void CoProcess( - Grid& grid, Attributes& attributes, double time, unsigned int timeStep, bool lastTimeStep) -{ - vtkNew<vtkCPDataDescription> dataDescription; - dataDescription->AddInput("input"); - dataDescription->SetTimeData(time, timeStep); - if (lastTimeStep == true) - { - // assume that we want to execute all the pipelines if it - // is the last time step. - dataDescription->ForceOutputOn(); - } - if (Processor->RequestDataDescription(dataDescription.GetPointer()) != 0) - { - vtkCPInputDataDescription* idd = dataDescription->GetInputDescriptionByName("input"); - BuildVTKDataStructures(grid, attributes, idd); - idd->SetGrid(VTKGrid); - Processor->CoProcess(dataDescription.GetPointer()); - } -} -} // end of Catalyst namespace diff --git a/public/it4i/software/viz/insitu/FEAdaptor.h b/public/it4i/software/viz/insitu/FEAdaptor.h deleted file mode 100644 index 86154b252eaec4b95065cc7b838d37e996d462fe..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/FEAdaptor.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef FEADAPTOR_HEADER -#define FEADAPTOR_HEADER - -class Attributes; -class Grid; - -namespace FEAdaptor -{ -void Initialize(char* script); - -void Finalize(); - -void CoProcess( - Grid& grid, Attributes& attributes, double time, unsigned int timeStep, bool lastTimeStep); -} - -#endif diff --git a/public/it4i/software/viz/insitu/FEDataStructures.cxx b/public/it4i/software/viz/insitu/FEDataStructures.cxx deleted file mode 100644 index 858e450aa94dea6ccc598e0387596e2c7b96d15d..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/FEDataStructures.cxx +++ /dev/null @@ -1,155 +0,0 @@ -#include "FEDataStructures.h" - -#include <iostream> -#include <mpi.h> - -Grid::Grid() -{ -} - -void Grid::Initialize(const unsigned int numPoints[3], const double spacing[3]) -{ - if (numPoints[0] == 0 || numPoints[1] == 0 || numPoints[2] == 0) - { - std::cerr << "Must have a non-zero amount of points in each direction.\n"; - } - // in parallel, we do a simple partitioning in the x-direction. - int mpiSize = 1; - int mpiRank = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank); - MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); - - unsigned int startXPoint = mpiRank * numPoints[0] / mpiSize; - unsigned int endXPoint = (mpiRank + 1) * numPoints[0] / mpiSize; - if (mpiSize != mpiRank + 1) - { - endXPoint++; - } - - // create the points -- slowest in the x and fastest in the z directions - double coord[3] = { 0, 0, 0 }; - for (unsigned int i = startXPoint; i < endXPoint; i++) - { - coord[0] = i * spacing[0]; - for (unsigned int j = 0; j < numPoints[1]; j++) - { - coord[1] = j * spacing[1]; - for (unsigned int k = 0; k < numPoints[2]; k++) - { - coord[2] = k * spacing[2]; - // add the coordinate to the end of the vector - std::copy(coord, coord + 3, std::back_inserter(this->Points)); - } - } - } - // create the hex cells - unsigned int cellPoints[8]; - unsigned int numXPoints = endXPoint - startXPoint; - for (unsigned int i = 0; i < numXPoints - 1; i++) - { - for (unsigned int j = 0; j < numPoints[1] - 1; j++) - { - for (unsigned int k = 0; k < numPoints[2] - 1; k++) - { - cellPoints[0] = i * numPoints[1] * numPoints[2] + j * numPoints[2] + k; - cellPoints[1] = (i + 1) * numPoints[1] * numPoints[2] + j * numPoints[2] + k; - cellPoints[2] = (i + 1) * numPoints[1] * numPoints[2] + (j + 1) * numPoints[2] + k; - cellPoints[3] = i * numPoints[1] * numPoints[2] + (j + 1) * numPoints[2] + k; - cellPoints[4] = i * numPoints[1] * numPoints[2] + j * numPoints[2] + k + 1; - cellPoints[5] = (i + 1) * numPoints[1] * numPoints[2] + j * numPoints[2] + k + 1; - cellPoints[6] = (i + 1) * numPoints[1] * numPoints[2] + (j + 1) * numPoints[2] + k + 1; - cellPoints[7] = i * numPoints[1] * numPoints[2] + (j + 1) * numPoints[2] + k + 1; - std::copy(cellPoints, cellPoints + 8, std::back_inserter(this->Cells)); - } - } - } -} - -size_t Grid::GetNumberOfPoints() -{ - return this->Points.size() / 3; -} - -size_t Grid::GetNumberOfCells() -{ - return this->Cells.size() / 8; -} - -double* Grid::GetPointsArray() -{ - if (this->Points.empty()) - { - return NULL; - } - return &(this->Points[0]); -} - -double* Grid::GetPoint(size_t pointId) -{ - if (pointId >= this->Points.size()) - { - return NULL; - } - return &(this->Points[pointId * 3]); -} - -unsigned int* Grid::GetCellPoints(size_t cellId) -{ - if (cellId >= this->Cells.size()) - { - return NULL; - } - return &(this->Cells[cellId * 8]); -} - -Attributes::Attributes() -{ - this->GridPtr = NULL; -} - -void Attributes::Initialize(Grid* grid) -{ - this->GridPtr = grid; -} - -void Attributes::UpdateFields(double time) -{ - size_t numPoints = this->GridPtr->GetNumberOfPoints(); - this->Velocity.resize(numPoints * 3); - - // provide different update setting for different parallel process - int mpiSize = 1; - int mpiRank = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank); - MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); - double setting = 1.0 + (double) mpiRank / (double) mpiSize; - - for (size_t pt = 0; pt < numPoints; pt++) - { - double* coord = this->GridPtr->GetPoint(pt); - this->Velocity[pt] = coord[1] * time * setting; - } - std::fill(this->Velocity.begin() + numPoints, this->Velocity.end(), 0.0); - - size_t numCells = this->GridPtr->GetNumberOfCells(); - this->Pressure.resize(numCells); - std::fill(this->Pressure.begin(), this->Pressure.end(), setting); -} - -double* Attributes::GetVelocityArray() -{ - if (this->Velocity.empty()) - { - return NULL; - } - return &this->Velocity[0]; -} - -float* Attributes::GetPressureArray() -{ - if (this->Pressure.empty()) - { - return NULL; - } - return &this->Pressure[0]; -} diff --git a/public/it4i/software/viz/insitu/FEDataStructures.h b/public/it4i/software/viz/insitu/FEDataStructures.h deleted file mode 100644 index bbfdf66991e3939f1a7d439b7ee81da6d0ce963b..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/FEDataStructures.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef FEDATASTRUCTURES_HEADER -#define FEDATASTRUCTURES_HEADER - -#include <cstddef> -#include <vector> - -class Grid -{ -public: - Grid(); - void Initialize(const unsigned int numPoints[3], const double spacing[3]); - size_t GetNumberOfPoints(); - size_t GetNumberOfCells(); - double* GetPointsArray(); - double* GetPoint(size_t pointId); - unsigned int* GetCellPoints(size_t cellId); - -private: - std::vector<double> Points; - std::vector<unsigned int> Cells; -}; - -class Attributes -{ - // A class for generating and storing point and cell fields. - // Velocity is stored at the points and pressure is stored - // for the cells. - -public: - Attributes(); - void Initialize(Grid* grid); - void UpdateFields(double time); - double* GetVelocityArray(); - float* GetPressureArray(); - -private: - std::vector<double> Velocity; - std::vector<float> Pressure; - Grid* GridPtr; -}; -#endif diff --git a/public/it4i/software/viz/insitu/FEDriver.cxx b/public/it4i/software/viz/insitu/FEDriver.cxx deleted file mode 100644 index 90848a04d6790dec836ec115abb03126e48e9458..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/FEDriver.cxx +++ /dev/null @@ -1,64 +0,0 @@ -#include "FEDataStructures.h" -#include <mpi.h> -#include <stdio.h> -#include <unistd.h> -#include <iostream> -#include <stdlib.h> - -#ifdef USE_CATALYST -#include "FEAdaptor.h" -#endif - -int main(int argc, char** argv) -{ - // Check the input arguments - if (argc < 5) { - printf("Not all arguments supplied (grid definition, Python script name)\n"); - return 0; - } - - unsigned int pointsX = abs(std::stoi(argv[1])); - unsigned int pointsY = abs(std::stoi(argv[2])); - unsigned int pointsZ = abs(std::stoi(argv[3])); - - // MPI_Init(&argc, &argv); - MPI_Init(NULL, NULL); - Grid grid; - - unsigned int numPoints[3] = { pointsX, pointsY, pointsZ }; - double spacing[3] = { 1, 1.1, 1.3 }; - grid.Initialize(numPoints, spacing); - Attributes attributes; - attributes.Initialize(&grid); - -#ifdef USE_CATALYST - // The argument nr. 4 is the Python script name - FEAdaptor::Initialize(argv[4]); -#endif - unsigned int numberOfTimeSteps = 1000; - for (unsigned int timeStep = 0; timeStep < numberOfTimeSteps; timeStep++) - { - // Use a time step of length 0.1 - double time = timeStep * 0.1; - attributes.UpdateFields(time); -#ifdef USE_CATALYST - FEAdaptor::CoProcess(grid, attributes, time, timeStep, timeStep == numberOfTimeSteps - 1); -#endif - - // Get the name of the processor - char processor_name[MPI_MAX_PROCESSOR_NAME]; - int name_len; - MPI_Get_processor_name(processor_name, &name_len); - - // Print actual time step and processor name that handles the calculation - printf("This is processor %s, time step: %0.3f\n", processor_name, time); - usleep(500000); - } - -#ifdef USE_CATALYST - FEAdaptor::Finalize(); -#endif - MPI_Finalize(); - - return 0; -} diff --git a/public/it4i/software/viz/insitu/feslicescript.py b/public/it4i/software/viz/insitu/feslicescript.py deleted file mode 100644 index 1a3344ec7a932093374eb41dfa605ae973e73c72..0000000000000000000000000000000000000000 --- a/public/it4i/software/viz/insitu/feslicescript.py +++ /dev/null @@ -1,72 +0,0 @@ -from paraview.simple import * -from paraview import coprocessing - -#-------------------------------------------------------------- -# Code generated from cpstate.py to create the CoProcessor. - - -# ----------------------- CoProcessor definition ----------------------- - -def CreateCoProcessor(): - def _CreatePipeline(coprocessor, datadescription): - class Pipeline: - coprocessor.CreateProducer( datadescription, "input" ) - - return Pipeline() - - class CoProcessor(coprocessing.CoProcessor): - def CreatePipeline(self, datadescription): - self.Pipeline = _CreatePipeline(self, datadescription) - - coprocessor = CoProcessor() - freqs = {'input': []} - coprocessor.SetUpdateFrequencies(freqs) - return coprocessor - -#-------------------------------------------------------------- -# Global variables that will hold the pipeline for each timestep -# Creating the CoProcessor object, doesn't actually create the ParaView pipeline. -# It will be automatically setup when coprocessor.UpdateProducers() is called the -# first time. -coprocessor = CreateCoProcessor() - -#-------------------------------------------------------------- -# Enable Live-Visualizaton with ParaView -coprocessor.EnableLiveVisualization(True) - - -# ---------------------- Data Selection method ---------------------- - -def RequestDataDescription(datadescription): - "Callback to populate the request for current timestep" - global coprocessor - if datadescription.GetForceOutput() == True: - # We are just going to request all fields and meshes from the simulation - # code/adaptor. - for i in range(datadescription.GetNumberOfInputDescriptions()): - datadescription.GetInputDescription(i).AllFieldsOn() - datadescription.GetInputDescription(i).GenerateMeshOn() - return - - # setup requests for all inputs based on the requirements of the - # pipeline. - coprocessor.LoadRequestedData(datadescription) - -# ------------------------ Processing method ------------------------ - -def DoCoProcessing(datadescription): - "Callback to do co-processing for current timestep" - global coprocessor - - # Update the coprocessor by providing it the newly generated simulation data. - # If the pipeline hasn't been setup yet, this will setup the pipeline. - coprocessor.UpdateProducers(datadescription) - - # Write output data, if appropriate. - coprocessor.WriteData(datadescription); - - # Write image capture (Last arg: rescale lookup table), if appropriate. - coprocessor.WriteImages(datadescription, rescale_lookuptable=False) - - # Live Visualization, if enabled. - coprocessor.DoLiveVisualization(datadescription, "localhost", 22222) diff --git a/public/it4i/software/viz/insitu/img/Catalyst_connect.png b/public/it4i/software/viz/insitu/img/Catalyst_connect.png deleted file mode 100644 index f9a4901c52728b552ce8f4000d7906836e7aee20..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Catalyst_connect.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/CoProcess.png b/public/it4i/software/viz/insitu/img/CoProcess.png deleted file mode 100644 index 4cc8f5d9af44f55d93db026706b594ba12cfb53a..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/CoProcess.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Data_shown.png b/public/it4i/software/viz/insitu/img/Data_shown.png deleted file mode 100644 index 2342962bd946dae806625f8c692688e9c3a57da7..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Data_shown.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Extract_input.png b/public/it4i/software/viz/insitu/img/Extract_input.png deleted file mode 100644 index 6bdcba1b6609f5aa4def63c91c261ec31210dd58..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Extract_input.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/FEDriver.png b/public/it4i/software/viz/insitu/img/FEDriver.png deleted file mode 100644 index 59c3b8b18d930106c77a51c33f8a7b624b054c2b..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/FEDriver.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Finalize.png b/public/it4i/software/viz/insitu/img/Finalize.png deleted file mode 100644 index 9d7ae9fb1853898a4a4c8b3a0a097b98b5fc40a7..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Finalize.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Initialize.png b/public/it4i/software/viz/insitu/img/Initialize.png deleted file mode 100644 index 19ff205cc2b257a4334e227dce28d2208dd99ea4..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Initialize.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Input_pipeline.png b/public/it4i/software/viz/insitu/img/Input_pipeline.png deleted file mode 100644 index 82f8ca1c9952fc94bb05095dc5a65eb83e455955..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Input_pipeline.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Result.png b/public/it4i/software/viz/insitu/img/Result.png deleted file mode 100644 index f198073a0209e4afc562708c0bb68e3b94d85dd1..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Result.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Show_velocity.png b/public/it4i/software/viz/insitu/img/Show_velocity.png deleted file mode 100644 index 5870f929f30fdb201687705a46e79122abcc619c..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Show_velocity.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/Simulator_response.png b/public/it4i/software/viz/insitu/img/Simulator_response.png deleted file mode 100644 index c52f48a69dc20bc9966f05e35181c95485cdcc34..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/Simulator_response.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/UpdateFields.png b/public/it4i/software/viz/insitu/img/UpdateFields.png deleted file mode 100644 index a238a69d790f0e347b3d76a87230a3c8633096a3..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/UpdateFields.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/img/feslicescript.png b/public/it4i/software/viz/insitu/img/feslicescript.png deleted file mode 100644 index 29d5b7fa395b007990d49e0acab120f4f72ddf26..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/img/feslicescript.png and /dev/null differ diff --git a/public/it4i/software/viz/insitu/insitu.tar.gz b/public/it4i/software/viz/insitu/insitu.tar.gz deleted file mode 100644 index a58ee6017e061765ba7dcbf405a8ff60a8a2c222..0000000000000000000000000000000000000000 Binary files a/public/it4i/software/viz/insitu/insitu.tar.gz and /dev/null differ diff --git a/public/it4i/src/IB_single-plane_topology_-_Accelerated_nodes.pdf b/public/it4i/src/IB_single-plane_topology_-_Accelerated_nodes.pdf deleted file mode 100644 index d46c9b8fcc178bad31b7e7c11f2e120f784fc414..0000000000000000000000000000000000000000 Binary files a/public/it4i/src/IB_single-plane_topology_-_Accelerated_nodes.pdf and /dev/null differ diff --git a/public/it4i/src/IB_single-plane_topology_-_ICEX_Mcell.pdf b/public/it4i/src/IB_single-plane_topology_-_ICEX_Mcell.pdf deleted file mode 100644 index a2c7ce24e94cfbbadec3500a515e519a584671ac..0000000000000000000000000000000000000000 Binary files a/public/it4i/src/IB_single-plane_topology_-_ICEX_Mcell.pdf and /dev/null differ diff --git a/public/it4i/src/css.css b/public/it4i/src/css.css deleted file mode 100644 index 50dcdc37fc1f2f448cf7badca3de9dfb8763d57e..0000000000000000000000000000000000000000 --- a/public/it4i/src/css.css +++ /dev/null @@ -1,227 +0,0 @@ -:root { - --md-details-icon: url("data:image/svg+xml; utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z' /></svg>") -} - -.md-typeset details { - display:block; - padding-top:0; - overflow:visible -} - -.md-typeset details[open]>summary::after { - transform:rotate(90deg) -} - -.md-typeset details:not([open]) { - padding-bottom:0 -} - -.md-typeset details:not([open])>summary { - border-bottom-right-radius:.1rem -} - -.md-typeset details::after { - display:table; - content:"" -} - -.md-typeset summary { - display:block; - min-height:1rem; - padding:.4rem 1.8rem .4rem 2rem; - border-top-right-radius:.1rem; - cursor:pointer -} - -[dir=rtl] .md-typeset summary { - padding:.4rem 2rem .4rem 1.8rem -} - -.md-typeset summary::-webkit-details-marker { - display:none -} - -.md-typeset summary::after { - position:absolute; - top:.4rem; - right:.4rem; - width:1rem; - height:1rem; - background-color:currentColor; - -webkit-mask-image:var(--md-details-icon); - mask-image:var(--md-details-icon); - transform:rotate(0deg); - transition:transform 250ms; - content:"" -} - -[dir=rtl] .md-typeset summary::after { - right:initial; - left:.4rem; - transform:rotate(180deg) -} - -html .md-nav__link[for=__toc] { - display:none -} - -html .md-nav__link[for=__toc]~.md-nav { - display: none; -} - - -.md-nav__icon.md-icon svg { - display: inline-block; - width: 0.9rem; - height: 0.9rem; - vertical-align: -0.1rem;} -/* -.md-nav__icon.md-icon { - float: left; - padding-right: .2rem; -} -*/ -.md-nav__it4i_link { - display: block; - transition: color 0.125s; - text-overflow: ellipsis; - cursor: pointer; - overflow: hidden -} - -a:not([href*="//"]) { - /* CSS for internal links */ -} - -a.md-footer-social__link.fa.fa-globe { - !background: none; -} - -a[href*="//"]:not( [href*='127.0.0.1'] ):not( [href*='docs.it4i.cz'] ):not( [href*='gitlab.it4i.cz'] ):not( [href*='code.it4i.cz'] ):not( [href*='https://www.it4i.cz'] ):not( [href*='https://support.it4i.cz'] ) { - /*CSS for external links */ - background: transparent url("/img/external.png") no-repeat right 0px top 1px; - background-size: 12px; - padding: 1px 16px 1px 0px; -} - - -.md-nav__it4i_link:after { - font-family: Material Icons; - font-style: normal; - font-variant: normal; - font-weight: 400; - line-height: 1; - text-transform: none; - white-space: nowrap; - speak: none; - word-wrap: normal; - direction: ltr -} - -/* -.md-nav__item--nested>.md-nav__it4i_link:after { - content: "keyboard_arrow_down" -}*/ - -html .md-nav__it4i_link[for=toc],html .md-nav__it4i_link[for=toc]+.md-nav__it4i_link:after,html .md-nav__it4i_link[for=toc]~.md-nav { - display: none; -} - -/* -.md-nav__it4i_link[data-md-state=blur] { - color: rgba(0,0,0,.54) -} -*/ - -.md-nav__it4i_link--active,.md-nav__it4i_link:active { - color: #3f51b5 -} - -.md-nav__it4i_link:focus,.md-nav__it4i_link:hover { - color: #536dfe -} -@media only screen and (max-width: 59.9375em) { - html .md-nav__it4i_link[for=toc] { - display: block; - padding-right: 4.8rem - } - - html .md-nav__it4i_link[for=toc]:after { - color: inherit; - content: "toc" - } - - html .md-nav__it4i_link[for=toc]+.md-nav__it4i_link { - display: none - } - - html .md-nav__it4i_link[for=toc]~.md-nav { - display: -webkit-box; - display: -ms-flexbox; - display: flex - } - /* - .md-nav--primary .md-nav__item--nested>.md-nav__it4i_link { - padding-right: 4.8rem - } - - .md-nav--primary .md-nav__item--nested>.md-nav__it4i_link:after { - display: none; - }*/ - - .md-nav--primary .md-nav__it4i_link { - position: relative; - padding: 1.6rem - } - - .md-nav--primary .md-nav__it4i_link:after { - position: absolute; - top: 50%; - right: 1.2rem; - margin-top: -1.2rem; - color: rgba(0,0,0,.54); - font-size: 2.4rem - } - - .md-nav--primary .md-nav__it4i_link:focus:after,.md-nav--primary .md-nav__it4i_link:hover:after { - color: inherit - } - - .md-nav--primary .md-nav--secondary .md-nav .md-nav__it4i_link { - padding-left: 2.8rem - } - - .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__it4i_link { - padding-left: 4rem - } - - .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__it4i_link { - padding-left: 5.2rem - } - - .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__it4i_link { - padding-left: 6.4rem - } -} -@media only screen and (min-width: 76.25em) { - .md-nav__item--nested>.md-nav__it4i_link:after { - display: inline-block; - -webkit-transform-origin: .45em .45em; - transform-origin: .45em .45em; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - vertical-align: -.125em - } - - .js .md-nav__item--nested>.md-nav__it4i_link:after { - -webkit-transition: -webkit-transform .4s; - transition: -webkit-transform .4s; - transition: transform .4s; - transition: transform .4s,-webkit-transform .4s - } - - .md-nav__item--nested .md-nav__toggle:checked~.md-nav__it4i_link:after { - -webkit-transform: rotateX(180deg); - transform: rotateX(180deg) - } -} diff --git a/public/it4i/src/mympiprog_32p_2014-10-15_16-56.html b/public/it4i/src/mympiprog_32p_2014-10-15_16-56.html deleted file mode 100644 index ce60070a9ee25a91973a577fd048d88f31d4680e..0000000000000000000000000000000000000000 --- a/public/it4i/src/mympiprog_32p_2014-10-15_16-56.html +++ /dev/null @@ -1,610 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<title>mympiprog.x - Performance Report</title> -<style type="text/css"> -body { - font-family: "Lucida Grande", "Lucida Sans Unicode", "Bitstream Vera Sans",sans-serif; - font-size: 1em; - color: #2c1a0a; -} -div#content { - width: 900px; - margin-left: auto; - margin-right: auto; -} -.header { - padding-top: 16px; -} -.header_left { - float:left; - width: 532px; -} -.logo { - float: left; -} -.logo img { height: 150px; } -#time_radar { - float: right; -} -#time_radar .legend_CPU { fill: #4fd32e; font-size: 1.5em; } -#time_radar .legend_MPI { fill: #409ded; font-size: 1.5em; } -#time_radar .legend_IO { fill: #ed8140; font-size: 1.5em; } -.clear { - clear: both; -} -table { - border-spacing: 0; -} -td { - padding-left: 0; - padding-right: 16px; - padding-top: 1px; - padding-bottom: 1px; -} -#error { - border: 1px solid; - margin: 16px 0px; - padding: 16px 16px 16px 16px; - color: #C80000; - background-color: #FFC0C0; -} -#error p { - margin: 8px; -} -.application_details { - margin-top: 8px; - margin-left: 16px; - margin-right: 16px; -} -.application_details .details_key { width: 100px; color: #bdc4d5;} -.application_details table { - table-layout: fixed; - width: 100%; - color: #37537b; -} -.application_details #cmdline { - word-wrap: break-word; -} -.application_details #exe_path { - word-wrap: break-word; -} -.summary { -} -hr { - margin-top: 32px; - margin-bottom: 32px; - visibility: hidden; -} -.summary .heading { - font-family: inherit; - font-size: 1.8em; - padding-bottom: 8px; -} -#summary_cpu_class { - font-weight: bold; -} -#summary_mpi_class { - font-weight: bold; -} -#summary_io_class { - font-weight: bold; -} -.overview_general_advice p { - margin-top: 8px; - margin-bottom: 8px; -} -.subsections { - margin-bottom: 32px; -} -.subsections .heading { - font-family: inherit; - font-size: 2em; - padding-bottom: 8px; -} -.subsections .heading_cpu { - padding-bottom: 8px; -} -.subsections .heading_mpi { - padding-bottom: 8px; -} -.subsections .heading_ram { - padding-bottom: 8px; -} -.subsections .heading_io { - padding-bottom: 8px; -} -.subsections .explanation { - font-size: 0.9em; - color: #404040; - padding-top: 8px; -} - -.ltcol, .ctcol { float: left; width: 436px; padding-right: 16px; } -.rtcol { float: right; width: 436px; } - -.heading_cpu { color: #4fd32e; font-size: 1.5em; } -.heading_mpi { color: #409ded; font-size: 1.5em; } -.heading_ram { color: #ed4040; font-size: 1.5em; } -.heading_io { color: #ed8140; font-size: 1.5em; } -.cpu_span { color: #4fd32e; } -.mpi_span { color: #409ded; } -.ram { color: #ed4040; } -.io_span { color: #ed8140; } -.bar_graph { width: 200px; } -#cpu_bar { background-color: #4fd32e; width: 0; height: 2em; } -#mpi_bar { background-color: #409ded; width: 0; height: 2em; } -#io_bar { background-color: #ed8140; width: 0; height: 2em; } -.summary_table { padding-top: 16px; padding-bottom: 8px; } -.summary_table td p { margin: 0px; margin-bottom: 4px; } -.summary_table td { padding-bottom: 8px; } -.summary_table .details { font-size: 0.9em; } -.balanced_span { color: #bb58d6; } -.right_cell { text-align: right; } - -#cpu_chart { padding-top: 8px; } -#cpu_chart td { font-size: 0.9em; padding-bottom: 8px; } -.mini_bar_graph { width: 50px; } -#cpu_num_bar { background-color: #4fd32e; width: 0; height: 1em; } -#cpu_vec_bar { background-color: #3c9f23; width: 0; height: 1em; } -#cpu_mem_bar { background-color: #266516; width: 0; height: 1em; } -#cpu_other_bar { background-color: #808080; width: 0; height: 1em; } -.cpu_num_span { color: #4fd32e; } -.cpu_vec_span { color: #3c9f23; } -.cpu_mem_span { color: #266516; } -.cpu_other_span { color: #808080; } - -#mpi_chart { padding-top: 8px; } -#mpi_chart td { font-size: 0.9em; padding-bottom: 8px; } -#mpi_col_bar { background-color: #409ded; width: 0; height: 1em; } -#mpi_p2p_bar { background-color: #2f73ad; width: 0; height: 1em; } -#mpi_colrate_bar { background-color: #255a87; width: 0; height: 1em; } -#mpi_p2prate_bar { background-color: #1f4a70; width: 0; height: 1em; } -.mpi_col_span { color: #409ded; } -.mpi_p2p_span { color: #2f73ad; } -.mpi_colrate_span { color: #255a87; } -.mpi_p2prate_span { color: #1f4a70; } - -#ram_chart { padding-top: 8px; } -#ram_chart td { font-size: 0.9em; padding-bottom: 8px; } -#ram_mean_bar { background-color: #ed4040; width: 0; height: 1em; } -#ram_peak_bar { background-color: #b53131; width: 0; height: 1em; } -#ram_node_bar { background-color: #742020; width: 0; height: 1em; } -.ram_mean_span { color: #ed4040; } -.ram_peak_span { color: #b53131; } -.ram_node_span { color: #742020; } - -#io_chart { padding-top: 8px; } -#io_chart td { font-size: 0.9em; padding-bottom: 8px; } -#io_read_bar { background-color: #ed8140; width: 0; height: 1em; } -#io_write_bar { background-color: #a95e0b; width: 0; height: 1em; } -#io_readrate_bar { background-color: #9b7c14; width: 0; height: 1em; } -#io_writerate_bar { background-color: #7b6210; width: 0; height: 1em; } -.io_read_span { color: #ed8140; } -.io_write_span { color: #a95e0b; } -.io_readrate_span { color: #9b7c14; } -.io_writerate_span { color: #7b6210; } - -</style> -<script type="text/javascript">d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=la.length;r>e;++e){var u=la[e]+t;if(u in n)return u}}function c(){}function s(){}function l(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function f(){$o.event.preventDefault()}function h(){for(var n,t=$o.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new s,e=0,r=arguments.length;++e<r;)t[arguments[e]]=l(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=$o.event;u.target=n,$o.event=u,t[u.type].apply(e,r)}finally{$o.event=i}}},t}function p(n){return ha(n,ma),n}function v(n){return"function"==typeof n?n:function(){return ga(n,this)}}function d(n){return"function"==typeof n?n:function(){return pa(n,this)}}function m(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=$o.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\s+/g," ")}function x(n){return new RegExp("(?:^|\\s+)"+$o.requote(n)+"(?:\\s+|$)","g")}function M(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\s+/).map(_);var u=n.length;return"function"==typeof t?r:e}function _(n){var t=x(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",y(u+" "+n))):e.setAttribute("class",y(u.replace(t," ")))}}function b(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function w(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function S(n){return"function"==typeof n?n:(n=$o.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function k(n){return{__data__:n}}function E(n){return function(){return da(this,n)}}function A(n){return arguments.length||(n=$o.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function C(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function N(n){return ha(n,xa),n}function L(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function T(){var n=this.__transition__;n&&++n.active}function q(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=s(t,Wo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+$o.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),s=z;a>0&&(n=n.substring(0,a));var l=_a.get(n);return l&&(n=l,s=R),a?t?u:r:t?c:i}function z(n,t){return function(e){var r=$o.event;$o.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{$o.event=r}}}function R(n,t){var e=z(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function D(){var n=".dragsuppress-"+ ++wa,t="click"+n,e=$o.select(Ko).on("touchmove"+n,f).on("dragstart"+n,f).on("selectstart"+n,f);if(ba){var r=Go.style,u=r[ba];r[ba]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),ba&&(r[ba]=u),i&&(e.on(t,function(){f(),o()},!0),setTimeout(o,0))}}function P(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Sa&&(Ko.scrollX||Ko.scrollY)){e=$o.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();Sa=!(u.f||u.e),e.remove()}return Sa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function U(n){return n>0?1:0>n?-1:0}function j(n){return n>1?0:-1>n?ka:Math.acos(n)}function H(n){return n>1?Aa:-1>n?-Aa:Math.asin(n)}function F(n){return((n=Math.exp(n))-1/n)/2}function O(n){return((n=Math.exp(n))+1/n)/2}function Y(n){return((n=Math.exp(2*n))-1)/(n+1)}function I(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=La)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*Oa,r=tt(r)*Ya,i=tt(i)*Ia,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n>0?B(Math.atan2(e,t)*Ta,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n>>16,255&n>>8,255&n)}function it(n){return ut(n)+""}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function st(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=Xa.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function lt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/Oa),u=et((.2126729*n+.7151522*t+.072175*e)/Ya),i=et((.0193339*n+.119192*t+.9503041*e)/Ia);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function vt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=$o.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Ko.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=$o.event;$o.event=n;try{o.progress.call(i,c)}finally{$o.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Wo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},$o.rebind(i,o,"on"),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function xt(){var n=Mt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(Ja),Ja=setTimeout(xt,t)),Wa=0):(Wa=1,Ka(xt))}function Mt(){var n=Date.now();for(Ga=$a;Ga;)n>=Ga.t&&(Ga.f=Ga.c(n-Ga.t)),Ga=Ga.n;return n}function _t(){for(var n,t=$a,e=1/0;t;)t.f?t=n?n.n=t.n:$a=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Ba=n,e}function bt(n,t){var e=Math.pow(10,3*aa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function wt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function St(n){return n+""}function kt(){}function Et(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function At(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function Ct(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function Nt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Ct(n[e],t,1);t.polygonEnd()}function Lt(){function n(n,t){n*=La,t=t*La/2+ka/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,s=u*o+c*Math.cos(e),l=c*Math.sin(e);hc.add(Math.atan2(l,s)),r=n,u=o,i=a}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*La,u=Math.cos(a=(e=a)*La/2+ka/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function Tt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function qt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function zt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Rt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Dt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Pt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Ut(n){return[Math.atan2(n[1],n[0]),H(n[2])]}function jt(n,t){return aa(n[0]-t[0])<Ca&&aa(n[1]-t[1])<Ca}function Ht(n,t){n*=La;var e=Math.cos(t*=La);Ft(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Ft(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function Ot(){function n(n,u){n*=La;var i=Math.cos(u*=La),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),Ft(t,e,r)}var t,e,r;kc.point=function(u,i){u*=La;var o=Math.cos(i*=La);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,Ft(t,e,r)}}function Yt(){kc.point=Ht}function It(){function n(n,t){n*=La;var e=Math.cos(t*=La),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-j(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),Ft(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=La;var c=Math.cos(a*=La);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Ft(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Yt,kc.point=Ht}}function Zt(){return!0}function Vt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(jt(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new $t(e,n,null,!0),s=new $t(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new $t(r,n,null,!1),s=new $t(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Xt(i),Xt(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Xt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function $t(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=$o.merge(g);var n=Kt(m,p);g.length?Vt(g,Gt,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Jt(),M=t(x);return y}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.x)[0]<0?n[1]-Aa-Ca:Aa-n[1])-((t=t.x)[0]<0?t[1]-Aa-Ca:Aa-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+ka/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+ka/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=aa(_)>ka,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?Ea:-Ea):_,b^h>=e^m>=e){var S=zt(Tt(f),Tt(n));Pt(S);var k=zt(u,S);Pt(k);var E=(b^_>=0?-1:1)*H(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ca>i||Ca>i&&0>hc)^1&o}function Qt(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?ka:-ka,c=aa(i-e);aa(c-ka)<Ca?(n.point(e,r=(r+o)/2>0?Aa:-Aa),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=ka&&(aa(e-u)<Ca&&(e-=u*Ca),aa(i-a)<Ca&&(i-=a*Ca),r=ne(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var u,i,o=Math.sin(n-e);return aa(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function te(n,t,e,r){var u;if(null==n)u=e*Aa,r.point(-ka,u),r.point(0,u),r.point(ka,u),r.point(ka,0),r.point(ka,-u),r.point(0,-u),r.point(-ka,-u),r.point(-ka,0),r.point(-ka,u);else if(aa(n[0]-t[0])>Ca){var i=n[0]<t[0]?ka:-ka;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?ka:-ka),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(jt(e,g)||jt(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&jt(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=Tt(n),u=Tt(t),o=[1,0,0],a=zt(r,u),c=qt(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=zt(o,a),p=Dt(o,f),v=Dt(a,h);Rt(p,v);var d=g,m=qt(p,d),y=qt(d,d),x=m*m-y*(qt(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=Dt(d,(-m-M)/y);if(Rt(_,p),_=Ut(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=aa(A-ka)<Ca,N=C||Ca>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(aa(_[0]-w)<Ca?k:E):k<=_[1]&&_[1]<=E:A>ka^(w<=_[0]&&_[0]<=S)){var L=Dt(d,(-m+M)/y);return Rt(L,p),[_,Ut(L)]}}}function u(t,e){var r=o?n:ka-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=aa(i)>Ca,c=Le(n,6*La);return Bt(t,e,c,o?[0,-n]:[-ka,n-ka])}function re(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function ue(n,t,e,r){function u(r,u){return aa(r[0]-n)<Ca?u>0?0:3:aa(r[0]-e)<Ca?u>0?2:1:aa(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=m.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=m[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&s(l,i,n)>0&&++t:i[1]<=r&&s(l,i,n)<0&&--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function l(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function f(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function h(n,t){f(n,t)&&a.point(n,t)}function g(){L.point=v,m&&m.push(y=[]),k=!0,S=!1,b=w=0/0}function p(){d&&(v(x,M),_&&S&&C.rejoin(),d.push(C.buffer())),L.point=h,S&&a.lineEnd()}function v(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=f(n,t);if(m&&y.push([n,t]),k)x=n,M=t,_=e,k=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&S)a.point(n,t);else{var r={a:{x:b,y:w},b:{x:n,y:t}};N(r)?(S||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),E=!1):e&&(a.lineStart(),a.point(n,t),E=!1)}b=n,w=t,S=e}var d,m,y,x,M,_,b,w,S,k,E,A=a,C=Jt(),N=re(n,t,e,r),L={point:h,lineStart:g,lineEnd:p,polygonStart:function(){a=C,d=[],m=[],E=!0},polygonEnd:function(){a=A,d=$o.merge(d);var t=c([n,r]),e=E&&t,u=d.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Vt(d,i,t,l,a),a.polygonEnd()),d=m=y=null}};return L}}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=ka/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ka/180,e=n[1]*ka/180):[180*(t/ka),180*(e/ka)]},u}function ae(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,H((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function se(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),Tc>t&&(Tc=t),t>zc&&(zc=t)}function le(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=fe(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=fe(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function fe(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function he(n,t){dc+=n,mc+=t,++yc}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,he(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,he(t=r,e=u)}}function pe(){Pc.point=he}function ve(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,he(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,he(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function de(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Ea)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:c};return a}function me(n){function t(n){return(a?r:e)(n)}function e(t){return Me(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=Tt([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=aa(aa(w)-1)<Ca?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M>i||aa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*La),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function ye(n){var t=me(function(t,e){return n([t*Ta,e*Ta])});return function(n){return we(t(n))}}function xe(n){this.stream=n}function Me(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function _e(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*La,n[1]*La),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*Ta,n[1]*Ta]}function r(){a=ie(o=Ee(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=vt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=we(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):ee((b=+n)*La),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?ue(n[0][0],n[0][1],n[1][0],n[1][1]):vt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*La,d=n[1]%360*La,r()):[v*Ta,d*Ta]},t.rotate=function(n){return arguments.length?(m=n[0]%360*La,y=n[1]%360*La,x=n.length>2?n[2]%360*La:0,r()):[m*Ta,y*Ta,x*Ta]},$o.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function we(n){return Me(n,function(t,e){n.point(t*La,e*La)})}function Se(n,t){return[n,t]}function ke(n,t){return[n>ka?n-Ea:-ka>n?n+Ea:n,t]}function Ee(n,t,e){return n?t||e?ie(Ce(n),Ne(t,e)):Ce(n):t||e?Ne(t,e):ke}function Ae(n){return function(t,e){return t+=n,[t>ka?t-Ea:-ka>t?t+Ea:t,e]}}function Ce(n){var t=Ae(n);return t.invert=Ae(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),H(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),H(l*r-a*u)]},e}function Le(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=Te(e,u),i=Te(e,i),(o>0?i>u:u>i)&&(u+=o*Ea)):(u=n+o*Ea,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=Ut([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function Te(n,t){var e=Tt(t);e[0]-=n,Pt(e);var r=j(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function qe(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ze(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Re(n){return n.source}function De(n){return n.target}function Pe(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(I(r-t)+u*o*I(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ta,Math.atan2(o,Math.sqrt(r*r+u*u))*Ta]}:function(){return[n*Ta,t*Ta]};return p.distance=h,p}function Ue(){function n(n,u){var i=Math.sin(u*=La),o=Math.cos(u),a=aa((n*=La)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*La,e=Math.sin(i*=La),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=c}}function je(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function He(n,t){function e(n,t){var e=aa(aa(t)-Aa)<Ca?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ka/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=U(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Aa]},e):Oe}function Fe(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return aa(u)<Ca?Se:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-U(u)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(ka/4+t/2))]}function Ye(n){var t,e=_e(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=ka*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n,t,e,r){var u,i,o,a,c,s,l;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],s=u[0],l=u[1],(l-o)*(a-i)-(c-o)*(s-i)>0}function $e(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Be(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function We(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Je(){mr(this),this.edge=this.site=this.circle=null}function Ge(n){var t=Jc.pop()||new Je;return t.site=n,t}function Ke(n){cr(n),$c.remove(n),Jc.push(n),mr(n)}function Qe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Ke(n);for(var c=i;c.circle&&aa(e-c.circle.x)<Ca&&aa(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Ke(c),c=i;a.unshift(c),cr(c);for(var s=o;s.circle&&aa(e-s.circle.x)<Ca&&aa(r-s.circle.cy)<Ca;)o=s.N,a.push(s),Ke(s),s=o;a.push(s),cr(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],pr(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=hr(c.site,s.site,null,u),ar(c),ar(s)}function nr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=tr(a,o)-i,r>Ca)a=a.L;else{if(u=i-er(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Ge(n);if($c.insert(t,c),t||e){if(t===e)return cr(t),e=Ge(t.site),$c.insert(c,e),c.edge=e.edge=hr(t.site,c.site),ar(t),ar(e),void 0;if(!e)return c.edge=hr(t.site,c.site),void 0;cr(t),cr(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};pr(e.edge,s,p,M),c.edge=hr(s,n,null,M),e.edge=hr(n,p,null,M),ar(t),ar(e)}}function tr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function er(n,t){var e=n.N;if(e)return tr(e,t);var r=n.site;return r.y===t?r.x:1/0}function rr(n){this.site=n,this.edges=[]}function ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(aa(r-t)>Ca||aa(u-e)>Ca)&&(a.splice(o,0,new vr(gr(i.site,l,aa(r-f)<Ca&&p-u>Ca?{x:f,y:aa(t-f)<Ca?e:p}:aa(u-p)<Ca&&h-r>Ca?{x:aa(e-p)<Ca?t:h,y:p}:aa(r-h)<Ca&&u-g>Ca?{x:h,y:aa(t-h)<Ca?e:g}:aa(u-g)<Ca&&r-f>Ca?{x:aa(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function ir(n,t){return t.angle-n.angle}function or(){mr(this),this.x=this.y=this.arc=this.site=this.cy=null}function ar(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-Na)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new or;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function cr(n){var t=n.circle;t&&(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),mr(t),n.circle=null)}function sr(n){for(var t,e=Vc,r=re(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!lr(t,n)||!r(t)||aa(t.a.x-t.b.x)<Ca&&aa(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function lr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2; -if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function fr(n,t){this.l=n,this.r=t,this.a=this.b=null}function hr(n,t,e,r){var u=new fr(n,t);return Vc.push(u),e&&pr(u,n,t,e),r&&pr(u,t,n,r),Xc[n.i].edges.push(new vr(u,n,t)),Xc[t.i].edges.push(new vr(u,t,n)),u}function gr(n,t,e){var r=new fr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function pr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function vr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function dr(){this._=null}function mr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function yr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function xr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function Mr(n){for(;n.L;)n=n.L;return n}function _r(n,t){var e,r,u,i=n.sort(br).pop();for(Vc=[],Xc=new Array(n.length),$c=new dr,Wc=new dr;;)if(u=Bc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Xc[i.i]=new rr(i),nr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Qe(u.arc)}t&&(sr(t),ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function br(n,t){return t.y-n.y||t.x-n.x}function wr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function Sr(n){return n.x}function kr(n){return n.y}function Er(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Ar(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&Ar(n,c[0],e,r,o,a),c[1]&&Ar(n,c[1],o,r,u,a),c[2]&&Ar(n,c[2],e,a,o,i),c[3]&&Ar(n,c[3],o,a,u,i)}}function Cr(n,t){n=$o.rgb(n),t=$o.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function Nr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=qr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function Lr(n,t){return t-=n=+n,function(e){return n+t*e}}function Tr(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=Lr(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function qr(n,t){for(var e,r=$o.interpolators.length;--r>=0&&!(e=$o.interpolators[r](n,t)););return e}function zr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(qr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Rr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Dr(n){return function(t){return 1-n(1-t)}}function Pr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Ur(n){return n*n}function jr(n){return n*n*n}function Hr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Fr(n){return function(t){return Math.pow(t,n)}}function Or(n){return 1-Math.cos(n*Aa)}function Yr(n){return Math.pow(2,10*(n-1))}function Ir(n){return 1-Math.sqrt(1-n*n)}function Zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ea*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ea/t)}}function Vr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Xr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function $r(n,t){n=$o.hcl(n),t=$o.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+""}}function Br(n,t){n=$o.hsl(n),t=$o.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+""}}function Wr(n,t){n=$o.lab(n),t=$o.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return Q(e+i*n,r+o*n,u+a*n)+""}}function Jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Gr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Qr(t),u=Kr(t,e),i=Qr(nu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ta,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ta:0}function Kr(n,t){return n[0]*t[0]+n[1]*t[1]}function Qr(n){var t=Math.sqrt(Kr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function nu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function tu(n,t){var e,r=[],u=[],i=$o.transform(n),o=$o.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:Lr(a[0],c[0])},{i:3,x:Lr(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:Lr(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:Lr(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:Lr(g[0],p[0])},{i:e-2,x:Lr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function eu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function ru(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function uu(n){for(var t=n.source,e=n.target,r=ou(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function iu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function ou(n,t){if(n===t)return n;for(var e=iu(n),r=iu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function au(n){n.fixed|=2}function cu(n){n.fixed&=-7}function su(n){n.fixed|=4,n.px=n.x,n.py=n.y}function lu(n){n.fixed&=-5}function fu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(fu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function hu(n,t){return $o.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=du,n}function gu(n){return n.children}function pu(n){return n.value}function vu(n,t){return t.value-n.value}function du(n){return $o.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function mu(n){return n.x}function yu(n){return n.y}function xu(n,t,e){n.y0=t,n.y=e}function Mu(n){return $o.range(n.length)}function _u(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function bu(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function wu(n){return n.reduce(Su,0)}function Su(n,t){return n+t[1]}function ku(n,t){return Eu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Eu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function Au(n){return[$o.min(n),$o.max(n)]}function Cu(n,t){return n.parent==t.parent?1:2}function Nu(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function Lu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function Tu(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=Tu(e[i],t),n)>0&&(n=r);return n}function qu(n,t){return n.x-t.x}function zu(n,t){return t.x-n.x}function Ru(n,t){return n.depth-t.depth}function Du(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Pu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function Uu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function ju(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Hu(n,t){return n.value-t.value}function Fu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Ou(n,t){n._pack_next=t,t._pack_prev=n}function Yu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Iu(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Zu),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],$u(r,u,i),t(i),Fu(r,i),r._pack_prev=i,Fu(i,u),u=r._pack_next,o=3;s>o;o++){$u(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Yu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Yu(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Ou(r,u=a):Ou(r=c,u),o--):(Fu(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Vu)}}function Zu(n){n._pack_next=n._pack_prev=n}function Vu(n){delete n._pack_next,delete n._pack_prev}function Xu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)Xu(u[i],t,e,r)}function $u(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Bu(n){return 1+$o.max(n,function(n){return n.y})}function Wu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ju(n){var t=n.children;return t&&t.length?Ju(t[0]):n}function Gu(n){var t,e=n.children;return e&&(t=e.length)?Gu(e[t-1]):n}function Ku(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Qu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ni(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function ti(n){return n.rangeExtent?n.rangeExtent():ni(n.range())}function ei(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function ri(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ss}function ii(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=$o.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function oi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?ii:ei,c=r?ru:eu;return o=u(n,t,c,e),a=u(t,n,c,qr),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return li(n,t)},i.tickFormat=function(t,e){return fi(n,t,e)},i.nice=function(t){return ci(n,t),u()},i.copy=function(){return oi(n,t,e,r)},u()}function ai(n,t){return $o.rebind(n,t,"range","rangeRound","interpolate","clamp")}function ci(n,t){return ri(n,ui(si(n,t)[2]))}function si(n,t){null==t&&(t=10);var e=ni(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function li(n,t){return $o.range.apply($o,si(n,t))}function fi(n,t,e){var r=si(n,t);return $o.format(e?e.replace(uc,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+gi(l,r),l].join("")}):",."+hi(r[2])+"f")}function hi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function gi(n,t){var e=hi(t[2]);return n in ls?Math.abs(e-hi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function pi(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=ri(r.map(u),e?Math:hs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=ni(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return fs;arguments.length<2?t=fs:"function"!=typeof t&&(t=$o.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return pi(n.copy(),t,e,r)},ai(o,n)}function vi(n,t,e){function r(t){return n(u(t))}var u=di(t),i=di(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return li(e,n)},r.tickFormat=function(n,t){return fi(e,n,t)},r.nice=function(n){return r.domain(ci(e,n))},r.exponent=function(o){return arguments.length?(u=di(t=o),i=di(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return vi(n.copy(),t,e)},ai(r,n)}function di(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function mi(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return $o.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+s)/2:c+l*i/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return ni(t.a[0])},e.copy=function(){return mi(n,t)},e.domain(n)}function yi(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=$o.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[$o.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort($o.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return yi(n,t)},e()}function xi(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return xi(n,t,e)},u()}function Mi(n,t){function e(e){return e>=e?t[$o.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Mi(n,t)},e}function _i(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return li(n,t)},t.tickFormat=function(t,e){return fi(n,t,e)},t.copy=function(){return _i(n)},t}function bi(n){return n.innerRadius}function wi(n){return n.outerRadius}function Si(n){return n.startAngle}function ki(n){return n.endAngle}function Ei(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=Ze,r=Ve,u=Zt,i=Ai,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=xs.get(n)||Ai).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ai(n){return n.join("L")}function Ci(n){return Ai(n)+"Z"}function Ni(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function Li(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Ti(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function qi(n,t){return n.length<4?Ai(n):n[1]+Di(n.slice(1,n.length-1),Pi(n,t))}function zi(n,t){return n.length<3?Ai(n):n[0]+Di((n.push(n[0]),n),Pi([n[n.length-2]].concat(n,[n[1]]),t))}function Ri(n,t){return n.length<3?Ai(n):n[0]+Di(n,Pi(n,t))}function Di(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Ai(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function Pi(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function Ui(n){if(n.length<3)return Ai(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Oi(bs,o),",",Oi(bs,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Yi(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ji(n){if(n.length<4)return Ai(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Oi(bs,i)+","+Oi(bs,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Yi(e,i,o);return e.join("")}function Hi(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Oi(bs,o),",",Oi(bs,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Yi(t,o,a);return t.join("")}function Fi(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return Ui(n)}function Oi(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Yi(n,t,e){n.push("C",Oi(Ms,t),",",Oi(Ms,e),",",Oi(_s,t),",",Oi(_s,e),",",Oi(bs,t),",",Oi(bs,e))}function Ii(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Zi(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=Ii(u,i);++t<e;)r[t]=(o+(o=Ii(u=i,i=n[t+1])))/2;return r[t]=o,r}function Vi(n){for(var t,e,r,u,i=[],o=Zi(n),a=-1,c=n.length-1;++a<c;)t=Ii(n[a],n[a+1]),aa(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Xi(n){return n.length<3?Ai(n):n[0]+Di(n,Vi(n))}function $i(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+ms,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Bi(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=pt(e),_=pt(u),b=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ze,r=Ze,u=0,i=Ve,o=Zt,a=Ai,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=xs.get(n)||Ai).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Wi(n){return n.radius}function Ji(n){return[n.x,n.y]}function Gi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ms;return[e*Math.cos(r),e*Math.sin(r)]}}function Ki(){return 64}function Qi(){return"circle"}function no(n){var t=Math.sqrt(n/ka);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function to(n,t){return ha(n,Cs),n.id=t,n}function eo(n,t,e,r){var u=n.id;return C(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function ro(n){return null==n&&(n=""),function(){this.textContent=n}}function uo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,$o.timer(function(r){function u(r){return i.active>e?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),$o.timer(function(){return p.c=c(r||1)?Zt:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ga,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function io(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function oo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function ao(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function co(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new Ds(e-1)),1),e}function i(n,e){return t(n=new Ds(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Ds=ao;var r=new ao;return r._=n,o(r,t,e)}finally{Ds=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=so(n);return c.floor=c,c.round=so(r),c.ceil=so(u),c.offset=so(i),c.range=a,n}function so(n){return function(t,e){try{Ds=ao;var r=new ao;return r._=t,n(r,e)._}finally{Ds=Date}}}function lo(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a<e;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=nl[r=n.charAt(++a)])&&(r=n.charAt(++a)),(i=tl[r])&&(r=i(t,null==u?"e"===r?" ":"0":u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=fo(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=null!=e.Z&&Ds!==ao,i=new(u?ao:Ds);return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function fo(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=el[o in nl?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function ho(n){return new RegExp("^(?:"+n.map($o.requote).join("|")+")","i")}function go(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function po(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function vo(n,t,e){$s.lastIndex=0;var r=$s.exec(t.substring(e));return r?(n.w=Bs.get(r[0].toLowerCase()),e+r[0].length):-1}function mo(n,t,e){Vs.lastIndex=0;var r=Vs.exec(t.substring(e));return r?(n.w=Xs.get(r[0].toLowerCase()),e+r[0].length):-1}function yo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function xo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Mo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function _o(n,t,e){Gs.lastIndex=0;var r=Gs.exec(t.substring(e));return r?(n.m=Ks.get(r[0].toLowerCase()),e+r[0].length):-1}function bo(n,t,e){Ws.lastIndex=0;var r=Ws.exec(t.substring(e));return r?(n.m=Js.get(r[0].toLowerCase()),e+r[0].length):-1}function wo(n,t,e){return fo(n,tl.c.toString(),t,e)}function So(n,t,e){return fo(n,tl.x.toString(),t,e)}function ko(n,t,e){return fo(n,tl.X.toString(),t,e)}function Eo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ao(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.y=No(+r[0]),e+r[0].length):-1}function Co(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function No(n){return n+(n>68?1900:2e3)}function Lo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function To(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function qo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function zo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Ro(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Do(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Po(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function Uo(n,t,e){var r=ul.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function jo(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(aa(t)/60),u=aa(t)%60;return e+po(r,"0",2)+po(u,"0",2)}function Ho(n,t,e){Qs.lastIndex=0;var r=Qs.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function Fo(n){function t(n){try{Ds=ao;var t=new Ds;return t._=n,e(t)}finally{Ds=Date}}var e=lo(n);return t.parse=function(n){try{Ds=ao;var t=e.parse(n);return t&&t._}finally{Ds=Date}},t.toString=e.toString,t}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=$o.bisect(ol,u);return i==ol.length?[t.year,si(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/ol[i-1]<ol[i]/u?i-1:i]:[ll,si(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=ni(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(ri(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ni(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},ai(r,n)}function Io(n){return new Date(n)}function Zo(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function Vo(n){return JSON.parse(n.responseText)}function Xo(n){var t=Jo.createRange();return t.selectNode(Jo.body),t.createContextualFragment(n.responseText)}var $o={version:"3.3.9"};Date.now||(Date.now=function(){return+new Date});var Bo=[].slice,Wo=function(n){return Bo.call(n)},Jo=document,Go=Jo.documentElement,Ko=window;try{Wo(Go.childNodes)[0].nodeType}catch(Qo){Wo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Jo.createElement("div").style.setProperty("opacity",0,"")}catch(na){var ta=Ko.Element.prototype,ea=ta.setAttribute,ra=ta.setAttributeNS,ua=Ko.CSSStyleDeclaration.prototype,ia=ua.setProperty;ta.setAttribute=function(n,t){ea.call(this,n,t+"")},ta.setAttributeNS=function(n,t,e){ra.call(this,n,t,e+"")},ua.setProperty=function(n,t,e){ia.call(this,n,t+"",e)}}$o.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},$o.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},$o.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},$o.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},$o.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},$o.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},$o.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},$o.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r; -return i?u+i*(n[r]-u):u},$o.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?$o.quantile(t.sort($o.ascending),.5):void 0},$o.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var oa=$o.bisector(function(n){return n});$o.bisectLeft=oa.left,$o.bisect=$o.bisectRight=oa.right,$o.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},$o.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},$o.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},$o.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=$o.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},$o.transpose=function(n){return $o.zip.apply($o,n)},$o.keys=function(n){var t=[];for(var e in n)t.push(e);return t},$o.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},$o.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},$o.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var aa=Math.abs;$o.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(aa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},$o.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return ca+n in this},get:function(n){return this[ca+n]},set:function(n,t){return this[ca+n]=t},remove:function(n){return n=ca+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1),this[t])}});var ca="\x00",sa=ca.charCodeAt(0);$o.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n($o.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},$o.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(i,{has:function(n){return ca+n in this},add:function(n){return this[ca+n]=!0,n},remove:function(n){return n=ca+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1))}}),$o.behavior={},$o.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var la=["webkit","ms","moz","Moz","o","O"];$o.dispatch=function(){for(var n=new s,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=l(n);return n},s.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},$o.event=null,$o.requote=function(n){return n.replace(fa,"\\$&")};var fa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ha={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ga=function(n,t){return t.querySelector(n)},pa=function(n,t){return t.querySelectorAll(n)},va=Go[a(Go,"matchesSelector")],da=function(n,t){return va.call(n,t)};"function"==typeof Sizzle&&(ga=function(n,t){return Sizzle(n,t)[0]||null},pa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},da=Sizzle.matchesSelector),$o.selection=function(){return Ma};var ma=$o.selection.prototype=[];ma.select=function(n){var t,e,r,u,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return p(i)},ma.selectAll=function(n){var t,e,r=[];n=d(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Wo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var ya={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};$o.ns={prefix:ya,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ya.hasOwnProperty(e)?{space:ya[e],local:n}:n}},ma.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=$o.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},ma.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!x(n[u]).test(t))return!1;return!0}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},ma.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(b(e,n[e],t));return this}if(2>r)return Ko.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(b(n,t,e))},ma.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},ma.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},ma.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},ma.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ma.insert=function(n,t){return n=S(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ma.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},ma.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r<a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r<f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=k(o)),y.set(d,o),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=k(o);for(;f>r;++r)p[r]=k(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=N([]),s=p([]),l=p([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},ma.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},ma.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return p(u)},ma.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ma.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},ma.each=function(n){return C(this,function(t,e,r){n.call(t,t.__data__,e,r)})},ma.call=function(n){var t=Wo(arguments);return n.apply(t[0]=this,t),this},ma.empty=function(){return!this.node()},ma.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ma.size=function(){var n=0;return this.each(function(){++n}),n};var xa=[];$o.selection.enter=N,$o.selection.enter.prototype=xa,xa.append=ma.append,xa.empty=ma.empty,xa.node=ma.node,xa.call=ma.call,xa.size=ma.size,xa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return p(o)},xa.insert=function(n,t){return arguments.length<2&&(t=L(this)),ma.insert.call(this,n,t)},ma.transition=function(){for(var n,t,e=Ss||++Ns,r=[],u=ks||{time:Date.now(),ease:Hr,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&uo(t,c,e,u),n.push(t)}return to(r,e)},ma.interrupt=function(){return this.each(T)},$o.select=function(n){var t=["string"==typeof n?ga(n,Jo):n];return t.parentNode=Go,p([t])},$o.selectAll=function(n){var t=Wo("string"==typeof n?pa(n,Jo):n);return t.parentNode=Go,p([t])};var Ma=$o.select(Go);ma.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(q(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(q(n,t,e))};var _a=$o.map({mouseenter:"mouseover",mouseleave:"mouseout"});_a.forEach(function(n){"on"+n in Jo&&_a.remove(n)});var ba="onselectstart"in Jo?null:a(Go.style,"userSelect"),wa=0;$o.mouse=function(n){return P(n,h())};var Sa=/WebKit/.test(Ko.navigator.userAgent)?-1:0;$o.touches=function(n,t){return arguments.length<2&&(t=h().touches),t?Wo(t).map(function(t){var e=P(n,t);return e.identifier=t.identifier,e}):[]},$o.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return $o.event.changedTouches[0].identifier}function e(n,t){return $o.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&$o.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=$o.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=$o.select(Ko).on(e+"."+p,o).on(r+"."+p,a),y=D();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=g(n,"drag","dragstart","dragend"),i=null,o=r(c,$o.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},$o.rebind(n,u,"on")};var ka=Math.PI,Ea=2*ka,Aa=ka/2,Ca=1e-6,Na=Ca*Ca,La=ka/180,Ta=180/ka,qa=Math.SQRT2,za=2,Ra=4;$o.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=O(v),o=i/(za*h)*(e*Y(qa*t+v)-F(v));return[r+o*s,u+o*l,i*e/O(qa*t+v)]}return[r+n*s,u+n*l,i*Math.exp(qa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ra*f)/(2*i*za*h),p=(c*c-i*i-Ra*f)/(2*c*za*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/qa;return e.duration=1e3*y,e},$o.behavior.zoom=function(){function n(n){n.on(A,s).on(Ua+".zoom",h).on(C,p).on("dblclick.zoom",v).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u($o.mouse(r),h),a(i)}function e(){f.on(C,Ko===r?p:null).on(N,null),g(l&&$o.event.target===s),c(i)}var r=this,i=q.of(r,arguments),s=$o.event.target,l=0,f=$o.select(Ko).on(C,n).on(N,e),h=t($o.mouse(r)),g=D();T.call(r),o(i)}function l(){function n(){var n=$o.touches(p);return g=S.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=t(n))}),n}function e(){for(var t=$o.event.changedTouches,e=0,i=t.length;i>e;++e)d[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=d[s.identifier];r(2*S.k),u(s,l),f(),a(v)}x=c}else if(o.length>1){var s=o[0],h=o[1],g=s[0]-h[0],p=s[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=$o.touches(p),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}x=null,u(n,t),a(v)}function h(){if($o.event.touches.length){for(var t=$o.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(v)}var g,p=this,v=q.of(p,arguments),d={},m=0,y=$o.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=$o.select(Ko).on(M,i).on(_,h),w=$o.select(p).on(A,null).on(L,e),k=D();T.call(p),e(),o(v)}function h(){var n=q.of(this,arguments);y?clearTimeout(y):(T.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||$o.mouse(this);d||(d=t(e)),r(Math.pow(2,.002*Da())*S.k),u(e,d),a(n)}function p(){d=null}function v(){var n=q.of(this,arguments),e=$o.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,$o.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var d,m,y,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Pa,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",q=g(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=q.of(this,arguments),t=S;Ss?$o.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=$o.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Pa:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},$o.rebind(n,q,"on")};var Da,Pa=[0,1/0],Ua="onwheel"in Jo?(Da=function(){return-$o.event.deltaY*($o.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Jo?(Da=function(){return $o.event.wheelDelta},"mousewheel"):(Da=function(){return-$o.event.detail},"MozMousePixelScroll");Z.prototype.toString=function(){return this.rgb()+""},$o.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):st(""+n,lt,V):V(+n,+t,+e)};var ja=X.prototype=new Z;ja.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},ja.rgb=function(){return $(this.h,this.s,this.l)},$o.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=$o.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var Ha=W.prototype=new Z;Ha.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+Fa*(arguments.length?n:1)))},Ha.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-Fa*(arguments.length?n:1)))},Ha.rgb=function(){return J(this.h,this.c,this.l).rgb()},$o.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=$o.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var Fa=18,Oa=.95047,Ya=1,Ia=1.08883,Za=K.prototype=new Z;Za.brighter=function(n){return G(Math.min(100,this.l+Fa*(arguments.length?n:1)),this.a,this.b)},Za.darker=function(n){return G(Math.max(0,this.l-Fa*(arguments.length?n:1)),this.a,this.b)},Za.rgb=function(){return Q(this.l,this.a,this.b)},$o.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):st(""+n,ot,$):ot(~~n,~~t,~~e)};var Va=at.prototype=new Z;Va.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},Va.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Va.hsl=function(){return lt(this.r,this.g,this.b)},Va.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var Xa=$o.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Xa.forEach(function(n,t){Xa.set(n,ut(t))}),$o.functor=pt,$o.xhr=dt(vt),$o.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=$o.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),s=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=c)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==s)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(o).join("\n")},e},$o.csv=$o.dsv(",","text/csv"),$o.tsv=$o.dsv(" ","text/tab-separated-values");var $a,Ba,Wa,Ja,Ga,Ka=Ko[a(Ko,"requestAnimationFrame")]||function(n){setTimeout(n,17)};$o.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Ba?Ba.n=i:$a=i,Ba=i,Wa||(Ja=clearTimeout(Ja),Wa=1,Ka(xt))},$o.timer.flush=function(){Mt(),_t()};var Qa=".",nc=",",tc=[3,3],ec="$",rc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(bt);$o.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=$o.round(n,wt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),rc[8+e/3]},$o.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},$o.format=function(n){var t=uc.exec(n),e=t[1]||" ",r=t[2]||">",u=t[3]||"",i=t[4]||"",o=t[5],a=+t[6],c=t[7],s=t[8],l=t[9],f=1,h="",g=!1;switch(s&&(s=+s.substring(1)),(o||"0"===e&&"="===r)&&(o=e="0",r="=",c&&(a-=Math.floor((a-1)/4))),l){case"n":c=!0,l="g";break;case"%":f=100,h="%",l="f";break;case"p":f=100,h="%",l="r";break;case"b":case"o":case"x":case"X":"#"===i&&(i="0"+l.toLowerCase());case"c":case"d":g=!0,s=0;break;case"s":f=-1,l="r"}"#"===i?i="":"$"===i&&(i=ec),"r"!=l||s||(l="g"),null!=s&&("g"==l?s=Math.max(1,Math.min(21,s)):("e"==l||"f"==l)&&(s=Math.max(0,Math.min(20,s)))),l=ic.get(l)||St;var p=o&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):u;if(0>f){var v=$o.formatPrefix(n,s);n=v.scale(n),h=v.symbol}else n*=f;n=l(n,s);var d=n.lastIndexOf("."),m=0>d?n:n.substring(0,d),y=0>d?"":Qa+n.substring(d+1);!o&&c&&(m=oc(m));var x=i.length+m.length+y.length+(p?0:t.length),M=a>x?new Array(x=a-x+1).join(e):"";return p&&(m=oc(M+m)),t+=i,n=m+y,("<"===r?t+n+M:">"===r?M+t+n:"^"===r?M.substring(0,x>>=1)+t+n+M.substring(x):t+(p?n:M+n))+h}};var uc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ic=$o.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=$o.round(n,wt(n,t))).toFixed(Math.max(0,Math.min(20,wt(n*(1+1e-15),t))))}}),oc=vt;if(tc){var ac=tc.length;oc=function(n){for(var t=n.length,e=[],r=0,u=tc[0];t>0&&u>0;)e.push(n.substring(t-=u,t+u)),u=tc[r=(r+1)%ac];return e.reverse().join(nc)}}$o.geo={},kt.prototype={s:0,t:0,add:function(n){Et(n,this.t,cc),Et(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new kt;$o.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):At(n,t)};var sc={Feature:function(n,t){At(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)At(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Ct(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Ct(e[r],t,0)},Polygon:function(n,t){Nt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Nt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)At(e[r],t)}};$o.geo.area=function(n){return fc=0,$o.geo.stream(n,gc),fc};var fc,hc=new kt,gc={sphere:function(){fc+=4*ka},point:c,lineStart:c,lineEnd:c,polygonStart:function(){hc.reset(),gc.lineStart=Lt},polygonEnd:function(){var n=2*hc;fc+=0>n?4*ka+n:n,gc.lineStart=gc.lineEnd=gc.point=c}};$o.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=Tt([t*La,e*La]);if(m){var u=zt(m,r),i=[u[1],-u[0],0],o=zt(i,u);Pt(o),o=Ut(o);var c=t-p,s=c>0?1:-1,v=o[0]*Ta*s,d=aa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*Ta;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*Ta;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=aa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),aa(y)>Ca&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>hc?(l=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],$o.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),$o.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Na>u&&(t=xc,e=Mc,r=_c,Ca>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Na>u)?[0/0,0/0]:[Math.atan2(e,t)*Ta,H(r/Math.sqrt(u))*Ta]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:c,point:Ht,lineStart:Ot,lineEnd:Yt,polygonStart:function(){kc.lineStart=It},polygonEnd:function(){kc.lineStart=Ot}},Ec=Bt(Zt,Qt,te,[-ka,-ka/2]),Ac=1e9;$o.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=ue(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},($o.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,$o.geo.albers=function(){return $o.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},$o.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=$o.geo.albers(),o=$o.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=$o.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Ca,f+.12*s+Ca],[l-.214*s-Ca,f+.234*s-Ca]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Ca,f+.166*s+Ca],[l-.115*s-Ca,f+.234*s-Ca]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Nc=0,Rc.lineStart=ce},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=c,Cc+=aa(Nc/2)}},Dc={point:se,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},Pc={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){Pc.lineStart=ve},polygonEnd:function(){Pc.point=he,Pc.lineStart=ge,Pc.lineEnd=pe}};$o.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),$o.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,$o.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),$o.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||ye(n):vt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new le:new de(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection($o.geo.albersUsa()).context(null)},$o.geo.transform=function(n){return{stream:function(t){var e=new xe(t);for(var r in n)e[r]=n[r];return e}}},xe.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart() -},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},$o.geo.projection=_e,$o.geo.projectionMutator=be,($o.geo.equirectangular=function(){return _e(Se)}).raw=Se.invert=Se,$o.geo.rotation=function(n){function t(t){return t=n(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t}return n=Ee(n[0]%360*La,n[1]*La,n.length>2?n[2]*La:0),t.invert=function(t){return t=n.invert(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t},t},ke.invert=Se,$o.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*La,-n[1]*La,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ta,n[1]*=Ta}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Le((t=+r)*La,u*La),n):t},n.precision=function(r){return arguments.length?(e=Le(t*La,(u=+r)*La),n):u},n.angle(90)},$o.geo.distance=function(n,t){var e,r=(t[0]-n[0])*La,u=n[1]*La,i=t[1]*La,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},$o.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return $o.range(Math.ceil(i/d)*d,u,d).map(h).concat($o.range(Math.ceil(s/m)*m,c,m).map(g)).concat($o.range(Math.ceil(r/p)*p,e,p).filter(function(n){return aa(n%d)>Ca}).map(l)).concat($o.range(Math.ceil(a/v)*v,o,v).filter(function(n){return aa(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=qe(a,o,90),f=ze(r,e,y),h=qe(s,c,90),g=ze(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},$o.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Re,u=De;return n.distance=function(){return $o.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},$o.geo.interpolate=function(n,t){return Pe(n[0]*La,n[1]*La,t[0]*La,t[1]*La)},$o.geo.length=function(n){return Uc=0,$o.geo.stream(n,jc),Uc};var Uc,jc={sphere:c,point:c,lineStart:Ue,lineEnd:c,polygonStart:c,polygonEnd:c},Hc=je(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});($o.geo.azimuthalEqualArea=function(){return _e(Hc)}).raw=Hc;var Fc=je(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},vt);($o.geo.azimuthalEquidistant=function(){return _e(Fc)}).raw=Fc,($o.geo.conicConformal=function(){return oe(He)}).raw=He,($o.geo.conicEquidistant=function(){return oe(Fe)}).raw=Fe;var Oc=je(function(n){return 1/n},Math.atan);($o.geo.gnomonic=function(){return _e(Oc)}).raw=Oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Aa]},($o.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var Yc=je(function(){return 1},Math.asin);($o.geo.orthographic=function(){return _e(Yc)}).raw=Yc;var Ic=je(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});($o.geo.stereographic=function(){return _e(Ic)}).raw=Ic,Ie.invert=function(n,t){return[Math.atan2(F(n),Math.cos(t)),H(Math.sin(t)/O(n))]},($o.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,$o.geom={},$o.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,o,a,c,s,l,f,h,g,p,v=pt(e),d=pt(r),m=n.length,y=m-1,x=[],M=[],_=0;if(v===Ze&&r===Ve)t=n;else for(i=0,t=[];m>i;++i)t.push([+v.call(this,u=n[i],i),+d.call(this,u,i)]);for(i=1;m>i;++i)(t[i][1]<t[_][1]||t[i][1]==t[_][1]&&t[i][0]<t[_][0])&&(_=i);for(i=0;m>i;++i)i!==_&&(c=t[i][1]-t[_][1],a=t[i][0]-t[_][0],x.push({angle:Math.atan2(c,a),index:i}));for(x.sort(function(n,t){return n.angle-t.angle}),g=x[0].angle,h=x[0].index,f=0,i=1;y>i;++i){if(o=x[i].index,g==x[i].angle){if(a=t[h][0]-t[_][0],c=t[h][1]-t[_][1],s=t[o][0]-t[_][0],l=t[o][1]-t[_][1],a*a+c*c>=s*s+l*l){x[i].index=-1;continue}x[f].index=-1}g=x[i].angle,f=i,h=o}for(M.push(_),i=0,o=0;2>i;++o)x[o].index>-1&&(M.push(x[o].index),i++);for(p=M.length;y>o;++o)if(!(x[o].index<0)){for(;!Xe(M[p-2],M[p-1],x[o].index,t);)--p;M[p++]=x[o].index}var b=[];for(i=p-1;i>=0;--i)b.push(n[M[i]]);return b}var e=Ze,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},$o.geom.polygon=function(n){return ha(n,Zc),n};var Zc=$o.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=We(n),c=-1,s=this.length-We(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],$e(o,l,u)?($e(i,l,u)||n.push(Be(i,o,l,u)),n.push(o)):$e(i,l,u)&&n.push(Be(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];rr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(ir),t.length},vr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},dr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Mr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(yr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,xr(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(xr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,yr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Mr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,yr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,xr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,yr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,xr(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,yr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,xr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},$o.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return _r(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ze,u=Ve,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return _r(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return _r(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(ir),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&wr(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=pt(r=n),t):r},t.y=function(n){return arguments.length?(o=pt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Kc?null:a&&a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];$o.geom.delaunay=function(n){return $o.geom.voronoi().triangles(n)},$o.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(aa(c-e)+aa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Er()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=pt(a),M=pt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=Er();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){Ar(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=Sr,c=kr,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},$o.interpolateRgb=Cr,$o.interpolateObject=Nr,$o.interpolateNumber=Lr,$o.interpolateString=Tr;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;$o.interpolate=qr,$o.interpolators=[function(n,t){var e=typeof t;return("string"===e?Xa.has(t)||/^(#|rgb\(|hsl\()/.test(t)?Cr:Tr:t instanceof Z?Cr:"object"===e?Array.isArray(t)?zr:Nr:Lr)(n,t)}],$o.interpolateArray=zr;var ns=function(){return vt},ts=$o.map({linear:ns,poly:Fr,quad:function(){return Ur},cubic:function(){return jr},sin:function(){return Or},exp:function(){return Yr},circle:function(){return Ir},elastic:Zr,back:Vr,bounce:function(){return Xr}}),es=$o.map({"in":vt,out:Dr,"in-out":Pr,"out-in":function(n){return Pr(Dr(n))}});$o.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||vt,Rr(r(e.apply(null,Bo.call(arguments,1))))},$o.interpolateHcl=$r,$o.interpolateHsl=Br,$o.interpolateLab=Wr,$o.interpolateRound=Jr,$o.transform=function(n){var t=Jo.createElementNS($o.ns.prefix.svg,"g");return($o.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Gr(e?e.matrix:rs)})(n)},Gr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};$o.interpolateTransform=tu,$o.layout={},$o.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(uu(n[e]));return t}},$o.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=$o.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push($o.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Ea-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},$o.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=1/Math.sqrt(i*i+o*o);if(v>(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&&isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=$o.event.x,n.py=$o.event.y,a.resume()}var e,r,u,i,o,a={},c=$o.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=.1,v=.8,d=[],m=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,v,y,x,M,_=d.length,b=m.length;for(e=0;b>e;++e)a=m[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(v=x*x+M*M)&&(v=r*i[e]*((v=Math.sqrt(v))-u[e])/v,x*=v,M*=v,h.x-=x*(y=f.weight/(h.weight+f.weight)),h.y-=M*y,f.x+=x*(y=1-y),f.y+=M*y);if((y=r*p)&&(x=s[0]/2,M=s[1]/2,e=-1,y))for(;++e<_;)a=d[e],a.x+=(x-a.x)*y,a.y+=(M-a.y)*y;if(g)for(fu(t=$o.geom.quadtree(d),r,o),e=-1;++e<_;)(a=d[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=d[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(d=n,a):d},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(v=+n,a):v},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),$o.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=m[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=d.length,l=m.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=d[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=m[t],"number"==typeof r.source&&(r.source=d[r.source]),"number"==typeof r.target&&(r.target=d[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=d[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,m[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,m[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,d[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=$o.behavior.drag().origin(vt).on("dragstart.force",au).on("drag.force",t).on("dragend.force",cu)),arguments.length?(this.on("mouseover.force",su).on("mouseout.force",lu).call(e),void 0):e},$o.rebind(a,c,"on")};var us=20,is=1;$o.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=vu,u=gu,i=pu;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},$o.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=$o.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},hu(e,r)},$o.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/$o.sum(o),s=$o.range(i.length);null!=e&&s.sort(e===os?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=os,r=0,u=Ea;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var os={};$o.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=$o.permute(s,f),l=$o.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=vt,e=Mu,r=_u,u=xu,i=mu,o=yu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:as.get(t)||Mu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:cs.get(t)||_u,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var as=$o.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(bu),i=n.map(wu),o=$o.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return $o.range(n.length).reverse()},"default":Mu}),cs=$o.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:_u});$o.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[$o.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=Au,u=ku;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return Eu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},$o.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;Pu(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=Lu(a),i=Nu(i),a&&i;)c=Nu(c),o=Lu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(Uu(ju(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!Lu(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!Nu(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];Du(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=Tu(l,zu),h=Tu(l,qu),g=Tu(l,Ru),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return Du(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Du(a,function(n){n.r=+l(n.value)}),Du(a,Iu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;Du(a,function(n){n.r+=f}),Du(a,Iu),Du(a,function(n){n.r-=f})}return Xu(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=$o.layout.hierarchy().sort(Hu),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},hu(n,e)},$o.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;Du(c,function(n){var t=n.children;t&&t.length?(n.x=Wu(t),n.y=Bu(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ju(c),f=Gu(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return Du(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=$o.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ku,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ku(t):Qu(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Qu(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ku:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},hu(i,a)},$o.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=$o.random.normal.apply($o,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},$o.scale={};var ss={floor:vt,ceil:vt};$o.scale.linear=function(){return oi([0,1],[0,1],qr,!1)};var ls={s:1,g:1,p:1,r:1,e:1};$o.scale.log=function(){return pi($o.scale.linear().domain([0,1]),10,!0,[1,10])};var fs=$o.format(".0e"),hs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};$o.scale.pow=function(){return vi($o.scale.linear(),1,[0,1])},$o.scale.sqrt=function(){return $o.scale.pow().exponent(.5)},$o.scale.ordinal=function(){return mi([],{t:"range",a:[[]]})},$o.scale.category10=function(){return $o.scale.ordinal().range(gs)},$o.scale.category20=function(){return $o.scale.ordinal().range(ps)},$o.scale.category20b=function(){return $o.scale.ordinal().range(vs)},$o.scale.category20c=function(){return $o.scale.ordinal().range(ds)};var gs=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),ps=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),vs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),ds=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);$o.scale.quantile=function(){return yi([],[])},$o.scale.quantize=function(){return xi(0,1,[0,1])},$o.scale.threshold=function(){return Mi([.5],[0,1])},$o.scale.identity=function(){return _i([0,1])},$o.svg={},$o.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ms,a=u.apply(this,arguments)+ms,c=(o>a&&(c=o,o=a,a=c),a-o),s=ka>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=ys?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=bi,e=wi,r=Si,u=ki;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ms;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ms=-Aa,ys=Ea-Ca;$o.svg.line=function(){return Ei(vt)};var xs=$o.map({linear:Ai,"linear-closed":Ci,step:Ni,"step-before":Li,"step-after":Ti,basis:Ui,"basis-open":ji,"basis-closed":Hi,bundle:Fi,cardinal:Ri,"cardinal-open":qi,"cardinal-closed":zi,monotone:Xi});xs.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ms=[0,2/3,1/3,0],_s=[0,1/3,2/3,0],bs=[0,1/6,2/3,1/6];$o.svg.line.radial=function(){var n=Ei($i);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},Li.reverse=Ti,Ti.reverse=Li,$o.svg.area=function(){return Bi(vt)},$o.svg.area.radial=function(){var n=Bi($i);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},$o.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ms,l=s.call(n,u,r)+ms;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ka)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Re,o=De,a=Wi,c=Si,s=ki;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(s=pt(t),n):s},n},$o.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=Re,e=De,r=Ji;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},$o.svg.diagonal.radial=function(){var n=$o.svg.diagonal(),t=Ji,e=n.projection;return n.projection=function(n){return arguments.length?e(Gi(t=n)):t},n},$o.svg.symbol=function(){function n(n,r){return(ws.get(t.call(this,n,r))||no)(e.call(this,n,r))}var t=Qi,e=Ki;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var ws=$o.map({circle:no,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*As)),e=t*As;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});$o.svg.symbolTypes=ws.keys();var Ss,ks,Es=Math.sqrt(3),As=Math.tan(30*La),Cs=[],Ns=0; -Cs.call=ma.call,Cs.empty=ma.empty,Cs.node=ma.node,Cs.size=ma.size,$o.transition=function(n){return arguments.length?Ss?n.transition():n:Ma.transition()},$o.transition.prototype=Cs,Cs.select=function(n){var t,e,r,u=this.id,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),uo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return to(i,u)},Cs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=d(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&uo(u,g,o,i),t.push(u)}return to(a,o)},Cs.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return to(u,this.id)},Cs.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):C(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Cs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?tu:qr,a=$o.ns.qualify(n);return eo(this,"attr."+n,t,a.local?i:u)},Cs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=$o.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Cs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Ko.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=qr(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return eo(this,"style."+n,t,u)},Cs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Ko.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Cs.text=function(n){return eo(this,"text",n,ro)},Cs.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Cs.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=$o.ease.apply($o,arguments)),C(this,function(e){e.__transition__[t].ease=n}))},Cs.delay=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Cs.duration=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Cs.each=function(n,t){var e=this.id;if(arguments.length<2){var r=ks,u=Ss;Ss=e,C(this,function(t,r,u){ks=t.__transition__[e],n.call(t,t.__data__,r,u)}),ks=r,Ss=u}else C(this,function(r){var u=r.__transition__[e];(u.event||(u.event=$o.dispatch("start","end"))).on(n,t)});return this},Cs.transition=function(){for(var n,t,e,r,u=this.id,i=++Ns,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,uo(e,s,i,r)),n.push(e)}return to(o,i)},$o.svg.axis=function(){function n(n){n.each(function(){var n,s=$o.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):vt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=$o.transition(p.exit()).style("opacity",Ca).remove(),m=$o.transition(p).style("opacity",1),y=ti(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),$o.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=io,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=io,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=oo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=oo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f.rangeBand()/2,A=function(n){return f(n)+E};v.call(n,A),m.call(n,A)}else v.call(n,l),m.call(n,f),d.call(n,f)})}var t,e=$o.scale.linear(),r=Ls,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ts?t+"":Ls,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ls="bottom",Ts={top:1,right:1,bottom:1,left:1};$o.svg.brush=function(){function n(i){i.each(function(){var i=$o.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(d,vt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return qs[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=$o.transition(i),h=$o.transition(o);c&&(l=ti(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=ti(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==$o.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=h[1],C=2),f())}function g(){32==$o.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=h[1],C=0,f())}function d(){var n=$o.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||($o.event.altKey?(x||(x=[(l[0]+l[1])/2,(h[0]+h[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=h[+(n[1]<x[1])]):x=null),E&&m(n,c,0)&&(e(S),u=!0),A&&m(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,a=ti(t),c=a[0],s=a[1],f=L[e],g=e?h:l,d=g[1]-g[0];return C&&(c-=f,s-=d+f),r=(e?v:p)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=f)+d:(x&&(f=Math.max(c,Math.min(s,2*x[e]-r))),r>f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){d(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),$o.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=$o.select($o.event.target),w=a.of(_,arguments),S=$o.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=D(),L=$o.mouse(_),T=$o.select(Ko).on("keydown.brush",u).on("keyup.brush",g);if($o.event.changedTouches?T.on("touchmove.brush",d).on("touchend.brush",y):T.on("mousemove.brush",d).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=h[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],h[1-z]-L[1]],L[0]=l[q],L[1]=h[z]}else $o.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),$o.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),d()}var i,o,a=g(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],h=[0,0],p=!0,v=!0,d=zs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ss?$o.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=zr(l,t.x),r=zr(h,t.y);return i=o=null,function(u){l=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,d=zs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,d=zs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(p=!!t[0],v=!!t[1]):c?p=!!t:s&&(v=!!t),n):c&&s?[p,v]:c?p:s?v:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(f=e,e=r,r=f),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&&(h=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(f=e,e=r,r=f))),s&&(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(f=u,u=a,a=f))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&h[0]==h[1]},$o.rebind(n,a,"on")};var qs={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},zs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Rs=$o.time={},Ds=Date,Ps=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ao.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Us.setUTCDate.apply(this._,arguments)},setDay:function(){Us.setUTCDay.apply(this._,arguments)},setFullYear:function(){Us.setUTCFullYear.apply(this._,arguments)},setHours:function(){Us.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Us.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Us.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Us.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Us.setUTCSeconds.apply(this._,arguments)},setTime:function(){Us.setTime.apply(this._,arguments)}};var Us=Date.prototype,js="%a %b %e %X %Y",Hs="%m/%d/%Y",Fs="%H:%M:%S",Os=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ys=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Is=["January","February","March","April","May","June","July","August","September","October","November","December"],Zs=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Rs.year=co(function(n){return n=Rs.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Rs.years=Rs.year.range,Rs.years.utc=Rs.year.utc.range,Rs.day=co(function(n){var t=new Ds(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Rs.days=Rs.day.range,Rs.days.utc=Rs.day.utc.range,Rs.dayOfYear=function(n){var t=Rs.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Ps.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Rs[n]=co(function(n){return(n=Rs.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Rs[n+"s"]=e.range,Rs[n+"s"].utc=e.utc.range,Rs[n+"OfYear"]=function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)}}),Rs.week=Rs.sunday,Rs.weeks=Rs.sunday.range,Rs.weeks.utc=Rs.sunday.utc.range,Rs.weekOfYear=Rs.sundayOfYear,Rs.format=lo;var Vs=ho(Os),Xs=go(Os),$s=ho(Ys),Bs=go(Ys),Ws=ho(Is),Js=go(Is),Gs=ho(Zs),Ks=go(Zs),Qs=/^%/,nl={"-":"",_:" ",0:"0"},tl={a:function(n){return Ys[n.getDay()]},A:function(n){return Os[n.getDay()]},b:function(n){return Zs[n.getMonth()]},B:function(n){return Is[n.getMonth()]},c:lo(js),d:function(n,t){return po(n.getDate(),t,2)},e:function(n,t){return po(n.getDate(),t,2)},H:function(n,t){return po(n.getHours(),t,2)},I:function(n,t){return po(n.getHours()%12||12,t,2)},j:function(n,t){return po(1+Rs.dayOfYear(n),t,3)},L:function(n,t){return po(n.getMilliseconds(),t,3)},m:function(n,t){return po(n.getMonth()+1,t,2)},M:function(n,t){return po(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return po(n.getSeconds(),t,2)},U:function(n,t){return po(Rs.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return po(Rs.mondayOfYear(n),t,2)},x:lo(Hs),X:lo(Fs),y:function(n,t){return po(n.getFullYear()%100,t,2)},Y:function(n,t){return po(n.getFullYear()%1e4,t,4)},Z:jo,"%":function(){return"%"}},el={a:vo,A:mo,b:_o,B:bo,c:wo,d:To,e:To,H:zo,I:zo,j:qo,L:Po,m:Lo,M:Ro,p:Uo,S:Do,U:xo,w:yo,W:Mo,x:So,X:ko,y:Ao,Y:Eo,Z:Co,"%":Ho},rl=/^\s*\d+/,ul=$o.map({am:0,pm:1});lo.utc=Fo;var il=Fo("%Y-%m-%dT%H:%M:%S.%LZ");lo.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:il,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=il.toString,Rs.second=co(function(n){return new Ds(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Rs.seconds=Rs.second.range,Rs.seconds.utc=Rs.second.utc.range,Rs.minute=co(function(n){return new Ds(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Rs.minutes=Rs.minute.range,Rs.minutes.utc=Rs.minute.utc.range,Rs.hour=co(function(n){var t=n.getTimezoneOffset()/60;return new Ds(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Rs.hours=Rs.hour.range,Rs.hours.utc=Rs.hour.utc.range,Rs.month=co(function(n){return n=Rs.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Rs.months=Rs.month.range,Rs.months.utc=Rs.month.utc.range;var ol=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],al=[[Rs.second,1],[Rs.second,5],[Rs.second,15],[Rs.second,30],[Rs.minute,1],[Rs.minute,5],[Rs.minute,15],[Rs.minute,30],[Rs.hour,1],[Rs.hour,3],[Rs.hour,6],[Rs.hour,12],[Rs.day,1],[Rs.day,2],[Rs.week,1],[Rs.month,1],[Rs.month,3],[Rs.year,1]],cl=[[lo("%Y"),Zt],[lo("%B"),function(n){return n.getMonth()}],[lo("%b %d"),function(n){return 1!=n.getDate()}],[lo("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[lo("%I %p"),function(n){return n.getHours()}],[lo("%I:%M"),function(n){return n.getMinutes()}],[lo(":%S"),function(n){return n.getSeconds()}],[lo(".%L"),function(n){return n.getMilliseconds()}]],sl=Zo(cl);al.year=Rs.year,Rs.scale=function(){return Yo($o.scale.linear(),al,sl)};var ll={range:function(n,t,e){return $o.range(+n,+t,e).map(Io)}},fl=al.map(function(n){return[n[0].utc,n[1]]}),hl=[[Fo("%Y"),Zt],[Fo("%B"),function(n){return n.getUTCMonth()}],[Fo("%b %d"),function(n){return 1!=n.getUTCDate()}],[Fo("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[Fo("%I %p"),function(n){return n.getUTCHours()}],[Fo("%I:%M"),function(n){return n.getUTCMinutes()}],[Fo(":%S"),function(n){return n.getUTCSeconds()}],[Fo(".%L"),function(n){return n.getUTCMilliseconds()}]],gl=Zo(hl);return fl.year=Rs.year.utc,Rs.scale.utc=function(){return Yo($o.scale.linear(),fl,gl)},$o.text=dt(function(n){return n.responseText}),$o.json=function(n,t){return mt(n,"application/json",Vo,t)},$o.html=function(n,t){return mt(n,"text/html",Xo,t)},$o.xml=dt(function(n){return n.responseXML}),$o}();</script> -<script type="text/javascript">var RadarChart = { - draw: function(id, d, options){ - var cfg = { - radius: 5, - w: 600, - h: 600, - factor: .95, - factorLegend: 1, - levels: 3, - maxValue: 0, - radians: 2 * Math.PI, - opacityArea: 0.5, - color: d3.scale.category10(), - fontSize: 10 - }; - if('undefined' !== typeof options){ - for(var i in options){ - if('undefined' !== typeof options[i]){ - cfg[i] = options[i]; - } - } - } - cfg.maxValue = Math.max(cfg.maxValue, d3.max(d, function(i){return d3.max(i.map(function(o){return o.value;}))})); - var allAxis = (d[0].map(function(i, j){return i.axis})); - var total = allAxis.length; - var radius = cfg.factor*Math.min(cfg.w/2, cfg.h/2); - d3.select(id).select("svg").remove(); - var g = d3.select(id).append("svg").attr("width", cfg.w).attr("height", 0.75 * cfg.h).append("g"); - - var tooltip; - function getPosition(i, range, factor, func){ - factor = typeof factor !== 'undefined' ? factor : 1; - return range * (1 - factor * func(i * cfg.radians / total)); - } - function getHorizontalPosition(i, range, factor){ - return getPosition(i, range, factor, Math.sin); - } - function getVerticalPosition(i, range, factor){ - return getPosition(i, range, factor, Math.cos); - } - - for(var j=0; j<cfg.levels; j++){ - var levelFactor = radius*((j+1)/cfg.levels); - g.selectAll(".levels").data(allAxis).enter().append("svg:line") - .attr("x1", function(d, i){return getHorizontalPosition(i, levelFactor);}) - .attr("y1", function(d, i){return getVerticalPosition(i, levelFactor);}) - .attr("x2", function(d, i){return getHorizontalPosition(i+1, levelFactor);}) - .attr("y2", function(d, i){return getVerticalPosition(i+1, levelFactor);}) - .attr("class", "line").style("stroke", "grey").style("stroke-width", "0.5px").attr("transform", "translate(" + (cfg.w/2-levelFactor) + ", " + (cfg.h/2-levelFactor) + ")"); - - } - - series = 0; - - var axis = g.selectAll(".axis").data(allAxis).enter().append("g").attr("class", "axis"); - - axis.append("line") - .attr("x1", cfg.w/2) - .attr("y1", cfg.h/2) - .attr("x2", function(j, i){return getHorizontalPosition(i, cfg.w/2, cfg.factor);}) - .attr("y2", function(j, i){return getVerticalPosition(i, cfg.h/2, cfg.factor);}) - .attr("class", "line").style("stroke", "grey").style("stroke-width", "1px"); - - axis.append("text").attr("class", function(d){ return "legend_" + d.replace("/", "") }) - .text(function(d){return d}) - .style("font-size", cfg.fontSize + "px") - .style("text-anchor", function(d, i){ - var p = getHorizontalPosition(i, 0.5); - return (p < 0.4) ? "start" : ((p > 0.6) ? "end" : "middle"); - }) - .attr("transform", function(d, i){ - var p = getVerticalPosition(i, cfg.h / 2); - return p < cfg.fontSize ? "translate(0, " + (cfg.fontSize - p) + ")" : ""; - }) - .attr("x", function(d, i){return getHorizontalPosition(i, cfg.w / 2, cfg.factorLegend);}) - .attr("y", function(d, i){return getVerticalPosition(i, cfg.h / 2, cfg.factorLegend);}); - - d.forEach(function(y, x){ - dataValues = []; - g.selectAll(".nodes") - .data(y, function(j, i){ - dataValues.push([ - getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), - getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) - ]); - }); - dataValues.push(dataValues[0]); - g.selectAll(".area") - .data([dataValues]) - .enter() - .append("polygon") - .attr("class", "radar-chart-serie"+series) - .style("stroke-width", "2px") - .style("stroke", cfg.color(series)) - .attr("points",function(d) { - var str=""; - for(var pti=0;pti<d.length;pti++){ - str=str+d[pti][0]+","+d[pti][1]+" "; - } - return str; - }) - .style("fill", function(j, i){return cfg.color(series)}) - .style("fill-opacity", cfg.opacityArea) - .on('mouseover', function (d){ - z = "polygon."+d3.select(this).attr("class"); - g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); - g.selectAll(z).transition(200).style("fill-opacity", .7); - }) - .on('mouseout', function(){ - g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); - }); - series++; - }); - series=0; - - - d.forEach(function(y, x){ - g.selectAll(".nodes") - .data(y).enter() - .append("svg:circle").attr("class", "radar-chart-serie"+series) - .attr('r', cfg.radius) - .attr("alt", function(j){return Math.max(j.value, 0)}) - .attr("cx", function(j, i){ - dataValues.push([ - getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), - getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) - ]); - return getHorizontalPosition(i, cfg.w/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); - }) - .attr("cy", function(j, i){ - return getVerticalPosition(i, cfg.h/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); - }) - .attr("data-id", function(j){return j.axis}) - .style("fill", cfg.color(series)).style("fill-opacity", .9) - .on('mouseover', function (d){ - newX = parseFloat(d3.select(this).attr('cx')) - 10; - newY = parseFloat(d3.select(this).attr('cy')) - 5; - tooltip.attr('x', newX).attr('y', newY).text(d.value).transition(200).style('opacity', 1); - z = "polygon."+d3.select(this).attr("class"); - g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); - g.selectAll(z).transition(200).style("fill-opacity", .7); - }) - .on('mouseout', function(){ - tooltip.transition(200).style('opacity', 0); - g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); - }) - .append("svg:title") - .text(function(j){return Math.max(j.value, 0)}); - - series++; - }); - //Tooltip - tooltip = g.append('text').style('opacity', 0).style('font-family', 'sans-serif').style('font-size', '13px'); - } -} - -</script> -<script type="text/javascript">window.onload = function() { - var cpu = 88.6; - var mpi = 11.4; - var io = 0.0; - - // Draw radar chart, choose its color based on application classification - var radar_data = [[ { axis: "CPU", value: cpu }, - { axis: "MPI", value: mpi }, - { axis: "I/O", value: io } ]]; - var radar_options = { w: 200, h: 200, factor: 0.7, fontSize: 16, radius: 0, - opacityArea: 0.64, maxValue: 100, - color: function() { - if ("cpu" == "io") return "#ed8140"; - if ("cpu" == "cpu") return "#4fd32e"; - if ("cpu" == "mpi") return "#409ded"; - else return "#bb58d6"; - } - }; - RadarChart.draw("#time_radar", radar_data, radar_options); - - // Wrap the exe path on slashes if necessary - var exe_path = document.getElementById("exe_path"); - exe_path.innerHTML = exe_path.innerHTML.replace(/\//g, '/​'); // insert a zero width space after slashes as a word wrap hint - - // Format our byte value numbers to show at most 2 decimal places, but only if required to attain 3 digits of precision - // 1234.56 -> "1234" - // 12.3456 -> "12.3" - // 1.23456 -> "1.23" - // 0.00000 -> "0.00" - var formatNumber = function(num) { - if (num > 100) return new Number(num).toFixed(0); // 1234.56 -> 1234 - if (num > 10) return new Number(num).toFixed(1); // 12.3456 -> 12.3 - else return new Number(num).toFixed(2); // 1.23456 -> 1.23 and 0 -> 0.00 - } - - // Parse a number, but return 0 for invalid numbers, not NaN - var toNumber = function(num_str) { - var num = Number(num_str) - return isNaN(num) ? 0 : num; - } - - // Scale byte values to bytes, kB, MB or GB as appropriate - var fillBytes = function(base_name, bytes_str, per_second) { - var units = "bytes"; - var scale = 1.0; - var bytes = Number(bytes_str) - if (isNaN(bytes) ) { units = "" ; } - else if (bytes > 1000000000) { units = "GB"; scale = 1*1000*1000*1000; } - else if (bytes > 1000000 ) { units = "MB"; scale = 1*1000*1000 } - else if (bytes > 1000 ) { units = "kB"; scale = 1*1000 } - var num = isNaN(bytes) ? bytes_str : formatNumber(bytes / scale); - var elementNum = document.getElementById(base_name + "_num"); - elementNum.innerHTML = num; - var elementUnits = document.getElementById(base_name + "_units"); - elementUnits.innerHTML = units + (per_second && !isNaN(bytes) ? "/s" : ""); - }; - - // Fill all the byte numbers and their units with the scaled values - fillBytes("mpi_colrate", "1.65e+02", true); - fillBytes("mpi_p2prate", "0.00e+00", true); - fillBytes("io_readrate", "0.00e+00", true); - fillBytes("io_writerate", "0.00e+00", true); - fillBytes("ram_mean", "2.33e+07", false); - fillBytes("ram_peak", "2.35e+07", false); - - // Set widths for all graphs - var bar = function(name, width) { - var rounded = Math.round(width); - if (!isFinite(rounded) || rounded < 1) - document.getElementById(name).style.width = "1px" - else - document.getElementById(name).style.width = rounded + "px"; - }; - bar("cpu_bar", cpu * 2); - bar("mpi_bar", mpi * 2); - bar("io_bar", io * 2); - - bar("cpu_num_bar", toNumber("50.0") / 2); - bar("cpu_vec_bar", toNumber("50.0") / 2); - bar("cpu_mem_bar", toNumber("0.0") / 2); - bar("cpu_other_bar", toNumber("0.0") / 2); - - bar("mpi_col_bar", toNumber("100.0") / 2); - bar("mpi_p2p_bar", toNumber("0.0") / 2); - var mpi_scale = Math.max(toNumber("1.65e+02"), toNumber("0.00e+00")); - bar("mpi_colrate_bar", 50 * toNumber("1.65e+02") / mpi_scale); - bar("mpi_p2prate_bar", 50 * toNumber("0.00e+00") / mpi_scale); - - bar("io_read_bar", toNumber("0.0") / 2); - bar("io_write_bar", toNumber("0.0") / 2); - var io_scale = Math.max(toNumber("0.00e+00"), toNumber("0.00e+00")); - bar("io_readrate_bar", 50 * toNumber("0.00e+00") / io_scale); - bar("io_writerate_bar", 50 * toNumber("0.00e+00") / io_scale); - - bar("ram_mean_bar", 50 * toNumber("2.33e+07") / toNumber("2.35e+07")); - bar("ram_peak_bar", 50); - bar("ram_node_bar", toNumber("2.8") / 2); - - // Formatting replacement helper function - var replaceIn = function(elementId, re, new_text) { - element = document.getElementById(elementId); - element.innerHTML = element.innerHTML.replace(re, new_text); - }; - - // Add formatting for the overview advice section - replaceIn('overview_advice', /CPU/g, '<span class="cpu_span">CPU</span>'); - replaceIn('overview_advice', /MPI/g, '<span class="mpi_span">MPI</span>'); - replaceIn('overview_advice', /I\/O/g, '<span class="io_span">I\/O</span>'); - - // Add formatting for the CPU advice section - if ( 88.6 < 0.05 ) - replaceIn('cpu_explanation', /application code/g, '<span class="cpu_span">application code</span>'); - replaceIn('cpu_explanation', /vectorized instructions/g, '<span class="cpu_vec_span">vectorized instructions</span>'); - replaceIn('cpu_explanation', /memory accesses/g, '<span class="cpu_mem_span">memory accesses</span>'); - replaceIn('cpu_explanation', /memory-bound/g, '<span class="cpu_mem_span">memory-bound</span>'); - replaceIn('cpu_explanation', /arithmetic-bound/g, '<span class="cpu_num_span">arithmetic-bound</span>'); - replaceIn('cpu_explanation', /numerical computation/g, '<span class="cpu_num_span">numerical computation</span>'); - - // Add formatting for the MPI advice section - if ( 11.4 < 0.05 ) - replaceIn('mpi_explanation', /MPI/g, '<span class="mpi_span">MPI</span>'); - replaceIn('mpi_explanation', /collective calls/g, '<span class="mpi_col_span">collective calls</span>'); - replaceIn('mpi_explanation', /point-to-point calls/g, '<span class="mpi_p2p_span">point-to-point calls</span>'); - replaceIn('mpi_explanation', / very low/g, ' <span class="mpi_colrate_span">very low</span>'); - replaceIn('mpi_explanation', / low/g, ' <span class="mpi_colrate_span">low</span>'); - replaceIn('mpi_explanation', / average/g, ' <span class="mpi_colrate_span">average</span>'); - replaceIn('mpi_explanation', / very high/g, ' <span class="mpi_colrate_span">very high</span>'); - replaceIn('mpi_explanation', / high/g, ' <span class="mpi_colrate_span">high</span>'); - - // Add formatting for the I/O advice section - if ( 0.0 < 0.05 ) - replaceIn('io_explanation', /I\/O/g, '<span class="io_span">I/O</span>'); - replaceIn('io_explanation', /read operations/g, '<span class="io_read_span">read operations</span>'); - replaceIn('io_explanation', /write operations/g, '<span class="io_write_span">write operations</span>'); - replaceIn('io_explanation', / very low/g, ' <span class="io_readrate_span">very low</span>'); - replaceIn('io_explanation', / low/g, ' <span class="io_readrate_span">low</span>'); - replaceIn('io_explanation', / average/g, ' <span class="io_readrate_span">average</span>'); - replaceIn('io_explanation', / very high/g, ' <span class="io_readrate_span">very high</span>'); - replaceIn('io_explanation', / high/g, ' <span class="io_readrate_span">high</span>'); - - // Add formatting for the RAM advice section - replaceIn('ram_explanation', /high/g, ' <span class="ram_node_span">high</span>'); - replaceIn('ram_explanation', /well-balanced/g, '<span class="ram_peak_span">well-balanced</span>'); - replaceIn('ram_explanation', /significant variation/g, '<span class="ram_peak_span">significant variation</span>'); - replaceIn('ram_explanation', /peak node memory usage/g, '<span class="ram_node_span">peak node memory usage</span>'); - - // Hide the error warning if the script got this far - document.getElementById('error').style.display = 'none'; -}; -</script> -</head> - -<body> -<div id="content"> - -<div class="header"> - <div class="logo"><img src="http://content.allinea.com/downloads/performance-report-logo.png" alt="Allinea Performance Reports" /></div> - <div class="header_left"> - <div class="application_details"> - <table> - <tr><td class="details_key">Executable:</td><td id="exe_name">mympiprog.x</td></tr> - <tr><td class="details_key">Resources:</td><td id="num_procs">32 processes, 2 nodes</td></tr> - <tr><td class="details_key">Machine:</td><td id="machine_name">cn182</td></tr> - <tr><td class="details_key">Start time:</td><td id="start_date">Wed Oct 15 16:56:23 2014</td></tr> - <tr><td class="details_key">Total time:</td><td id="time_string">7 seconds (0 minutes)</td></tr> - <tr><td class="details_key">Full path:</td><td id="exe_path">/home/user</td></tr> - <tr><td class="details_key">Notes:</td><td id="notes"></td></tr> - </table> - </div> - </div> - <div id="time_radar"></div> - <div class="clear"></div> -</div> -<hr /> -<div id="error"> -<p><strong>Error: javascript is not running</strong></p> -<p>The graphs in this Performance Report require <strong>javascript</strong>, which is disabled or not working.</p> -<p>Check whether your javascript support is enabled or try another browser.<p> -<p>Remember, you can always contact <a href="mailto:support@allinea.com">support@allinea.com</a>, we're very nice!</p> -</div> -<div class="summary"> - <div class="heading">Summary: mympiprog.x is <span class="cpu_span">CPU-bound</span> in this configuration</div> - <div>The total wallclock time was spent as follows:</div> - <table class="summary_table"> - <tr><td class="heading_cpu">CPU</td><td class="percent">88.6%</td><td class="bar_graph"><div id="cpu_bar" /></td> - <td class="details"><p>Time spent running application code. High values are usually good.</p><p>This is <span id="summary_cpu_class">high</span>; check the CPU performance section for optimization advice.</p></td></tr> - <tr><td class="heading_mpi">MPI</td><td class="percent">11.4%</td><td class="bar_graph"><div id="mpi_bar" /></td> - <td class="details"><p>Time spent in MPI calls. High values are usually bad.</p><p>This is <span id="summary_mpi_class">very low</span>; this code may benefit from increasing the process count.</p></td></tr> - <tr><td class="heading_io">I/O</td><td class="percent">0.0%</td><td class="bar_graph"><div id="io_bar" /></td> - <td class="details"><p>Time spent in filesystem I/O. High values are usually bad.</p><p>This is <span id="summary_io_class">negligible</span>; there's no need to investigate I/O performance.</p></td></tr> - </table> - <div class="overview_general_advice"><p>This application run was <span class="cpu_span">CPU-bound</span>. A breakdown of this time and advice for investigating further is in the <span class="cpu_span">CPU</span> section below.</p><p id="overview_advice">As very little time is spent in MPI calls, this code may also benefit from running at larger scales.</p></div> -</div> -<hr /> -<div class="subsections"> - <div class="ltcol"> - <div class="heading_cpu">CPU</div> - <div>A breakdown of how the <span class="cpu_span">88.6</span>% total CPU time was spent:</div> - <table id="cpu_chart"> - <tr><td>Scalar numeric ops</td><td class="right_cell"><span class="cpu_num_span">50.0</span>%</td><td class="mini_bar_graph"><div id="cpu_num_bar" /></td></tr> - <tr><td>Vector numeric ops</td><td class="right_cell"><span class="cpu_vec_span">50.0</span>%</td><td class="mini_bar_graph"><div id="cpu_vec_bar" /></td></tr> - <tr><td>Memory accesses</td><td class="right_cell"><span class="cpu_mem_span">0.0</span>%</td><td class="mini_bar_graph"><div id="cpu_mem_bar" /></td></tr> - <tr><td>Other</td><td class="right_cell"><span class="cpu_other_span">0.0</span>%</td><td class="mini_bar_graph"><div id="cpu_other_bar" /></td></tr> - </table> - <div id="cpu_explanation"> - <div class="explanation">The per-core performance is arithmetic-bound. Try to increase the amount of time spent in vectorized instructions by analyzing the compiler's vectorization reports.</div> - <div class="explanation"></div> - </div> - </div> - <div class="rtcol"> - <div class="heading_mpi">MPI</div> - <div>Of the <span class="mpi_span">11.4</span>% total time spent in MPI calls:</div> - <table id="mpi_chart"> - <tr><td>Time in collective calls</td><td class="right_cell"><span class="mpi_col_span">100.0</span>%</td><td class="mini_bar_graph"><div id="mpi_col_bar" /></td></tr> - <tr><td>Time in point-to-point calls</td><td class="right_cell"><span class="mpi_p2p_span">0.0</span>%</td><td class="mini_bar_graph"><div id="mpi_p2p_bar" /></td></tr> - <tr><td>Effective process collective rate</td><td class="right_cell"><span class="mpi_colrate_span"><span id="mpi_colrate_num">1.65e+02</span></span> <span id="mpi_colrate_units"></span></td><td class="mini_bar_graph"><div id="mpi_colrate_bar" /></td></tr> - <tr><td>Effective process point-to-point rate</td><td class="right_cell"><span class="mpi_p2prate_span"><span id="mpi_p2prate_num">0.00e+00</span></span> <span id="mpi_p2prate_units"></span></td><td class="mini_bar_graph"><div id="mpi_p2prate_bar" /></td></tr> - </table> - <div id="mpi_explanation"> - <div class="explanation">Most of the time is spent in collective calls with a very low transfer rate. This suggests load imbalance is causing synchonization overhead; use an MPI profiler to investigate further.</div> - <div class="explanation"></div> - </div> - </div> - <div class="clear"></div> -</div> -<div class="subsections"> - <div class="ltcol"> - <div class="heading_io">I/O</div> - <div>A breakdown of how the <span class="io_span">0.0</span>% total I/O time was spent:</div> - <table id="io_chart"> - <tr><td>Time in reads</td><td class="right_cell"><span class="io_read_span">0.0</span>%</td><td class="mini_bar_graph"><div id="io_read_bar" /></td></tr> - <tr><td>Time in writes</td><td class="right_cell"><span class="io_write_span">0.0</span>%</td><td class="mini_bar_graph"><div id="io_write_bar" /></td></tr> - <tr><td>Effective process read rate</td><td class="right_cell"><span class="io_readrate_span"><span id="io_readrate_num">0.00e+00</span></span> <span id="io_readrate_units"></span></td><td class="mini_bar_graph"><div id="io_readrate_bar" /></td></tr> - <tr><td>Effective process write rate</td><td class="right_cell"><span class="io_writerate_span"><span id="io_writerate_num">0.00e+00</span></span> <span id="io_writerate_units"></span></td><td class="mini_bar_graph"><div id="io_writerate_bar" /></td></tr> - </table> - <div id="io_explanation"> - <div class="explanation">No time is spent in I/O operations. There's nothing to optimize here!</div> - <div class="explanation"></div> - </div> - </div> - <div class="rtcol"> - <div class="heading_ram">Memory</div> - <div>Per-process memory usage may also affect scaling:</div> - <table id="ram_chart"> - <tr><td>Mean process memory usage</td><td class="right_cell"><span class="ram_mean_span"><span id="ram_mean_num">2.33e+07</span></span> <span id="ram_mean_units"></span></td><td class="mini_bar_graph"><div id="ram_mean_bar" /></td></tr> - <tr><td>Peak process memory usage</td><td class="right_cell"><span class="ram_peak_span"><span id="ram_peak_num">2.35e+07</span></span> <span id="ram_peak_units"></span></td><td class="mini_bar_graph"><div id="ram_peak_bar" /></td></tr> - <tr><td>Peak node memory usage</td><td class="right_cell"><span class="ram_node_span">2.8</span>%</td><td class="mini_bar_graph"><div id="ram_node_bar" /></td></tr> - </table> - <div id="ram_explanation"> - <div class="explanation">The peak node memory usage is very low. You may be able to reduce the amount of allocation time used by running with fewer MPI processes and more data on each process.</div> - <div class="explanation"></div> - </div> - </div> - <div class="clear"></div> -</div> -</div> <!-- content --> -</body> -</html> diff --git a/public/it4i/src/mympiprog_32p_2014-10-15_16-56.txt b/public/it4i/src/mympiprog_32p_2014-10-15_16-56.txt deleted file mode 100644 index de8449179640fd943a9f007f9eda084b11f2a455..0000000000000000000000000000000000000000 --- a/public/it4i/src/mympiprog_32p_2014-10-15_16-56.txt +++ /dev/null @@ -1,50 +0,0 @@ -Executable: mympiprog.x -Resources: 32 processes, 2 nodes -Machine: cn182 -Started on: Wed Oct 15 16:56:23 2014 -Total time: 7 seconds (0 minutes) -Full path: /home/user -Notes: - -Summary: mympiprog.x is CPU-bound in this configuration -CPU: 88.6% |========| -MPI: 11.4% || -I/O: 0.0% | -This application run was CPU-bound. A breakdown of this time and advice for investigating further is found in the CPU section below. -As very little time is spent in MPI calls, this code may also benefit from running at larger scales. - -CPU: -A breakdown of how the 88.6% total CPU time was spent: -Scalar numeric ops: 50.0% |====| -Vector numeric ops: 50.0% |====| -Memory accesses: 0.0% | -Other: 0.0% | -The per-core performance is arithmetic-bound. Try to increase the amount of time spent in vectorized instructions by analyzing the compiler's vectorization reports. - - -MPI: -A breakdown of how the 11.4% total MPI time was spent: -Time in collective calls: 100.0% |=========| -Time in point-to-point calls: 0.0% | -Effective collective rate: 1.65e+02 bytes/s -Effective point-to-point rate: 0.00e+00 bytes/s -Most of the time is spent in collective calls with a very low transfer rate. This suggests load imbalance is causing synchonization overhead; use an MPI profiler to investigate further. - - -I/O: -A breakdown of how the 0.0% total I/O time was spent: -Time in reads: 0.0% | -Time in writes: 0.0% | -Effective read rate: 0.00e+00 bytes/s -Effective write rate: 0.00e+00 bytes/s -No time is spent in I/O operations. There's nothing to optimize here! - - -Memory: -Per-process memory usage may also affect scaling: -Mean process memory usage: 2.33e+07 bytes -Peak process memory usage: 2.35e+07 bytes -Peak node memory usage: 2.8% | -The peak node memory usage is very low. You may be able to reduce the amount of allocation time used by running with fewer MPI processes and more data on each process. - - diff --git a/public/it4i/src/ompi/Hello.java b/public/it4i/src/ompi/Hello.java deleted file mode 100644 index 4f2ac4cfb15b0edd31e35e74ecce307e41a631be..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/Hello.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -/* - * Author of revised version: Franklyn Pinedo - * - * Adapted from Source Code in C of Tutorial/User's Guide for MPI by - * Peter Pacheco. - */ -/* - * Copyright (c) 2011 Cisco Systems, Inc. All rights reserved. - * - */ - -import mpi.*; - -class Hello { - static public void main(String[] args) throws MPIException { - - - MPI.Init(args); - - int myrank = MPI.COMM_WORLD.getRank(); - int size = MPI.COMM_WORLD.getSize() ; - System.out.println("Hello world from rank " + myrank + " of " + size); - - MPI.Finalize(); - } -} diff --git a/public/it4i/src/ompi/Ring.java b/public/it4i/src/ompi/Ring.java deleted file mode 100644 index 08cd864663e6cde304ec4adc509662ff2854b7de..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/Ring.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2011 Cisco Systems, Inc. All rights reserved. - * - * Simple ring test program - */ - -import mpi.* ; - -class Ring { - static public void main(String[] args) throws MPIException { - - - MPI.Init(args) ; - - int source; // Rank of sender - int dest; // Rank of receiver - int tag=50; // Tag for messages - int next; - int prev; - int message[] = new int [1]; - - int myrank = MPI.COMM_WORLD.getRank() ; - int size = MPI.COMM_WORLD.getSize() ; - - /* Calculate the rank of the next process in the ring. Use the - modulus operator so that the last process "wraps around" to - rank zero. */ - - next = (myrank + 1) % size; - prev = (myrank + size - 1) % size; - - /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), - put the number of times to go around the ring in the - message. */ - - if (0 == myrank) { - message[0] = 10; - - System.out.println("Process 0 sending " + message[0] + " to rank " + next + " (" + size + " processes in ring)"); - MPI.COMM_WORLD.send(message, 1, MPI.INT, next, tag); - } - - /* Pass the message around the ring. The exit mechanism works as - follows: the message (a positive integer) is passed around the - ring. Each time it passes rank 0, it is decremented. When - each processes receives a message containing a 0 value, it - passes the message on to the next process and then quits. By - passing the 0 message first, every process gets the 0 message - and can quit normally. */ - - while (true) { - MPI.COMM_WORLD.recv(message, 1, MPI.INT, prev, tag); - - if (0 == myrank) { - --message[0]; - System.out.println("Process 0 decremented value: " + message[0]); - } - - MPI.COMM_WORLD.send(message, 1, MPI.INT, next, tag); - if (0 == message[0]) { - System.out.println("Process " + myrank + " exiting"); - break; - } - } - - /* The last process does one extra send to process 0, which needs - to be received before the program can exit */ - - if (0 == myrank) { - MPI.COMM_WORLD.recv(message, 1, MPI.INT, prev, tag); - } - - MPI.Finalize(); - } -} diff --git a/public/it4i/src/ompi/connectivity_c.c b/public/it4i/src/ompi/connectivity_c.c deleted file mode 100644 index 14f3f546d532f0f1fa59d33e0a5b0a89eed8f0fa..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/connectivity_c.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. - */ - -/* - * Test the connectivity between all processes. - */ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <netdb.h> -#include <unistd.h> -#include <mpi.h> - -int -main(int argc, char **argv) -{ - MPI_Status status; - int verbose = 0; - int rank; - int np; /* number of processes in job */ - int peer; - int i; - int j; - int length; - char name[MPI_MAX_PROCESSOR_NAME+1]; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &np); - - /* - * If we cannot get the name for whatever reason, just - * set it to unknown. */ - if (MPI_SUCCESS != MPI_Get_processor_name(name, &length)) { - strcpy(name, "unknown"); - } - - if (argc>1 && strcmp(argv[1], "-v")==0) - verbose = 1; - - for (i=0; i<np; i++) { - if (rank==i) { - /* rank i sends to and receives from each higher rank */ - for(j=i+1; j<np; j++) { - if (verbose) - printf("checking connection between rank %d on %s and rank %-4d\n", - i, name, j); - MPI_Send(&rank, 1, MPI_INT, j, rank, MPI_COMM_WORLD); - MPI_Recv(&peer, 1, MPI_INT, j, j, MPI_COMM_WORLD, &status); - } - } else if (rank>i) { - /* receive from and reply to rank i */ - MPI_Recv(&peer, 1, MPI_INT, i, i, MPI_COMM_WORLD, &status); - MPI_Send(&rank, 1, MPI_INT, i, rank, MPI_COMM_WORLD); - } - } - - MPI_Barrier(MPI_COMM_WORLD); - if (rank==0) - printf("Connectivity test on %d processes PASSED.\n", np); - - MPI_Finalize(); - return 0; -} diff --git a/public/it4i/src/ompi/hello_c.c b/public/it4i/src/ompi/hello_c.c deleted file mode 100644 index e44f684370214442829f92adbb4455e7a559474f..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_c.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana - * University Research and Technology - * Corporation. All rights reserved. - * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. - * - * Sample MPI "hello world" application in C - */ - -#include <stdio.h> -#include "mpi.h" - -int main(int argc, char* argv[]) -{ - int rank, size, len; - char version[MPI_MAX_LIBRARY_VERSION_STRING]; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - MPI_Get_library_version(version, &len); - printf("Hello, world, I am %d of %d, (%s, %d)\n", - rank, size, version, len); - MPI_Finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/hello_cxx.cc b/public/it4i/src/ompi/hello_cxx.cc deleted file mode 100644 index b2253bfb8e58699a8c8ffec24e71cdd4a8e0609e..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_cxx.cc +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -// University Research and Technology -// Corporation. All rights reserved. -// Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. -// -// Sample MPI "hello world" application in C++ -// -// NOTE: The MPI C++ bindings were deprecated in MPI-2.2 and removed -// from the standard in MPI-3. Open MPI still provides C++ MPI -// bindings, but they are no longer built by default (and may be -// removed in a future version of Open MPI). You must -// --enable-mpi-cxx when configuring Open MPI to enable the MPI C++ -// bindings. -// - -#include "mpi.h" -#include <iostream> - -int main(int argc, char **argv) -{ - int rank, size, len; - char version[MPI_MAX_LIBRARY_VERSION_STRING]; - - MPI::Init(); - rank = MPI::COMM_WORLD.Get_rank(); - size = MPI::COMM_WORLD.Get_size(); - MPI_Get_library_version(version, &len); - std::cout << "Hello, world! I am " << rank << " of " << size - << "(" << version << ", " << len << ")" << std::endl; - MPI::Finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/hello_mpifh.f b/public/it4i/src/ompi/hello_mpifh.f deleted file mode 100644 index a2ff38f964007c02aa4642249bb40b695695bf44..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_mpifh.f +++ /dev/null @@ -1,27 +0,0 @@ -C -C Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -C University Research and Technology -C Corporation. All rights reserved. -C Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -C $COPYRIGHT$ -C -C Sample MPI "hello world" application using the Fortran mpif.h -C bindings. -C - program main - implicit none - include 'mpif.h' - integer ierr, rank, size, len - character(len=MPI_MAX_LIBRARY_VERSION_STRING) version - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - call MPI_GET_LIBRARY_VERSION(version, len, ierr) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": ", a)') - & rank, size, version - - call MPI_FINALIZE(ierr) - - end diff --git a/public/it4i/src/ompi/hello_oshmem_c.c b/public/it4i/src/ompi/hello_oshmem_c.c deleted file mode 100644 index 6bb0d08c06255d29dc4883195c325542c0dbedd4..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_oshmem_c.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include <stdio.h> -#include "shmem.h" - -#if !defined(OSHMEM_SPEC_VERSION) || OSHMEM_SPEC_VERSION < 10200 -#error This application uses API 1.2 and up -#endif - -int main(int argc, char* argv[]) -{ - int proc, nproc; - char name[SHMEM_MAX_NAME_LEN]; - int major, minor; - - shmem_init(); - nproc = shmem_n_pes(); - proc = shmem_my_pe(); - shmem_info_get_name(name); - shmem_info_get_version(&major, &minor); - - printf("Hello, world, I am %d of %d: %s (version: %d.%d)\n", - proc, nproc, name, major, minor); - shmem_finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/hello_oshmem_cxx.cc b/public/it4i/src/ompi/hello_oshmem_cxx.cc deleted file mode 100644 index 99d8565c8a53b2b0a23bc32edf1637f1ead10748..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_oshmem_cxx.cc +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include <iostream> -#include "shmem.h" - -#if !defined(OSHMEM_SPEC_VERSION) || OSHMEM_SPEC_VERSION < 10200 -#error This application uses API 1.2 and up -#endif - -int main(int argc, char* argv[]) -{ - int proc, nproc; - char name[SHMEM_MAX_NAME_LEN]; - int major, minor; - - shmem_init(); - nproc = shmem_n_pes(); - proc = shmem_my_pe(); - shmem_info_get_name(name); - shmem_info_get_version(&major, &minor); - - std::cout << "Hello, world, I am " << proc << " of " << nproc << ": " << name - << " (version: " << major << "." << minor << ")" << std::endl; - - shmem_finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/hello_oshmemfh.f90 b/public/it4i/src/ompi/hello_oshmemfh.f90 deleted file mode 100644 index 09404c3bb8aa650a63c7a72e177a3cb6a61e88a0..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_oshmemfh.f90 +++ /dev/null @@ -1,29 +0,0 @@ -! -! Copyright (c) 2014 Mellanox Technologies, Inc. -! All rights reserved. -! Copyright (c) 2014-2015 Cisco Systems, Inc. All rights reserved. -! $COPYRIGHT$ -! -! Additional copyrights may follow -! -! $HEADER$ -! -program hello_oshmem - implicit none - include 'shmem.fh' - - integer proc, nproc - integer shmem_my_pe, shmem_n_pes - integer major, minor, len - character(len=SHMEM_MAX_NAME_LEN) name - - call SHMEM_INIT() - proc = SHMEM_MY_PE() - nproc = SHMEM_N_PES() - call SHMEM_INFO_GET_VERSION(major, minor) - call SHMEM_INFO_GET_NAME(name) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": (version: ", i0, ".", i0, ")")') proc, nproc, major, minor - call SHMEM_FINALIZE() - -end program hello_oshmem diff --git a/public/it4i/src/ompi/hello_usempi.f90 b/public/it4i/src/ompi/hello_usempi.f90 deleted file mode 100644 index 3fc7a9be31bc3902db58b2d3000e3a7bf870b642..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_usempi.f90 +++ /dev/null @@ -1,28 +0,0 @@ -! -! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -! University Research and Technology -! Corporation. All rights reserved. -! Copyright (c) 2004-2005 The Regents of the University of California. -! All rights reserved. -! Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -! $COPYRIGHT$ -! -! Sample MPI "hello world" application using the Fortran mpi module -! bindings. -! -program main - use mpi - implicit none - integer :: ierr, rank, size, len - character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: version - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - call MPI_GET_LIBRARY_VERSION(version, len, ierr) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": ", a)') & - rank, size, version - - call MPI_FINALIZE(ierr) -end diff --git a/public/it4i/src/ompi/hello_usempif08.f90 b/public/it4i/src/ompi/hello_usempif08.f90 deleted file mode 100644 index e4af17bb6aefe4e982ab3a668ff13b97ddf2247f..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/hello_usempif08.f90 +++ /dev/null @@ -1,31 +0,0 @@ -! -*- f90 -*- -! -! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -! University Research and Technology -! Corporation. All rights reserved. -! Copyright (c) 2004-2005 The Regents of the University of California. -! All rights reserved. -! Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -! Copyright (c) 2009-2012 Los Alamos National Security, LLC. -! All rights reserved. -! $COPYRIGHT$ -! -! Sample MPI "hello world" application using the Fortran mpi_f08 -! module bindings. -! -program main - use mpi_f08 - implicit none - integer :: rank, size, len - character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: version - - call MPI_INIT() - call MPI_COMM_RANK(MPI_COMM_WORLD, rank) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size) - call MPI_GET_LIBRARY_VERSION(version, len) - - write(*, '("Hello, world, I am ", i2, " of ", i2, ": ", a)') & - rank, size, version - - call MPI_FINALIZE() -end diff --git a/public/it4i/src/ompi/ompi.tar.gz b/public/it4i/src/ompi/ompi.tar.gz deleted file mode 100644 index ec348839c8a280dd3dc286c468389fd06fd10914..0000000000000000000000000000000000000000 Binary files a/public/it4i/src/ompi/ompi.tar.gz and /dev/null differ diff --git a/public/it4i/src/ompi/oshmem_circular_shift.c b/public/it4i/src/ompi/oshmem_circular_shift.c deleted file mode 100644 index 3ff2d6d0c87d85dfe3777c934c00fc8f85e799ae..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/oshmem_circular_shift.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2014-2016 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include <stdio.h> -#include <shmem.h> - -int main (void) -{ - static int aaa, bbb; - int num_pes, my_pe, peer; - - shmem_init(); - - num_pes = shmem_n_pes(); - my_pe = shmem_my_pe(); - - peer = (my_pe + 1) % num_pes; - - printf("Process %d gets message from %d (%d processes in ring)\n", my_pe, peer, num_pes); - shmem_int_get(&aaa, &bbb, 1, peer); - - shmem_barrier_all(); - printf("Process %d exiting\n", my_pe); - shmem_finalize(); - - return 0; -} - diff --git a/public/it4i/src/ompi/oshmem_max_reduction.c b/public/it4i/src/ompi/oshmem_max_reduction.c deleted file mode 100644 index d0dec673af2a331fe7bcd3388478a18c253b007f..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/oshmem_max_reduction.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2014-2016 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - * - * reduce [0,1,2] + _my_pe() across 4 PEs with MAX() - */ - -#include <stdio.h> -#include <string.h> - -#include <shmem.h> - -long pSync[_SHMEM_BCAST_SYNC_SIZE]; - -#define N 3 - -long src[N]; -long dst[N]; -long pWrk[_SHMEM_REDUCE_SYNC_SIZE]; - -int main(void) -{ - int i; - int my_pe, num_pes; - - for (i = 0; i < SHMEM_BCAST_SYNC_SIZE; i += 1) { - pSync[i] = _SHMEM_SYNC_VALUE; - } - - shmem_init(); - - my_pe = shmem_my_pe(); - num_pes = shmem_n_pes(); - - for (i = 0; i < N; i += 1) { - src[i] = my_pe + i; - } - - shmem_barrier_all(); - - shmem_long_max_to_all(dst, src, N, 0, 0, num_pes, pWrk, pSync); - - printf("%d/%d dst =", my_pe, num_pes); - - for (i = 0; i < N; i+= 1) { - printf(" %ld", dst[i]); - } - - printf("\n"); - shmem_finalize(); - - return 0; -} - diff --git a/public/it4i/src/ompi/oshmem_shmalloc.c b/public/it4i/src/ompi/oshmem_shmalloc.c deleted file mode 100644 index e5f9ab9090738a64623bd16e2147e3dc82fbd584..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/oshmem_shmalloc.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014-2016 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - * - * This sample allocates (shmalloc) symmetric memory (1 long integer), - * and then frees it. Success of allocation is not checked. - * - * Produces no output. - */ - -#include <shmem.h> - -int main(void) -{ - long *x; - - shmem_init(); - - x = (long *) shmem_malloc(sizeof(*x)); - - shmem_free(x); - - shmem_finalize(); -} - diff --git a/public/it4i/src/ompi/oshmem_strided_puts.c b/public/it4i/src/ompi/oshmem_strided_puts.c deleted file mode 100644 index e9f31ddb74915812db8460d3bfee4ea1d5efded2..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/oshmem_strided_puts.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2014-2016 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - * - * This program is an adaptation of examples found in the man pages - * of SGI’s SHMEM implementation. - * - * In this program, iput is used to select 5 elements from array source separated by - * a stride of 2 and write them to array target using a stride of 1. - * - * Given the array source = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } - * iput will select 5 elements from array source on PE 0, using a stride of 2: - * - * selected elements = { 1, 3, 5, 7, 9 } - * - * These elements will then be written to the array source on PE 1 using a stride of 1: - * - * target = { 1, 3, 5, 7, 9 } - * - */ - -#include <stdio.h> -#include <shmem.h> - -int main(void) -{ - short source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - static short target[10]; - int me; - - shmem_init(); - me = shmem_my_pe(); - - if (me == 0) { - /* put 10 words into target on PE 1 */ - shmem_short_iput(target, source, 1, 2, 5, 1); - } - - shmem_barrier_all(); /* sync sender and receiver */ - - if (me == 1) { - printf("target on PE %d is %hd %hd %hd %hd %hd\n", me, - target[0], target[1], target[2], - target[3], target[4] ); - } - shmem_barrier_all(); /* sync before exiting */ - shmem_finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/oshmem_symmetric_data.c b/public/it4i/src/ompi/oshmem_symmetric_data.c deleted file mode 100644 index 7c5a1db6b5344e82b6b6fed4cb3bcdc531cc6894..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/oshmem_symmetric_data.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2014-2016 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include <stdio.h> -#include <shmem.h> - -#define SIZE 16 - -int main(int argc, char* argv[]) -{ - short source[SIZE]; - static short target[SIZE]; - int i; - int num_pe, my_pe; - - shmem_init(); - - num_pe = shmem_n_pes(); - my_pe = shmem_my_pe(); - - if (my_pe == 0) { - /* initialize array */ - for(i = 0; i < SIZE; i++) { - source[i] = i; - } - /* local, not symmetric */ - /* static makes it symmetric */ - /* put "size" words into target on each PE */ - for(i = 1; i < num_pe; i++) { - shmem_short_put(target, source, SIZE, i); - } - } - - shmem_barrier_all(); /* sync sender and receiver */ - - if (my_pe != 0) { - printf("Target on PE %d is \t", my_pe); - - for(i = 0; i < SIZE; i++) { - printf("%hd \t", target[i]); - } - printf("\n"); - } - - shmem_barrier_all(); /* sync before exiting */ - shmem_finalize(); - - return 0; -} diff --git a/public/it4i/src/ompi/ring_c.c b/public/it4i/src/ompi/ring_c.c deleted file mode 100644 index 86c205b3d21633c60607ce33f3f8c4d540ac8987..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_c.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana - * University Research and Technology - * Corporation. All rights reserved. - * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. - * - * Simple ring test program in C. - */ - -#include <stdio.h> -#include "mpi.h" - -int main(int argc, char *argv[]) -{ - int rank, size, next, prev, message, tag = 201; - - /* Start up MPI */ - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - /* Calculate the rank of the next process in the ring. Use the - modulus operator so that the last process "wraps around" to - rank zero. */ - - next = (rank + 1) % size; - prev = (rank + size - 1) % size; - - /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), - put the number of times to go around the ring in the - message. */ - - if (0 == rank) { - message = 10; - - printf("Process 0 sending %d to %d, tag %d (%d processes in ring)\n", - message, next, tag, size); - MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD); - printf("Process 0 sent to %d\n", next); - } - - /* Pass the message around the ring. The exit mechanism works as - follows: the message (a positive integer) is passed around the - ring. Each time it passes rank 0, it is decremented. When - each processes receives a message containing a 0 value, it - passes the message on to the next process and then quits. By - passing the 0 message first, every process gets the 0 message - and can quit normally. */ - - while (1) { - MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD, - MPI_STATUS_IGNORE); - - if (0 == rank) { - --message; - printf("Process 0 decremented value: %d\n", message); - } - - MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD); - if (0 == message) { - printf("Process %d exiting\n", rank); - break; - } - } - - /* The last process does one extra send to process 0, which needs - to be received before the program can exit */ - - if (0 == rank) { - MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD, - MPI_STATUS_IGNORE); - } - - /* All done */ - - MPI_Finalize(); - return 0; -} diff --git a/public/it4i/src/ompi/ring_cxx.cc b/public/it4i/src/ompi/ring_cxx.cc deleted file mode 100644 index e783192431d881a28b1f9b92f012f36e2ab8c23a..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_cxx.cc +++ /dev/null @@ -1,85 +0,0 @@ -// -// Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -// University Research and Technology -// Corporation. All rights reserved. -// Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. -// -// Simple ring test program in C++. -// -// NOTE: The MPI C++ bindings were deprecated in MPI-2.2 and removed -// from the standard in MPI-3. Open MPI still provides C++ MPI -// bindings, but they are no longer built by default (and may be -// removed in a future version of Open MPI). You must -// --enable-mpi-cxx when configuring Open MPI to enable the MPI C++ -// bindings. -// - -#include "mpi.h" -#include <iostream> - -int main(int argc, char *argv[]) -{ - int rank, size, next, prev, message, tag = 201; - - // Start up MPI - - MPI::Init(); - rank = MPI::COMM_WORLD.Get_rank(); - size = MPI::COMM_WORLD.Get_size(); - - // Calculate the rank of the next process in the ring. Use the - // modulus operator so that the last process "wraps around" to - // rank zero. - - next = (rank + 1) % size; - prev = (rank + size - 1) % size; - - // If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), - // put the number of times to go around the ring in the message. - - if (0 == rank) { - message = 10; - - std::cout << "Process 0 sending " << message << " to " << next - << ", tag " << tag << " (" << size << " processes in ring)" - << std::endl; - MPI::COMM_WORLD.Send(&message, 1, MPI::INT, next, tag); - std::cout << "Process 0 sent to " << next << std::endl; - } - - // Pass the message around the ring. The exit mechanism works as - // follows: the message (a positive integer) is passed around the - // ring. Each time it passes rank 0, it is decremented. When - // each processes receives a message containing a 0 value, it - // passes the message on to the next process and then quits. By - // passing the 0 message first, every process gets the 0 message - // and can quit normally. - - while (1) { - MPI::COMM_WORLD.Recv(&message, 1, MPI::INT, prev, tag); - - if (0 == rank) { - --message; - std::cout << "Process 0 decremented value: " << message - << std::endl; - } - - MPI::COMM_WORLD.Send(&message, 1, MPI::INT, next, tag); - if (0 == message) { - std::cout << "Process " << rank << " exiting" << std::endl; - break; - } - } - - // The last process does one extra send to process 0, which needs - // to be received before the program can exit */ - - if (0 == rank) { - MPI::COMM_WORLD.Recv(&message, 1, MPI::INT, prev, tag); - } - - // All done - - MPI::Finalize(); - return 0; -} diff --git a/public/it4i/src/ompi/ring_mpifh.f b/public/it4i/src/ompi/ring_mpifh.f deleted file mode 100644 index 64e6498fe7f0bf25dbb4705bc9bb6fca2f12faee..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_mpifh.f +++ /dev/null @@ -1,81 +0,0 @@ -C -C Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -C University Research and Technology -C Corporation. All rights reserved. -C Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -C $COPYRIGHT$ -C -C Simple ring test program using the mpif.h Fortran bindings. -C - program ring_f77 - implicit none - include 'mpif.h' - integer rank, size, tag, next, from, message, ierr - -C Start up MPI */ - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - -C Calculate the rank of the next process in the ring. Use the -C modulus operator so that the last process "wraps around" to rank -C zero. - - tag = 201 - next = mod((rank + 1), size) - from = mod((rank + size - 1), size) - -C If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put -C the number of times to go around the ring in the message. - - if (rank .eq. 0) then - message = 10 - - write(*, '("Process 0 sending ", i2, " to ", i2, " tag ", - & i3, " (", i2, " processes in ring)")') - & message, next, tag, size - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, - & MPI_COMM_WORLD, ierr) - write(*, '("Process 0 sent to ", i2)') - & next - endif - -C Pass the message around the ring. The exit mechanism works as -C follows: the message (a positive integer) is passed around the -C ring. Each time it passes rank 0, it is decremented. When each -C processes receives a message containing a 0 value, it passes the -C message on to the next process and then quits. By passing the 0 -C message first, every process gets the 0 message and can quit -C normally. - - 10 call MPI_RECV(message, 1, MPI_INTEGER, from, tag, - & MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierr) - - if (rank .eq. 0) then - message = message - 1 - write(*, '("Process 0 decremented value: ", i2)') message - endif - - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, - & MPI_COMM_WORLD, ierr) - - if (message .eq. 0) then - write(*, '("Process ", i2, " exiting")') rank - goto 20 - endif - goto 10 - -C The last process does one extra send to process 0, which needs to -C be received before the program can exit - - 20 if (rank .eq. 0) then - call MPI_RECV(message, 1, MPI_INTEGER, from, tag, - & MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierr) - endif - -C All done - - call MPI_FINALIZE(ierr) - end - diff --git a/public/it4i/src/ompi/ring_oshmem_c.c b/public/it4i/src/ompi/ring_oshmem_c.c deleted file mode 100644 index 5fe1c7f65dca76f060cbd4120f6ee19b8399efd6..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_oshmem_c.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2014 Mellanox Technologies, Inc. - * All rights reserved. - * $COPYRIGHT$ - * - * Additional copyrights may follow - * - * $HEADER$ - */ - -#include <shmem.h> -#include <stdio.h> - -#if !defined(OSHMEM_SPEC_VERSION) || OSHMEM_SPEC_VERSION < 10200 -#error This application uses API 1.2 and up -#endif - -int main (int argc, char * argv[]) -{ - static int rbuf = -1; - int proc, nproc, next; - int message = 10; - - shmem_init(); - nproc = shmem_n_pes(); - proc = shmem_my_pe(); - - /* Calculate the PE number of the next process in the ring. Use the - modulus operator so that the last process "wraps around" to PE 0. */ - - next = (proc + 1) % nproc; - - if(proc == 0) - { - printf("Process 0 puts message %d to %d (%d processes in ring)\n", message, next, nproc); - shmem_int_put(&rbuf, &message, 1, next); - } - - /* Pass the message around the ring. The exit mechanism works as - follows: the message (a positive integer) is passed around the - ring. Each time it passes PE 0, it is decremented. When each - processes receives a message containing a 0 value, it passes the - message on to the next process and then quits. By passing the 0 - message first, every process gets the 0 message and can quit - normally. */ - - while(message > 0) { - shmem_int_wait_until(&rbuf, SHMEM_CMP_EQ, message); - if(proc == 0) { - --message; - printf("Process 0 decremented value: %d\n", message); - } - shmem_int_put(&rbuf, &message, 1, next); - if(proc != 0) { - --message; - } - } - shmem_finalize(); - - /* All done */ - - printf("Process %d exiting\n", proc); - - return 0; -} diff --git a/public/it4i/src/ompi/ring_oshmemfh.f90 b/public/it4i/src/ompi/ring_oshmemfh.f90 deleted file mode 100644 index e365bf23e17a9d2e17faa30f087b14628f2d000b..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_oshmemfh.f90 +++ /dev/null @@ -1,66 +0,0 @@ -! -! Copyright (c) 2014 Mellanox Technologies, Inc. -! All rights reserved. -! Copyright (c) 2014 Cisco Systems, Inc. All rights reserved. -! $COPYRIGHT$ -! -! Additional copyrights may follow -! -! $HEADER$ -! - -program ring_oshmem - implicit none - include 'shmem.fh' - - integer*8, save :: rbuf - integer*8 :: message - integer :: proc, nproc, next - integer :: my_pe, num_pes - - rbuf = -1 - message = 10 - - call start_pes(0) - proc = my_pe() - nproc = num_pes() - -! Calculate the PE number of the next process in the ring. Use the -! modulus operator so that the last process "wraps around" to PE 0. - - next = mod((proc + 1), nproc) - - if (proc .eq. 0) then - write(*, '("Process 0 sending ", i2, " to", i2, " (", i2, " processes in ring)")') message, next, nproc - call shmem_put8(rbuf, message, 1, next) - write(*, '("Process 0 sent to ", i2)') next - end if - -! Pass the message around the ring. The exit mechanism works as -! follows: the message (a positive integer) is passed around the -! ring. Each time it passes PE 0, it is decremented. When each -! processes receives a message containing a 0 value, it passes the -! message on to the next process and then quits. By passing the 0 -! message first, every process gets the 0 message and can quit -! normally. - - do while (message .gt. 0) - call shmem_int8_wait_until(rbuf, SHMEM_CMP_EQ, message) - - if (proc .eq. 0) then - message = message - 1 - write(*, '("Process 0 decremented value:", i2)') message - end if - - call shmem_put8(rbuf, message, 1, next) - - if (proc .gt. 0) then - message = message - 1 - end if - end do - -! All done - - write(*, '("Process", i2," exiting.")') proc - -end program ring_oshmem diff --git a/public/it4i/src/ompi/ring_usempi.f90 b/public/it4i/src/ompi/ring_usempi.f90 deleted file mode 100644 index 6c5b0b17bd0fcd9e05ab9e6da3688891377fed21..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_usempi.f90 +++ /dev/null @@ -1,75 +0,0 @@ -! -! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -! University Research and Technology -! Corporation. All rights reserved. -! Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -! $COPYRIGHT$ -! -! Simple ring test program using the Fortran mpi module bindings. -! -program ring - use mpi - implicit none - integer :: rank, size, tag, next, from, ierr, i, message - -! Start up MPI - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - -! Calculate the rank of the next process in the ring. Use the modulus -! operator so that the last process "wraps around" to rank zero. - - tag = 201 - next = mod((rank + 1), size) - from = mod((rank + size - 1), size) - -! If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put -! the number of times to go around the ring in the message. - - if (rank .eq. 0) then - message = 10 - - write(*, '("Process 0 sending ", i2, " to ", i2, " tag ", i3, " (", i2, " processes in ring)")') message, next, tag, size - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr) - write(*, '("Process 0 sent to ", i2)') next - endif - -! Pass the message around the ring. The exit mechanism works as -! follows: the message (a positive integer) is passed around the ring. -! Each time it passes rank 0, it is decremented. When each processes -! receives a message containing a 0 value, it passes the message on to -! the next process and then quits. By passing the 0 message first, -! every process gets the 0 message and can quit normally. - - i = 1 -10 call MPI_Recv(message, i, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & - MPI_STATUS_IGNORE, ierr) - - if (rank .eq. 0) then - message = message - 1 - write(*, '("Process 0 decremented value: ", i2)') message - endif - - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD, ierr) - - if (message .eq. 0) then - write(*, '("Process ", i2, " exiting")') rank - goto 20 - endif - goto 10 - -! The last process does one extra send to process 0, which needs to be -! received before the program can exit - - 20 if (rank .eq. 0) then - call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & - MPI_STATUS_IGNORE, ierr) - endif - -! All done - - call MPI_FINALIZE(ierr) -end program - diff --git a/public/it4i/src/ompi/ring_usempif08.f90 b/public/it4i/src/ompi/ring_usempif08.f90 deleted file mode 100644 index 753b89531e6c4ec09e0c16952e3ce3f5aaae9be2..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/ring_usempif08.f90 +++ /dev/null @@ -1,79 +0,0 @@ -! -*- f90 -*- -! -! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana -! University Research and Technology -! Corporation. All rights reserved. -! Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. -! Copyright (c) 2009-2012 Los Alamos National Security, LLC. -! All rights reserved. -! $COPYRIGHT$ -! -! Simple ring test program using the Fortran mpi_f08 module bindings. -! -program ring - use mpi_f08 - implicit none - integer :: rank, size, tag, next, from, i, message - - -! Start up MPI - - call MPI_INIT() - call MPI_COMM_RANK(MPI_COMM_WORLD, rank) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size) - -! Calculate the rank of the next process in the ring. Use the modulus -! operator so that the last process "wraps around" to rank zero. - - tag = 201 - next = mod((rank + 1), size) - from = mod((rank + size - 1), size) - -! If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put -! the number of times to go around the ring in the message. - - if (rank .eq. 0) then - message = 10 - - write(*, '("Process 0 sending ", i2, " to ", i2, " tag ", i3, " (", i2, " processes in ring)")') message, next, tag, size - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD) - write(*, '("Process 0 sent to ", i2)') next - endif - -! Pass the message around the ring. The exit mechanism works as -! follows: the message (a positive integer) is passed around the ring. -! Each time it passes rank 0, it is decremented. When each processes -! receives a message containing a 0 value, it passes the message on to -! the next process and then quits. By passing the 0 message first, -! every process gets the 0 message and can quit normally. - - i = 1 -10 call MPI_Recv(message, i, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & - MPI_STATUS_IGNORE) - - if (rank .eq. 0) then - message = message - 1 - write(*, '("Process 0 decremented value: ", i2)') message - endif - - call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD) - - if (message .eq. 0) then - write(*, '("Process ", i2, " exiting")') rank - goto 20 - endif - goto 10 - -! The last process does one extra send to process 0, which needs to be -! received before the program can exit - - 20 if (rank .eq. 0) then - call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, & - MPI_STATUS_IGNORE) - endif - -! All done - - call MPI_FINALIZE() -end program - diff --git a/public/it4i/src/ompi/spc_example.c b/public/it4i/src/ompi/spc_example.c deleted file mode 100644 index 5b57589cffd4a5da6bddcb8baff3d9497c82745b..0000000000000000000000000000000000000000 --- a/public/it4i/src/ompi/spc_example.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2018 The University of Tennessee and The University - * of Tennessee Research Foundation. All rights - * reserved. - * - * Simple example usage of SPCs through MPI_T. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "mpi.h" - -/* Sends 'num_messages' messages of 'message_size' bytes from rank 0 to rank 1. - * All messages are send synchronously and with the same tag in MPI_COMM_WORLD. - */ -void message_exchange(int num_messages, int message_size) -{ - int i, rank; - /* Use calloc to initialize data to 0's */ - char *data = (char*)calloc(message_size, sizeof(char)); - MPI_Status status; - - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - if(rank == 0) { - for(i = 0; i < num_messages; i++) - MPI_Send(data, message_size, MPI_BYTE, 1, 123, MPI_COMM_WORLD); - } else if(rank == 1) { - for(i = 0; i < num_messages; i++) - MPI_Recv(data, message_size, MPI_BYTE, 0, 123, MPI_COMM_WORLD, &status); - } - - free(data); -} - -int main(int argc, char **argv) -{ - int num_messages, message_size; - - if(argc < 3) { - printf("Usage: mpirun -np 2 --mca mpi_spc_attach all --mca mpi_spc_dump_enabled true ./spc_example [num_messages] [message_size]\n"); - return -1; - } else { - num_messages = atoi(argv[1]); - message_size = atoi(argv[2]); - } - - int i, rank, size, provided, num, name_len, desc_len, verbosity, bind, var_class, readonly, continuous, atomic, count, index; - MPI_Datatype datatype; - MPI_T_enum enumtype; - MPI_Comm comm; - char name[256], description[256]; - - /* Counter names to be read by ranks 0 and 1 */ - char *counter_names[] = {"runtime_spc_OMPI_BYTES_SENT_USER", - "runtime_spc_OMPI_BYTES_RECEIVED_USER" }; - - MPI_Init(NULL, NULL); - MPI_T_init_thread(MPI_THREAD_SINGLE, &provided); - - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - if(size != 2) { - fprintf(stderr, "ERROR: This test should be run with two MPI processes.\n"); - MPI_Abort(MPI_COMM_WORLD, -1); - } - - /* Determine the MPI_T pvar indices for the OMPI_BYTES_SENT/RECIEVED_USER SPCs */ - index = -1; - MPI_T_pvar_get_num(&num); - for(i = 0; i < num; i++) { - name_len = desc_len = 256; - PMPI_T_pvar_get_info(i, name, &name_len, &verbosity, - &var_class, &datatype, &enumtype, description, &desc_len, &bind, - &readonly, &continuous, &atomic); - if(strcmp(name, counter_names[rank]) == 0) { - index = i; - printf("[%d] %s -> %s\n", rank, name, description); - } - } - - /* Make sure we found the counters */ - if(index == -1) { - fprintf(stderr, "ERROR: Couldn't find the appropriate SPC counter in the MPI_T pvars.\n"); - MPI_Abort(MPI_COMM_WORLD, -1); - } - - int ret; - long long value; - - MPI_T_pvar_session session; - MPI_T_pvar_handle handle; - /* Create the MPI_T sessions/handles for the counters and start the counters */ - ret = MPI_T_pvar_session_create(&session); - ret = MPI_T_pvar_handle_alloc(session, index, NULL, &handle, &count); - ret = MPI_T_pvar_start(session, handle); - - message_exchange(num_messages, message_size); - - ret = MPI_T_pvar_read(session, handle, &value); - /* Print the counter values in order by rank */ - for(i = 0; i < 2; i++) { - if(i == rank) { - printf("[%d] Value Read: %lld\n", rank, value); - fflush(stdout); - } - MPI_Barrier(MPI_COMM_WORLD); - } - /* Stop the MPI_T session, free the handle, and then free the session */ - ret = MPI_T_pvar_stop(session, handle); - ret = MPI_T_pvar_handle_free(session, &handle); - ret = MPI_T_pvar_session_free(&session); - - MPI_T_finalize(); - MPI_Finalize(); - - return 0; -} diff --git a/public/it4i/src/qnn_example.txt b/public/it4i/src/qnn_example.txt deleted file mode 100644 index 9ffee3e37194e06d55b639398cbfc9aa9603252a..0000000000000000000000000000000000000000 --- a/public/it4i/src/qnn_example.txt +++ /dev/null @@ -1,269 +0,0 @@ -#!/usr/bin/env python - - -import numpy as np -import matplotlib.pyplot as plt - -import torch -from torch.autograd import Function -from torchvision import datasets, transforms -import torch.optim as optim -import torch.nn as nn -import torch.nn.functional as F - -import cudaq -from cudaq import spin - - - - -# GPU utilities -for tar in cudaq.get_targets(): - print(f'{tar.description} {tar.name} {tar.platform} {tar.simulator} {tar.num_qpus}') -cudaq.set_target("default") # Set CUDAQ to run on GPU's -torch.cuda.is_available( -) # If this is True then the NVIDIA drivers are correctly installed - -torch.cuda.device_count() # Counts the number of GPU's available - -torch.cuda.current_device() - -torch.cuda.get_device_name(0) - -device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") - - - - -# Training set -sample_count = 140 - -X_train = datasets.FashionMNIST( - root="./data", - train=True, - download=True, - transform=transforms.Compose([transforms.ToTensor()]), -) - -# Leaving only labels 0 and 1 -idx = np.append( - np.where(X_train.targets == 0)[0][:sample_count], - np.where(X_train.targets == 1)[0][:sample_count], -) -X_train.data = X_train.data[idx] -X_train.targets = X_train.targets[idx] -train_loader = torch.utils.data.DataLoader(X_train, batch_size=1, shuffle=True) - -# Test set -sample_count = 70 - -X_test = datasets.FashionMNIST( - root="./data", - train=False, - download=True, - transform=transforms.Compose([transforms.ToTensor()]), -) -idx = np.append( - np.where(X_test.targets == 0)[0][:sample_count], - np.where(X_test.targets == 1)[0][:sample_count], -) - -X_test.data = X_test.data[idx] -X_test.targets = X_test.targets[idx] - -test_loader = torch.utils.data.DataLoader(X_test, batch_size=1, shuffle=True) - - -class QuantumCircuit: - """This class defines the quantum circuit structure and the run method which is used to calculate an expectation value""" - - def __init__(self, qubit_count: int): - """Define the quantum circuit in CUDA Quantum""" - - kernel, thetas = cudaq.make_kernel(list) - - self.kernel = kernel - - self.theta = thetas - - qubits = kernel.qalloc(qubit_count) - - self.kernel.h(qubits) - - # Variational gate parameters which are optimised during training - kernel.ry(thetas[0], qubits[0]) - kernel.rx(thetas[1], qubits[0]) - - def run(self, thetas: torch.tensor) -> torch.tensor: - """Excetute the quantum circuit to output an expectation value""" - - expectation = torch.tensor(cudaq.observe(self.kernel, spin.z(0), - thetas).expectation_z(), - device=device) - - return expectation - - - - -class QuantumFunction(Function): - """Allows the quantum circuit to pass data through it and compute the gradients""" - - @staticmethod - def forward(ctx, thetas: torch.tensor, quantum_circuit, - shift) -> torch.tensor: - # Save shift and quantum_circuit in context to use in backward - ctx.shift = shift - ctx.quantum_circuit = quantum_circuit - - # Calculate exp_val - expectation_z = ctx.quantum_circuit.run(thetas) - - ctx.save_for_backward(thetas, expectation_z) - - return expectation_z - - @staticmethod - def backward(ctx, grad_output): - """Backward pass computation via finite difference parameter shift""" - - thetas, expectation_z = ctx.saved_tensors - - gradients = torch.zeros(len(thetas), device=device) - - for i in range(len(thetas)): - shift_right = torch.clone(thetas) - - shift_right[i] += ctx.shift - - shift_left = torch.clone(thetas) - - shift_left[i] -= ctx.shift - - expectation_right = ctx.quantum_circuit.run(shift_right) - expectation_left = ctx.quantum_circuit.run(shift_left) - - gradients[i] = 0.5 * (expectation_right - expectation_left) - - return gradients * grad_output.float(), None, None - - - -class QuantumLayer(nn.Module): - """Encapsulates a quantum circuit and a quantum function into a quantum layer""" - - def __init__(self, shift: torch.tensor): - super(QuantumLayer, self).__init__() - self.quantum_circuit = QuantumCircuit(1) # 1 qubit quantum circuit - self.shift = shift - - def forward(self, input): - ans = QuantumFunction.apply(input, self.quantum_circuit, self.shift) - - return ans - - - -class Net(nn.Module): - - def __init__(self): - super(Net, self).__init__() - - # Neural network structure - self.conv1 = nn.Conv2d(1, 6, kernel_size=5) - self.conv2 = nn.Conv2d(6, 16, kernel_size=5) - self.dropout = nn.Dropout2d() - self.fc1 = nn.Linear(256, 64) - self.fc2 = nn.Linear( - 64, 2 - ) # Output a 2D tensor since we have 2 variational parameters in our quantum circuit - self.hybrid = QuantumLayer( - torch.tensor(np.pi / 2) - ) # Input is the magnitude of the parameter shifts to calculate gradients - - def forward(self, x): - x = F.relu(self.conv1(x)) - x = F.max_pool2d(x, 2) - x = F.relu(self.conv2(x)) - x = F.max_pool2d(x, 2) - x = self.dropout(x) - x = x.view(1, -1) - x = F.relu(self.fc1(x)) - x = self.fc2(x).reshape( - -1) # Reshapes required to satisfy input dimensions to CUDAQ - x = self.hybrid(x).reshape(-1) - - return torch.cat((x, 1 - x), -1).unsqueeze(0) - - - - -# We move our model to the CUDA device to minimise data transfer between GPU and CPU - -model = Net().to(device) -print(model) -optimizer = optim.Adam(model.parameters(), lr=0.001) - -loss_func = nn.NLLLoss().to(device) - -epochs = 20 - -epoch_loss = [] - -model.train() -for epoch in range(epochs): - batch_loss = 0.0 - for batch_idx, (data, target) in enumerate(train_loader): # batch training - optimizer.zero_grad() - - data, target = data.to(device), target.to(device) - - # Forward pass - output = model(data).to(device) - # Calculating loss - loss = loss_func(output, target).to(device) - - # Backward pass - loss.backward() - - # Optimize the weights - optimizer.step() - - batch_loss += loss.item() - - epoch_loss.append(batch_loss / batch_idx) - - print("Training [{:.0f}%]\tLoss: {:.4f}".format( - 100.0 * (epoch + 1) / epochs, epoch_loss[-1])) - - - - -plt.plot(epoch_loss) -plt.title("Hybrid NN Training Convergence") -plt.xlabel("Training Iterations") - -plt.ylabel("Neg Log Likelihood Loss") - - - - -# Testing on the test set - -model.eval() -with torch.no_grad(): - correct = 0 - for batch_idx, (data, target) in enumerate(test_loader): - data, target = data.to(device), target.to(device) - - output = model(data).to(device) - - pred = output.argmax(dim=1, keepdim=True) - correct += pred.eq(target.view_as(pred)).sum().item() - - loss = loss_func(output, target) - epoch_loss.append(loss.item()) - - print("Performance on test data:\n\tAccuracy: {:.1f}%".format( - correct / len(test_loader) * 100)) - diff --git a/public/it4i/src/srun_karolina.pdf b/public/it4i/src/srun_karolina.pdf deleted file mode 100644 index ba7adcc86ae1a4b87b865652c4ebe390597ac767..0000000000000000000000000000000000000000 Binary files a/public/it4i/src/srun_karolina.pdf and /dev/null differ diff --git a/public/it4i/storage/.gitkeep b/public/it4i/storage/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/public/it4i/storage/img/file-storage-block4.png b/public/it4i/storage/img/file-storage-block4.png deleted file mode 100644 index d9d6b420a13e10460fa90067d5f7538558334be3..0000000000000000000000000000000000000000 Binary files a/public/it4i/storage/img/file-storage-block4.png and /dev/null differ diff --git a/public/it4i/storage/img/project-storage-overview2.png b/public/it4i/storage/img/project-storage-overview2.png deleted file mode 100644 index 1d249379e1983672ed45c8021e088a7ef82d54b3..0000000000000000000000000000000000000000 Binary files a/public/it4i/storage/img/project-storage-overview2.png and /dev/null differ diff --git a/public/it4i/storage/img/project-storage-overview3.png b/public/it4i/storage/img/project-storage-overview3.png deleted file mode 100644 index bf824318e994615d78c52a2a097131958edcaf44..0000000000000000000000000000000000000000 Binary files a/public/it4i/storage/img/project-storage-overview3.png and /dev/null differ