3
3
# E3SM Coupled Model Group run_e3sm script template.
4
4
#
5
5
# Bash coding style inspired by:
6
- # http://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming
7
-
8
- # TO DO:
9
- # - custom pelayout
6
+ # https://web.archive.org/web/20200620202413/http://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming
10
7
11
8
main () {
12
9
@@ -17,8 +14,9 @@ main() {
17
14
18
15
# Machine and project
19
16
readonly MACHINE=pm-cpu
20
- # BEFORE RUNNING: CHANGE this to your project
21
- readonly PROJECT=" e3sm"
17
+ # NOTE: The command below will return your default project on SLURM-based systems.
18
+ # If you are not using SLURM or need a different project, remove the command and set it directly
19
+ readonly PROJECT=" $( sacctmgr show user $USER format=DefaultAccount | tail -n1 | tr -d ' ' ) "
22
20
23
21
# Simulation
24
22
readonly COMPSET=" WCYCL1850"
@@ -46,8 +44,8 @@ readonly GET_REFCASE=TRUE
46
44
# readonly RUN_REFDATE="" # same as MODEL_START_DATE for 'branch', can be different for 'hybrid'
47
45
48
46
# Set paths
47
+ readonly CASE_ROOT=" ${PSCRATCH} /E3SMv3/${CASE_NAME} "
49
48
readonly CODE_ROOT=" ${HOME} /E3SMv3/code/${CHECKOUT} "
50
- readonly CASE_ROOT=" /pscratch/sd/r/${USER} /e3sm-scratch/${CASE_NAME} "
51
49
52
50
# Sub-directories
53
51
readonly CASE_BUILD_DIR=${CASE_ROOT} /build
@@ -56,6 +54,7 @@ readonly CASE_ARCHIVE_DIR=${CASE_ROOT}/archive
56
54
# Define type of run
57
55
# short tests: 'XS_2x5_ndays', 'XS_1x10_ndays', 'S_1x10_ndays',
58
56
# 'M_1x10_ndays', 'M2_1x10_ndays', 'M80_1x10_ndays', 'L_1x10_ndays'
57
+ # * can replace XS, M, etc. with custom-XY with XY being the node count
59
58
# or 'production' for full simulation
60
59
readonly run=' XS_2x5_ndays'
61
60
if [ " ${run} " != " production" ]; then
@@ -118,6 +117,9 @@ fetch_code
118
117
# Create case
119
118
create_newcase
120
119
120
+ # Custom PE layout
121
+ custom_pelayout
122
+
121
123
# Setup
122
124
case_setup
123
125
@@ -322,6 +324,14 @@ create_newcase() {
322
324
323
325
echo $' \n ----- Starting create_newcase -----\n '
324
326
327
+
328
+ if [[ ${PELAYOUT} == custom-* ]];
329
+ then
330
+ layout=" M" # temporary placeholder for create_newcase
331
+ else
332
+ layout=${PELAYOUT}
333
+ fi
334
+
325
335
if [[ -z " $CASE_GROUP " ]]; then
326
336
${CODE_ROOT} /cime/scripts/create_newcase \
327
337
--case ${CASE_NAME} \
@@ -333,7 +343,7 @@ create_newcase() {
333
343
--machine ${MACHINE} \
334
344
--project ${PROJECT} \
335
345
--walltime ${WALLTIME} \
336
- --pecount ${PELAYOUT }
346
+ --pecount ${layout }
337
347
else
338
348
${CODE_ROOT} /cime/scripts/create_newcase \
339
349
--case ${CASE_NAME} \
@@ -346,7 +356,7 @@ create_newcase() {
346
356
--machine ${MACHINE} \
347
357
--project ${PROJECT} \
348
358
--walltime ${WALLTIME} \
349
- --pecount ${PELAYOUT }
359
+ --pecount ${layout }
350
360
fi
351
361
352
362
@@ -398,6 +408,43 @@ case_setup() {
398
408
popd
399
409
}
400
410
411
+ # -----------------------------------------------------
412
+ custom_pelayout () {
413
+
414
+ if [[ ${PELAYOUT} == custom-* ]];
415
+ then
416
+ echo $' \n CUSTOMIZE PROCESSOR CONFIGURATION:'
417
+
418
+ # Number of cores per node (machine specific)
419
+ if [ " ${MACHINE} " == " pm-cpu" ]; then
420
+ ncore=128
421
+ elif [ " ${MACHINE} " == " chrysalis" ]; then
422
+ ncore=64
423
+ elif [ " ${MACHINE} " == " compy" ]; then
424
+ ncore=40
425
+ elif [ " ${MACHINE} " == " anvil" ]; then
426
+ ncore=36
427
+ else
428
+ echo ' ERROR: MACHINE = ' ${MACHINE} ' is not supported for custom PE layout.'
429
+ exit 400
430
+ fi
431
+
432
+ # Extract number of nodes
433
+ tmp=($( echo ${PELAYOUT} | tr " -" " " ) )
434
+ nnodes=${tmp[1]}
435
+
436
+ # Customize
437
+ pushd ${CASE_SCRIPTS_DIR}
438
+ ./xmlchange NTASKS=$(( $nnodes * $ncore ))
439
+ ./xmlchange NTHRDS=1
440
+ ./xmlchange MAX_MPITASKS_PER_NODE=$ncore
441
+ ./xmlchange MAX_TASKS_PER_NODE=$ncore
442
+ popd
443
+
444
+ fi
445
+
446
+ }
447
+
401
448
# -----------------------------------------------------
402
449
case_build () {
403
450
@@ -534,9 +581,10 @@ copy_script() {
534
581
535
582
local script_provenance_dir=${CASE_SCRIPTS_DIR} /run_script_provenance
536
583
mkdir -p ${script_provenance_dir}
537
- local this_script_name=` basename $0 `
584
+ local this_script_name=$( basename -- " $0 " ; )
585
+ local this_script_dir=$( dirname -- " $0 " ; )
538
586
local script_provenance_name=${this_script_name} .` date +%Y%m%d-%H%M%S`
539
- cp -vp ${ this_script_name} ${script_provenance_dir} /${script_provenance_name}
587
+ cp -vp " ${this_script_dir} / ${ this_script_name}" ${script_provenance_dir} /${script_provenance_name}
540
588
541
589
}
542
590
0 commit comments