1function [simElem, simDoc] = saveRegions(self, simElem, simDoc)
2% [SIMELEM, SIMDOC] = SAVEREGIONS(SIMELEM, SIMDOC)
4% Copyright (c) 2012-2026, Imperial College London
9% <blockingRegion name=
"FCRegion1" type=
"default">
10% <regionNode nodeName=
"Queue 1"/>
11% <regionNode nodeName=
"Queue 2"/>
12% <globalConstraint maxJobs=
"2"/>
13% <globalMemoryConstraint maxMemory=
"-1"/>
14% <classConstraint jobClass=
"Class1" maxJobsPerClass=
"-1"/>
15% <classMemoryConstraint jobClass=
"Class1" maxMemoryPerClass=
"-1"/>
16% <dropRules dropThisClass=
"false" jobClass=
"Class1"/>
17% <classWeight jobClass=
"Class1" weight=
"1"/>
18% <classSize jobClass=
"Class1" size=
"1"/>
21% First, create implicit FCR regions
for LPS queues
22% LPS uses FCR to limit concurrent jobs at PS station
23lpsRegionIdx = length(self.model.regions); % Start numbering after
explicit regions
26 if sn.sched(ist) == SchedStrategy.LPS
27 lpsRegionIdx = lpsRegionIdx + 1;
28 lpsLimit = sn.schedparam(ist, 1); % LPS limit stored in first column
29 ind = sn.stationToNode(ist);
30 nodeName = sn.nodenames{ind};
32 blockingRegion = simDoc.createElement(
'blockingRegion');
33 blockingRegion.setAttribute(
'name', [
'LPSRegion', num2str(lpsRegionIdx)]);
34 blockingRegion.setAttribute(
'type',
'default');
36 regionNode = simDoc.createElement(
'regionNode');
37 regionNode.setAttribute(
'nodeName', nodeName);
38 blockingRegion.appendChild(regionNode);
40 globalConstraint = simDoc.createElement(
'globalConstraint');
41 globalConstraint.setAttribute(
'maxJobs', num2str(lpsLimit));
42 blockingRegion.appendChild(globalConstraint);
44 globalMemoryConstraint = simDoc.createElement(
'globalMemoryConstraint');
45 globalMemoryConstraint.setAttribute(
'maxMemory',
'-1');
46 blockingRegion.appendChild(globalMemoryConstraint);
49 % Skip closed
classes with 0 customers (JMT cannot handle these)
50 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
54 % dropRules - LPS uses blocking (waitq), not drop
55 dropRuleElem = simDoc.createElement(
'dropRules');
56 dropRuleElem.setAttribute(
'jobClass', sn.classnames{c});
57 dropRuleElem.setAttribute(
'dropThisClass',
'false');
58 blockingRegion.appendChild(dropRuleElem);
61 simElem.appendChild(blockingRegion);
65% Now save
explicit user-defined regions
66% JMT XML schema
requires elements in specific order:
67% regionNode*, globalConstraint, globalMemoryConstraint,
68% classConstraint*, classMemoryConstraint*, dropRules*, classWeight*, classSize*, classSoftDeadline*
69for r=1:length(self.model.regions)
70 blockingRegion = simDoc.createElement('blockingRegion');
71 blockingRegion.setAttribute('name', ['FCRegion',num2str(r)]);
72 blockingRegion.setAttribute('type', 'default');
74 % 1. regionNode elements
75 for i=1:length(self.model.regions{r}.nodes)
76 regionNode = simDoc.createElement(
'regionNode');
77 regionNode.setAttribute(
'nodeName', self.model.regions{r}.nodes{i}.getName);
78 blockingRegion.appendChild(regionNode);
82 globalConstraint = simDoc.createElement(
'globalConstraint');
83 globalConstraint.setAttribute(
'maxJobs', num2str(self.model.regions{r}.globalMaxJobs));
84 blockingRegion.appendChild(globalConstraint);
86 % 3. globalMemoryConstraint
87 globalMemoryConstraint = simDoc.createElement(
'globalMemoryConstraint');
88 globalMemoryConstraint.setAttribute(
'maxMemory', num2str(self.model.regions{r}.globalMaxMemory));
89 blockingRegion.appendChild(globalMemoryConstraint);
91 % 4. All classConstraint elements (
for all
classes)
93 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
96 if self.model.regions{r}.classMaxJobs(c) ~= Region.UNBOUNDED
97 classConstraint = simDoc.createElement(
'classConstraint');
98 classConstraint.setAttribute(
'jobClass', self.model.regions{r}.classes{c}.getName);
99 classConstraint.setAttribute(
'maxJobsPerClass', num2str(self.model.regions{r}.classMaxJobs(c)));
100 blockingRegion.appendChild(classConstraint);
104 % 5. All classMemoryConstraint elements (
for all
classes)
106 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
109 if self.model.regions{r}.classMaxMemory(c) ~= Region.UNBOUNDED
110 classMemoryConstraint = simDoc.createElement(
'classMemoryConstraint');
111 classMemoryConstraint.setAttribute(
'jobClass', self.model.regions{r}.classes{c}.getName);
112 classMemoryConstraint.setAttribute(
'maxMemoryPerClass', num2str(self.model.regions{r}.classMaxMemory(c)));
113 blockingRegion.appendChild(classMemoryConstraint);
117 % 6. All dropRules elements (
for all
classes)
119 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
122 % Always write dropRules element - JMT defaults to drop when not specified
123 dropRuleElem = simDoc.createElement(
'dropRules');
124 dropRuleElem.setAttribute(
'jobClass', self.model.regions{r}.classes{c}.getName);
125 if self.model.regions{r}.dropRule(c) == DropStrategy.DROP
126 dropRuleElem.setAttribute(
'dropThisClass',
'true');
128 dropRuleElem.setAttribute(
'dropThisClass',
'false');
130 blockingRegion.appendChild(dropRuleElem);
133 % 7. classWeight elements (currently disabled in JMT)
134 %
for c=1:sn.nclasses
135 %
if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
138 %
if self.model.regions{r}.classWeight(c) ~= 1
139 % classWeightElem = simDoc.createElement(
'classWeight');
140 % classWeightElem.setAttribute(
'jobClass', self.model.regions{r}.classes{c}.getName);
141 % classWeightElem.setAttribute(
'weight', num2str(self.model.regions{r}.classWeight(c)));
142 % blockingRegion.appendChild(classWeightElem);
146 % 8. All classSize elements (
for all
classes)
148 if isfinite(sn.njobs(c)) && sn.njobs(c) == 0
151 if self.model.regions{r}.classSize(c) ~= 1
152 classSizeElem = simDoc.createElement(
'classSize');
153 classSizeElem.setAttribute(
'jobClass', self.model.regions{r}.classes{c}.getName);
154 classSizeElem.setAttribute(
'size', num2str(self.model.regions{r}.classSize(c)));
155 blockingRegion.appendChild(classSizeElem);
159 simElem.appendChild(blockingRegion);