Summary

Row

Summary

Usage Summary by QOS

Number of Jobs by QOS

Usage Summary by Department

Number of Jobs by Department

Usage Summary by College

Number of Jobs by College

Summary

Row

Total

Partition SU % Consumed Jobs Wait Run
Total 43080830 60.67 125552 411.20 335.49
general 34441888 61.60 91498 522.74 384.41
bigmem 165162 14.77 1920 403.93 98.66
gpu 8473780 60.62 32135 94.05 210.35

CPU vs GPU

Type SU % SU Jobs % Jobs Wait Run
cpu 34607050 80.33 93417 74.41 520.30 378.54
gpu 8473780 19.67 32135 25.59 94.05 210.35
Total 43080830 100.00 125552 100.00 411.20 335.49

Row

Serial Jobs

Partition SU Jobs % SU % Jobs Wait Run
Total 347402.60 38265 0.81 30.48 780.81 485.98
general 291190.81 32704 0.85 35.74 884.10 534.24
bigmem 0.21 378 0.00 19.69 647.70 0.02
gpu 56211.58 5183 0.66 16.13 138.77 216.91

SMP Jobs

Partition SU Jobs % SU % Jobs Wait Run
Total 16009143.4 80363 37.16 64.01 252.37 233.70
general 8540992.8 52433 24.80 57.31 333.05 250.53
bigmem 128215.2 1539 77.63 80.16 344.84 119.33
gpu 7339935.4 26391 86.62 82.13 86.68 206.92

DMP Jobs

Partition SU Jobs % SU % Jobs Wait Run
Total 26724283.95 6924 62.03 5.51 212.12 685.26
general 25609703.91 6361 74.36 6.95 228.45 717.58
bigmem 36946.56 3 22.37 0.16 0.42 1924.30
gpu 1077633.48 561 12.72 1.75 27.74 310.92

Row

Serial Jobs

Type SU % SU Jobs % Jobs Wait Run
cpu 291191.02 0.68 33082 26.35 881.40 528.13
gpu 56211.58 0.13 5183 4.13 138.77 216.91
Total 347402.60 0.81 38265 30.48 780.81 485.98

SMP Jobs

Type SU % SU Jobs % Jobs Wait Run
cpu 8669208 20.12 53972 42.99 333.39 246.79
gpu 7339935 17.04 26391 21.02 86.68 206.92
Total 16009143 37.16 80363 64.01 252.37 233.70

DMP Jobs

Type SU % SU Jobs % Jobs Wait Run
cpu 25646650 59.53 6363 5.07 228.37 718.27
gpu 1077633 2.50 561 0.45 27.74 310.92
Total 26724284 62.03 6924 5.51 212.12 685.26

Partition

Row

Summary

Partition SU % SU Jobs Wait Run
bigmem 165162.00 0.38 1920 403.93 98.66
debug 342.49 0.00 604 19.87 15.21
general 34366820.89 79.77 88936 535.06 393.43
general,gpu 0.00 0.00 1 0.32 0.00
gpu 8473780.44 19.67 32134 94.05 210.35
test 74724.18 0.17 1957 118.40 88.69
Total 43080830.00 100.00 125552 411.20 335.49

Serial Jobs

Partition SU Jobs Wait Run CPUs
bigmem 0.21 378 647.70 0.02 1
debug 89.44 452 23.51 11.92 1
general 290792.43 32062 901.35 544.19 1
gpu 56211.58 5183 138.77 216.91 1
test 308.94 190 21.04 97.58 1
Total 347402.60 38265 780.81 485.98 1

SMP Jobs

Partition SU Jobs Wait Run CPUs
bigmem 128215.23 1539 344.84 119.33 27
debug 253.05 151 9.12 25.14 4
general 8466363.60 50524 341.10 256.86 31
gpu 7339935.38 26391 86.68 206.92 22
test 74376.19 1758 129.50 88.01 26
Total 16009143.45 80363 252.37 233.70 28

DMP Jobs

Partition SU Jobs Wait Run CPUs
bigmem 36946.56 3 0.42 1924.30 256
debug 0.00 1 0.52 0.00 4
general 25609664.86 6350 228.83 718.78 332
general,gpu 0.00 1 0.32 0.00 1024
gpu 1077633.48 560 27.79 311.48 202
test 39.05 9 6.91 32.54 92
Total 26724283.95 6924 212.12 685.26 321

QOS

Row

Summary

QOS SU % SU Jobs Wait Run
debug 342.49 0.00 604 13.16 15.21
high 14825406.29 34.41 35446 150.07 224.26
low 21417895.51 49.72 61162 567.51 405.45
standard 6762461.55 15.70 26354 429.97 348.75
test 74724.16 0.17 1986 130.27 87.39
Total 43080830.00 100.00 125552 411.20 335.49

Serial Jobs

QOS SU Jobs Wait Run CPUs
debug 89.44 452 14.53 11.92 1
high 43587.54 6209 30.99 364.04 1
low 249715.02 26159 1125.69 544.49 1
standard 53701.66 5212 43.75 396.84 1
test 308.94 233 16.33 79.57 1
Total 347402.60 38265 780.81 485.98 1

SMP Jobs

QOS SU Jobs Wait Run CPUs
debug 253.05 151 9.12 25.14 4
high 2877753.52 26581 158.40 120.59 19
low 8896748.18 32066 154.95 272.77 30
standard 4160012.53 19817 547.30 336.57 37
test 74376.17 1748 145.79 88.52 26
Total 16009143.45 80363 252.37 233.70 28

DMP Jobs

QOS SU Jobs Wait Run CPUs
debug 0.00 1 0.52 0.00 4
high 11904065.23 2656 345.04 935.01 206
low 12271432.31 2937 100.31 615.69 420
standard 2548747.36 1325 194.41 341.73 333
test 39.05 5 11.85 58.58 58
Total 26724283.95 6924 212.12 685.26 321

Allocation

Row

Summary

CPU vs GPU

Row

Serial Jobs

SMP Jobs

DMP Jobs

Row

Standard

Low

High

User

Row

Summary

CPU vs GPU

Row

Serial

SMP

DMP

Row

Standard

Low

High

Summary

Row

Summary

Year Month SU %Consumed Jobs Wait Run
2024 Jan 5690432 47.05 2904 7.67 532.81
2024 Feb 7148647 63.18 7798 36.62 341.86
2024 Mar 8787280 72.66 26264 157.79 254.15
2024 Apr 7383422 63.08 61668 522.50 306.50
2024 May 6907264 57.11 16509 780.20 414.26
2024 Jun 7163786 61.21 10409 199.24 527.69

CPU vs GPU

Year Month Total CPU GPU %CPU %GPU
2024 Jan 5690432 5129779 560653.1 90.15 9.85
2024 Feb 7148647 5826382 1322264.7 81.50 18.50
2024 Mar 8787280 6508955 2278325.1 74.07 25.93
2024 Apr 7383422 5884845 1498576.7 79.70 20.30
2024 May 6907264 5688514 1218749.9 82.36 17.64
2024 Jun 7163786 5568575 1595210.9 77.73 22.27

Serial Jobs

Year Month SU Jobs % SU % Jobs Wait Run
2024 Jan 3922.82 846 0.07 29.13 2.57 93.76
2024 Feb 8767.83 3176 0.14 40.73 2.62 78.77
2024 Mar 22442.40 4595 0.31 17.50 159.02 209.02
2024 Apr 244330.01 25139 3.84 40.77 997.65 562.20
2024 May 44459.39 2483 0.73 15.04 1593.10 846.74
2024 Jun 23480.15 2026 0.38 19.46 49.78 528.33

SMP Jobs

Year Month SU Jobs % SU % Jobs Wait Run
2024 Jan 1003442 1782 18.87 61.36 10.49 487.52
2024 Feb 1921088 3862 30.66 49.53 46.73 395.05
2024 Mar 4461888 20168 61.60 76.79 149.13 247.82
2024 Apr 3597967 35391 56.59 57.39 192.25 111.73
2024 May 2657939 12979 43.63 78.62 665.38 304.40
2024 Jun 2366819 6181 38.80 59.38 264.45 563.54

DMP Jobs

Year Month SU Jobs % SU % Jobs Wait Run
2024 Jan 4683067 276 88.08 9.50 5.05 2171.06
2024 Feb 5218791 760 83.28 9.75 127.30 1171.00
2024 Mar 4302949 1501 59.40 5.72 270.32 477.45
2024 Apr 3541125 1138 55.70 1.85 296.69 715.40
2024 May 4204865 1047 69.03 6.34 275.79 750.48
2024 Jun 4773486 2202 78.25 21.15 153.69 426.45

Partition

Row

general

Year Month SU %Consumed Jobs Wait Run
2024 Jan 5129779 53.87 1214 16.20 784.26
2024 Feb 5824748 65.38 5777 47.27 306.40
2024 Mar 6435107 67.57 17678 157.02 280.86
2024 Apr 5805755 63.00 48713 627.95 358.79
2024 May 5678323 59.63 11413 1111.45 500.26
2024 Jun 5568176 60.42 6703 221.79 641.22

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 21.60 25 0.01 51.84 1
2024 Feb 1870.25 2882 1.21 38.94 1
2024 Mar 12788.99 2949 76.91 260.21 1
2024 Apr 231160.88 23691 1042.99 585.44 1
2024 May 30329.64 1820 2143.57 999.93 1
2024 Jun 15019.45 1337 54.20 674.03 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 467148.3 921 19.83 393.07 55
2024 Feb 889545.1 2185 79.11 358.52 59
2024 Mar 2187014.2 13390 160.35 261.47 52
2024 Apr 2124012.9 23914 232.15 117.08 18
2024 May 1626747.6 8621 985.51 360.73 25
2024 Jun 1246524.7 3402 316.58 758.36 30

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 4662609 268 5.20 2196.92 495
2024 Feb 4933332 710 136.23 1231.66 381
2024 Mar 4235304 1339 300.18 520.24 392
2024 Apr 3450582 1108 296.33 729.27 241
2024 May 4021246 972 295.88 802.15 222
2024 Jun 4306632 1964 171.67 415.97 355

Row

bigmem

Year Month SU %Consumed Jobs Wait Run
2024 Jan 0.00 0.00 0 0.00 0.00
2024 Feb 1634.74 0.92 16 0.04 61.85
2024 Mar 73847.77 38.77 549 348.43 114.60
2024 Apr 79089.54 42.91 1337 433.41 91.22
2024 May 10191.00 5.35 14 341.69 236.39
2024 Jun 398.95 0.22 4 0.01 62.82

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Feb 0.00 6 0.00 0.00 1
2024 Mar 0.00 72 128.05 0.00 1
2024 Apr 0.21 298 790.64 0.03 1
2024 May 0.00 2 0.41 0.00 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Feb 1634.74 10 0.06 98.97 62
2024 Mar 36901.21 475 383.30 120.30 26
2024 Apr 79089.33 1038 331.27 117.49 26
2024 May 10191.00 12 398.57 275.79 105
2024 Jun 398.95 4 0.01 62.82 34

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Mar 36946.56 2 0.20 2886.45 256
2024 Apr 0.00 1 0.88 0.00 256

Row

gpu

Year Month SU %Consumed Jobs Wait Run
2024 Jan 560653.1 23.55 1690 1.54 352.19
2024 Feb 1322264.7 59.37 2006 6.22 446.05
2024 Mar 2278325.1 95.70 8037 146.45 204.93
2024 Apr 1498576.7 65.04 11618 90.58 112.06
2024 May 1218749.9 51.19 5082 37.51 221.62
2024 Jun 1595210.9 69.24 3702 158.62 322.63

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 3901.22 821 2.65 95.04 1
2024 Feb 6897.58 288 16.74 479.01 1
2024 Mar 9653.41 1574 314.28 122.66 1
2024 Apr 13168.92 1150 117.22 229.03 1
2024 May 14129.75 661 82.25 427.53 1
2024 Jun 8460.70 689 41.21 245.60 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 536293.8 861 0.49 588.55 19
2024 Feb 1029908.3 1667 4.58 444.71 29
2024 Mar 2237972.6 6303 107.65 228.41 25
2024 Apr 1394864.3 10439 87.01 98.90 19
2024 May 1021000.8 4346 31.09 192.74 23
2024 Jun 1119895.5 2775 200.91 325.43 20

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 20458.04 8 0.00 1304.82 36
2024 Feb 285458.85 50 0.36 309.62 288
2024 Mar 30699.12 160 23.88 89.23 195
2024 Apr 90543.44 29 320.35 209.99 456
2024 May 183619.37 75 15.44 80.80 206
2024 Jun 466854.66 238 5.35 512.95 162

QOS

Row

Standard

Year Month SU Jobs Wait Run CPUs
2024 Jan 436665.6 1488 14.09 248.84 40
2024 Feb 1264151.7 2686 73.25 296.69 60
2024 Mar 2099113.4 10339 55.70 326.50 59
2024 Apr 1908988.1 6056 518.39 384.50 36
2024 May 623931.3 3401 2152.94 403.81 20
2024 Jun 429611.5 2384 31.99 396.88 28

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 2593.20 165 13.14 319.57 1
2024 Feb 5321.69 242 19.19 458.82 1
2024 Mar 14135.13 2045 60.41 313.98 1
2024 Apr 20203.16 1321 45.22 617.91 1
2024 May 3293.01 625 6.98 237.25 1
2024 Jun 8155.47 814 41.24 366.02 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 402896.8 1279 14.28 238.62 36
2024 Feb 637860.4 2155 63.67 266.08 44
2024 Mar 1404256.5 7768 40.87 335.10 50
2024 Apr 1088898.0 4523 671.01 305.78 29
2024 May 368215.1 2680 2722.38 444.85 17
2024 Jun 257885.8 1412 29.68 434.09 22

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 31175.55 44 12.00 280.52 301
2024 Feb 620969.68 289 189.96 389.14 223
2024 Mar 680721.72 526 256.52 248.22 427
2024 Apr 799886.91 212 210.53 609.70 395
2024 May 252423.21 96 227.28 342.47 227
2024 Jun 163570.29 158 4.95 223.34 214

Row

Low

Year Month SU Jobs Wait Run CPUs
2024 Jan 363248.7 1026 0.41 388.17 8
2024 Feb 1980875.8 1636 26.78 450.26 103
2024 Mar 4647391.8 9541 280.02 242.82 56
2024 Apr 3994239.1 34162 786.08 416.37 13
2024 May 4642719.2 9758 467.30 433.44 35
2024 Jun 5789420.9 5039 115.17 574.16 144

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 1329.62 681 0.01 39.05 1
2024 Feb 867.40 66 3.05 266.01 1
2024 Mar 1693.40 1162 438.97 31.91 1
2024 Apr 209039.83 22280 1121.52 557.19 1
2024 May 34810.50 1542 2557.11 1093.43 1
2024 Jun 1974.27 428 14.09 144.37 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 361919.0 345 1.20 1077.31 23
2024 Feb 846182.5 1386 13.51 461.02 37
2024 Mar 2564525.3 7876 267.67 255.55 40
2024 Apr 1792530.8 11538 150.19 130.10 26
2024 May 1671195.5 7695 73.80 272.21 25
2024 Jun 1660395.1 3226 167.56 659.57 29

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Feb 1133826 184 135.18 435.25 634
2024 Mar 2081173 503 106.28 530.80 437
2024 Apr 1992668 344 388.31 897.59 360
2024 May 2936713 521 93.96 861.42 279
2024 Jun 4127052 1385 24.37 508.04 454

Row

High

Year Month SU Jobs Wait Run CPUs
2024 Jan 4890517.6 390 2.25 1996.82 342
2024 Feb 3900969.1 3404 6.25 331.91 39
2024 Mar 2033363.7 6263 143.10 154.96 44
2024 Apr 1422444.8 19538 102.13 112.83 14
2024 May 1633469.9 3141 317.80 386.84 45
2024 Jun 944641.3 2710 519.30 609.04 39

Serial Jobs

Year Month SU Jobs Wait Run CPUs
2024 Feb 2578.74 2863 1.20 42.47 1
2024 Mar 6598.37 1325 73.26 211.57 1
2024 Apr 14764.47 1268 22.19 696.59 1
2024 May 6331.69 177 46.60 1506.50 1
2024 Jun 13314.27 576 96.40 1230.02 1

SMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 238626.2 158 0.07 1214.48 86
2024 Feb 434394.9 254 3.33 1223.73 100
2024 Mar 485750.0 4472 130.12 83.05 37
2024 Apr 659110.6 17688 102.21 53.44 11
2024 May 611409.4 2534 304.65 254.28 30
2024 Jun 448462.5 1475 710.42 502.97 22

DMP Jobs

Year Month SU Jobs Wait Run CPUs
2024 Jan 4651891.4 232 3.73 2529.61 516
2024 Feb 3463995.4 287 59.14 2430.01 360
2024 Mar 1541015.3 466 466.32 684.13 242
2024 Apr 748569.7 582 273.91 646.22 125
2024 May 1015728.8 430 506.93 707.15 150
2024 Jun 482864.5 659 461.14 303.68 112

Allocation

Row

Summary

Partition

QOS

User

Row

Summary

Partition

QOS

---
title: "CY 2024 Report"
output:
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: scroll
    source: embed
    smart: false
    theme: lumen
    navbar: 
      - { title: "NJIT HPC", href: "https://hpc.njit.edu"}
      - { title: "Daily Monitoring", href: "https://web.njit.edu/~abp/load.html"}
---

```{r setup, include=F}
library(flexdashboard)
library(tidyverse)
library(lubridate)
library(reshape2)
library(stringr)
library(plotly)
library(knitr)
library(DT)
options(DT.options = list(dom = 'ltip', pageLength = 25, lengthMenu = c(10, 25, 50, 75, 100), autoWidth = TRUE) )
library(kableExtra)
options(knitr.table.format = "html")
source("./ayfuncs.R")

```

Summary 
================================

```{r annual-setup,echo=F}
jobsthisay2024 <- read_delim('jobsalloc.csv.gz',delim=";") %>% filter(End >= as.Date("2024-01-01") & End < as.Date("2025-01-01"))
jobsthismonth <- read_delim('jobs-0.csv',delim=";")#, col_select=c(JobID:End)) 
day_of_month <- mday(today())
if ( day_of_month > 1 ){
  jobsthisay <- rbind(jobsthisay2024,jobsthismonth) %>%
     separate(Account, c("Account", "year1", "year2") , sep="_", fill = "right") %>%
     select(-c("year1","year2")) %>%
     mutate(Account = gsub("^([0-9]{4}-(spring|summer|fall)-[a-z]+-\\d+-[a-z0-9]+)-[a-z0-9]+$", "\\1", Account))
} else {
  jobsthisay <- jobsthisay2024 %>%
     mutate(Account = gsub("^([0-9]{4}-(spring|summer|fall)-[a-z]+-\\d+-[a-z0-9]+)-[a-z0-9]+$", "\\1", Account))
}
#	rbind(jobsthisay2021,jobsthisay2122) %>% filter(End >= as.Date("2021-01-01") & End < as.Date("2022-01-01"))

dayspermonth = c(31,29,31,30,31,30,31,31,30,31,30,31)
general <- rep(100,12)*128*dayspermonth*24
bigmem <- rep(2,12)*128*dayspermonth*24
gpusu <- rep(25,12)*128*dayspermonth*24
cy2024su <- general + bigmem + gpusu
if ( Sys.Date() > as.Date("2024-12-31")){
  currmonth <- length(seq(from=as.Date("2024-01-01"), to=as.Date("2024-12-31"), by='month'))
} else {
  if ( day_of_month > 1 ){
    currmonth <- length(seq(from=as.Date("2024-01-01"), to=Sys.Date(), by='month'))
  } else {
    currmonth <- length(seq(from=as.Date("2024-01-01"), to=Sys.Date()-1, by='month'))
  }
}
jobsthisay %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>% 
  group_by(Year,Month) %>% 
  select(c(Month,Start,Submit,End,NCPUS))  %>% 
  summarize( 
    Total_SU=round(sum(as.numeric(difftime(End,Start,units="hours"))*NCPUS),2), 
    Total_Jobs=n() 
  ) -> percent
jobsthisay_trim <- jobsthisay %>%
  mutate(
    QOS = gsub("high_[a-z0-9]+", "high", QOS),
    Account = gsub("qm32","jyoung", Account)
    )
pis <- read_delim('pi.txt',delim="|") 
users <- read_delim('users.txt', delim="|") %>% select(c(Account:Name))
pi_users <- full_join(pis,users)
pi_users_alloc <- pi_users %>% group_by(Account) %>% summarize(Users=n_distinct(User))
pi_users_dept <- pi_users %>% group_by(Department) %>% summarize(PIs=n_distinct(Account),Users=n_distinct(User))
pi_users_college <- pi_users %>% group_by(College) %>% summarize(PIs=n_distinct(Account),Users=n_distinct(User))
```


Row {.tabset data-height=1200}
---------------------------------

### Summary

```{r alloc-summary,echo=F}
jobsthisay_trim %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% summary -> Timing_Total

full_join(full_join(pis,Timing_Part),pi_users_alloc) %>% drop_na -> Timing_Part
Timing_Total %>% mutate(Account="Total",'PI Name'="Wulver Cluster",Department="Research Computing",College="NJIT",Users=sum(Timing_Part$Users)) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
#Timing[is.na(Timing)] <- "Total"

Timing %>% select(c(Account,'PI Name', Department, College, Users, SU:CPUs)) %>% 
  datatable(rownames = FALSE,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(5, 'desc'))))
```

### Usage Summary by QOS

```{r alloc-usage-summary-qos,echo=F}
jobsthisay_trim %>% group_by(Account,QOS) %>% filter(str_detect(QOS,"standard")) %>% summary  -> std
jobsthisay_trim %>% group_by(Account,QOS) %>% filter(str_detect(QOS,"low")) %>% summary -> low
jobsthisay_trim %>% group_by(Account,QOS) %>% filter(str_detect(QOS,"high")) %>% summary -> high
  #mutate(QOS = gsub("high_[a-z0-9]+", "high", QOS)) %>%
jobsthisay_trim %>% group_by(Account,QOS) %>% filter(str_detect(QOS,"debug")) %>% summary -> debug
usage_summary <- full_join(full_join(full_join(high,std),low),debug) %>% select(c(Account,QOS,SU)) %>% pivot_wider(names_from = QOS, values_from = SU)
usage_summary[is.na(usage_summary)] <- 0
full_join(full_join(pis,usage_summary),pi_users_alloc) %>% drop_na() %>%
  mutate(Total=round(high+low+standard+debug,2)) %>% select(c(Account:College,Users,Total,Standard=standard,Low=low,High=high,Debug=debug)) %>%
  datatable(rownames = FALSE,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(5, 'desc'))))
```

### Number of Jobs by QOS

```{r alloc-jobs-summary-qos,echo=F}
usage_summary <- full_join(full_join(full_join(high,std),low),debug) %>% select(c(Account,QOS,Jobs)) %>% pivot_wider(names_from = QOS, values_from = Jobs)
usage_summary[is.na(usage_summary)] <- 0
full_join(full_join(pis,usage_summary),pi_users_alloc) %>% drop_na() %>%
  mutate(Total=round(high+low+standard+debug,2)) %>% select(c(Account:College,Users,Total,Standard=standard,Low=low,High=high,Debug=debug)) %>%
  datatable(rownames = FALSE,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(5, 'desc'))))
```


### Usage Summary by Department

```{r alloc-summary-su-department,echo=F}
jobsthisay_trim %>% group_by(Account,QOS) %>% summary %>%
   select(c(Account,QOS,SU,Jobs)) %>% pivot_wider(names_from = QOS, values_from = c(SU,Jobs)) %>% select(-c(SU_test,Jobs_test)) -> Timing_Part
Timing_Part[is.na(Timing_Part)] <- 0
jobsthisay_trim %>% summary -> Timing_Total

full_join(pis,Timing_Part) %>% drop_na %>%
  mutate(SU=round(SU_standard+SU_low+SU_debug+SU_high,2),Jobs=Jobs_standard+Jobs_low+Jobs_debug+Jobs_high) -> Timing

Timing %>% group_by(Department) %>% summarize(PIs=n(),
  SU=round(sum(SU),2),
  Standard=round(sum(SU_standard),2),
  Low=round(sum(SU_low),2),
  High=round(sum(SU_high),2),
  Debug=round(sum(SU_debug),2)
  ) %>%
  full_join(pi_users_dept) %>% drop_na() %>% select(c(Department,PIs,Users,SU:Debug)) %>%
  datatable(rownames = FALSE, ,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(3, 'desc'))))
```


### Number of Jobs by Department

```{r alloc-summary-jobs-department,echo=F}
Timing %>% group_by(Department) %>% summarize(PIs=n(),
  Jobs=sum(Jobs),
  Standard=sum(Jobs_standard),
  Low=sum(Jobs_low),
  High=sum(Jobs_high),
  Debug=sum(Jobs_debug)
  ) %>%
  full_join(pi_users_dept) %>% drop_na() %>% select(c(Department,PIs,Users,Jobs:Debug)) %>%
  datatable(rownames = FALSE, ,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(3, 'desc'))))
```

### Usage Summary by College

```{r alloc-summary-su-college,echo=F}
Timing %>% group_by(College) %>% summarize(PIs=n(),
  SU=round(sum(SU),2),
  Standard=round(sum(SU_standard),2),
  Low=round(sum(SU_low),2),
  High=round(sum(SU_high),2),
  Debug=round(sum(SU_debug),2)
  ) %>%
  full_join(pi_users_college) %>% drop_na() %>% select(c(College,PIs,Users,SU:Debug)) %>%
  datatable(rownames = FALSE,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(3, 'desc'))))
```

### Number of Jobs by College

```{r alloc-summary-jobs-college,echo=F}
Timing %>% group_by(College) %>% summarize(PIs=n(),
  Jobs=sum(Jobs),
  Standard=sum(Jobs_standard),
  Low=sum(Jobs_low),
  High=sum(Jobs_high),
  Debug=sum(Jobs_debug)
  ) %>%
  full_join(pi_users_college) %>% drop_na() %>% select(c(College,PIs,Users,Jobs:Debug)) %>%
  datatable(rownames = FALSE,options = list(autoWidth = FALSE,pageLength = 100,order = list(list(3, 'desc'))))
```

Summary {data-navmenu="Annual Report"}
==============================

Row
-------------------------------------



```{r annualsummary}
jobsthisay_trim %>% summary %>% 
   mutate(Partition="Total",Used=round(SU/sum(cy2024su[1:currmonth])*100,2)) %>%
   select(c(Partition,SU,'% Consumed'=Used,Jobs,Wait,Run)) -> Total_SU_Jobs
jobsthisay_trim %>% serial_filter %>% summary %>% 
  mutate(Partition="Total",
         SUper = round(SU/Total_SU_Jobs$SU*100,2), 
         Jobsper = round(Jobs/Total_SU_Jobs$Jobs*100,2)) %>%
  select(c(Partition,SU,Jobs,'% SU'=SUper,'% Jobs'=Jobsper,Wait,Run)) -> serialtotal
jobsthisay_trim %>% smp_filter %>% summary %>% 
  mutate(Partition="Total",
         SUper = round(SU/Total_SU_Jobs$SU*100,2), 
         Jobsper = round(Jobs/Total_SU_Jobs$Jobs*100,2)) %>%
  select(c(Partition,SU,Jobs,'% SU'=SUper,'% Jobs'=Jobsper,Wait,Run)) -> smptotal
jobsthisay_trim %>% dmp_filter %>% summary %>% 
  mutate(Partition="Total",
         SUper = round(SU/Total_SU_Jobs$SU*100,2), 
         Jobsper = round(Jobs/Total_SU_Jobs$Jobs*100,2)) %>%
  select(c(Partition,SU,Jobs,'% SU'=SUper,'% Jobs'=Jobsper,Wait,Run)) -> dmptotal
```

### Total

```{r annualsummary-total}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% summary %>% partfilter('general',general) -> generaltotal
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% summary %>% partfilter('bigmem',bigmem) -> bigmemtotal
jobsthisay_trim %>% filter(str_detect(Partition,'gpu')) %>% summary %>% partfilter('gpu',gpusu) -> gputotal
rbind(Total_SU_Jobs,generaltotal,bigmemtotal,gputotal) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### CPU vs GPU

```{r annualcpuvgpu-summary,echo=F}
jobsthisay_trim %>% summary -> Timing_Total
jobsthisay_trim %>% filter(!str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="cpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> cpu
jobsthisay_trim %>% filter(str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="gpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> gpu
jobsthisay_trim %>% summary %>% 
   mutate(Type="Total","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> total
full_join(full_join(cpu,gpu),total) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


Row
-----------------------
### Serial Jobs

```{r annualsummary-serial}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% 
  serial_filter %>% summary %>% parttotalfilter('general',generaltotal) -> general_serial
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% 
  serial_filter %>% summary %>% parttotalfilter('bigmem',bigmemtotal) -> bigmem_serial
jobsthisay_trim %>% filter(str_detect(Partition,'gpu')) %>% 
  serial_filter %>% summary %>% parttotalfilter('gpu',gputotal) -> gpu_serial
rbind(serialtotal,general_serial,bigmem_serial,gpu_serial) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r annualsummary-smp}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% 
  smp_filter %>% summary %>% parttotalfilter('general',generaltotal) -> general_smp
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% 
  smp_filter %>% summary %>% parttotalfilter('bigmem',bigmemtotal) -> bigmem_smp
jobsthisay_trim %>% filter(str_detect(Partition,'gpu')) %>% 
  smp_filter %>% summary %>% parttotalfilter('gpu',gputotal) -> gpu_smp
rbind(smptotal,general_smp,bigmem_smp,gpu_smp) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r annualsummary-dmp}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% 
  dmp_filter %>% summary %>% parttotalfilter('general',generaltotal) -> general_dmp
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% 
  dmp_filter %>% summary %>% parttotalfilter('bigmem',bigmemtotal) -> bigmem_dmp
jobsthisay_trim %>% filter(str_detect(Partition,'gpu')) %>% 
  dmp_filter %>% summary %>% parttotalfilter('gpu',gputotal) -> gpu_dmp
rbind(dmptotal,general_dmp,bigmem_dmp,gpu_dmp) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


Row
--------------------------------------------------

### Serial Jobs

```{r annualcpuvgpu-serial,echo=F}
jobsthisay_trim %>% serial_filter %>% filter(!str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="cpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> cpu
jobsthisay_trim %>% serial_filter %>% filter(str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="gpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> gpu
jobsthisay_trim %>% serial_filter %>% summary %>% 
   mutate(Type="Total","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> total
full_join(full_join(cpu,gpu),total) %>%
   kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r annualcpuvgpu-smp,echo=F}
jobsthisay_trim %>% smp_filter %>% filter(!str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="cpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> cpu
jobsthisay_trim %>% smp_filter %>% filter(str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="gpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> gpu
jobsthisay_trim %>% smp_filter %>% summary %>% 
   mutate(Type="Total","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> total
full_join(full_join(cpu,gpu),total) %>%
   kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r annualcpuvgpu-dmp,echo=F}
jobsthisay_trim %>% dmp_filter %>% filter(!str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="cpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> cpu
jobsthisay_trim %>% dmp_filter %>% filter(str_detect(Partition,"gpu")) %>% summary %>% 
   mutate(Type="gpu","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> gpu
jobsthisay_trim %>% dmp_filter %>% summary %>% 
   mutate(Type="Total","% SU"=round(SU/Timing_Total$SU*100,2),"% Jobs"=round(Jobs/Timing_Total$Jobs*100,2)) %>% 
   select(c("Type","SU","% SU","Jobs","% Jobs","Wait","Run")) -> total
full_join(full_join(cpu,gpu),total) %>%
   kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

Partition {data-navmenu="Annual Report"}
==============================


Row
---------------------------------

### Summary

```{r annualpart-summary,echo=F}
jobsthisay_trim %>% group_by(Partition) %>% summary -> Timing_Part
jobsthisay_trim %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) %>% mutate('% SU' = round(SU/Timing_Total$SU*100,2)) %>% select(c('Partition','SU','% SU','Jobs', 'Wait', 'Run')) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


### Serial Jobs

```{r annualpart-serial,echo=F}
jobsthisay_trim %>% serial_filter %>% group_by(Partition) %>% summary  -> Timing_Part
jobsthisay_trim %>% serial_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r annualpart-smp,echo=F}
jobsthisay_trim %>% smp_filter %>% group_by(Partition) %>% summary  -> Timing_Part
jobsthisay_trim %>% smp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r annualpart-dmp,echo=F}
jobsthisay_trim %>% dmp_filter %>% group_by(Partition) %>% summary  -> Timing_Part
jobsthisay_trim %>% dmp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


QOS {data-navmenu="Annual Report"}
==============================


Row
---------------------------------

### Summary

```{r annualqos-summary,echo=F}
jobsthisay_trim %>% group_by(QOS) %>% summary -> Timing_Part
jobsthisay_trim %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) %>% mutate('% SU' = round(SU/Timing_Total$SU*100,2)) %>% select(c('QOS','SU','% SU','Jobs', 'Wait', 'Run')) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


### Serial Jobs

```{r annualqos-serial,echo=F}
jobsthisay_trim %>% serial_filter %>% group_by(QOS) %>% summary  -> Timing_Part
jobsthisay_trim %>% serial_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r annualqos-smp,echo=F}
jobsthisay_trim %>% smp_filter %>% group_by(QOS) %>% summary  -> Timing_Part
jobsthisay_trim %>% smp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r annualqos-dmp,echo=F}
jobsthisay_trim %>% dmp_filter %>% group_by(QOS) %>% summary  -> Timing_Part
jobsthisay_trim %>% dmp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


Allocation {data-navmenu="Annual Report"}
==============================

Row
---------------------------------

### Summary

```{r annualalloc-summary,echo=F}
jobsthisay_trim %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table
```

### CPU vs GPU

```{r annualalloc-type,echo=F}
#jobsthisay_trim %>% cpu_gpu_total(Account) -> total
#jobsthisay_trim %>% cpu_total(Account) -> cpu
#jobsthisay_trim %>% gpu_total(Account) -> gpu
jobsthisay_trim %>% group_by(Account) %>% summary %>% select(c(Account,Total=SU)) -> total
jobsthisay_trim %>% filter(!str_detect(Partition,"gpu")) %>% group_by(Account) %>% summary %>% select(c(Account,CPU=SU)) -> cpu
jobsthisay_trim %>% filter(str_detect(Partition,"gpu")) %>% group_by(Account) %>% summary %>% select(c(Account,GPU=SU))  -> gpu
full_join(total,full_join(cpu,gpu)) -> usage1920
usage1920[is.na(usage1920)] <- 0
usage1920 %>% mutate('%CPU'=round(CPU/Total*100,2), '%GPU'=round(GPU/Total*100,2)) %>% my_table
```

Row
----------------------------------


### Serial Jobs

```{r annualalloc-serial,echo=F}
jobsthisay_trim %>% serial_filter %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% serial_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### SMP Jobs

```{r annualalloc-smp,echo=F}
jobsthisay_trim %>% smp_filter %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% smp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table
```

### DMP Jobs

```{r annualalloc-dmp,echo=F}
jobsthisay_trim %>% dmp_filter %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% dmp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

Row
------------------------------

### Standard

```{r annualalloc-std,echo=F}
jobsthisay_trim %>% filter(str_detect(QOS,'standard')) %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'standard')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### Low

```{r annualalloc-low,echo=F}
jobsthisay_trim %>% filter(str_detect(QOS,'low')) %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'low')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### High

```{r annualalloc-high,echo=F}
jobsthisay_trim %>% filter(str_detect(QOS,'high')) %>% group_by(Account) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'high')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

User {data-navmenu="Annual Report"}
==============================

Row
---------------------------------

### Summary

```{r annualuser-summary}
jobsthisay_trim %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table
```

### CPU vs GPU

```{r annualuser-type,echo=F}
#jobsthisay_trim %>% cpu_gpu_total(User) -> total
#jobsthisay_trim %>% cpu_total(User) -> cpu
#jobsthisay_trim %>% gpu_total(User) -> gpu
jobsthisay_trim %>% group_by(User) %>% summary %>% select(c(User,Total=SU)) -> total
jobsthisay_trim %>% filter(!str_detect(Partition,"gpu")) %>% group_by(User) %>% summary %>% select(c(User,CPU=SU)) -> cpu
jobsthisay_trim %>% filter(str_detect(Partition,"gpu")) %>% group_by(User) %>% summary %>% select(c(User,GPU=SU))  -> gpu
full_join(total,full_join(cpu,gpu)) -> usage1920
usage1920[is.na(usage1920)] <- 0
usage1920 %>% mutate('%CPU'=round(CPU/Total*100,2), '%GPU'=round(GPU/Total*100,2)) %>% my_table
```

Row
--------------------------------------

### Serial

```{r annualuser-serial}
jobsthisay_trim %>% serial_filter %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% serial_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### SMP

```{r annualuser-smp}
jobsthisay_trim %>% smp_filter %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% smp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table
```

### DMP

```{r annualuser-dmp}
jobsthisay_trim %>% dmp_filter %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% dmp_filter %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table
```

Row
----------------------------------

### Standard

```{r annualuser-std}
jobsthisay_trim %>% filter(str_detect(QOS,'standard')) %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'standard')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### Low

```{r annualuser-low}
jobsthisay_trim %>% filter(str_detect(QOS,'low')) %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'low')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```

### High

```{r annualuser-high}
jobsthisay_trim %>% filter(str_detect(QOS,'high')) %>% group_by(User) %>% summary  -> Timing_Part
jobsthisay_trim %>% filter(str_detect(QOS,'high')) %>% summary -> Timing_Total

full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% my_table 
```





Summary {data-navmenu="Monthly Reports"}
=========================================

Row 
------------------------------------

### Summary

```{r monthly-setup,echo=F}
jobsthisay %>% monthly_summary %>% partpercent(cy2024su[1:currmonth]) -> total
jobsthisay %>% serial_filter %>% monthly_summary -> serial
jobsthisay %>% smp_filter %>% monthly_summary -> smp
jobsthisay %>% dmp_filter %>% monthly_summary -> dmp

getpercent(serial,percent) -> serialpercent
getpercent(smp,percent) -> smppercent
getpercent(dmp,percent) -> dmppercent

#cbind(total,serialpercent,smppercent,dmppercent)  %>% select(-c(Year1,Month1,Year2,Month2,Year3,Month3)) -> jobtotal
#colnames(jobtotal) <- c("Year","Month","SU","Jobs","Wait","Run","SU","Jobs","% SU","%Jobs","Wait","Run","SU","Jobs","% SU","%Jobs","Wait","Run","SU","Jobs","% SU","%Jobs","Wait","Run")
#jobtotal %>% 
#  kable() %>%
#  kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive")) %>%
#  add_header_above(c(" " = 2, "Total" = 4, "Serial" = 6, "SMP" = 6, "DMP" = 6))
```


```{r monthly-summary}
total %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### CPU vs GPU

```{r monthly-summarytype, echo=F}
#jobsthisay %>% cpu_gpu_monthly -> total
#jobsthisay %>% cpu_monthly -> cpu
#jobsthisay %>% gpu_monthly -> gpu
jobsthisay_trim %>% monthly_summary %>% select(c(Year,Month,Total=SU)) -> total
jobsthisay_trim %>% filter(!str_detect(Partition,"gpu")) %>% monthly_summary %>% select(c(Year,Month,CPU=SU)) -> cpu
jobsthisay_trim %>% filter(str_detect(Partition,"gpu")) %>% monthly_summary %>% select(c(Year,Month,GPU=SU)) -> gpu 
full_join(total,full_join(cpu,gpu)) %>% mutate('%CPU'=round(CPU/Total*100,2), '%GPU'=round(GPU/Total*100,2)) -> usage1920
usage1920 %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### Serial Jobs

```{r monthly-serial}
serialpercent %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r monthly-smp}
smppercent %>% 
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r monthly-dmp}
dmppercent %>% 
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```


Partition {data-navmenu="Monthly Reports"}
===============================================

Row 
------------------------------------------

### general

```{r monthlypart-general}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% monthly_summary %>% partpercent(general[1:currmonth]) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### Serial Jobs

```{r monthlypart-general-serial}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% serial_filter %>% monthly_summary %>% 
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r monthly-part-general-smp}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r monthlypart-general-dmp}
jobsthisay_trim %>% filter(str_detect(Partition,'general') | str_detect(Partition,'test') | str_detect(Partition,'debug')) %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

Row 
------------------------------------------

### bigmem

```{r monthlypart-bigmem}
temp <- jobsthisay_trim %>% filter(str_detect(Partition,'general')) %>% monthly_summary %>% select(c("Year","Month"))
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% monthly_summary -> month_bigmem
temp1 <- full_join(temp,month_bigmem)
temp1[is.na(temp1)] <- 0
bind_cols(temp1,as.tibble(bigmem[1:currmonth]))  %>%
  mutate(Used=round(SU/value*100,2)) %>%
  select(c(Year,Month,SU,'%Consumed'=Used,Jobs,Wait,Run)) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### Serial Jobs

```{r monthlypart-bigmem-serial}
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% serial_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r monthlypart-bigmem-smp}
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r monthlypart-bigmem-dmp}
jobsthisay_trim %>% filter(str_detect(Partition,'bigmem')) %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

Row 
------------------------------------------

### gpu

```{r monthlypart-gpu}
jobsthisay_trim %>% filter(str_detect(Partition,'gpu')) %>% monthly_summary %>% partpercent(gpusu[1:currmonth]) %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### Serial Jobs

```{r monthlypart-gpu-serial}
jobsthisay_trim %>% filter(Partition=="gpu") %>% serial_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs

```{r monthlypart-gpu-smp}
jobsthisay_trim %>% filter(Partition=="gpu") %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs

```{r monthlypart-gpu-dmp}
jobsthisay_trim %>% filter(Partition=="gpu") %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

QOS {data-navmenu="Monthly Reports"}
======================================

Row
-------------------------------

### Standard

```{r monthly-qos-summary-std, echo=F}
#listqos <- jobsthisay_trim %>% select(QOS) %>% unique()
#for ( qos in listqos$QOS ) {
  jobsthisay_trim %>% filter(str_detect(QOS,"standard")) %>% monthly_summary %>%
     kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
#  print("<br />")
#}
```

### Serial Jobs

```{r monthly-qos-summary-std-serial}
jobsthisay_trim %>% filter(str_detect(QOS,"standard")) %>% serial_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs


```{r monthly-qos-summary-std-smp}
jobsthisay_trim %>% filter(str_detect(QOS,"standard")) %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs


```{r monthly-qos-summary-std-dmp}
jobsthisay_trim %>% filter(str_detect(QOS,"standard")) %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

Row
----------------------------
### Low

```{r monthly-qos-summary-low, echo=F}
#listqos <- jobsthisay_trim %>% select(QOS) %>% unique()
#for ( qos in listqos$QOS ) {
  jobsthisay_trim %>% filter(str_detect(QOS,"low")) %>% monthly_summary %>%
     kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
#  print("<br />")
#}
```

### Serial Jobs

```{r monthly-qos-summary-low-serial}
jobsthisay_trim %>% filter(str_detect(QOS,"low")) %>% serial_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs


```{r monthly-qos-summary-low-smp}
jobsthisay_trim %>% filter(str_detect(QOS,"low")) %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs


```{r monthly-qos-summary-low-dmp}
jobsthisay_trim %>% filter(str_detect(QOS,"low")) %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

Row
----------------------------

### High

```{r monthly-qos-summary-high, echo=F}
#listqos <- jobsthisay_trim %>% select(QOS) %>% unique()
#for ( qos in listqos$QOS ) {
  jobsthisay_trim %>% filter(str_detect(QOS,"high")) %>% monthly_summary %>%
     kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
#  print("<br />")
#}
```

### Serial Jobs

```{r monthly-qos-summary-high-serial}
jobsthisay_trim %>% filter(str_detect(QOS,"high")) %>% serial_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### SMP Jobs


```{r monthly-qos-summary-high-smp}
jobsthisay_trim %>% filter(str_detect(QOS,"high")) %>% smp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```

### DMP Jobs


```{r monthly-qos-summary-high-dmp}
jobsthisay_trim %>% filter(str_detect(QOS,"high")) %>% dmp_filter %>% monthly_summary %>%
  kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed", "responsive") )
```





Allocation {data-navmenu="Monthly Reports"}
==========================================

Row {.tabset data-height=1200}
---------------------------------

<!--
### List of PIs

```{r monthlyalloc-list,echo=F}
jobsthisay_trim$Account %>% unique %>% sort %>% matrix(ncol = 1) %>% 
  kable() %>% kable_styling(bootstrap_options = "striped", full_width = F)
```
-->

### Summary

```{r monthlyalloc-summary,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,Account) %>%
  summary %>%
  my_longtable
```

### Partition

```{r monthlyalloc-part,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,Account,Partition) %>%
  summary %>%
  my_longtable
```

### QOS

```{r monthlyalloc-qos,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,Account,QOS) %>%
  summary %>%
  my_longtable
```

User {data-navmenu="Monthly Reports"}
==========================================

Row {.tabset data-height=1200}
---------------------------------

<!--
### List of Users

```{r monthlyuser-list,echo=F}
jobsthisay_trim$User %>% unique %>% sort %>% matrix(ncol = 1) %>% 
  kable() %>% kable_styling(bootstrap_options = "striped")
```
-->

### Summary

```{r monthlyuser-summary,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,User,Account) %>%
  summary %>%
  my_longtable
```

### Partition

```{r monthlyuser-part,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,User,Account,Partition) %>%
  summary %>%
  my_longtable
```

### QOS

```{r monthlyuser-qos,echo=F}
jobsthisay_trim %>% 
  mutate(Year=year(End),Month=month(End,label=TRUE)) %>%
  group_by(Year,Month,User,Account,QOS) %>%
  summary %>%
  my_longtable
```