This commit is contained in:
Marco Miozzo
2011-05-30 17:09:28 +02:00
18 changed files with 4825 additions and 251 deletions

View File

@@ -11,8 +11,15 @@ IMAGES_EPS = \
$(FIGURES)/ff-mac-saps.eps \
$(FIGURES)/ff-example.eps \
$(FIGURES)/lte-enb-architecture.eps \
$(FIGURES)/lte-ue-architecture.eps \
$(FIGURES)/lte-ue-architecture.eps
# specify figures for build process (all eps figures)
GRAPHS_EPS = \
$(FIGURES)/lte-mcs-index.eps \
$(FIGURES)/lenaThrTestCase1.eps \
$(FIGURES)/lenaThrTestCase2.eps \
$(FIGURES)/simulationTime.eps \
$(FIGURES)/memoryUsage.eps
# rescale figures as necessary
$(FIGURES)/testbed.pdf_width = 5in
@@ -38,6 +45,14 @@ IMAGES = $(IMAGES_EPS) $(IMAGES_PNG) $(IMAGES_PDF)
%.png : %.dia; $(DIA) -t png $< -e $@
%.pdf : %.eps; $(EPSTOPDF) $< -o=$@; if test x$($@_width) != x; then TMPFILE=`mktemp`; ./rescale-pdf.sh $($@_width) $@ $${TMPFILE} && mv $${TMPFILE} $@; fi
GRAPHS_PNG = ${GRAPHS_EPS:.eps=.png}
GRAPHS_PDF = ${GRAPHS_EPS:.eps=.pdf}
GRAPHS = $(GRAPHS_EPS) $(GRAPHS_PNG) $(GRAPHS_PDF)
%.png : %.eps; $(CONVERT) $< $@
%.pdf : %.eps; $(EPSTOPDF) $< -o=$@; if test x$($@_width) != x; then TMPFILE=`mktemp`; ./rescale-pdf.sh $($@_width) $@ $${TMPFILE} && mv $${TMPFILE} $@; fi
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
@@ -72,14 +87,17 @@ help:
clean:
-rm -rf $(BUILDDIR)/*
-rm -rf $(SOURCE)
-rm -f $(IMAGES_PNG)
-rm -f $(IMAGES_PDF)
-rm -f $(GRAPHS_PNG)
-rm -f $(GRAPHS_PDF)
frag: pickle
@if test ! -d $(BUILDDIR)/frag; then mkdir $(BUILDDIR)/frag; fi
pushd $(BUILDDIR)/frag && ../../pickle-to-xml.py ../pickle/index.fpickle > navigation.xml && popd
cp -r $(BUILDDIR)/pickle/_images $(BUILDDIR)/frag
html: $(IMAGES)
html: $(IMAGES) ${GRAPHS}
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
@@ -133,14 +151,14 @@ epub: $(IMAGES)
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex: $(IMAGES)
latex: $(IMAGES) ${GRAPHS}
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf: $(IMAGES)
latexpdf: $(IMAGES) ${GRAPHS}
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
make -C $(BUILDDIR)/latex all-pdf

View File

@@ -178,10 +178,10 @@ html_theme = 'default'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('lte-testing', 'lena-testing.tex', u'LENA Testing Documentation', u'CTTC', 'manual'),
('lte-design', 'lena-design.tex', u'LENA Design Documentation', u'CTTC', 'manual'),
('lte-user', 'lena-user.tex', u'LENA User Documentation', u'CTTC', 'manual'),
# ('lte-testing', 'lte-doc-testing.tex', u'LTE Simulator Testing Documentation', u'Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)', 'manual'),
# ('lte-design', 'lte-doc-design.tex', u'LTE Simulator Design Documentation', u'Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)', 'manual'),
# ('lte-user', 'lte-doc-user.tex', u'LTE Simulator User Documentation', u'Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)', 'manual'),
('lte', 'lte-sim-doc.tex', u'LTE Simulator Documentation', u'Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,927 @@
%!PS-Adobe-2.0 EPSF-2.0
%%Title: lenaThrTestCase2.eps
%%Creator: gnuplot 4.2 patchlevel 6
%%CreationDate: Mon May 23 12:59:45 2011
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 410 302
%%EndComments
%%BeginProlog
/gnudict 256 dict def
gnudict begin
%
% The following 6 true/false flags may be edited by hand if required
% The unit line width may also be changed
%
/Color true def
/Blacktext false def
/Solid false def
/Dashlength 1 def
/Landscape false def
/Level1 false def
/Rounded false def
/TransparentPatterns false def
/gnulinewidth 5.000 def
/userlinewidth gnulinewidth def
%
/vshift -63 def
/dl1 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
} def
/dl2 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul add } if
} def
/hpt_ 31.5 def
/vpt_ 31.5 def
/hpt hpt_ def
/vpt vpt_ def
Level1 {} {
/SDict 10 dict def
systemdict /pdfmark known not {
userdict /pdfmark systemdict /cleartomark get put
} if
SDict begin [
/Title (lenaThrTestCase2.eps)
/Subject (gnuplot plot)
/Creator (gnuplot 4.2 patchlevel 6 )
/Author (Marco Miozzo,,,)
% /Producer (gnuplot)
% /Keywords ()
/CreationDate (Mon May 23 12:59:45 2011)
/DOCINFO pdfmark
end
} ifelse
%
% Gnuplot Prolog Version 4.2 (August 2006)
%
/M {moveto} bind def
/L {lineto} bind def
/R {rmoveto} bind def
/V {rlineto} bind def
/N {newpath moveto} bind def
/Z {closepath} bind def
/C {setrgbcolor} bind def
/f {rlineto fill} bind def
/vpt2 vpt 2 mul def
/hpt2 hpt 2 mul def
/Lshow {currentpoint stroke M 0 vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
/hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
{pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
/BL {stroke userlinewidth 2 mul setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/AL {stroke userlinewidth 2 div setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/UL {dup gnulinewidth mul /userlinewidth exch def
dup 1 lt {pop 1} if 10 mul /udl exch def} def
/PL {stroke userlinewidth setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
% Default Line colors
/LCw {1 1 1} def
/LCb {0 0 0} def
/LCa {0 0 0} def
/LC0 {1 0 0} def
/LC1 {0 1 0} def
/LC2 {0 0 1} def
/LC3 {1 0 1} def
/LC4 {0 1 1} def
/LC5 {1 1 0} def
/LC6 {0 0 0} def
/LC7 {1 0.3 0} def
/LC8 {0.5 0.5 0.5} def
% Default Line Types
/LTw {PL [] 1 setgray} def
/LTb {BL [] LCb DL} def
/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
/LT0 {PL [] LC0 DL} def
/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
/Dia {stroke [] 0 setdash 2 copy vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke
Pnt} def
/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
currentpoint stroke M
hpt neg vpt neg R hpt2 0 V stroke
} def
/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke
Pnt} def
/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
hpt2 vpt2 neg V currentpoint stroke M
hpt2 neg 0 R hpt2 vpt2 V stroke} def
/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke
Pnt} def
/Star {2 copy Pls Crs} def
/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath fill} def
/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath fill} def
/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke
Pnt} def
/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath fill} def
/DiaF {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath fill} def
/Pent {stroke [] 0 setdash 2 copy gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore Pnt} def
/PentF {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath fill grestore} def
/Circle {stroke [] 0 setdash 2 copy
hpt 0 360 arc stroke Pnt} def
/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
/C1 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
vpt 0 360 arc closepath} bind def
/C2 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C3 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C4 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C5 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc
2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc} bind def
/C6 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C7 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C8 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C9 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 450 arc closepath fill
vpt 0 360 arc closepath} bind def
/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C11 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C12 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C13 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C14 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 360 arc closepath fill
vpt 0 360 arc} bind def
/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
neg 0 rlineto closepath} bind def
/Square {dup Rec} bind def
/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
2 copy vpt Square fill Bsquare} bind def
/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
Bsquare} bind def
/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
Bsquare} bind def
/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy vpt Square fill Bsquare} bind def
/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
/DiaE {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke} def
/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke} def
/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke} def
/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke} def
/PentE {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore} def
/CircE {stroke [] 0 setdash
hpt 0 360 arc stroke} def
/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
/DiaW {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V Opaque stroke} def
/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V Opaque stroke} def
/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V Opaque stroke} def
/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V Opaque stroke} def
/PentW {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
Opaque stroke grestore} def
/CircW {stroke [] 0 setdash
hpt 0 360 arc Opaque stroke} def
/BoxFill {gsave Rec 1 setgray fill grestore} def
/Density {
/Fillden exch def
currentrgbcolor
/ColB exch def /ColG exch def /ColR exch def
/ColR ColR Fillden mul Fillden sub 1 add def
/ColG ColG Fillden mul Fillden sub 1 add def
/ColB ColB Fillden mul Fillden sub 1 add def
ColR ColG ColB setrgbcolor} def
/BoxColFill {gsave Rec PolyFill} def
/PolyFill {gsave Density fill grestore grestore} def
/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
%
% PostScript Level 1 Pattern Fill routine for rectangles
% Usage: x y w h s a XX PatternFill
% x,y = lower left corner of box to be filled
% w,h = width and height of box
% a = angle in degrees between lines and x-axis
% XX = 0/1 for no/yes cross-hatch
%
/PatternFill {gsave /PFa [ 9 2 roll ] def
PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
gsave 1 setgray fill grestore clip
currentlinewidth 0.5 mul setlinewidth
/PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
0 0 M PFa 5 get rotate PFs -2 div dup translate
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 M 0 PFs V} for
0 PFa 6 get ne {
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 2 1 roll M PFs 0 V} for
} if
stroke grestore} def
%
/languagelevel where
{pop languagelevel} {1} ifelse
2 lt
{/InterpretLevel1 true def}
{/InterpretLevel1 Level1 def}
ifelse
%
% PostScript level 2 pattern fill definitions
%
/Level2PatternFill {
/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
bind def
/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
>> matrix makepattern
/Pat1 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
>> matrix makepattern
/Pat2 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
8 8 L 8 0 L 0 0 L fill}
>> matrix makepattern
/Pat3 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
0 12 M 12 0 L stroke}
>> matrix makepattern
/Pat4 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
0 -4 M 12 8 L stroke}
>> matrix makepattern
/Pat5 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
0 12 M 8 -4 L 4 12 M 10 0 L stroke}
>> matrix makepattern
/Pat6 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
>> matrix makepattern
/Pat7 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
12 0 M -4 8 L 12 4 M 0 10 L stroke}
>> matrix makepattern
/Pat8 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
-4 0 M 12 8 L -4 4 M 8 10 L stroke}
>> matrix makepattern
/Pat9 exch def
/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
} def
%
%
%End of PostScript Level 2 code
%
/PatternBgnd {
TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
} def
%
% Substitute for Level 2 pattern fill codes with
% grayscale if Level 2 support is not selected.
%
/Level1PatternFill {
/Pattern1 {0.250 Density} bind def
/Pattern2 {0.500 Density} bind def
/Pattern3 {0.750 Density} bind def
/Pattern4 {0.125 Density} bind def
/Pattern5 {0.375 Density} bind def
/Pattern6 {0.625 Density} bind def
/Pattern7 {0.875 Density} bind def
} def
%
% Now test for support of Level 2 code
%
Level1 {Level1PatternFill} {Level2PatternFill} ifelse
%
/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
currentdict end definefont pop
/MFshow {
{ dup 5 get 3 ge
{ 5 get 3 eq {gsave} {grestore} ifelse }
{dup dup 0 get findfont exch 1 get scalefont setfont
[ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
{dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
pop aload pop M} ifelse }ifelse }ifelse }
ifelse }
forall} bind def
/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
{dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
/MLshow { currentpoint stroke M
0 exch R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MRshow { currentpoint stroke M
exch dup MFwidth neg 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MCshow { currentpoint stroke M
exch dup MFwidth -2 div 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/XYsave { [( ) 1 2 true false 3 ()] } bind def
/XYrestore { [( ) 1 2 true false 4 ()] } bind def
end
%%EndProlog
gnudict begin
gsave
50 50 translate
0.050 0.050 scale
0 setgray
newpath
(Times) findfont 190 scalefont setfont
1.000 UL
LTb
1.000 UL
LTa
1159 608 M
5756 0 V
stroke
LTb
1159 608 M
63 0 V
5693 0 R
-63 0 V
stroke
1045 608 M
[ [(Times) 190.0 0.0 true true 0 (0.01)]
] -63.3 MRshow
1.000 UL
LTb
1.000 UL
LTa
1159 1241 M
5756 0 V
stroke
LTb
1159 1241 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 1611 M
5756 0 V
stroke
LTb
1159 1611 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 1874 M
5756 0 V
stroke
LTb
1159 1874 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2077 M
5756 0 V
stroke
LTb
1159 2077 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2244 M
5756 0 V
stroke
LTb
1159 2244 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2384 M
5756 0 V
stroke
LTb
1159 2384 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2506 M
5756 0 V
stroke
LTb
1159 2506 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2614 M
5756 0 V
stroke
LTb
1159 2614 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 2710 M
5756 0 V
stroke
LTb
1159 2710 M
63 0 V
5693 0 R
-63 0 V
stroke
1045 2710 M
[ [(Times) 190.0 0.0 true true 0 (0.1)]
] -63.3 MRshow
1.000 UL
LTb
1.000 UL
LTa
1159 3343 M
5756 0 V
stroke
LTb
1159 3343 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 3713 M
5756 0 V
stroke
LTb
1159 3713 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 3976 M
5756 0 V
stroke
LTb
1159 3976 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4179 M
5756 0 V
stroke
LTb
1159 4179 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4346 M
5756 0 V
stroke
LTb
1159 4346 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4486 M
3299 0 V
2343 0 R
114 0 V
stroke
LTb
1159 4486 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4608 M
3299 0 V
2343 0 R
114 0 V
stroke
LTb
1159 4608 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4716 M
3299 0 V
2343 0 R
114 0 V
stroke
LTb
1159 4716 M
63 0 V
5693 0 R
-63 0 V
stroke
LTa
1159 4812 M
5756 0 V
stroke
LTb
1159 4812 M
63 0 V
5693 0 R
-63 0 V
stroke
1045 4812 M
[ [(Times) 190.0 0.0 true true 0 (1)]
] -63.3 MRshow
1.000 UL
LTb
1.000 UL
LTa
2118 608 M
0 4204 V
stroke
LTb
2118 608 M
0 63 V
0 4141 R
0 -63 V
stroke
2118 418 M
[ [(Times) 190.0 0.0 true true 0 (1)]
] -63.3 MCshow
1.000 UL
LTb
1.000 UL
LTa
3078 608 M
0 4204 V
stroke
LTb
3078 608 M
0 63 V
0 4141 R
0 -63 V
stroke
3078 418 M
[ [(Times) 190.0 0.0 true true 0 (2)]
] -63.3 MCshow
1.000 UL
LTb
1.000 UL
LTa
4037 608 M
0 4204 V
stroke
LTb
4037 608 M
0 63 V
0 4141 R
0 -63 V
stroke
4037 418 M
[ [(Times) 190.0 0.0 true true 0 (3)]
] -63.3 MCshow
1.000 UL
LTb
1.000 UL
LTa
4996 608 M
0 3761 V
0 380 R
0 63 V
stroke
LTb
4996 608 M
0 63 V
0 4141 R
0 -63 V
stroke
4996 418 M
[ [(Times) 190.0 0.0 true true 0 (4)]
] -63.3 MCshow
1.000 UL
LTb
1.000 UL
LTa
5956 608 M
0 3761 V
0 380 R
0 63 V
stroke
LTb
5956 608 M
0 63 V
0 4141 R
0 -63 V
stroke
5956 418 M
[ [(Times) 190.0 0.0 true true 0 (5)]
] -63.3 MCshow
1.000 UL
LTb
1.000 UL
LTb
1159 4812 N
0 -4204 V
5756 0 V
0 4204 V
-5756 0 V
Z stroke
LCb setrgbcolor
380 2710 M
currentpoint gsave translate 90 rotate 0 0 moveto
[ [(Times) 190.0 0.0 true true 0 (Throughput Ratio)]
] -63.3 MCshow
grestore
LTb
LCb setrgbcolor
4037 133 M
[ [(Times) 190.0 0.0 true true 0 (User index )]
[(Times-Italic) 190.0 0.0 true true 0 (i)]
] -63.3 MCshow
LTb
1.000 UP
1.000 UL
LTb
1.000 UL
LT0
LTb
6054 4654 M
[ [(Times) 190.0 0.0 true true 0 (measured \()]
[(Symbol) 190.0 0.0 true true 0 (r)]
[(Times) 152.0 -57.0 true true 0 (T,i)]
[(Times) 190.0 0.0 true true 0 (\))]
] -44.3 MRshow
LT0
1.000 6168 4607 519 95 BoxColFill
LTb
6168 4607 N
519 0 V
0 94 V
-519 0 V
0 -94 V
Z stroke
LT0
1.000 1839 608 240 3409 BoxColFill
LTb
1839 608 N
0 3408 V
239 0 V
0 -3408 V
-239 0 V
Z stroke
LT0
1.000 2798 608 241 2976 BoxColFill
LTb
2798 608 N
0 2975 V
240 0 V
0 -2975 V
-240 0 V
Z stroke
LT0
1.000 3757 608 241 2565 BoxColFill
LTb
3757 608 N
0 2564 V
240 0 V
0 -2564 V
-240 0 V
Z stroke
LT0
1.000 4717 608 240 2139 BoxColFill
LTb
4717 608 N
0 2138 V
239 0 V
0 -2138 V
-239 0 V
Z stroke
LT0
1.000 5676 608 241 1501 BoxColFill
LTb
5676 608 N
0 1500 V
240 0 V
0 -1500 V
-240 0 V
Z stroke
LT0
1.000 UL
LT1
LTb
6054 4464 M
[ [(Times) 190.0 0.0 true true 0 (expected \()]
[(Symbol) 190.0 0.0 true true 0 (r)]
[(Times) 152.0 -57.0 true true 0 (R,i)]
[(Times) 190.0 0.0 true true 0 (\))]
] -44.3 MRshow
LT1
1.000 6168 4417 519 95 BoxColFill
LTb
6168 4417 N
519 0 V
0 94 V
-519 0 V
0 -94 V
Z stroke
LT1
1.000 2158 608 241 3413 BoxColFill
LTb
2158 608 N
0 3412 V
240 0 V
0 -3412 V
-240 0 V
Z stroke
LT1
1.000 3118 608 240 2973 BoxColFill
LTb
3118 608 N
0 2972 V
239 0 V
0 -2972 V
-239 0 V
Z stroke
LT1
1.000 4077 608 241 2561 BoxColFill
LTb
4077 608 N
0 2560 V
240 0 V
0 -2560 V
-240 0 V
Z stroke
LT1
1.000 5036 608 241 2137 BoxColFill
LTb
5036 608 N
0 2136 V
240 0 V
0 -2136 V
-240 0 V
Z stroke
LT1
1.000 5996 608 240 1504 BoxColFill
LTb
5996 608 N
0 1503 V
239 0 V
0 -1503 V
-239 0 V
Z stroke
LT1
1.000 UL
LTb
1159 4812 N
0 -4204 V
5756 0 V
0 4204 V
-5756 0 V
Z stroke
1.000 UP
1.000 UL
LTb
stroke
grestore
end
showpage
%%Trailer
%%DocumentFonts: Symbol Times-Italic Times

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,863 @@
%!PS-Adobe-2.0 EPSF-2.0
%%Title: ../figures/memoryUsage.eps
%%Creator: gnuplot 4.2 patchlevel 6
%%CreationDate: Fri May 27 14:35:30 2011
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 410 302
%%EndComments
%%BeginProlog
/gnudict 256 dict def
gnudict begin
%
% The following 6 true/false flags may be edited by hand if required
% The unit line width may also be changed
%
/Color false def
/Blacktext false def
/Solid false def
/Dashlength 1 def
/Landscape false def
/Level1 false def
/Rounded false def
/TransparentPatterns false def
/gnulinewidth 5.000 def
/userlinewidth gnulinewidth def
%
/vshift -46 def
/dl1 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
} def
/dl2 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul add } if
} def
/hpt_ 31.5 def
/vpt_ 31.5 def
/hpt hpt_ def
/vpt vpt_ def
Level1 {} {
/SDict 10 dict def
systemdict /pdfmark known not {
userdict /pdfmark systemdict /cleartomark get put
} if
SDict begin [
/Title (../figures/memoryUsage.eps)
/Subject (gnuplot plot)
/Creator (gnuplot 4.2 patchlevel 6 )
/Author (Nicola Baldo,,,)
% /Producer (gnuplot)
% /Keywords ()
/CreationDate (Fri May 27 14:35:30 2011)
/DOCINFO pdfmark
end
} ifelse
%
% Gnuplot Prolog Version 4.2 (August 2006)
%
/M {moveto} bind def
/L {lineto} bind def
/R {rmoveto} bind def
/V {rlineto} bind def
/N {newpath moveto} bind def
/Z {closepath} bind def
/C {setrgbcolor} bind def
/f {rlineto fill} bind def
/vpt2 vpt 2 mul def
/hpt2 hpt 2 mul def
/Lshow {currentpoint stroke M 0 vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
/hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
{pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
/BL {stroke userlinewidth 2 mul setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/AL {stroke userlinewidth 2 div setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/UL {dup gnulinewidth mul /userlinewidth exch def
dup 1 lt {pop 1} if 10 mul /udl exch def} def
/PL {stroke userlinewidth setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
% Default Line colors
/LCw {1 1 1} def
/LCb {0 0 0} def
/LCa {0 0 0} def
/LC0 {1 0 0} def
/LC1 {0 1 0} def
/LC2 {0 0 1} def
/LC3 {1 0 1} def
/LC4 {0 1 1} def
/LC5 {1 1 0} def
/LC6 {0 0 0} def
/LC7 {1 0.3 0} def
/LC8 {0.5 0.5 0.5} def
% Default Line Types
/LTw {PL [] 1 setgray} def
/LTb {BL [] LCb DL} def
/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
/LT0 {PL [] LC0 DL} def
/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
/Dia {stroke [] 0 setdash 2 copy vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke
Pnt} def
/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
currentpoint stroke M
hpt neg vpt neg R hpt2 0 V stroke
} def
/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke
Pnt} def
/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
hpt2 vpt2 neg V currentpoint stroke M
hpt2 neg 0 R hpt2 vpt2 V stroke} def
/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke
Pnt} def
/Star {2 copy Pls Crs} def
/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath fill} def
/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath fill} def
/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke
Pnt} def
/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath fill} def
/DiaF {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath fill} def
/Pent {stroke [] 0 setdash 2 copy gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore Pnt} def
/PentF {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath fill grestore} def
/Circle {stroke [] 0 setdash 2 copy
hpt 0 360 arc stroke Pnt} def
/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
/C1 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
vpt 0 360 arc closepath} bind def
/C2 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C3 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C4 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C5 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc
2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc} bind def
/C6 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C7 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C8 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C9 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 450 arc closepath fill
vpt 0 360 arc closepath} bind def
/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C11 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C12 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C13 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C14 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 360 arc closepath fill
vpt 0 360 arc} bind def
/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
neg 0 rlineto closepath} bind def
/Square {dup Rec} bind def
/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
2 copy vpt Square fill Bsquare} bind def
/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
Bsquare} bind def
/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
Bsquare} bind def
/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy vpt Square fill Bsquare} bind def
/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
/DiaE {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke} def
/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke} def
/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke} def
/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke} def
/PentE {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore} def
/CircE {stroke [] 0 setdash
hpt 0 360 arc stroke} def
/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
/DiaW {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V Opaque stroke} def
/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V Opaque stroke} def
/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V Opaque stroke} def
/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V Opaque stroke} def
/PentW {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
Opaque stroke grestore} def
/CircW {stroke [] 0 setdash
hpt 0 360 arc Opaque stroke} def
/BoxFill {gsave Rec 1 setgray fill grestore} def
/Density {
/Fillden exch def
currentrgbcolor
/ColB exch def /ColG exch def /ColR exch def
/ColR ColR Fillden mul Fillden sub 1 add def
/ColG ColG Fillden mul Fillden sub 1 add def
/ColB ColB Fillden mul Fillden sub 1 add def
ColR ColG ColB setrgbcolor} def
/BoxColFill {gsave Rec PolyFill} def
/PolyFill {gsave Density fill grestore grestore} def
/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
%
% PostScript Level 1 Pattern Fill routine for rectangles
% Usage: x y w h s a XX PatternFill
% x,y = lower left corner of box to be filled
% w,h = width and height of box
% a = angle in degrees between lines and x-axis
% XX = 0/1 for no/yes cross-hatch
%
/PatternFill {gsave /PFa [ 9 2 roll ] def
PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
gsave 1 setgray fill grestore clip
currentlinewidth 0.5 mul setlinewidth
/PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
0 0 M PFa 5 get rotate PFs -2 div dup translate
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 M 0 PFs V} for
0 PFa 6 get ne {
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 2 1 roll M PFs 0 V} for
} if
stroke grestore} def
%
/languagelevel where
{pop languagelevel} {1} ifelse
2 lt
{/InterpretLevel1 true def}
{/InterpretLevel1 Level1 def}
ifelse
%
% PostScript level 2 pattern fill definitions
%
/Level2PatternFill {
/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
bind def
/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
>> matrix makepattern
/Pat1 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
>> matrix makepattern
/Pat2 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
8 8 L 8 0 L 0 0 L fill}
>> matrix makepattern
/Pat3 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
0 12 M 12 0 L stroke}
>> matrix makepattern
/Pat4 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
0 -4 M 12 8 L stroke}
>> matrix makepattern
/Pat5 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
0 12 M 8 -4 L 4 12 M 10 0 L stroke}
>> matrix makepattern
/Pat6 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
>> matrix makepattern
/Pat7 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
12 0 M -4 8 L 12 4 M 0 10 L stroke}
>> matrix makepattern
/Pat8 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
-4 0 M 12 8 L -4 4 M 8 10 L stroke}
>> matrix makepattern
/Pat9 exch def
/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
} def
%
%
%End of PostScript Level 2 code
%
/PatternBgnd {
TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
} def
%
% Substitute for Level 2 pattern fill codes with
% grayscale if Level 2 support is not selected.
%
/Level1PatternFill {
/Pattern1 {0.250 Density} bind def
/Pattern2 {0.500 Density} bind def
/Pattern3 {0.750 Density} bind def
/Pattern4 {0.125 Density} bind def
/Pattern5 {0.375 Density} bind def
/Pattern6 {0.625 Density} bind def
/Pattern7 {0.875 Density} bind def
} def
%
% Now test for support of Level 2 code
%
Level1 {Level1PatternFill} {Level2PatternFill} ifelse
%
/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
currentdict end definefont pop
/MFshow {
{ dup 5 get 3 ge
{ 5 get 3 eq {gsave} {grestore} ifelse }
{dup dup 0 get findfont exch 1 get scalefont setfont
[ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
{dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
pop aload pop M} ifelse }ifelse }ifelse }
ifelse }
forall} bind def
/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
{dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
/MLshow { currentpoint stroke M
0 exch R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MRshow { currentpoint stroke M
exch dup MFwidth neg 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MCshow { currentpoint stroke M
exch dup MFwidth -2 div 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/XYsave { [( ) 1 2 true false 3 ()] } bind def
/XYrestore { [( ) 1 2 true false 4 ()] } bind def
end
%%EndProlog
gnudict begin
gsave
50 50 translate
0.050 0.050 scale
0 setgray
newpath
(Helvetica) findfont 140 scalefont setfont
1.000 UL
LTb
1.000 UL
LTa
686 448 M
6304 0 V
stroke
LTb
686 448 M
63 0 V
6241 0 R
-63 0 V
stroke
602 448 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 1001 M
6304 0 V
stroke
LTb
686 1001 M
63 0 V
6241 0 R
-63 0 V
stroke
602 1001 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 1554 M
6304 0 V
stroke
LTb
686 1554 M
63 0 V
6241 0 R
-63 0 V
stroke
602 1554 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 2)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 2107 M
6304 0 V
stroke
LTb
686 2107 M
63 0 V
6241 0 R
-63 0 V
stroke
602 2107 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 3)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 2660 M
6304 0 V
stroke
LTb
686 2660 M
63 0 V
6241 0 R
-63 0 V
stroke
602 2660 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 3213 M
6304 0 V
stroke
LTb
686 3213 M
63 0 V
6241 0 R
-63 0 V
stroke
602 3213 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 5)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 3766 M
6304 0 V
stroke
LTb
686 3766 M
63 0 V
6241 0 R
-63 0 V
stroke
602 3766 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 6)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 4319 M
84 0 V
1659 0 R
4561 0 V
stroke
LTb
686 4319 M
63 0 V
6241 0 R
-63 0 V
stroke
602 4319 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 7)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 4872 M
6304 0 V
stroke
LTb
686 4872 M
63 0 V
6241 0 R
-63 0 V
stroke
602 4872 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 8)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
686 448 M
0 4424 V
stroke
LTb
686 448 M
0 63 V
0 4361 R
0 -63 V
stroke
686 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
1737 448 M
0 3731 V
0 630 R
0 63 V
stroke
LTb
1737 448 M
0 63 V
0 4361 R
0 -63 V
stroke
1737 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 2)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
2787 448 M
0 4424 V
stroke
LTb
2787 448 M
0 63 V
0 4361 R
0 -63 V
stroke
2787 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
3838 448 M
0 4424 V
stroke
LTb
3838 448 M
0 63 V
0 4361 R
0 -63 V
stroke
3838 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 6)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
4889 448 M
0 4424 V
stroke
LTb
4889 448 M
0 63 V
0 4361 R
0 -63 V
stroke
4889 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 8)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
5939 448 M
0 4424 V
stroke
LTb
5939 448 M
0 63 V
0 4361 R
0 -63 V
stroke
5939 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 10)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
6990 448 M
0 4424 V
stroke
LTb
6990 448 M
0 63 V
0 4361 R
0 -63 V
stroke
6990 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 12)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTb
686 4872 N
686 448 L
6304 0 V
0 4424 V
-6304 0 V
Z stroke
LCb setrgbcolor
280 2660 M
currentpoint gsave translate 90 rotate 0 0 moveto
[ [(Helvetica) 140.0 0.0 true true 0 (Memory usage [MB])]
] -46.7 MCshow
grestore
LTb
LCb setrgbcolor
3838 98 M
[ [(Helvetica) 140.0 0.0 true true 0 (Number of eNBs)]
] -46.7 MCshow
LTb
1.000 UP
1.000 UL
LTb
1.500 UP
2.000 UL
LT2
0.63 0.13 0.94 C LTb
1337 4704 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1 UE per eNB)]
] -46.7 MLshow
LT2
0.63 0.13 0.94 C 854 4704 M
399 0 V
1211 2218 M
526 166 V
525 110 V
525 166 V
526 166 V
525 166 V
525 110 V
526 166 V
525 166 V
525 166 V
526 166 V
525 111 V
1211 2218 Pls
1737 2384 Pls
2262 2494 Pls
2787 2660 Pls
3313 2826 Pls
3838 2992 Pls
4363 3102 Pls
4889 3268 Pls
5414 3434 Pls
5939 3600 Pls
6465 3766 Pls
6990 3877 Pls
1054 4704 Pls
1.500 UP
2.000 UL
LT1
1.00 0.00 0.00 C LTb
1337 4494 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 5 UE per eNB)]
] -46.7 MLshow
LT1
1.00 0.00 0.00 C 854 4494 M
399 0 V
1211 2218 M
526 166 V
525 165 V
525 166 V
526 166 V
525 166 V
525 221 V
526 166 V
525 166 V
525 221 V
526 332 V
525 111 V
1211 2218 Crs
1737 2384 Crs
2262 2549 Crs
2787 2715 Crs
3313 2881 Crs
3838 3047 Crs
4363 3268 Crs
4889 3434 Crs
5414 3600 Crs
5939 3821 Crs
6465 4153 Crs
6990 4264 Crs
1054 4494 Crs
1.500 UP
2.000 UL
LT3
0.00 0.00 1.00 C LTb
1337 4284 M
[ [(Helvetica) 140.0 0.0 true true 0 (10 UE per eNB)]
] -46.7 MLshow
LT3
0.00 0.00 1.00 C 854 4284 M
399 0 V
1211 2328 M
526 166 V
525 166 V
525 221 V
526 111 V
525 221 V
525 332 V
526 166 V
525 221 V
525 276 V
526 222 V
525 166 V
1211 2328 Star
1737 2494 Star
2262 2660 Star
2787 2881 Star
3313 2992 Star
3838 3213 Star
4363 3545 Star
4889 3711 Star
5414 3932 Star
5939 4208 Star
6465 4430 Star
6990 4596 Star
1054 4284 Star
1.000 UL
LTb
686 4872 N
686 448 L
6304 0 V
0 4424 V
-6304 0 V
Z stroke
1.000 UP
1.000 UL
LTb
stroke
grestore
end
showpage

View File

@@ -0,0 +1,997 @@
%!PS-Adobe-2.0 EPSF-2.0
%%Title: ../figures/simulationTime.eps
%%Creator: gnuplot 4.2 patchlevel 6
%%CreationDate: Fri May 27 14:35:30 2011
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 410 302
%%EndComments
%%BeginProlog
/gnudict 256 dict def
gnudict begin
%
% The following 6 true/false flags may be edited by hand if required
% The unit line width may also be changed
%
/Color false def
/Blacktext false def
/Solid false def
/Dashlength 1 def
/Landscape false def
/Level1 false def
/Rounded false def
/TransparentPatterns false def
/gnulinewidth 5.000 def
/userlinewidth gnulinewidth def
%
/vshift -46 def
/dl1 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
} def
/dl2 {
10.0 Dashlength mul mul
Rounded { currentlinewidth 0.75 mul add } if
} def
/hpt_ 31.5 def
/vpt_ 31.5 def
/hpt hpt_ def
/vpt vpt_ def
Level1 {} {
/SDict 10 dict def
systemdict /pdfmark known not {
userdict /pdfmark systemdict /cleartomark get put
} if
SDict begin [
/Title (../figures/simulationTime.eps)
/Subject (gnuplot plot)
/Creator (gnuplot 4.2 patchlevel 6 )
/Author (Nicola Baldo,,,)
% /Producer (gnuplot)
% /Keywords ()
/CreationDate (Fri May 27 14:35:30 2011)
/DOCINFO pdfmark
end
} ifelse
%
% Gnuplot Prolog Version 4.2 (August 2006)
%
/M {moveto} bind def
/L {lineto} bind def
/R {rmoveto} bind def
/V {rlineto} bind def
/N {newpath moveto} bind def
/Z {closepath} bind def
/C {setrgbcolor} bind def
/f {rlineto fill} bind def
/vpt2 vpt 2 mul def
/hpt2 hpt 2 mul def
/Lshow {currentpoint stroke M 0 vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
/hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
{pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
/BL {stroke userlinewidth 2 mul setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/AL {stroke userlinewidth 2 div setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
/UL {dup gnulinewidth mul /userlinewidth exch def
dup 1 lt {pop 1} if 10 mul /udl exch def} def
/PL {stroke userlinewidth setlinewidth
Rounded {1 setlinejoin 1 setlinecap} if} def
% Default Line colors
/LCw {1 1 1} def
/LCb {0 0 0} def
/LCa {0 0 0} def
/LC0 {1 0 0} def
/LC1 {0 1 0} def
/LC2 {0 0 1} def
/LC3 {1 0 1} def
/LC4 {0 1 1} def
/LC5 {1 1 0} def
/LC6 {0 0 0} def
/LC7 {1 0.3 0} def
/LC8 {0.5 0.5 0.5} def
% Default Line Types
/LTw {PL [] 1 setgray} def
/LTb {BL [] LCb DL} def
/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
/LT0 {PL [] LC0 DL} def
/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
/Dia {stroke [] 0 setdash 2 copy vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke
Pnt} def
/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
currentpoint stroke M
hpt neg vpt neg R hpt2 0 V stroke
} def
/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke
Pnt} def
/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
hpt2 vpt2 neg V currentpoint stroke M
hpt2 neg 0 R hpt2 vpt2 V stroke} def
/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke
Pnt} def
/Star {2 copy Pls Crs} def
/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath fill} def
/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath fill} def
/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke
Pnt} def
/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath fill} def
/DiaF {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath fill} def
/Pent {stroke [] 0 setdash 2 copy gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore Pnt} def
/PentF {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath fill grestore} def
/Circle {stroke [] 0 setdash 2 copy
hpt 0 360 arc stroke Pnt} def
/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
/C1 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
vpt 0 360 arc closepath} bind def
/C2 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C3 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C4 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C5 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc
2 copy moveto
2 copy vpt 180 270 arc closepath fill
vpt 0 360 arc} bind def
/C6 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C7 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 270 arc closepath fill
vpt 0 360 arc closepath} bind def
/C8 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C9 {BL [] 0 setdash 2 copy moveto
2 copy vpt 270 450 arc closepath fill
vpt 0 360 arc closepath} bind def
/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
2 copy moveto
2 copy vpt 90 180 arc closepath fill
vpt 0 360 arc closepath} bind def
/C11 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 180 arc closepath fill
2 copy moveto
2 copy vpt 270 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C12 {BL [] 0 setdash 2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C13 {BL [] 0 setdash 2 copy moveto
2 copy vpt 0 90 arc closepath fill
2 copy moveto
2 copy vpt 180 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/C14 {BL [] 0 setdash 2 copy moveto
2 copy vpt 90 360 arc closepath fill
vpt 0 360 arc} bind def
/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
vpt 0 360 arc closepath} bind def
/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
neg 0 rlineto closepath} bind def
/Square {dup Rec} bind def
/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
2 copy vpt Square fill Bsquare} bind def
/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
Bsquare} bind def
/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
Bsquare} bind def
/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy vpt Square fill Bsquare} bind def
/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
/DiaE {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V closepath stroke} def
/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V closepath stroke} def
/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V closepath stroke} def
/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V closepath stroke} def
/PentE {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
closepath stroke grestore} def
/CircE {stroke [] 0 setdash
hpt 0 360 arc stroke} def
/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
/DiaW {stroke [] 0 setdash vpt add M
hpt neg vpt neg V hpt vpt neg V
hpt vpt V hpt neg vpt V Opaque stroke} def
/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
0 vpt2 neg V hpt2 0 V 0 vpt2 V
hpt2 neg 0 V Opaque stroke} def
/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
hpt neg vpt -1.62 mul V
hpt 2 mul 0 V
hpt neg vpt 1.62 mul V Opaque stroke} def
/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
hpt neg vpt 1.62 mul V
hpt 2 mul 0 V
hpt neg vpt -1.62 mul V Opaque stroke} def
/PentW {stroke [] 0 setdash gsave
translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
Opaque stroke grestore} def
/CircW {stroke [] 0 setdash
hpt 0 360 arc Opaque stroke} def
/BoxFill {gsave Rec 1 setgray fill grestore} def
/Density {
/Fillden exch def
currentrgbcolor
/ColB exch def /ColG exch def /ColR exch def
/ColR ColR Fillden mul Fillden sub 1 add def
/ColG ColG Fillden mul Fillden sub 1 add def
/ColB ColB Fillden mul Fillden sub 1 add def
ColR ColG ColB setrgbcolor} def
/BoxColFill {gsave Rec PolyFill} def
/PolyFill {gsave Density fill grestore grestore} def
/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
%
% PostScript Level 1 Pattern Fill routine for rectangles
% Usage: x y w h s a XX PatternFill
% x,y = lower left corner of box to be filled
% w,h = width and height of box
% a = angle in degrees between lines and x-axis
% XX = 0/1 for no/yes cross-hatch
%
/PatternFill {gsave /PFa [ 9 2 roll ] def
PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
gsave 1 setgray fill grestore clip
currentlinewidth 0.5 mul setlinewidth
/PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
0 0 M PFa 5 get rotate PFs -2 div dup translate
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 M 0 PFs V} for
0 PFa 6 get ne {
0 1 PFs PFa 4 get div 1 add floor cvi
{PFa 4 get mul 0 2 1 roll M PFs 0 V} for
} if
stroke grestore} def
%
/languagelevel where
{pop languagelevel} {1} ifelse
2 lt
{/InterpretLevel1 true def}
{/InterpretLevel1 Level1 def}
ifelse
%
% PostScript level 2 pattern fill definitions
%
/Level2PatternFill {
/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
bind def
/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
>> matrix makepattern
/Pat1 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
>> matrix makepattern
/Pat2 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
8 8 L 8 0 L 0 0 L fill}
>> matrix makepattern
/Pat3 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
0 12 M 12 0 L stroke}
>> matrix makepattern
/Pat4 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
0 -4 M 12 8 L stroke}
>> matrix makepattern
/Pat5 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
0 12 M 8 -4 L 4 12 M 10 0 L stroke}
>> matrix makepattern
/Pat6 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
>> matrix makepattern
/Pat7 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
12 0 M -4 8 L 12 4 M 0 10 L stroke}
>> matrix makepattern
/Pat8 exch def
<< Tile8x8
/PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
-4 0 M 12 8 L -4 4 M 8 10 L stroke}
>> matrix makepattern
/Pat9 exch def
/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
} def
%
%
%End of PostScript Level 2 code
%
/PatternBgnd {
TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
} def
%
% Substitute for Level 2 pattern fill codes with
% grayscale if Level 2 support is not selected.
%
/Level1PatternFill {
/Pattern1 {0.250 Density} bind def
/Pattern2 {0.500 Density} bind def
/Pattern3 {0.750 Density} bind def
/Pattern4 {0.125 Density} bind def
/Pattern5 {0.375 Density} bind def
/Pattern6 {0.625 Density} bind def
/Pattern7 {0.875 Density} bind def
} def
%
% Now test for support of Level 2 code
%
Level1 {Level1PatternFill} {Level2PatternFill} ifelse
%
/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
currentdict end definefont pop
/MFshow {
{ dup 5 get 3 ge
{ 5 get 3 eq {gsave} {grestore} ifelse }
{dup dup 0 get findfont exch 1 get scalefont setfont
[ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
{dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
pop aload pop M} ifelse }ifelse }ifelse }
ifelse }
forall} bind def
/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
{dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
/MLshow { currentpoint stroke M
0 exch R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MRshow { currentpoint stroke M
exch dup MFwidth neg 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/MCshow { currentpoint stroke M
exch dup MFwidth -2 div 3 -1 roll R
Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
/XYsave { [( ) 1 2 true false 3 ()] } bind def
/XYrestore { [( ) 1 2 true false 4 ()] } bind def
end
%%EndProlog
gnudict begin
gsave
50 50 translate
0.050 0.050 scale
0 setgray
newpath
(Helvetica) findfont 140 scalefont setfont
1.000 UL
LTb
1.000 UL
LTa
938 448 M
6052 0 V
stroke
LTb
938 448 M
63 0 V
5989 0 R
-63 0 V
stroke
854 448 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 940 M
6052 0 V
stroke
LTb
938 940 M
63 0 V
5989 0 R
-63 0 V
stroke
854 940 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 200)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 1431 M
6052 0 V
stroke
LTb
938 1431 M
63 0 V
5989 0 R
-63 0 V
stroke
854 1431 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 400)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 1923 M
6052 0 V
stroke
LTb
938 1923 M
63 0 V
5989 0 R
-63 0 V
stroke
854 1923 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 600)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 2414 M
6052 0 V
stroke
LTb
938 2414 M
63 0 V
5989 0 R
-63 0 V
stroke
854 2414 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 800)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 2906 M
6052 0 V
stroke
LTb
938 2906 M
63 0 V
5989 0 R
-63 0 V
stroke
854 2906 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1000)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 3397 M
6052 0 V
stroke
LTb
938 3397 M
63 0 V
5989 0 R
-63 0 V
stroke
854 3397 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1200)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 3889 M
6052 0 V
stroke
LTb
938 3889 M
63 0 V
5989 0 R
-63 0 V
stroke
854 3889 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1400)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 4380 M
84 0 V
3087 0 R
2881 0 V
stroke
LTb
938 4380 M
63 0 V
5989 0 R
-63 0 V
stroke
854 4380 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1600)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 4872 M
6052 0 V
stroke
LTb
938 4872 M
63 0 V
5989 0 R
-63 0 V
stroke
854 4872 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1800)]
] -46.7 MRshow
1.000 UL
LTb
1.000 UL
LTa
938 448 M
0 4424 V
stroke
LTb
938 448 M
0 63 V
0 4361 R
0 -63 V
stroke
938 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
1947 448 M
0 3521 V
0 840 R
0 63 V
stroke
LTb
1947 448 M
0 63 V
0 4361 R
0 -63 V
stroke
1947 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 2)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
2955 448 M
0 3521 V
0 840 R
0 63 V
stroke
LTb
2955 448 M
0 63 V
0 4361 R
0 -63 V
stroke
2955 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
3964 448 M
0 3521 V
0 840 R
0 63 V
stroke
LTb
3964 448 M
0 63 V
0 4361 R
0 -63 V
stroke
3964 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 6)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
4973 448 M
0 4424 V
stroke
LTb
4973 448 M
0 63 V
0 4361 R
0 -63 V
stroke
4973 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 8)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
5981 448 M
0 4424 V
stroke
LTb
5981 448 M
0 63 V
0 4361 R
0 -63 V
stroke
5981 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 10)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTa
6990 448 M
0 4424 V
stroke
LTb
6990 448 M
0 63 V
0 4361 R
0 -63 V
stroke
6990 308 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 12)]
] -46.7 MCshow
1.000 UL
LTb
1.000 UL
LTb
938 4872 N
938 448 L
6052 0 V
0 4424 V
-6052 0 V
Z stroke
LCb setrgbcolor
280 2660 M
currentpoint gsave translate 90 rotate 0 0 moveto
[ [(Helvetica) 140.0 0.0 true true 0 (Execution time [s])]
] -46.7 MCshow
grestore
LTb
LCb setrgbcolor
3964 98 M
[ [(Helvetica) 140.0 0.0 true true 0 (Number of eNBs)]
] -46.7 MCshow
LTb
1.000 UP
1.000 UL
LTb
1.500 UP
2.000 UL
LT2
0.63 0.13 0.94 C LTb
1589 4704 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 1 UE per eNB)]
] -46.7 MLshow
LT2
0.63 0.13 0.94 C 1106 4704 M
399 0 V
1442 488 M
505 3 V
504 23 V
504 25 V
505 28 V
504 31 V
504 35 V
505 41 V
504 45 V
504 43 V
505 54 V
504 66 V
1442 488 Pls
1947 491 Pls
2451 514 Pls
2955 539 Pls
3460 567 Pls
3964 598 Pls
4468 633 Pls
4973 674 Pls
5477 719 Pls
5981 762 Pls
6486 816 Pls
6990 882 Pls
1306 4704 Pls
1.500 UP
2.000 UL
LT1
1.00 0.00 0.00 C LTb
1589 4494 M
[ [(Helvetica) 140.0 0.0 true true 0 ( 5 UE per eNB)]
] -46.7 MLshow
LT1
1.00 0.00 0.00 C 1106 4494 M
399 0 V
1442 503 M
505 63 V
504 78 V
504 99 V
505 119 V
504 154 V
504 180 V
505 212 V
504 250 V
504 263 V
505 294 V
504 312 V
1442 503 Crs
1947 566 Crs
2451 644 Crs
2955 743 Crs
3460 862 Crs
3964 1016 Crs
4468 1196 Crs
4973 1408 Crs
5477 1658 Crs
5981 1921 Crs
6486 2215 Crs
6990 2527 Crs
1306 4494 Crs
1.500 UP
2.000 UL
LT3
0.00 0.00 1.00 C LTb
1589 4284 M
[ [(Helvetica) 140.0 0.0 true true 0 (10 UE per eNB)]
] -46.7 MLshow
LT3
0.00 0.00 1.00 C 1106 4284 M
399 0 V
1442 542 M
505 113 V
504 162 V
504 197 V
505 258 V
504 334 V
504 386 V
505 442 V
504 487 V
504 527 V
505 577 V
504 602 V
1442 542 Star
1947 655 Star
2451 817 Star
2955 1014 Star
3460 1272 Star
3964 1606 Star
4468 1992 Star
4973 2434 Star
5477 2921 Star
5981 3448 Star
6486 4025 Star
6990 4627 Star
1306 4284 Star
3.000 UL
LT0
0.00 0.00 0.00 C LTb
1589 4074 M
[ [(Helvetica) 140.0 0.0 true true 0 (y = 10.756x)]
[(Helvetica) 112.0 70.0 true true 0 (2)]
[(Helvetica) 140.0 0.0 true true 0 ( + 11.274x + 16.249)]
] -60.7 MLshow
LT0
0.00 0.00 0.00 C 1106 4074 M
399 0 V
938 488 M
61 4 V
61 4 V
61 6 V
62 6 V
61 6 V
61 8 V
61 8 V
61 10 V
61 10 V
61 10 V
61 12 V
62 12 V
61 13 V
61 14 V
61 15 V
61 15 V
61 16 V
61 17 V
61 18 V
62 18 V
61 20 V
61 20 V
61 21 V
61 21 V
61 23 V
61 23 V
62 24 V
61 24 V
61 26 V
61 26 V
61 27 V
61 28 V
61 29 V
61 29 V
62 30 V
61 31 V
61 32 V
61 32 V
61 34 V
61 34 V
61 35 V
62 35 V
61 37 V
61 37 V
61 38 V
61 38 V
61 40 V
61 40 V
61 41 V
62 42 V
61 42 V
61 44 V
61 44 V
61 45 V
61 46 V
61 46 V
61 47 V
62 48 V
61 49 V
61 50 V
61 50 V
61 51 V
61 52 V
61 53 V
62 53 V
61 55 V
61 55 V
61 55 V
61 57 V
61 57 V
61 58 V
61 59 V
62 60 V
61 60 V
61 62 V
61 62 V
61 62 V
61 64 V
61 64 V
62 65 V
61 66 V
61 67 V
61 67 V
61 69 V
61 69 V
61 69 V
61 71 V
62 71 V
61 72 V
61 73 V
61 74 V
61 74 V
61 76 V
61 76 V
61 76 V
62 78 V
61 78 V
61 79 V
61 80 V
stroke
1.000 UL
LTb
938 4872 N
938 448 L
6052 0 V
0 4424 V
-6052 0 V
Z stroke
1.000 UP
1.000 UL
LTb
stroke
grestore
end
showpage
%%Trailer
%%DocumentFonts: Helvetica

View File

@@ -2,176 +2,330 @@
++++++++++++++++++++++++++
LTE Design Documentation
Design Documentation
++++++++++++++++++++++++++
An overview of the LTE module
*****************************
Design Criteria
~~~~~~~~~~~~~~~
The LTE module has the long term objective of supporting the evaluation of the following aspects of LTE systems:
* LTE Radio Resource Management
* QoS-aware Packet Scheduling
* Call Admission Control
* Inter-cell Interference Coordination
* Load Balancing
* Mobility
The LTE module has been designed to support the evaluation of the following aspects of LTE systems:
* Radio Resource Management
* QoS-aware Packet Scheduling
* Inter-cell Interference Coordination
* Dynamic Spectrum Access
In order to model LTE systems to a level of detail that is sufficient to allow a correct evaluation of the above mentioned aspects, the following assumptions have been made:
In order to model LTE systems to a level of detail that is sufficient to allow a
correct evaluation of the above mentioned aspects, the following requirements
have been considered:
#. At the radio level, the granularity of the model should be at least that of the Resource Block. In fact, this is the fundamental unit being used for resource allocation. Without this minimum level of granularity, it is not possible to model accurately, for example, packet scheduling and inter-cell-interference solutions. Note that this design choice rules out system level simulator, which work at the granularity of call / bearer establishment.
#. The simulator should scale up to tens of eNBs and hundreds of UEs. This rules out the use of a link level simulator, i.e., a simulator whose radio interface is modeled with a granularity up to the symbol level. This is becaise a symbol layer model needs to implement all the PHY layer signal processing, whose huge complexity severely limits scalability in terms of number of eNBs and UEs. In fact, link-level simulators are normally limited to a single eNB and one or a few UEs.
#. MAC-level KPIs (e.g., per-UE and per-bearer throughput, delay and loss rate measured at the RLC PDU level) are probably the most straightforward KPIs that can be extracted by the simulator. Still, these KPIs cannot be mapped directly to the Quality of Experience (QoE) perceived by the end user, at least without some gross approximation. Hence, to allow a proper evaluation of the QoE, the LTE user plane protocol stack should be modeled accurately. In particular, the RLC protocol should be modeled: in fact, since the RLC takes care of fragmentation, concatenation & fragment retransmission of user-plane IP packets, it
#. While it is acceptable to idealize some aspects of the control plane for ease of simulations, there are some other aspects that need to be modeled in order to obtain accurate simulation results. For example, control signaling consumes radio resources and can be the cause of a limitation in the user-perceived performance; furthermore, the correct or erroneous reception of the control signalling affects important aspects of LTE such as cell selection by the UEs and the neighbor relation function of the eNBs.
#. At the radio level, the granularity of the model should be at least that
of the Resource Block (RB). In fact, this is the fundamental unit being used for
resource allocation. Without this minimum level of granularity, it is not
possible to model accurately packet scheduling and
inter-cell-interference.
The reason is that, since packet scheduling is done on
a per-RB basis, an eNB might transmit on a subset only of all the available
RBs, hence interfering with other eNBs only on those RBs where it is
trasmitting.
Note that this requirement rules out the adoption of a system lever simulation
approach, which evaluates resource allocation only at the granularity of
call/bearer establishment.
#. The simulator should scale up to tens of eNBs and hundreds of User
Equipments (UEs). This
rules out the use of a link level simulator, i.e., a simulator whose radio
interface is modeled with a granularity up to the symbol level. This is because
to have a symbol level model it is necessary to implement all the PHY
layer signal processing, whose huge computational complexity severely limits
simulation. In fact, link-level simulators are normally limited to a single eNB
and one or a few UEs.
#. It should be possible within the simulation to configure different cells
so that they use different carrier frequencies and system bandwidths. The
bandwidth used by different cells should be allowed to overlap, in order to
support dynamic spectrum licensing solutions such as those described in
in~\cite{ofcom2.6GHz, RealWireless}. The calculation of interference should
handle appropriately this case.
#. To be more representative of the LTE standard, as well as to be as
close as possible to real-world implementations, the simulator
should support the MAC Scheduler API published by the FemtoForum
[FFAPI]_. This interface is expected to be used by femtocell manufacturers
for the implementation of scheduling and Radio Resource Management
(RRM) algorithms. By introducing support for this interface in the
simulator, we make it possible for LTE equipment vendors and
operators to test in a simulative environment exactly the same
algorithms that would be deployed in a real system.
#. The LTE simulation module should contain its own implementation of
the API defined in [FFAPI]_. Neither
binary nor data structure compatibility with vendor-specific implementations
of the same interface are expected; hence, a compatibility layer should be
interposed whenever a vendor-specific MAC scheduler is to be used
with the simulator. This requirement is necessary to allow the
simulator to be independent from vendor-specific implementations of this
interface specification. We note that [FFAPI]_ is a logical
specification only, and its implementation (e.g., translation to some specific
programming language) is left to the vendors.
Module Architecture
~~~~~~~~~~~~~~~~~~~
The overall architecture of the LTE module is represented in the following figures.
.. figure:: figures/lte-enb-architecture.*
:align: right
The overall architecture of the LTE module is represented in the
figures :ref:`fig-lte-enb-architecture` and :ref:`fig-lte-ue-architecture`, which
deal respectively with the eNB and the UE. A detailed description of the most
important components are provided in the following sections.
The architecture of the LTE eNB
.. figure:: figures/lte-ue-architecture.*
:align: right
The architecture of the LTE UE
.. _fig-lte-enb-architecture:
.. figure:: figures/lte-enb-architecture.*
Architecture of the LTE eNB
Detailed description of the components
**************************************
.. _fig-lte-ue-architecture:
.. _ff-mac-sched-api:
.. figure:: figures/lte-ue-architecture.*
The FemtoForum MAC Scheduler Interface
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes the ns-3 specific version of the `FemtoForum LTE MAC Scheduler Interface Specification v1.11 <http://www.femtoforum.org/femto/technical.php>`_
The goals of the definition of this MAC scheduler API in the |ns3| network simulator are:
* to let MAC's developers to implement its own MAC schedulers allowing these developers to provide the standard MAC scheduler API.
* to let MAC's users to use different MAC schedulers using always the same standard MAC scheduler API.
Architecture of the LTE UE
Design
++++++
The MAC Scheduler interface is **specified** or defined as **abstract classes**. The MAC Scheduler interface is **implemented** as **derived classes** from the abstract classes. We have splitted the MAC Scheduler interface into 4 abstract classes:
* SCHED SAP API
* Provider Side is specified in the ``FfMacSchedSapProvider`` class
* User Side is specified in the ``FfMacSchedSapUser`` class
* CSCHED SAP API
* Provider Side is specified in the ``FfMacCschedSapProvider`` class
* User Side is specified in the ``FfMacCschedSapUser`` class
The FemtoForum MAC Scheduler Interface
++++++++++++++++++++++++++++++++++++++
This section describes the ns-3 specific version of the LTE MAC
Scheduler Interface Specification published by the FemtoForum [FFAPI]_.
We implemented the ns-3 specific version of the FemtoForum MAC Scheduler
Interface [FFAPI]_ as a set of C++ abstract
classes; in particular, each primitive is translated to a C++ method of a
given class. The term *implemented* here is used with the same
meaning adopted in [FFAPI]_, and hence refers to the process of translating
the logical interface specification to a particular programming language.
The primitives in [FFAPI]_ are grouped in two groups: the CSCHED
primitives, which deal with scheduler configuration, and the SCHED primitives,
which deal with the execution of the scheduler. Furthermore, [FFAPI]_
defines primitives of two different kinds: those of type REQ go from the MAC to
the Scheduler, and those of type IND/CNF go from the scheduler to the MAC. To
translate these characteristics into C++, we define the following abstract
classes that implement Service Access Points (SAPs) to be used to issue the
primitives:
* the ``FfMacSchedSapProvider`` class defines all the C++ methods that
correspond to SCHED primitives of type REQ;
* the ``FfMacSchedSapUser`` class defines all the C++ methods that
correspond to SCHED primitives of type CNF/IND;
* the ``FfMacCschedSapProvider`` class defines all the C++ methods that
correspond to CSCHED primitives of type REQ;
* the ``FfMacCschedSapUser`` class defines all the C++ methods that
correspond to CSCHED primitives of type CNF/IND;
There are 3 blocks involved in the MAC Scheduler interface: Control block, Subframe block and Scheduler block. Each of these blocks provide one part of the MAC Scheduler interface. The following figure shows the relationship between the blocks and the Service Access Points they provide.
There are 3 blocks involved in the MAC Scheduler interface: Control block,
Subframe block and Scheduler block. Each of these blocks provide one part of the
MAC Scheduler interface. The figure below shows the relationship
between the blocks and the SAPs defined in our implementation of the MAC
Scheduler Interface.
.. figure:: figures/ff-mac-saps.*
Implementation details
++++++++++++++++++++++
In addition to the above principles, the following design choices have been
taken:
This subsection details the criteria adopted during the development of the FF MAC API:
* The definition of the MAC Scheduler interface follows the naming conventions of the |ns3| Coding Style. In particular, we follow the CamelCase convention for the primitive names. For example, the primitive **CSCHED_CELL_CONFIG_REG** is translated to ``CschedCellConfigReg`` in the |ns3| code.
* The same naming conventions are followed for the primitive parameters. As the primitive parameters are member variables of classes, they are also prefixed with a ``m_``.
* FF MAC API is a C-based oriented API but |ns3| network simulator is written in C++. So, STL vectors (``std::vector``) are used, instead of using C arrays as the FF MAC API document suggests.
* In C++, members with constructors and destructors are not allow in ``unions``. These ``unions`` have been converted to ``structs``.
Usage in the ns-3 LTE module
++++++++++++++++++++++++++++
To clarify how the MAC Scheduler Interface is used within the eNB, we consider the example of the Round Robin Scheduler which is depicted in the figure below. To interact with the MAC of the eNB, the Round Robin scheduler implements the Provider side of the SCHED SAP and CSCHED SAP interfaces. The MAC of the eNB implements the provider side of the SCHED SAP and CSCHED SAP interfaces. A similar approach is If you plan to develop your own scheduler, we advise to create your own class taking inspiration from the Round Robin scheduler.
The User side of both the CSCHED SAP and the SCHED SAP are implemented in the file ``lte-enb-mac.cc``. You are normally not expected to modify these files in order to implement your own scheduler.
* The definition of the MAC Scheduler interface classes follows the naming
conventions of the |ns3| Coding Style. In particular, we follow the
CamelCase convention for the primitive names. For example, the primitive
``CSCHED_CELL_CONFIG_REG`` is translated to ``CschedCellConfigReg``
in the |ns3| code.
* The same naming conventions are followed for the primitive parameters. As
the primitive parameters are member variables of classes, they are also prefixed
with a ``m_``.
* regarding the use of vectors and lists in data structures, we note
that [FFAPI]_ is a pretty much C-oriented API. However, considered that
C++ is used in ns-3, and that the use of C arrays is discouraged, we used STL
vectors (``std::vector``) for the implementation of the MAC Scheduler
Interface, instead of using C arrays as implicitly suggested by the
way [FFAPI]_ is written.
* In C++, members with constructors and destructors are not allow in
``unions``. Hence all those data structures that are said to be
``unions`` in [FFAPI]_ have been defined as ``structs`` in our code.
The figure below shows how the MAC Scheduler Interface is
used within the eNB.
.. figure:: figures/ff-example.*
The User side of both the CSCHED SAP and the SCHED SAP are
implemented within the eNB MAC, i.e., in the file ``lte-enb-mac.cc``.
The eNB MAC can be used with different scheduler implementations without
modifications. The same figure also shows, as an example, how the Round Robin
Scheduler is implemented: to interact with the MAC of the eNB, the Round Robin
scheduler implements the Provider side of the SCHED SAP and CSCHED
SAP interfaces. A similar approach can be used to implement other schedulers as
well. A description of all the scheduler implementations that we provide as
part of our LTE simulation module will be given in
the following.
MAC Scheduler Implementations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In this section we describe the features of the MAC Scheduler Implementations that are included with the simulator. Both these models are well-known from the literature. The reason for their inclusion is twofold: first, they can be used as starting code base for the development of more advanced schedulers; second, they can be used as reference algorithm when doing performance evaluation. With this latter respect, we stress that the use of a publicly available scheduler implementation as the reference for a performance evaluation study is beneficial to the authoritativeness of the study itself.
Resource Allocation Model
+++++++++++++++++++++++++
Before describing the schedulers, we would like introduce a bit the problem of resource allocation in LTE. The scheduler is in charge of generating specific structures calles Data Control Indication (DCI) by which communicates to the users connected the resource allocation per subframe basis. In doing this in the downlink direction, the scheduler has to fill some specific fields of the DCI structure with all the information, such as: MCS, TB size and the allocation bitmap. The latter bitmap can be coded in different manner, in this implementation we considered the "allocation Type 0" [36.213], which implies the aggregation of the RB in group of different size as function of the bandwidth in use. This implies that for certain bandwidth values not all the RBs are usable, since the group size is not a common divisor of the group. This is for instance the case when system bandwith is equal to 25 RBs, which results in a RBG size of 2 RBs and therefore 1 RB will result not addressable.
In uplink the structure of the DCIs changes and since it uses only adjacent RBs allows the use of all RBs in all the configurations.
On this matter, another constaint of LTE is represented by the assumption that the scheduler can allocate only one transport channel to a user. This implies that the control of the scheduler is only per users basis and the different LCs have to be multiplxed in the same transport block.
We now briefly describe how resource allocation is handled in LTE,
clarifying how it is implemented in the simulator. The scheduler is in
charge of generating specific structures calles Data Control Indication (DCI)
which are then transmitted by the PHY of the eNB to the connected UEs, in order
to inform them of the resource allocation on a per subframe basis. In doing this
in the downlink direction, the scheduler has to fill some specific fields of the
DCI structure with all the information, such as: the Modulation and Coding
Scheme (MCS) to be used, the MAC Transport Block (TB) size, and the allocation
bitmap which identifies which RBs will contain the data
tranmitted by the eNB to each user.
For the mapping of resources to
physical RBs, we adopt a *localized mapping* approach
(see [Sesia2009]_, Section 9.2.2.1);
hence in a given subframe each RB is always allocated to the same user in both
slots.
The allocation bitmap can be coded in
different formats; in this implementation, we considered the *Allocation
Type 0* defined in [TS36.213]_, according to which the RBs are grouped in
Resource Block Groups (RBG) of different size determined as a function of the
Transmission Bandwidth Configuration in use.
For certain bandwidth
values not all the RBs are usable, since the
group size is not a common divisor of the group. This is for instance the case
when the bandwith is equal to 25 RBs, which results in a RBG size of 2 RBs, and
therefore 1 RB will result not addressable.
In uplink the format of the DCIs is different, since only adjacent RBs
can be used because of the SC-FDMA modulation. As a consequence, all
RBs can be allocated by the eNB regardless of the bandwidth
configuration.
Adaptive Modulation and Coding
++++++++++++++++++++++++++++++
The Adaptive Modulation and Coding (AMC) model that we provide in the
simulator is a modified version of the model described in [Piro2011]_,
which in turn is inspired from [Seo2004]_. Our version is described in the
following. Let :math:`i` denote the
generic user, and let :math:`\gamma_i` be its SINR. We get the spectral efficiency
:math:`\eta_i` of user :math:`i` using the following equations:
.. math::
\mathrm{BER} = 0.00005
\Gamma = \frac{ -\ln{ (5 * \mathrm{BER}) } }{ 1.5}
\eta_i = \log_2 { \left( 1 + \frac{ {\gamma}_i }{ \Gamma } \right)}
The procedure described in [R1-081483]_ is used to get
the corresponding MCS scheme. The spectral efficiency is quantized based on the
CQI (rounding to the lowest value) and is mapped to the corresponding MCS
scheme.
Finally, wenote that there are some discrepancies between the MCS index
in [R1-081483]_
and that indicated by the standard: [TS36.213]_ Table
7.1.7.1-1 says that the MCS index goes from 0 to 31, and 0 appears to be a valid
MCS scheme (TB size is not 0) but in [R1-081483]_ the first useful MCS
index
is 1. Hence to get the value as intended by the standard we need to subtract 1
from the index reported in [R1-081483]_.
Round Robin (RR) Scheduler
++++++++++++++++++++++++++
The RR scheduler is one of the simpliest solution in literature. It divides the available resources among the active flows, which means all the logical channels that has something in the queues. In case the number of active flows is greater then the number of RBGs available, the RR scheduler allocates the users in a round robin fashion within multiples subframes (i.e., users that cannot be allocated in a subframe will be allocated in the subsequents ones). The evaluation of the MCS to be adopted for each user is done according to the received wideband CQIs.
The Round Robin (RR) scheduler is probably the simplest scheduler found in the literature. It works by dividing the
available resources among the active flows, i.e., those logical channels which have a non-empty RLC queue. If the number of RBGs is greater than the number of active flows, all the flows can be allocated in the same subframe. Otherwise, if the number of active flows is greater than the number of RBGs, not all the flows can be scheduled in a given subframe; then, in the next subframe the allocation will start from the last flow that was not allocated. The MCS to be adopted for each user is done according to the received wideband CQIs.
Proportional Fair (PF) Scheduler
++++++++++++++++++++++++++++++++
The PF scheduler[5]_ philosophy is to schedule a user when its instantaneous channel quality is high relative to its own average channel condition over time. In formula this implies that a user :math:`k` is allocated to a rb :math:`m` in a subframe :math:`f` when it is the one that maximizes the formula
:math:`\hat{k_{m}} = \underset{k`=1,...,k}{\operatorname{argmax}}\frac{ R_\mathrm{k`}(m,f) }{ T_\mathrm{k`}(f) }\end{split}\notag`
where :math:`T_{k}(f)` is the long-term average througput perceived by the user :math:`k` during the subframe :math:`f` and :math:`R_{k}(m,f)` is the achievable rate evaluated by the PFS during the subframe :math:`f`. The latter is evaluated by estimating the MCS to be used according to the the inband CQIs of the user :math:`k` in RB :math:`m` and therefore computing the TB size as function of the MCS considering the transmission of a single RB. The long-term average user throughputs are computed each subframe by
The Proportional Fair (PF) scheduler [Sesia2009]_ works by scheduling a user
when its
instantaneous channel quality is high relative to its own average channel
condition over time. Let :math:`i,j` denote generic users; let :math:`t` be the
subframe index, and :math:`k` be the resource block index; let :math:`M_{i,k}(t)` be MCS
usable by user :math:`i` on resource block :math:`k` according to what reported by the AMC
model (see `Adaptive Modulation and Coding`_); finally, let :math:`S(M, B)` be the TB
size in bits as defined in [TS36.213]_ for the case where a number :math:`B` of
resource blocks is used. The achievable rate :math:`R_{i}(k,t)` in bit/s for user :math:`i`
on resource block :math:`k` at subframe :math:`t` is defined as
:math:`T_\mathrm{k}(f) = (1-\frac{1}{t_\mathrm{c}})T_{k}(f-1)+\frac{1}{t_\mathrm{c}}\sum{i}^{M}_{m = 1}R_\mathrm{k}(m,f)\Phi(\hat{k_{m}}=k\end{split})\notag
%\begin{split}T_\mathrm{k}(f) = (1-\frac{1}{t_\mathrm{c}})T_{k}(f-1)+\frac{1}{t_\mathrm{c}\sum{i}^{M}_{m = 1}R_\mathrm{k}(m,f)\I\{\hat{k_\matrm{m}}=k\}`
.. math::
where :math:`t_c` is the time window over which the fairness is imposed and :math:`\Phi(\cdot)` is the indicator function equal to one if :math:`\hat{k_m}=k` and zero otherwise. According to this allocation scheme a user can be allocated to different RBGs either undjacents as function of the actual condition of the channel and its past history in terms of throughput.
R_{i}(k,t) = \frac{S\left( M_{i,k}(t), 1\right)}{\tau}
where :math:`\tau` is the TTI duration.
At the start of each subframe :math:`t`, all the RBs are assigned to a certain user.
In detail, the index :math:`\widehat{i}_{k}(t)` to which RB :math:`k` is assigned at time
:math:`t` is determined as
LTE Spectrum Model
~~~~~~~~~~~~~~~~~~
.. math::
Here we describe how the LTE spectrum model works and what it allows to do.
\widehat{i}_{k}(t) = \underset{j=1,...,N}{\operatorname{argmax}}
\left( \frac{ R_{j}(k,t) }{ T_\mathrm{j}(t) } \right)
where :math:`T_{j}(t)` is the past througput performance perceived by the
user :math:`j`.
According to the above scheduling algorithm, a user can be allocated to
different RBGs, which can be either adjacent or not, depending on the current
condition of the channel and the past throughput performance :math:`T_{j}(t)`. The
latter is determined at the end of the subframe :math:`t` using the following
exponential moving average approach:
.. math::
Physical layer
~~~~~~~~~~~~~~
The physical layer model provided in this LTE simulator model supports Frequency Division Duplex (FDD) only.
T_{j}(t) =
(1-\frac{1}{\alpha})T_{j}(t-1)
+\frac{1}{\alpha} \widehat{T}_{j}(t)
where :math:`\alpha` is the time constant (in number of subframes) of
the exponential moving average, and :math:`\widehat{T}_{j}(t)` is the actual
throughput achieved by the user :math:`i` in the subframe :math:`t`. :math:`\widehat{T}_{j}(t)`
is measured according to the following procedure. First we
determine the MCS :math:`\widehat{M}_j(t)` actually used by user
:math:`j`:
.. math::
Propagation Loss Models
~~~~~~~~~~~~~~~~~~~~~~~
NOTE: this information refers to the GSoC model, which as of this writing is not working anymore.
\widehat{M}_j(t) = \min_{k: \widehat{i}_{k}(t) = j}{M_{j,k}(t)}
A proper propagation loss model has been developed for the LTE E-UTRAN interface (see [2]_ and [3]_).
It is used by the PHY layer to compute the loss due to the propagation.
then we determine the total number :math:`\widehat{B}_j(t)` of RBs allocated to user
:math:`j`:
The LTE propagation loss model is composed by 4 different models (shadowing, multipath,
penetration loss and path loss) [2]_:
.. math::
* Pathloss: :math:`PL = 128.1 + (37.6 * log10 (R))`, where R is the distance between the
UE and the eNB in Km.
\widehat{B}_j(t) = \left| \{ k : \widehat{i}_{k}(t) = j \} \right|
* Multipath: Jakes model
where :math:`|\cdot|` indicates the cardinality of the set; finally,
* PenetrationLoss: 10 dB
.. math::
* Shadowing: log-normal distribution (mean=0dB, standard deviation=8dB)
\widehat{T}_{j}(t) = \frac{S\left( \widehat{M}_j(t), \widehat{B}_j(t)
\right)}{\tau}
Every time that the ``LteSpectrumPHY::StartRx ()`` function is called, the
``SpectrumInterferenceModel`` is used to computed the SINR, as proposed in [3]_. Then,
@@ -179,22 +333,43 @@ the network device uses the AMC module to map the SINR to a proper CQI and to se
to the eNB using the ideal control channel.
References
**********
RRC and RLC Models
++++++++++++++++++++++++++++++
.. [1] N. Baldo and M. Miozzo, Spectrum-aware Channel and PHY layer modeling for ns3, Proceedings
of ICST NSTools 2009, Pisa, Italy. The framework is designed to simulate only data
transmissions. For the transmission of control messages (such as CQI feedback, PDCCH,
etc..) will be used an ideal control channel).
At the time of this writing, the RRC and the RLC models implemented in the simulator are not comprehensive of all the funcionalities defined
by the 3GPP standard. The RRC mainly includes the procedures for managing the connection of the UEs to the eNBs, and to setup and release the Radio Bearers. The RLC model takes care of the generation of RLC PDUs in response to the notification of transmission opportunities, which are notified by the scheduler using the primitives specified in~\cite{ffapi}. The current RLC implementation simulates saturation conditions, i.e., it assumes that the RLC buffer is always full and can generate a new PDU whenever notified by the scheduler. We note that, although this is an unrealistic traffic model, it still allows for the correct simulation of scenarios with flow belonging to different QoS classes in order to test the QoS performance obtained by different schedulers. This can be done since it is the task of the Scheduler to assign transmission resources based on the characteristics of each Radio Bearer which are specified upon the creation of each Bearer at the start of the simulation.
.. [2] 3GPP TS 25.814 ( http://www.3gpp.org/ftp/specs/html-INFO/25814.htm )
LTE Spectrum Model
++++++++++++++++++
The usage of the radio spectrum by eNBs and UEs in LTE is described in
[TS36.101]_. In the simulator, radio spectrum usage is modeled as follows.
Let :math:`f_c` denote the LTE Absolute Radio Frequency Channel Number, which
identifies the carrier frequency on a 100 kHz raster; furthermore, let :math:`B` be
the Transmission Bandwidth Configuration in number of Resource Blocks. For every
pair :math:`(f_c,B)` used in the simulation we define a corresponding spectrum
model using the Spectrum framework framework described
in [Baldo2009]_. :math:`f_c` and :math:`B` can be configured for every eNB instantiated
in the simulation; hence, each eNB can use a different spectrum model. Every UE
will automatically use the spectrum model of the eNB it is attached to. Using
the MultiModelSpectrumChannel described in [Baldo2009]_, the interference
among eNBs that use different spectrum models is properly accounted for.
This allows to simulate dynamic spectrum access policies, such as for
example the spectrum licensing policies that are
discussed in [Ofcom2.6GHz]_.
.. [3] Giuseppe Piro, Luigi Alfredo Grieco, Gennaro Boggia, and Pietro Camarda", A Two-level
Scheduling Algorithm for QoS Support in the Downlink of LTE Cellular Networks", Proc. of
European Wireless, EW2010, Lucca, Italy, Apr., 2010 ( draft version is available on
http://telematics.poliba.it/index.php?option=com_jombib&task=showbib&id=330 )
.. [4] 3GPP R1-081483 (available on
http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip )
.. [5] S. Sesia, I. Toufik and M. Baker, “LTE The UMTS Long Term Evolution”, Ed Wiley, 2009.
Physical layer
++++++++++++++
The physical layer model provided in this LTE simulator is based on
the one described in [Piro2011]_, with the following modifications. The model now includes the
inter cell intereference calculation and the simulation of uplink traffic, including both packet transmission and CQI generation. Regarding CQIs in particular, their evaluation
has been refined to comply with the scheduler interface specification [FFAPI]_. In detail, we considered the generation
of periodic wideband CQI (i.e., a single value of channel state that is deemed representative of all RBs
in use) and inband CQIs (i.e., a set of value representing the channel state for each RB).

View File

@@ -0,0 +1,41 @@
.. [Sesia2009] S. Sesia, I. Toufik and M. Baker, "LTE - The UMTS Long Term Evolution - from theory to practice",
Wiley, 2009
.. [Baldo2009] N. Baldo and M. Miozzo, "Spectrum-aware Channel and PHY layer modeling for ns3",
Proceedings of ICST NSTools 2009, Pisa, Italy.
.. [Piro2010] Giuseppe Piro, Luigi Alfredo Grieco, Gennaro Boggia, and Pietro Camarda, A Two-level
Scheduling Algorithm for QoS Support in the Downlink of LTE Cellular Networks", Proc. of
European Wireless, EW2010, Lucca, Italy, Apr., 2010
.. [Kushner2004] H.J. Kushner and P.A. Whiting, "Convergence of proportional-fair sharing algorithms under general conditions",
IEEE Trans. on Wireless Communications, July 2004
.. [Piro2011] G. Piro, N. Baldo. M. Miozzo, "An LTE module for the ns-3 network simulator",
in Proc. of Wns3 2011 (in conjunction with SimuTOOLS 2011), March 2011, Barcelona (Spain)
.. [Seo2004] H. Seo, B. G. Lee. "A proportional-fair power allocation scheme for fair and efficient multiuser OFDM systems",
in Proc. of IEEE GLOBECOM, December 2004. Dallas (USA)
.. [Ofcom2.6GHz] Ofcom, "Consultation on assessment of future mobile
competition and proposals for the award of 800 MHz and 2.6 GHz
spectrum and related issues", March 2011
.. [TS36.101] 3GPP TS 36.101 "E-UTRA User Equipment (UE) radio transmission and reception"
.. [TS36.213] 3GPP TS 36.213 "E-UTRA Physical layer procedures"
.. [TS25.814] 3GPP TS 25.814 "Physical layer aspect for evolved Universal Terrestrial Radio Access"
.. [R1-081483] 3GPP R1-081483 "Conveying MCS and TB size via PDCCH" http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip
.. [FFAPI] FemtoForum LTE MAC Scheduler Interface Specification v1.11 http://www.femtoforum.org/femto/technical.php
.. [ns3tutorial] The ns-3 Tutorial http://www.nsnam.org/docs/tutorial/html/
.. [ns3manual] The ns-3 Tutorial http://www.nsnam.org/docs/manual/html/

View File

@@ -2,7 +2,7 @@
+++++++++++++++++++++++++++
LTE Testing Documentation
Testing Documentation
+++++++++++++++++++++++++++
@@ -40,29 +40,62 @@ Unit Tests
SINR calculation in the Downlink
--------------------------------
The test suite ``lte-downlink-sinr`` checks that the SINR calculation in downlink is performed correctly. The SINR in the downlink is calculated for each Resource Block assigned to data transmissions by dividing the power of the intended signal from the considered eNB by the sum of the noise power plus all the transmissions on the same RB coming from other eNBs (the interference signals).
The test suite ``lte-downlink-sinr``
checks that the SINR calculation in
downlink is performed correctly. The SINR in the downlink is calculated for each
RB assigned to data transmissions by dividing the power of the
intended signal from the considered eNB by the sum of the noise power plus all
the transmissions on the same RB coming from other eNBs (the interference
signals):
.. math::
\gamma = \frac{ P_\mathrm{signal} }{ P_\mathrm{noise} + \sum P_\mathrm{interference} }
In general, different signals can be active during different periods of time. We define a *chunk* as the time interval between any two events of type either start or end of a waveform. In other words, a chunk identifies a time interval during which the set of active waveforms does not change. Let :math:`i` be the generic chunk, :math:`T_i` its duration and :math:`\mathrm{SINR_i}` its SINR, calculated with the above equation. The calculation of the average SINR :math:`\overline{\gamma}` to be used for CQI feedback reporting uses the following formula:
In general, different signals can be active during different periods
of time. We define a *chunk* as the time interval between any two
events of type either start or end of a waveform. In other words, a
chunk identifies a time interval during which the set of active
waveforms does not change. Let :math:`i` be the generic chunk,
:math:`T_i` its duration and :math:`\mathrm{SINR_i}` its SINR,
calculated with the above equation. The calculation of the average
SINR :math:`\overline{\gamma}` to be used for CQI feedback reporting
uses the following formula:
.. math::
\overline{\gamma} = \frac{ \sum_i {\gamma}_i T_i }{ \sum_i T_{i} }
The test suite checks that the above calculation is performed correctly in the simulator. The test vectors are obtained offline by an Octave script that implements the above equation, and that recreates a number of random transmitted signals and interference signals that mimic a scenario where an UE is trying to decode a signal from an eNB while facing interference from other eNBs. The test passes if the calculated values are equal to the test vector within a tolerance of :math:`10^{-7}`. The tolerance is meant to account for the approximation errors typical of floating point arithmetic.
The test suite checks that the above calculation is performed
correctly in the simulator. The test vectors are obtained offline by
an Octave script that implements the above equation, and that
recreates a number of random transmitted signals and interference
signals that mimic a scenario where an UE is trying to decode a signal
from an eNB while facing interference from other eNBs. The test passes
if the calculated values are equal to the test vector within a
tolerance of :math:`10^{-7}`. The tolerance is meant to account for
the approximation errors typical of floating point arithmetic.
SINR calculation in the Uplink
------------------------------
The test suite ``lte-uplink-sinr`` checks that the SINR calculation in uplink is performed correctly. This test suite is identical to ``lte-downlink-sinr`` described in the previous section, with the difference than both the signal and the interference now refer to transmissions by the UEs, and reception is performed by the eNB.
This test suite recreates a number of random transmitted signals and interference signals to mimic a scenario where an eNB is trying to decode the signal from several UEs simultaneously (the ones in the cell of the eNB) while facing interference from other UEs (the ones belonging to other cells).
The test suite ``lte-uplink-sinr`` checks that the SINR calculation in
uplink is performed correctly. This test suite is identical to
``lte-downlink-sinr`` described in the previous section, with the
difference than both the signal and the interference now refer to
transmissions by the UEs, and reception is performed by the eNB.
This test suite recreates a number of random transmitted signals and
interference signals to mimic a scenario where an eNB is trying to
decode the signal from several UEs simultaneously (the ones in the
cell of the eNB) while facing interference from other UEs (the ones
belonging to other cells).
The test vectors are obtained by a dedicated Octave script. The test passes if the calculated values are equal to the test vector within a tolerance of :math:`10^{-7}` which, as for the downlink SINR test, deals with floating point arithmetic approximation issues.
The test vectors are obtained by a dedicated Octave script. The test
passes if the calculated values are equal to the test vector within a
tolerance of :math:`10^{-7}` which, as for the downlink SINR test,
deals with floating point arithmetic approximation issues.
System Tests
@@ -71,91 +104,156 @@ System Tests
Adaptive Modulation and Coding
------------------------------
The test suite ``lte-link-adaptation`` provides system tests recreating a scenario with a single eNB and a single UE. Different test cases are created corresponding to different SINR values perceived by the UE. The aim of the test is to check that in each test case the chosen MCS corresponds to the values in a known test vector.
The test suite ``lte-link-adaptation`` provides system tests recreating a
scenario with a single eNB and a single UE. Different test cases are created
corresponding to different SINR values perceived by the UE. The aim of the test
is to check that in each test case the chosen MCS corresponds to some known
reference values. These reference values are obtained by re-implementing the
model described in Section~\ref{sec:amc} in Octave. The resulting test vector is
represented in Figure :ref:`fig-lte-mcs-index`.
The test vector is obtained with the model described in [Piro2011]_ which cites [Seo2004]_. Here we described how this model works. Let :math:`i` denote the generic user, and let :math:`\gamma_i` be its SINR. We get the spectral efficiency :math:`\eta_i` of user :math:`i` using the following equations:
.. math::
\mathrm{BER} = 0.00005
.. math::
\Gamma = \frac{ -\ln{ (5 * \mathrm{BER}) } }{ 1.5 }
.. math::
\eta_i = \log_2 { \left( 1 + \frac{ {\gamma}_i }{ \Gamma } \right) }
Then, 3GPP [R1-081483]_ document (its XLS sheet annexed file) is used to get the corresponding MCS scheme. The spectral efficiency is quantized based on the CQI (rounding to the lowest value) and is mapped to the corresponding MCS scheme (i.e. the MCS index that appears on the same line looking at the MCS table on the right). Note that the quantization of the CQI is coarser than the spectral efficiency reported in the CQI table.
Finally, note that there are some discrepancies between the MCS index in [R1-081483]_ and that indicated by the standard: [TS36.213]_ Table 7.1.7.1-1 says that the MCS index goes from 0 to 31, and 0 appears to be a valid MCS scheme (TB size is not 0) but in [R1-081483]_ the first useful MCS index is 1. Hence to get the value as intended by the standard we need to subtract 1 from the index reported in [R1-081483]_.
The test passes if both the following conditions are verified:
#. the SINR calculated by the UE corresponds to the value intended for the given test case within a tolerance of :math:`10^{-7}`. The tolerance is meant to account for the approximation errors typical of floating point arithmetic. This test condition acts as a system test of the SINR calculation. This is needed because the other test suites that deal with the SINR calculation are unit tests, and hence might not be able to detect system-level bugs in the SINR calculation.
#. the MCS index chosen by the scheduler matches exactly with the MCS index in the test vector, determined using the above described procedure.
In the following figure, we see the modulation to be used depending on the MCS index. This mapping is defined in [R1-081483]_.
.. _fig-lte-mcs-index:
.. figure:: figures/lte-mcs-index.*
:align: center
Modulation depending on the SINR and MCS index
Test vector for Adaptive Modulation and Coding
Round Robin scheduler performance
---------------------------------
The test suite ``lte-rr-ff-mac-scheduler`` creates different test cases with a single eNB and several UEs, all having the same Radio Bearer specification. In each test case, the UEs see the same SINR from the eNB; different test cases are implemented by using different distance among UEs and the eNB (i.e., therefore having different SINR values) and different numbers of UEs. The test consists on checking that the obtained throughput performance is equal among users and matches a reference throughput value obtained according to the SINR perceived within a given tolerance.
The test vector is obtained according to the values of transport block size reported in table 7.1.7.2.1-1 of [TS36.213]_, considering an equal distribution of the physical resource block among the users using Resource Allocation Type 0 as defined in Section 7.1.6.1 of [TS36.213]_. Let :math:`\tau` be the TTI duration, :math:`N` be the number of UEs, :math:`B` the transmission bandwidth configuration in number of RBs, :math:`G` the RBG size, :math:`M` the modulation and coding scheme in use at the given SINR and :math:`S(M, B)` be the transport block size in bits as defined by 3GPP TS 36.213. We first calculate the number :math:`L` of RBGs allocated to each user as
The test suite ``lte-rr-ff-mac-scheduler`` creates different test cases with
a single eNB and several UEs, all having the same Radio Bearer specification. In
each test case, the UEs see the same SINR from the eNB; different test cases are
implemented by using different distance among UEs and the eNB (i.e., therefore
having different SINR values) and different numbers of UEs. The test consists on
checking that the obtained throughput performance is equal among users and
matches a reference throughput value obtained according to the SINR perceived
within a given tolerance.
The test vector is obtained according to the values of transport block
size reported in table 7.1.7.2.1-1 of [TS36.213]_, considering an
equal distribution of the physical resource block among the users
using Resource Allocation Type 0 as defined in Section 7.1.6.1 of
[TS36.213]_. Let :math:`\tau` be the TTI duration, :math:`N` be the
number of UEs, :math:`B` the transmission bandwidth configuration in
number of RBs, :math:`G` the RBG size, :math:`M` the modulation and
coding scheme in use at the given SINR and :math:`S(M, B)` be the
transport block size in bits as defined by 3GPP TS 36.213. We first
calculate the number :math:`L` of RBGs allocated to each user as
.. math::
L = \left\lfloor \frac{B}{NG} \right\rfloor
The reference throughput (in bytes per second) :math:`T` in bps achieved by each UE is then calculated as
The reference throughput :math:`T` in bit/s achieved by each UE is then calculated as
.. math::
T = \frac{S(M, L G)}{8 \; \tau}
The test passes if the measured throughput matches with the reference throughput within a relative tolerance of 0.1. This tolerance is needed to account for the transient behavior at the beginning of the simulation (e.g., CQI feedback is only available after a few subframes) as well as for the accuracy of the estimator of the average throughput performance over the chosen simulation time (0.04s). We note that a lower value of the tolerance can be achieved by making each test case running longer simulations; we chose not to do this in order to keep the total execution time of this test suite as low as possible in spite of the high number of test cases.
The test passes if the measured throughput matches with the reference throughput
within a relative tolerance of 0.1. This tolerance is needed to account for the
transient behavior at the beginning of the simulation (e.g., CQI feedback is
only available after a few subframes) as well as for the accuracy of the
estimator of the average throughput performance over the chosen simulation time
(0.4s). This choice of the simulation time is justified by the need to
follow the ns-3 guidelines of keeping the total execution time of the test
suite low, in spite of the high number of test cases. In any case, we note that
a lower value of the tolerance can be used when longer simulations are
run.
In Figure `fig-lenaThrTestCase1`_, the curves labeled "RR" represent the test values
calculated for the RR scheduler test, as a function of the number of UEs and of
the MCS index being used in each test case.
.. _fig-lenaThrTestCase1:
.. figure:: figures/lenaThrTestCase1.*
:align: center
Test vectors for the RR and PF Scheduler in the downlink in a
scenario where all UEs use the same MCS.
Proportional Fair scheduler performance
---------------------------------------
The test suite ``lte-pf-ff-mac-scheduler`` creates different test cases with a single eNB, using the Proportional Fair (PF) scheduler, and several UEs, all having the same Radio Bearer specification. The test cases are grouped in two categories in order to evaluate both the performance in terms of adaptation to channel condition and from fairness perspective.
The test suite ``lte-pf-ff-mac-scheduler`` creates different test cases with
a single eNB, using the Proportional Fair (PF) scheduler, and several UEs, all
having the same Radio Bearer specification. The test cases are grouped in two
categories in order to evaluate the performance both in terms of the adaptation
to the channel condition and from a fairness perspective.
In the first category of test cases, the UEs are all placed at the same distance from the eNB, and hence all placed in order to have the same SINR. Different test cases are implemented by using a different SINR value and a different number of UEs. The test consists on checking that the obtained throughput performance matches with the known reference throughput up to a given tolerance. The expected behavior of the PF scheduler when all UEs have the same SNR is that each UE should get an equal fraction of the throughput obtainable by a single UE when using all the resources. We calculate the reference throughput value by dividing the throughput achievable by a single UE at the given SNR by the total number of UEs. Let :math:`\tau` be the TTI duration, :math:`B` the transmission bandwidth configuration in number of RBs, :math:`M` the modulation and coding scheme in use at the given SINR and :math:`S(M, B)` be the transport block size as defined in [TS36.213]_. The reference throughput :math:`T` achieved by each UE is calculated as
In the first category of test cases, the UEs are all placed at the
same distance from the eNB, and hence all placed in order to have the
same SINR. Different test cases are implemented by using a different
SINR value and a different number of UEs. The test consists on
checking that the obtained throughput performance matches with the
known reference throughput up to a given tolerance. The expected
behavior of the PF scheduler when all UEs have the same SNR is that
each UE should get an equal fraction of the throughput obtainable by a
single UE when using all the resources. We calculate the reference
throughput value by dividing the throughput achievable by a single UE
at the given SNR by the total number of UEs.
Let :math:`\tau` be the TTI duration, :math:`B` the transmission
bandwidth configuration in number of RBs, :math:`M` the modulation and
coding scheme in use at the given SINR and :math:`S(M, B)` be the
transport block size as defined in [TS36.213]_. The reference
throughput :math:`T` in bit/s achieved by each UE is calculated as
.. math::
T = \frac{S(M,B)}{\tau N}
The second category of tests is aimed at verify the fairness behavior in presence of UEs with different SINRs (and therefore different estimated throughput from PFS). The test consists of checking whether the throughput obtained by each UE over the whole simulation matches with the steady-state throughput expected by the PF scheduler according to the theory (see for instance [Kushner2004]_).
Let :math:`Ri` the estimation done by PFS of the throughput of the :math:`i` UE for the next TTI according to the CQIs received and :math:`Ti` the throughput preceived by the :math:`i` UE . The test verifies that the ratio of the obtained throughput value respect to the global one (i.e. the sum of the ones of all users) is equal to the steady-state throughput of the PFS, that is
The curves labeled "PF" in Figure `fig-lenaThrTestCase1`_ represent the test values
calculated for the PF scheduler tests of the first category, that we just described.
The second category of tests aims at verifying the fairness of the PF
scheduler in a more realistic simulation scenario where the UEs have a
different SINR (constant for the whole simulation). In these conditions, the PF
scheduler will give to each user a share of the system bandwidth that is
proportional to the capacity achievable by a single user alone considered its
SINR. In detail, let :math:`M_i` be the modulation and coding scheme being used by
each UE (which is a deterministic function of the SINR of the UE, and is hence
known in this scenario). Based on the MCS, we determine the achievable
rate :math:`R_i` for each user :math:`i` using the
procedure described in Section~\ref{sec:pfs}. We then define the
achievable rate ratio :math:`\rho_{R,i}` of each user :math:`i` as
.. math::
\rho_{R,i} = \frac{R_i}{\sum_{j=1}^N R_j}
K = \frac{Ri}{\sum_{k=1}^N Ri} = \frac{Ti}{\sum_{k=1}^N Ti}
Let now :math:`T_i` be the throughput actually achieved by the UE :math:`i` , which
is obtained as part of the simulation output. We define the obtained throughput
ratio :math:`\rho_{R,i}` of UE :math:`i` as
The test passes if the measured throughput matches with the reference throughput within a relative tolerance of 0.1. The choice of this tolerance has the same motivations already discussed for the Round Robin scheduler test suite.
.. math::
\rho_{T,i} = \frac{T_i}{\sum_{j=1}^N T_j}
References
**********
The test consists of checking that the following condition is verified:
.. [TS36.213] 3GPP TS 36.213 "LTE Physical layer procedures"
.. math::
\rho_{R,i} = \rho_{T,i}
.. [Kushner2004] H.J. Kushner and P.A. Whiting, "Convergence of proportional-fair sharing algorithms under general conditions", IEEE Trans. on Wireless Communications, July 2004
if so, it means that the throughput obtained by each UE over the whole
simulation matches with the steady-state throughput expected by the PF scheduler
according to the theory (see for instance [Kushner2004]_).
.. [Piro2011] G. Piro, N. Baldo. M. Miozzo, "An LTE module for the ns-3 network simulator", Wns3 2011
(in conjunction with SimuTOOLS 2011), March 2011, Barcelona (Spain)
.. [Seo2004] H. Seo, B. G. Lee. "A proportional-fair power allocation scheme for fair and efficient multiuser
OFDM systems", In Proc. of IEEE GLOBECOM, December 2004. Dallas (USA)
Figure :ref:`fig-lenaThrTestCase2` presents the results obtained in a test case with
UEs :math:`i=1,\dots,5` that are located at a distance from the base
station such that they will use respectively the MCS index :math:`28, 24, 16, 12,
6`. From the figure, we note that, as expected, the obtained throughput is
proportional to the achievable rate. In other words, the PF scheduler assign
more resources to the users that use a higher MCS index.
.. [R1-081483] 3GPP R1-081483 "Conveying MCS and TB size via PDCCH"
.. _fig-lenaThrTestCase2:
.. figure:: figures/lenaThrTestCase2.*
:align: center
Throughput ratio evaluation for the PF scheduler in a scenario
where the UEs have MCS index :math:`28, 24, 16, 12, 6`

View File

@@ -1,70 +1,323 @@
.. include:: replace.txt
+++++++++++++++++++++++++
LTE User Documentation
+++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++
User Documentation
+++++++++++++++++++++++++++++++++
EUTRA stack diagram
*******************
Background
**********
We assume the reader is already familiar with how to use the ns-3
simulator to run generic simulation programs. If this is not the case,
we strongly recommend the reader to consult [ns3tutorial]_.
Usage
*****
Usage Overview
**************
Users interact with the LTE model through the LENA helper API and through the publicly visible methods of the model. The helper API is defined in ``src/lte/helper/lena-helper.h``.
The ns-3 LTE model is a software library that allows the simulation of
LTE networks. The process of performing such simulations typically involves the following
steps:
The ``src/lte/examples/`` directory contains some basic examples that shows how to set up the LTE model in order to simulate an EUTRA downlink transmission.
1. *Define the scenario* to be simulated
2. *Write a simulation program* that recreates the desired scenario
topology/architecture. This is done accessing the ns-3 LTE model
libraryusing the ``ns3::LenaHelper`` API defined in ``src/lte/helper/lena-helper.h``.
3. *Specify configuration parameters* of the objects that are being
used for the simulation. This can be done using input files (via the
``ns3::ConfigStore``) or directly within the simulation program.
4. *Configure the desired output* to be produced by the simulator
5. *Run* the simulation.
Example simulation program
--------------------------
``src/lte/examples/lena-first-sim.cc`` shows how to build a simple but complete simulation with one LTE eNB and one LTE UE. The detail explanation of the code follows:
#. Declare the helper. This helper keeps together all the LTE components::
LenaHelper lena;
All these aspects will be explained in the following sections by means
of practical examples.
#. Enable the logs in the LTE components::
lena.EnableLogComponents ();
Basic simulation program
------------------------
Here is the minimal simulation program that is needed to do an LTE simulation.
.. highlight:: none
#. Initial boilerplate::
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/lte-module.h"
using namespace ns3;
int main (int argc, char *argv[])
{
#. Create eNB and UE. They are created in its own node container::
#. Create a LenaHelper object::
NodeContainer enbNodes;
NodeContainer ueNodes;
enbNodes.Create (1);
ueNodes.Create (1);
Ptr<LenaHelper> lena = CreateObject<LenaHelper> ();
This will instantiate some common
objects (e.g., the Channel object) and provide the methods to add
eNBs and UEs and configure them.
#. Create Node objects for the eNB(s) and the UEs::
NodeContainer enbNodes;
enbNodes.Create (1);
NodeContainer ueNodes;
ueNodes.Create (2);
Note that the above Node instances at this point still don't have
an LTE protocol stack installed; they're just empty nodes.
#. Configure the Mobility model for all the nodes::
MobilityHelper mobility;
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (enbNodes);
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (ueNodes);
The above will place all nodes at the coordinates (0,0,0). Please
refer to the documentation of the ns-3 mobility model for how to
set your own position or configure node movement.
#. Install an LTE protocol stack on the eNB(s)::
NetDeviceContainer enbDevs;
enbDevs = lena->InstallEnbDevice (enbNodes);
#. Install an LTE protocol stack on the UEs::
NetDeviceContainer ueDevs;
ueDevs = lena->InstallUeDevice (ueNodes);
#. Install mobility models to eNB and UE. This has to be done before devices are created and installed::
MobilityHelper mobility;
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (enbNodes);
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (ueNodes);
#. Create devices and install them to the eNB and UE::
NetDeviceContainer enbDevs;
NetDeviceContainer ueDevs;
enbDevs = lena.InstallEnbDevice (enbNodes);
ueDevs = lena.InstallUeDevice (ueNodes);
#. Attach a UE to a eNB. It will also create a RRC connection between them and configure the UE::
lena.Attach (ueDevs, enbDevs.Get (0));
#. Attach the UEs to an eNB. This will configure each UE according to
the eNB configuration, and create an RRC connection between them::
lena->Attach (ueDevs, enbDevs.Get (0));
#. Activate an EPS Bearer including the setup of the Radio Bearer between an eNB and its attached UE::
enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
EpsBearer bearer (q);
lena.ActivateEpsBearer (ueDevs, bearer);
enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
EpsBearer bearer (q);
lena->ActivateEpsBearer (ueDevs, bearer);
In the current version of the ns-3 LTE model, the activation of an
EPS Bearer will also activate two saturation traffic generators for
that bearer, one in uplink and one in downlink.
#. Set the stop time::
Simulator::Stop (Seconds (0.005));
This is needed otherwise the simulation will last forever, because
(among others) the start-of-subframe event is scheduled repeatedly, and the
ns-3 simulator scheduler will hence never run out of events.
#. Run the simulation::
Simulator::Run ();
#. Cleanup and exit::
Simulator::Destroy ();
return 0;
}
For how to compile and run simulation programs, please refer to [ns3tutorial]_.
Configuration of LTE model parameters
--------------------------------------
All the relevant LTE model parameters are managed through the ns-3
attribute system. Please refer to the [ns3tutorial]_ and [ns3manual]_
for detailed information on all the possible methods to do it
(environmental variables, C++ API, GtkConfigStore...).
In the following, we just briefly summarize
how to do it using input files together with the ns-3 ConfigStore.
First of all, you need to put the following in your simulation
program, right after ``main ()`` starts::
CommandLine cmd;
cmd.Parse (argc, argv);
ConfigStore inputConfig;
inputConfig.ConfigureDefaults ();
// parse again so you can override default values from the command line
cmd.Parse (argc, argv);
for the above to work, make sure you also ``#include "ns3/config-store.h"``.
Now create a text file named (for example) ``input-defaults.txt``
specifying the new default values that you want to use for some attributes::
default ns3::LenaHelper::Scheduler "ns3::PfFfMacScheduler"
default ns3::LenaHelper::PropagationModel "ns3::FriisSpectrumPropagationLossModel"
default ns3::LteEnbNetDevice::UlBandwidth "25"
default ns3::LteEnbNetDevice::DlBandwidth "25"
default ns3::LteEnbNetDevice::DlEarfcn "100"
default ns3::LteEnbNetDevice::UlEarfcn "18100"
default ns3::LteUePhy::TxPower "10"
default ns3::LteUePhy::NoiseFigure "9"
default ns3::LteEnbPhy::TxPower "30"
default ns3::LteEnbPhy::NoiseFigure "5"
Supposing your simulation program is called
``src/lte/examples/lte-sim-with-input``, you can now pass these
settings to the simulation program in the following way::
./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lte-sim-with-input
Furthermore, you can generate a template input file with the following
command::
./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lte-sim-with-input
note that the above will put in the file ``input-defaults.txt`` *all*
the default values that are registered in your particular build of the
simulator, including lots of non-LTE attributes.
Simulation Output
-----------------
The ns-3 LTE model currently supports the output to file of both MAC and RLC
level Key Performance Indicators (KPIs). You can enable it in the following way::
Ptr<LenaHelper> lena = CreateObject<LenaHelper> ();
// configure all the simulation scenario here...
lena->EnableMacTraces ();
lena->EnableRlcTraces ();
Simulator::Run ();
RLC KPIs are calculated over a time interval and stored on two ASCII
files, one for uplink and one for downlink. The time interval duration
and the name of the files can be controlled using the attributes
``ns3::RlcStatsCalculator::EpochDuration``,
``ns3::RlcStatsCalculator::DlOutputFilename`` and
``ns3::RlcStatsCalculator::UlOutputFilename``.
The content of the columns of these files is the following (the same
for uplink and downlink):
1. start time of measurement interval in seconds since the start of simulation
2. end time of measurement interval in seconds since the start of simulation
3. unique UE ID
4. RNTI
5. Logical Channel ID
6. Number of transmitted PDUs
7. Total bytes transmitted.
8. Number of received PDUs
9. Total bytes received
10. Average PDU delay in seconds
11. Standard deviation of the PDU delay
12. Minimum value of the PDU delay
13. Maximum value of the PDU delay
14. Average PDU size, in bytes
15. Standard deviation of the PDU size
16. Minimum PDU size
17. Maximum PDU size
MAC KPIs are basically a trace of the resource allocation reported by
the scheduler upon the start of every subframe. They are stored in
ASCII files. For downlink MAC KPIs the format is the following:
1. Simulation time in seconds at which the allocation is indicated by the scheduler
2. Cell Identifier
3. Frame number
4. Subframe number
5. RNTI
6. MCS of TB 1
7. size of TB 1
8. MCS of TB 2 (0 if not present)
9. size of TB 2 (0 if not present)
while for uplink MAC KPIs the format is:
1. Simulation time in seconds at which the allocation is indicated by the scheduler
2. Frame number
3. Subframe number
4. RNTI
5. MCS of TB
6. size of TB
The names of the files used for MAC KPI output can be customized via
the ns-3 attributes ``ns3::MacStatsCalculator::DlOutputFilename`` and
``ns3::MacStatsCalculator::UlOutputFilename``.
Further Reading
---------------
The directory ``src/lte/examples/`` contains some example simulation programs that
show how to simulate different LTE scenarios.
Performance evaluation
**********************
Execution time and memory consumption
-------------------------------------
In order to provide an evaluation of the execution time and
memory consumption, a
reference simulation program (``examples/profiling-reference``) has been
developed. This program simulates a scenario
composed by a set of eNodeBs, and a set of UEs attached to each eNB. All eNodeBs
have the same number of attached UEs. Communications are performed both in the
dowlink and in the uplink using a saturation model (i.e., each RLC instance
always has a PDU to transmit). The UEs are all in the same position than its
eNodeB and the eNodeBs are distributed in a line, each one 140m away from the
previous one. The total simulation time is set to 60s.
Using this simulation program, we ran a simulation campaign varying the number
of eNBs as well as the number of UEs per eNB. For each simulation, we measured
the execution time using the ``time`` shell command in linux, and the memory
consumption by looking at the information in ``/proc/\{pid\}/statm``. The
reference hardware platform is an Intel Core2 Duo E8400 3.00GHz with 512 MB of
RAM memory running a Fedora Core 10 distribution with kernel
2.6.27.5. The simulator build used in this
experiment was configured with the options ``-d optimized
--enable-static``.
The results are reported in `fig-simulationTime`_ and `fig-memoryUsage`_.
We note that the memory usage, as expected,
primarily depends on the number of eNBs, however is in general quite low. The
execution time depends significantly on both the number of eNBs and the number
of UEs per eNB. For the case of 10 UEs per eNB, we also show that the
experimental data can be fitted quite accurately by a quadratic function. We
suggest that this behavior is due to the fact that the
interference calculations have a computational complexity which is quadratic with
respect to the number of eNBs, and which is the dominant contribution in the overall
computational load.
.. _fig-simulationTime:
.. figure:: figures/simulationTime.*
:align: center
Execution time of the reference program for a simulation duration of 60s.
.. _fig-memoryUsage:
.. figure:: figures/memoryUsage.*
:align: center
Memory usage of the reference program.

View File

@@ -1,11 +1,9 @@
########################
LTE Module
########################
####################################
LTE Simulator Documentation
####################################
This chapter describes the ns-3 LTE module located in ``src/lte``.
.. toctree::
@@ -13,6 +11,7 @@ This chapter describes the ns-3 LTE module located in ``src/lte``.
lte-design
lte-user
lte-testing
lte-references

View File

@@ -38,6 +38,7 @@ int main (int argc, char *argv[])
double radius = 0.0;
uint32_t nEnb = 1;
uint32_t nUe = 1;
double enbDist = 100;
CommandLine cmd;
cmd.AddValue ("nEnb", "Number of eNodeBs", nEnb);
@@ -64,6 +65,7 @@ int main (int argc, char *argv[])
<< "_rngRun" << std::setw(3) << std::setfill('0') << runValue.Get () ;
*/
Ptr<LenaHelper> lena = CreateObject<LenaHelper> ();
lena->EnableLogComponents ();
// Create Nodes: eNodeB and UE
NodeContainer enbNodes;
@@ -79,25 +81,30 @@ int main (int argc, char *argv[])
// Position of eNBs
Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
positionAlloc->Add (Vector (0.0, 0.0, 0.0));
for (uint32_t i = 0; i < nEnb; i++)
{
positionAlloc->Add (Vector (enbDist*i, enbDist*i, 0.0));
}
MobilityHelper enbMobility;
enbMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
enbMobility.SetPositionAllocator (positionAlloc);
enbMobility.Install (enbNodes);
// Position of UEs attached to eN
MobilityHelper ueMobility;
ueMobility.SetPositionAllocator ("ns3::UniformDiscPositionAllocator",
"X", DoubleValue (0.0),
"Y", DoubleValue (0.0),
"rho", DoubleValue (radius));
ueMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
// Position of UEs attached to eNB
vector<MobilityHelper> ueMobility;
for (uint32_t i = 0; i < nEnb; i++)
{
ueMobility.Install (ueNodes[i]);
MobilityHelper ueMob;
ueMob.SetPositionAllocator ("ns3::UniformDiscPositionAllocator",
"X", DoubleValue (enbDist*i),
"Y", DoubleValue (enbDist*i),
"rho", DoubleValue (radius));
ueMob.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
ueMobility.push_back (ueMob);
ueMobility[i].Install (ueNodes[i]);
}
// Create Devices and install them in the Nodes (eNB and UE)
NetDeviceContainer enbDevs;
vector<NetDeviceContainer> ueDevs;

View File

@@ -10,6 +10,6 @@ def build(bld):
obj = bld.create_ns3_program('lena-rlc-calculator',
['lte'])
obj.source = 'lena-rlc-calculator.cc'
obj = bld.create_ns3_program('execution-time-reference',
obj = bld.create_ns3_program('profiling-reference',
['lte'])
obj.source = 'execution-time-reference.cc'
obj.source = 'profiling-reference.cc'

View File

@@ -228,15 +228,6 @@ LteAmc::GetMcsFromCqi (int cqi)
return mcs;
}
// int
// LteAmc::GetTbSizeFromMcs (int mcs)
// {
// NS_LOG_FUNCTION (mcs);
// NS_LOG_FUNCTION (mcs << TransportBlockSize[mcs]);
// return TransportBlockSize[mcs];
// }
int
LteAmc::GetTbSizeFromMcs (int mcs, int nprb)
{

View File

@@ -51,18 +51,11 @@ public:
*/
static int GetMcsFromCqi (int cqi);
// /**
// * \brief Get the Transport Block Size for a selected MCS
// * \param mcs the mcs index
// * \return the TBs value
// */
// static int GetTbSizeFromMcs (int mcs);
/**
* \brief Get the Transport Block Size for a selected MCS and number of PRB (table 7.1.7.2.1-1 of 36.213)
* \param mcs the mcs index
* \param nprb the no. of PRB
* \return the TBs value
* \return the Transport Block Size in bits
*/
static int GetTbSizeFromMcs (int mcs, int nprb);
@@ -70,7 +63,7 @@ public:
* \brief Get the spectral efficiency value associated
* to the received CQI
* \param cqi the cqi value
* \return the spectral efficiency value
* \return the spectral efficiency in (bit/s)/Hz
*/
static double GetSpectralEfficiencyFromCqi (int cqi);

View File

@@ -152,11 +152,11 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// Test Case 2: fairness check
std::vector<uint16_t> dist;
dist.push_back (0); // User 0 distance
dist.push_back (3000); // User 1 distance
dist.push_back (6000); // User 2 distance
dist.push_back (9000); // User 3 distance
dist.push_back (15000); // User 4 distance
dist.push_back (0); // User 0 distance --> MCS 28
dist.push_back (3000); // User 1 distance --> MCS 24
dist.push_back (6000); // User 2 distance --> MCS 16
dist.push_back (9000); // User 3 distance --> MCS 12
dist.push_back (15000); // User 4 distance --> MCS 6
std::vector<uint32_t> estThrPfDl;
estThrPfDl.push_back (89000); // User 0 estimated TTI throughput from PF
estThrPfDl.push_back (55000); // User 1 estimated TTI throughput from PF