%--------------------------------------------
%
% Package pgfplots, library for smith charts.
%
% Copyright 2010 by Christian Feuersänger.
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see .
%
% A smithchart maps the complex halfplane
% H subset \C,
% H := [0,infty] x [-infty,infty]
% =~ \{ z = a+ j *b | a >=0, b \in \R }
%
% to the unit circle.
%
% A number z = a+jb is mapped to r(z) = (z-1) / (z+1) which is, per
% definition, in the 2d unit circle.
%
% Grid lines (i.e. a==const or b==const) are mapped on circles.
%
% In PGFPlots, the a=Re(z) is the x axis and b = Im(z) is the y axis.
%
% - CARTESIAN INPUT
% - tick/grid coordinates are from
% - input coordinates can be either from H or (perhaps preferred) from
% the unit circle.
% this "preferred" needs to be discussed.
% - the transformed data range is the unit circle (or a sequeezed variant)
% - in order to compute limits etc., I should accept data in H. this
% should simplify the logic to determine ticks etc considerably.
% problem: this transformation appears to be quite difficult (?)
% -> r(z) = (z-1)/(z+1)
% in complex arithmetics (but the G-tutorial.pdf says something
% about these circle equations!?)
%
% www.amanogawa.com/archive/docs/G-tutorial.pdf
%
%
% Idea:
% - work on H
% - transform whereever necessary
% - implement all pgfplots wrinkles in analogy to polar axes
% - provide support for normalized input coords (combined with
% untransformed limits or something like that)
\pgfplotsdefineaxistype{smithchart}{%
\pgfplots@smithchartaxis@activate
}%
\newif\ifpgfplotspointisinsmithchartCS
\newif\ifpgfplots@smithchart@showorigin
\newif\ifpgfplots@smithchart@mirrored
\pgfplotsset{
/pgfplots/xgrid each nth passes y/.initial=,% format: CSV list, each entry of the form ' | ':' | 'if <' | ':' 'if <' '
/pgfplots/xgrid each nth passes y start/.initial=0,
/pgfplots/ygrid each nth passes x/.initial=,
/pgfplots/ygrid each nth passes x start/.initial=0,
%
/pgfplots/xgrid stop at y/.initial=,% individual stop map of the form ' ':' ', separated by white space
/pgfplots/ygrid stop at x/.initial=,
%
% FIXME : this is undocumented:
/pgfplots/smithchart mirrored/.is if=pgfplots@smithchart@mirrored,
/pgfplots/smithchart mirrored/.default=true,
%
% this boolean may only be used inside of \addplot. It will be
% ignored otherwise.
/pgfplots/is smithchart cs/.is if=pgfplotspointisinsmithchartCS,
/pgfplots/is smithchart cs/.default=true,
/pgfplots/show origin/.is if=pgfplots@smithchart@showorigin,
/pgfplots/show origin/.default=true,
/pgfplots/show origin code/.code={%
\path[draw=black,fill=white] (0pt,0pt) circle (2.5pt);
\path[fill=black] (0pt,0pt) circle (0.5pt);
},
/pgfplots/every smithchart axis/.style={
grid=both,
xmin=0,
xmax=16000,% FIXME : more is not possible because some code uses the \pgfplots@xmin@reg registers... (ticks)
ymin=-16000,ymax=16000,
scaled ticks=false, % never draw the \cdot 10^4 labels
major tick style={draw=black},
xtick align=center,
ytick align=center,
every axis title shift=1.2\baselineskip,
legend style={anchor=center},
},
/pgfplots/default smithchart xtick/.code=,
/pgfplots/default smithchart ytick/.code=,
/pgfplots/default smithchart xytick/.code=,
/pgfplots/smithchart ticks by size/.code 2 args={%
\ifdim#1<14cm
\pgfkeysalso{/pgfplots/few smithchart ticks}%
\else
\ifdim#1<20cm
\pgfkeysalso{/pgfplots/many smithchart ticks}%
\else
\pgfkeysalso{/pgfplots/dense smithchart ticks}%
\fi
\fi
},
/pgfplots/few smithchart ticks*/.style={
default smithchart xtick/.style={
xtick={0.2,0.5,1,2,5},
},
default smithchart ytick/.style={
ytick={%
0,%
0.2, 0.5, 1, 2, 5,%
-0.2,-0.5,-1,-2,-5},
},
default smithchart xytick/.style={
xgrid each nth passes y={2},
ygrid each nth passes x={2},
},
},
/pgfplots/few smithchart ticks/.style={/pgfplots/few smithchart ticks*},
/pgfplots/few smithchart ticks*,% use it as initial config
/pgfplots/many smithchart ticks*/.style={
default smithchart xtick/.style={
xtick={
0.1,0.2,0.3,0.4,0.5,1,1.5,2,3,4,5,10,20%
},
minor xtick={0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50},
},
default smithchart ytick/.style={
ytick={%
0,%
0.1,0.2,...,1,1.5,2,3,4,5,10,20,%
-0.1,-0.2,...,-1,-1.5,-2,-3,-4,-5,-10,-20%
},
minor ytick={%
1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,%
-1.1,-1.2,-1.3,-1.4,-1.6,-1.7,-1.8,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50%
},
},
default smithchart xytick/.style={
xgrid each nth passes y={1,2,4,5,10,20},
ygrid each nth passes x={1,2,3,5,10:3,20:3},
},
},
/pgfplots/many smithchart ticks/.style={
many smithchart ticks*,
every axis title shift=6pt,
yticklabel in circle,
show origin=true,
},
/pgfplots/dense smithchart ticks*/.style={
default smithchart xtick/.style={
%ygrid each nth passes x start=0,
xtick={
0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20%
},
minor xtick={%
0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,%
0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,%
0.52,%
0.55,0.65,0.75,0.85,0.95,%
%0.6,0.7,0.8,0.9,%
1.1,1.3,1.5,1.7,1.9,%
2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50},
},
default smithchart ytick/.style={
ytick={%
0,%
0.1,0.2,...,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20,%
-0.1,-0.2,...,-1,-1.2,-1.4,-1.6,-1.8,-2,-3,-4,-5,-10,-20%
},
minor ytick={%
0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,%
0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,%
0.55,0.65,0.75,0.85,0.95,%
1.1,1.3,1.5,1.7,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,%
-0.01,-0.02,-0.03,-0.04,-0.05,-0.06,-0.07,-0.08,-0.09,-0.11,-0.12,-0.13,-0.14,-0.15,-0.16,-0.17,-0.18,-0.19,%
-0.22,-0.24,-0.26,-0.28,-0.32,-0.34,-0.36,-0.38,-0.42,-0.44,-0.46,-0.48,%
-0.55,-0.65,-0.75,-0.85,-0.95,%
-1.1,-1.3,-1.5,-1.7,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50%
},
},
default smithchart xytick/.style={
xgrid each nth passes y={0.2 if < 0.2001,0.5 if < 0.50001,1 if < 1.001,2,4,5,10,20},
ygrid each nth passes x={0.2 if < 0.2001,0.52 if < 0.52001,1 if < 1.001,2,3,5,10:3,20:3},
},
},
/pgfplots/dense smithchart ticks/.style={
yticklabel in circle,
every axis title shift=6pt,
dense smithchart ticks*,
show origin=true,
every major grid/.style={black!60},
},
/pgfplots/yticklabel in circle/.style={
ytick align=inside,
yticklabel style={
rotate=90,
sloped like y axis={%
execute for upside down={\tikzset{anchor=north east}},
%allow upside down,
reset nontranslations=false},
anchor=south west,
%font=\tiny,
}
},
yticklabel around circle/.style={
ytick align=center,
yticklabel style={
rotate=90,
sloped like y axis={%
execute for upside down={\tikzset{anchor=south west}},
%allow upside down,
reset nontranslations=false},
anchor=south east,
%font=\tiny,
}
},
yticklabel around circle*/.style={
ytick align=center,
yticklabel style={
rotate=90,
sloped like y axis={%
execute for upside down={\tikzset{anchor=north west}},
%allow upside down,
reset nontranslations=false},
anchor=north east,
%font=\tiny,
}
}
}
\pgfkeys{
/pgfplots/warning/smithchart/no such tick/.code 2 args={%
\pgfplotsthrow@warning{There is no #1tick with index '#2'. Skipping it.}%
},
}
\def\pgfplots@smithchartaxis@activate{%
\def\axisdefaultwidth{207pt}%
\def\axisdefaultheight{207pt}%
\let\pgfplotsqpointxy@cart=\pgfplotsqpointxy
\let\pgfplotsqpointxy=\pgfplotsqpointxy@smithchartaxis
\let\pgfplotsqpointxy@orthogonal=\pgfplotsqpointxy
\def\pgfplotsqpointxyz##1##2##3{\pgfplotsqpointxy{##1}{##2}}% FIXME
\let\pgfplotspointouternormalvectorofaxis@=\pgfplotspointouternormalvectorofaxis@smithchartaxis
\def\pgfplotspointouternormalvectorofaxis@ifdependson@v##1##2##3{##2}%
\def\pgfplots@drawticklines@INSTALLCLIP@onorientedsurf##1{}%
\let\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf=\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis
\def\pgfplots@visphase@notify@changeofcanvaslimits##1{}%
\def\pgfplots@avoid@empty@axis@range@for##1{}%
\def\pgfplotsaxisifcontainspoint##1##2{##1}%
\let\pgfplots@set@default@size@options=\pgfplots@set@default@size@options@smithchart%
%
\def\b@pgfplots@smithchart@defaultticks@x{0}%
\def\b@pgfplots@smithchart@defaultticks@y{0}%
\let\pgfplots@assign@default@tick@foraxis=\pgfplots@assign@default@tick@foraxis@smithchart
\def\pgfplots@checkisuniformLINEARtick##1##2{%
% don't do anything here. I suppose it is useless and is a
% waste of time for many ticks.
\global\pgfplots@isuniformtickfalse
}%
\let\pgfplots@clippath@prepare@for@axistype=\pgfplots@clippath@prepare@for@axistype@smithchartaxis
%
% invalid range: do not clear plots. simply assign default limits.
\let\pgfplots@handle@invalid@range@defaultlimits=\pgfplots@handle@invalid@range@defaultlimits@smithchart%
\def\pgfplots@handle@invalid@range{\pgfplots@handle@invalid@range@defaultlimits}%
%
\let\pgfplotspointonorientedsurfaceabwithbshift=\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis
\let\pgfplots@draw@axis@is@prepared=\pgfplots@draw@axis@is@prepared@smithchartaxis
\let\pgfplots@drawgridlines@onorientedsurf@fromto=\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart
\let\pgfplots@drawaxis@innerlines@onorientedsurf=\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart
\let\pgfplots@drawaxis@outerlines@separate@onorientedsurf=\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis
\let\pgfplotspoint@initialisation@axes=\pgfplotspoint@initialisation@axes@smithchart%
\let\pgfplotspoint@initialisation@units=\pgfplotspoint@initialisation@units@smithchart
\expandafter\def\expandafter\pgfplots@create@axis@descriptions@\expandafter{%
\pgfplots@create@axis@descriptions@
\ifpgfplots@smithchart@showorigin
\pgfkeysvalueof{/pgfplots/show origin code/.@cmd}\pgfeov%
\fi
}%
\def\axisdefaultheight{\axisdefaultwidth}%
\let\pgfplots@BB@for@plotbox@get@unit@scales@for@limits=\pgfplots@BB@for@plotbox@get@unit@scales@for@limits@smithchart
%\let\pgfplots@limits@ready=\pgfplots@limits@ready@smithchart
%\let\pgfplots@show@ticklabel@=\pgfplots@show@ticklabel@@smithchart
%\def\pgfplots@xtick@disable@last@tick{0}%
\let\pgfplots@xtick@check@tickshow=\pgfplots@xtick@check@tickshow@smithchart%
\let\pgfplots@ytick@check@tickshow=\pgfplots@ytick@check@tickshow@smithchart%
\let\pgfplots@set@options@sanitize=\relax
\let\pgfplots@set@options@sanitizemode=\relax
\let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart
%
\expandafter\def\expandafter\pgfplots@notify@options@are@set\expandafter{%
\pgfplots@notify@options@are@set
\pgfplotsset{%
separate axis lines,%
is smithchart cs=false,%
xtick pos=left,
ytick pos=left,
axis x line*=center,
disabledatascaling,
}%
\def\pgfplots@xtickposnum{2}%
%
\ifx\pgfplots@xtick\pgfutil@empty
\def\b@pgfplots@smithchart@defaultticks@x{1}%
\fi
\ifx\pgfplots@ytick\pgfutil@empty
\def\b@pgfplots@smithchart@defaultticks@y{1}%
\fi
\pgfplotscoordmath{default}{parsenumber}{0.002}%
\let\pgfplots@almost@zero@thresh=\pgfmathresult
}%
\def\pgfplots@xticklabel@pos{}%
\def\pgfplots@yticklabel@pos{}%
\def\pgfplots@zticklabel@pos{}%
\def\pgfplots@init@ticklabelaxisspecfor##1##2{}%
\def\pgfplots@init@ticklabelaxisspec@twodim@for##1##2{}%
\def\pgfplotspointonorientedsurfaceabmatchaxisline@warn##1{}% clear warning. It works for smith charts.
\def\pgfplots@xticklabelaxisspec{v20}%
\def\pgfplots@yticklabelaxisspec{0v0}%
\def\pgfplots@zticklabelaxisspec{00v}%
%
% cartesian cs
\tikzdeclarecoordinatesystem{cartesian}{\edef\pgfplots@loc@TMPa{##1}\expandafter\pgfplotspointcartesian@\pgfplots@loc@TMPa\pgfplots@coord@end}%
%
%
% Special treatment for
% \pgfplots@prepare@tick@coordlists@for: make sure we don't need
% to use the register arithmetics in \pgfplots@xmin@reg and its
% variants! I want an UNRESTRICTED max data range!
\def\pgfplots@prepare@tick@coordlists@for@assign##1=##2{\edef##1{##2}}%
\def\pgfplots@prepare@tick@coordlists@for@advance##1by##2{%
% THIS IS NEVER USED (at the time of this writing).
\edef\pgfplots@loc@TMPa{##2}%
\pgfplotscoordmath{default}{parsenumber}{##1}%
\pgfplotscoordmath{default}{op}{add}{{\pgfmathresult}{\pgfplots@loc@TMPa}}%
\pgfplotscoordmath{default}{tofixed}{\pgfmathresult}%
\let##1=\pgfmathresult
}%
\def\pgfplots@prepare@tick@coordlists@for@tofixed##1{\edef\pgfmathresult{##1}}%
\def\pgfplots@prepare@tick@coordlists@for@handletolerance##1{}% does not apply to smithcharts.
\def\pgfplots@prepare@tick@coordlists@for@checktickmin##1{%
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}%
\let\pgfplots@loc@TMPa=\pgfmathresult
\pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{%
\pgfplots@tickshowfalse
}{%
}%
}%
\def\pgfplots@prepare@tick@coordlists@for@checktickmax##1{%
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}%
\let\pgfplots@loc@TMPa=\pgfmathresult
\pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPa}{%
\pgfplots@tickshowfalse
}{%
}%
}%
\def\pgfplots@prepare@tick@coordlists@for@checkdatalimits##1{}% I won't do this here. Smithcharts are somewhat special.
}%
\def\pgfplotspointcartesian@#1,#2\pgfplots@coord@end{%
\pgfpointxy@orig{#1}{#2}%
}%
\def\pgfplotscoordmathnotifydatascalesetfor@smithchart#1{%
\def\pgfplotscoordmathnotifydatascalesetfor##1{}%
\edef\pgfplotscoordmathnotifydatascalesetfor@{#1}%
\def\pgfplotscoordmathnotifydatascalesetfor@@{x}%
\ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@
\pgfplotscoordmath{#1}{datascaletrafo set params}{0}{0}%
\else
\def\pgfplotscoordmathnotifydatascalesetfor@@{y}%
\ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@
\pgfplotscoordmath{#1}{datascaletrafo set shift}{0}%
\fi
\fi
\let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart
}%
% #1: the "a" value on the oriented surf
% #2: the "b" value.
% #3: the shift along the normal.
%
\def\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis#1#2#3{%
% implement the shift in "b" direction explicitly:
\pgfpointadd
{\pgfplotspointonorientedsurfaceab{#1}{#2}}%
{%
\pgfplotspointonorientedsurfaceabtolinespec{v}{0}%
\afterassignment\pgfplots@gobble@until@relax
\pgf@xa=-#3\relax
\edef\pgfplots@shift@no@unit{\pgf@sys@tonumber\pgf@xa}%
\pgfqpointscale
{\pgfplots@shift@no@unit}
{\expandafter\pgfplotspointouternormalvectorofaxis\expandafter{\pgfplotsretval}}%
}%
}
% Computes the complex division
% (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2)
% and assigns the result to \pgfmathresult and \pgfmathresultim . Here
% 'j = sqrt{-1}' is the imaginary unit.
%
% #1 : A
% #2 : B
% #3 : C
% #4 : D
%
% The arithmetics is performed in \pgfplotscoordmath{default} (which
% uses the floating point unit in the initial configuration)
%
% Numbers are expected to be already parsed (i.e. you need to invoke
% \pgfplotscoordmath{default}{parsenumber}{#1}%
% \let\A=\pgfmathresult
% before)
\def\pgfplotscoordmathcomplexdivision#1#2#3#4{%
\begingroup
\edef\pgfplots@A{#1}%
\edef\pgfplots@B{#2}%
\edef\pgfplots@C{#3}%
\edef\pgfplots@D{#4}%
%
%
% ok, compute it:
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@C}}%
\let\pgfplots@AC=\pgfmathresult
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@D}}%
\let\pgfplots@AD=\pgfmathresult
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@D}}%
\let\pgfplots@BD=\pgfmathresult
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@C}}%
\let\pgfplots@BC=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@C}{\pgfplots@C}}%
\let\pgfplots@CC=\pgfmathresult
\pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@D}{\pgfplots@D}}%
\let\pgfplots@DD=\pgfmathresult
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@CC}{\pgfplots@DD}}%
\pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}%
\let\pgfplots@scale=\pgfmathresult
%
%
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@AC}{\pgfplots@BD}}%
\pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}%
\let\pgfplots@x=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@BC}{\pgfplots@AD}}%
\pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}%
\let\pgfplots@y=\pgfmathresult
%
\xdef\pgfplots@glob@TMPa{%
\noexpand\def\noexpand\pgfmathresult{\pgfplots@x}%
\noexpand\def\noexpand\pgfmathresultim{\pgfplots@y}%
}%
\endgroup
\pgfplots@glob@TMPa
}%
\def\pgfplotsqpointxy@smithchartaxis#1#2{%
\pgf@process{%
\ifpgfplotspointisinsmithchartCS
\def\pgfplots@x{#1}%
\def\pgfplots@y{#2}%
\else
% compute rx + j* ry = (#1 + j * #2 -1) / (#1 + j*#2 + 1)
%
% I write
% #1 - 1 + j * #2 = A + j * B
% 1 + #1 + j * #2 = C + j * D
%
% -> rx + j * ry = (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2)
\pgfplotscoordmath{default}{parsenumber}{#1}%
\let\pgfplots@x=\pgfmathresult
%
\pgfplotscoordmath{default}{parsenumber}{#2}%
\let\pgfplots@D=\pgfmathresult
%
\pgfplotscoordmath{default}{one}%
\let\pgfplots@one=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@one}{\pgfplots@x}}%
\let\pgfplots@C=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@x}{\pgfplots@one}}%
\let\pgfplots@A=\pgfmathresult
%
\let\pgfplots@B=\pgfplots@D
%
\pgfplotscoordmathcomplexdivision\pgfplots@A\pgfplots@B\pgfplots@C\pgfplots@D
\pgfplotscoordmath{default}{tofixed}{\pgfmathresult}%
\let\pgfplots@x=\pgfmathresult
\pgfplotscoordmath{default}{tofixed}{\pgfmathresultim}%
\let\pgfplots@y=\pgfmathresult
\fi
%
\pgfplotsqpointxy@smithchart@canvas\pgfplots@x\pgfplots@y
%\message{pgfplotsqpointxy{#1}{#2} ---> (\pgfplots@x,\pgfplots@y) ---> (\the\pgf@x,\the\pgf@y)}%
}%
}%
\def\pgfplotsqpointxy@smithchart@canvas#1#2{%
\ifpgfplots@smithchart@mirrored
\pgfqpointxy@orig{-#1}{#2}%
\else
\pgfqpointxy@orig{#1}{#2}%
\fi
}%
\def\pgfplots@clippath@prepare@for@axistype@smithchartaxis{%
\def\pgfplots@clippath@install##1{%
\pgfpathellipse
{\pgfplotsqpointxy@smithchart@canvas{0}{0}}
{\pgfplotsqpointxy@smithchart@canvas{1}{0}}
{\pgfplotsqpointxy@smithchart@canvas{0}{1}}%
\pgfplots@clippath@use@{##1}%
}%
}%
\def\pgfplotspointouternormalvectorofaxis@smithchartaxis#1#2#3\relax{%
\if v#1%
\pgfqpoint{0pt}{1pt}%
\else
\if v#2%
\pgfplotspointouternormalvectorofaxisgetv{#1#2#3}%
\ifx\pgfplotsretval\pgfutil@empty
\def\pgfplotsretval{0}%
\fi
\pgfpointdiff
{\pgfplotsqpointxy@smithchart@canvas{0}{0}}%
{\pgfplotsqpointxy{0}{\pgfplotsretval}}%
\pgfpointnormalised{}%
\else
\pgfqpoint{0pt}{1pt}%
\fi
\fi
\pgf@process{}%
\endgroup
}%
\def\pgfplotspoint@initialisation@axes@smithchart{%
\begingroup
%\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}%
\gdef\pgfplotspointminminmin{\pgfplotsqpointxy@smithchart@canvas{0}{0}}%
%
% the "x" axis is the diameter of the circle (for fixed y=0)
\pgf@x=2\pgf@xx
\pgf@y=0pt
\xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}%
\pgfmathveclen{\pgf@x}{\pgf@y}%
\xdef\pgfplotspointxaxislength{\pgfmathresult pt}%
%
\pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}%
\xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}%
%
% the length of the "y" axis is 2*pi*r (for fixed x=0, the outer
% circle).
% The radius is the length of (0,1) which is (0pt,\pgf@xx1):
\pgfmath@basic@multiply@{\pgf@sys@tonumber\pgf@xx}{1}%
\pgfmathmultiply@{\pgfmathresult}{6.28318530717959}% 2*pi * r
\xdef\pgfplotspointyaxislength{\pgfmathresult pt}%
%
\global\let\pgfplotspointzaxis=\pgfpointorigin
\gdef\pgfplotspointzaxislength{0pt}%
\endgroup
%
\edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\pgf@xx}%
\pgfmathdivide@{16000}{\pgfplots@loc@TMPa}%
\let\pgfplots@smithchart@axis@max@xradius@for@ycircle=\pgfmathresult
%
\ifdim\pgf@xx=\pgf@yy
\def\pgfplots@smithchart@axis@ratioxy{1}%
\def\pgfplots@smithchart@axis@ratioyx{1}%
\let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfplots@smithchart@axis@max@xradius@for@ycircle
\else
\edef\pgfplots@loc@TMPb{\pgf@sys@tonumber\pgf@yy}%
\pgfmathdivide@\pgfplots@loc@TMPa\pgfplots@loc@TMPb
\let\pgfplots@smithchart@axis@ratioxy=\pgfmathresult
\pgfmathdivide@\pgfplots@loc@TMPb\pgfplots@loc@TMPa
\let\pgfplots@smithchart@axis@ratioyx=\pgfmathresult
%
\pgfmathdivide@{16000}{\pgfplots@loc@TMPb}%
\let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfmathresult
\fi
}
\let\pgfplotspoint@initialisation@units@orig=\pgfplotspoint@initialisation@units
\def\pgfplotspoint@initialisation@units@smithchart{%
\ifpgfplots@smithchart@mirrored
\pgfplots@warning{The key 'smithchart mirrored' is based on a mistake of the author. It does NOT resemble Admittance Smith charts!}%
\fi
\pgfplotspoint@initialisation@units@orig
\def\pgfplotspointunity{%
\pgfplotspointouternormalvectorofaxisgetv{0v0}% x=0 (outer circle) and v varies (the yticks)
\ifx\pgfplotsretval\pgfutil@empty
\def\pgfplotsretval{0}%
\fi
\pgfpointnormalised{\pgfplotsqpointxy{0}{\ifx\pgfplotsretval\pgfutil@empty 0\else\pgfplotsretval\fi}}%
\pgf@xa=-\pgf@y
\global\pgf@y=\pgf@x
\global\pgf@x=\pgf@xa
}%
\def\pgfplotsunitylength{1}%
\def\pgfplotsunityinvlength{1}%
}%
\def\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis#1{%
%\pgfplots@clippath@install{\pgfusepath{clip}}%
}%
% At this time, the minor/major tick lists are initialised.
\def\pgfplots@draw@axis@is@prepared@smithchartaxis{%
\pgfplots@gridlines@init@grid@stop@points@for xy%
\pgfplots@gridlines@init@grid@stop@points@for yx%
%
% and finalize x:
\def\pgfplots@finalize@constraints{1}%
\pgfplots@gridlines@init@grid@stop@points@for@computethem{x}{y}{\pgfplots@finalize@constraints}%
}%
% Initialises the '#1grid each nth passes #2' and '#1grid stop at #2'
% features. All it does is to prepare the
% method \pgfplots@get@current@grid@stop@point.
%
% The method is quite involved. Please refer to the manual for what it
% is supposed to do, and refer to the code comments below for
% implementational details.
%
% #1 either x or y
% #2 either x or y
\def\pgfplots@gridlines@init@grid@stop@points@for#1#2{%
%
\expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\relax
%
\pgfkeysgetvalue{/pgfplots/#1grid each nth passes #2}\pgfplots@loc@TMPa
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\else
% we have no "xticknum -> xtickpos" lookup table yet.
\expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{0}%
%
\pgfplotslistnewempty\pgfplots@loc@TMPd
% normalise the argument for 'ygrid each nth passes x': each list element
% should be of the form ':' where means that each
% th arc can pass.
\expandafter\pgfplotsutilforeachcommasep\pgfplots@loc@TMPa\as\entry{%
\expandafter\pgfplots@gridlines@init@grid@stop@points@for@normalise\entry\relax#1#2%
\expandafter\pgfplotslistpushback\entry\to\pgfplots@loc@TMPd
}%
\expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\pgfplots@loc@TMPd
%
% Ok.
%
% Now, the 'ygrid each nth passes x' feature relies *crucially* on grid line
% indices (for the 'each nth' feature).
%
% I sort the arcs according to their absolute magnitude and assign
% indices into the resulting arrays to normalize that stuff.
%
% The array is of the form
% A[i] = entry of \pgfplots@prepared@tick@positions@*
% and contains *both*, major and minor grid lines.
\pgfplotsarraynewempty\pgfplots@gridlines
\pgfplotscoordmath{default}{zero}%
\edef\elem{{-1}{\pgfmathresult}}% require 0 to be zero for symmetry even if there is no such tick pos
\expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines
\pgfplots@if{pgfplots@#1majorgrids}{%
% insert all major tick positions, using their absolute value.
\expandafter
\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}%
\pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}%
\edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}%
\expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines
}%
}{}%
\pgfplots@if{pgfplots@#1minorgrids}{%
% now the same for minor grid positions:
\expandafter
\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}%
\pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}%
\edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}%
\expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines
}%
}{}%
% sort the array!
\pgfkeysgetvalue{/pgfplots/smithchart@sortlt/.@cmd}\pgfplots@loc@TMPa
\pgfkeyslet{/pgfplots/iflessthan/.@cmd}\pgfplots@loc@TMPa
\pgfplotsarraysort\pgfplots@gridlines
%
% ok. Now it is sorted.
%
% I finally need a lookup
% \pgfplots@ticknum --> sort index.
% If the associated values have the same absolute value, the same
% sort index should be assigned.
%
% For example, the array might be associated to the following tick
% positions, sorted by absolute value:
% 0.0, 1.0, -1.0, 3.0, -3.0, 4.0, -4.0, 5.0, -5.0
% What I want is that
% 0.0 gets sort index 0
% 1.0 and -1.0 get sort index 1
% 3.0 and -3.0 get sort index 2
% 4.0 and -4.0 get sort index 3
% and so on. The array contains only absolute values, so that's
% not too difficult to check.
%
% Since each of the tick positions can be (uniquely) identified by
% its associated \pgfplots@ticknum value, I map \pgfplots@ticknum
% to the sort index.
\countdef\c@sortindex=\c@pgf@counta
\c@sortindex=\pgfkeysvalueof{/pgfplots/#1grid each nth passes #2 start} % this is assigned to the '0.0' gridline (if any)
\def\pgfplots@lasttickpos{}%
\pgfplotsarrayforeachungrouped\pgfplots@gridlines\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\ifx\pgfplots@lasttickpos\pgfutil@empty
\else
\ifx\pgfplots@lasttickpos\pgfplots@tick
\else
\advance\c@sortindex by1
\fi
\fi
\expandafter\edef\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname{\the\c@sortindex}%
%\message{\pgfplots@ticknum\space(abs(tickpos) = \pgfplots@tick)---> sort index \csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname^^J}%
\let\pgfplots@lasttickpos=\pgfplots@tick
}%
%
% unfortunately, I can't free the \pgfplots@gridlines array
% without extensive overhead :-(
\fi
%
\expandafter\let\csname b@pgfplots@#1gridline@stopmap\endcsname\relax
\pgfkeysgetvalue{/pgfplots/#1grid stop at #2}\pgfplots@loc@TMPa
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\else
\edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa,}% this inserts the final comma and handles any active ':' sign (for french babel)
\def\pgfplots@loc@TMPb{\pgfplots@gridlines@init@stop@maps #1#2}%
\expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPa\pgfplots@EOI%
\fi
%
%
% Now, compute all final stop positions. Also prepare the cross
% dependencies between x grids and y grids here (such that there
% is no grid line stopping in white space)
%
\if#1x%
\def\pgfplots@finalize@constraints{0}% we have to wait until y stop points are known.
\else
\def\pgfplots@finalize@constraints{1}%
\fi
\pgfplots@gridlines@init@grid@stop@points@for@computethem{#1}{#2}{\pgfplots@finalize@constraints}%
}%
% #1,#2,#3 the arguments for
% \pgfplots@gridlines@preparation@get@current@grid@stop@point
\def\pgfplots@gridlines@init@grid@stop@points@for@computethem#1#2#3{%
%
\expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult
\pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}%
\if1#3%
\pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval
\fi
}%
\expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult
\pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}%
\if1#3%
\pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval
\fi
}%
\expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}%
}
\def\pgfplots@gridlines@init@stop@maps#1#2{%
\pgfutil@ifnextchar\pgfplots@EOI{%
\pgfutil@gobble
}{%
\pgfutil@ifnextchar,{%
\pgfplots@gridlines@init@stop@maps@next@@#1#2%
}{%
\pgfplots@gridlines@init@stop@maps@next#1#2%
}%
}%
}%
\def\pgfplots@gridlines@init@stop@maps@next#1#2#3:#4,{%
\pgfplotscoordmath{default}{parsenumber}{#4}%
\let\pgfplots@loc@TMPa=\pgfmathresult
\pgfplots@gridlines@stopmap@prepare{#3}%
\pgfplots@gridlines@let{#1}{\pgfmathresult}=\pgfplots@loc@TMPa
\expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}%
%
\pgfplots@gridlines@init@stop@maps #1#2%
}
% just eat one empty comma:
\def\pgfplots@gridlines@init@stop@maps@next@@#1#2,{\pgfplots@gridlines@init@stop@maps #1#2}%
\def\pgfplots@gridlines@let#1#2=#3{%
\expandafter\let\csname pgfplots@#1gridline@stopmap@#2\endcsname=#3%
\if#1y%
% support symmetry:
% add -\pgfmathresult to the map.
% To disable this symmetry, use 'ygrid stop at x={0.2:4 -0.2:5}
% you can also use an empty value '-0.2:{}', that's also ok.
\expandafter\let\csname pgfplots@#1gridline@stopmap@-#2\endcsname=#3%
\fi
}%
\def\pgfplots@gridlines@stopmap@prepare@digits{2}%
\def\pgfplots@gridlines@stopmap@prepare#1{%
\begingroup
\pgfmathfloatparsenumber{#1}%
\let\pgfmathfloat@round@precision=\pgfplots@gridlines@stopmap@prepare@digits%
\pgfmathfloatroundzerofill\pgfmathresult
\pgfmath@smuggleone\pgfmathresult
\endgroup
}%
\def\pgfplots@gridlines@stopmap@trunc@#1.#2#3#4\relax{%
\def\pgfmathresult{#1.#2#3}%
}%
\pgfkeysdefargs{/pgfplots/smithchart@sortlt}{#1#2#3#4}{%
\expandafter\pgfplots@prepared@tick@pos@unpack#1%
\let\pgfplots@A=\pgfplots@tick
\expandafter\pgfplots@prepared@tick@pos@unpack#2%
\let\pgfplots@B=\pgfplots@tick
\pgfplotscoordmath{default}{if less than}{\pgfplots@A}{\pgfplots@B}{#3}{#4}%
}%
% initialise a lookuptable from ticknumber -> tick position (sort
% of an array)
%
% This is only invoked if it is needed (if 'arc
% limits={[index]4,[index]2}' or something like that is used, see the
% manual).
%
% #1 either x or y
% #2 either x or y
\def\pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#1#2{%
\c@pgf@counta=0
\pgfplots@if{pgfplots@#1majorgrids}{%
\expandafter
\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#2\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick
\advance\c@pgf@counta by1
}%
}{}%
\pgfplots@if{pgfplots@#1minorgrids}{%
\expandafter
\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#2\endcsname\as\elem{%
\expandafter\pgfplots@prepared@tick@pos@unpack\elem
\expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick
\advance\c@pgf@counta by1
}%
}{}%
\expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{1}%
}%
\def\pgfplots@gridlines@init@grid@stop@points@for@normalise#1\relax#2#3{%
\def\b@pgfplots@haslt{0}%
%
\pgfutil@in@{if <}{#1}%
\ifpgfutil@in@
% strip the white space between 'if' and '<':
\def\pgfplots@loc@TMPa##1if <##2\relax{\edef\entry{##1if<##2}}%
\expandafter\pgfplots@loc@TMPa\entry\relax
\def\b@pgfplots@haslt{1}%
\fi
%
\pgfutil@in@{if<}{#1}%
\ifpgfutil@in@
\def\b@pgfplots@haslt{1}%
\fi
%
\pgfutil@in@:{#1}%
\ifpgfutil@in@
\def\b@pgfplots@hascolon{1}%
\else
\def\b@pgfplots@hascolon{0}%
\fi
%
\if1\b@pgfplots@hascolon
\edef\entry{\entry\if0\b@pgfplots@haslt if<\fi}%
\else
\if1\b@pgfplots@haslt
\expandafter\pgfplots@gridlines@stop@at@unpack@@@\entry\relax
\edef\entry{\pgfplots@grid@stop@at:2if<\pgfplots@grid@stop@at@iflt}%
\else
\edef\entry{\entry:2if<}%
\fi%
\fi%
%
\pgfutil@in@{[index]}{#1}%
\ifpgfutil@in@
\if0\csname b@pgfplots@#3ticknum@to@pos@lookup\endcsname
\pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#2#3%
\fi
\expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax
\pgfutil@ifundefined{pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at}{%
\pgfplotswarning{smithchart/no such tick}{#3}{\pgfplots@grid@stop@at}\pgfeov
\let\entry=\pgfutil@empty
}{%
\edef\entry{\csname pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at\endcsname:\pgfplots@grid@stop@at@eachnth}%
}%
\fi
%
\expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax
\pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at
\let\pgfplots@grid@stop@at=\pgfmathresult
\ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty
\else
\pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at@iflt
\let\pgfplots@grid@stop@at@iflt=\pgfmathresult
\fi
\edef\entry{\pgfplots@grid@stop@at:\pgfplots@grid@stop@at@eachnth if<\pgfplots@grid@stop@at@iflt}%
}%
\def\pgfplots@gridlines@stop@at@unpack@@@#1if<#2\relax{%
\def\pgfplots@grid@stop@at{#1}%
\def\pgfplots@grid@stop@at@iflt{#2}%
}%
\def\pgfplots@gridlines@stop@at@unpack#1:#2if<#3\relax{%
\def\pgfplots@grid@stop@at{#1}%
\def\pgfplots@grid@stop@at@eachnth{#2}%
\def\pgfplots@grid@stop@at@iflt{#3}%
}%
% Returns the xtick position which should end the current arc.
%
% This is an INTERNAL preparation method. See
% \pgfplots@get@current@grid@stop@point for the final one.
%
% Note that arcs correspond to ygrid lines.
%
% #1 either x or y
% #2 either x or y
% #3 the value of the current grid line
% #4 a boolean which expands either to 0 or to 1.
% The \pgfplots@get@current@grid@stop@point@handle@constraints method
% will be invoked if and only if #4=1
%
% @POSTCONDITION On output,
% - \pgfplotsretval will be filled with the
% result. If the result is empty, no restriction is imposed.
% Otherwise, it contains the #2tick value at which the current #1grid shall end.
% The result is already processed with
% \pgfplotscoordmath{default}{parsenumber}{}
% - \pgfplots@tick@prepared contains a rounded representation of #3.
%
% The method relies on the 'ygrid each nth passes x' feature, more specifically the
% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for
\def\pgfplots@gridlines@preparation@get@current@grid@stop@point#1#2#3#4{%
\def\pgfplotsretval{}%
%
\pgfplots@gridlines@stopmap@prepare{#3}%
\let\pgfplots@tick@prepared=\pgfmathresult
\pgfmathfloatabs@\pgfplots@tick@prepared
\let\pgfplots@tick@prepared@abs=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{abs}{{#3}}%
\let\pgfplots@tick@abs=\pgfmathresult
%
% first: check the '#1grid stop at #2':
\expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax%
% ok. there is no such thing.
\else
% ah - process it!
\pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{%
}{%
\edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}%
}%
\fi
%
\ifx\pgfplotsretval\pgfutil@empty
% the individual map failed. Ok, then check for the '#1grid each nth passes #2'
\expandafter\ifx\csname pgfplots@#1grid@stop@points\endcsname\relax
\else
% \pgfplots@ticknum is defined in this context here.
\pgfutil@ifundefined{pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum}{%
\pgfplots@warning{Sorry, I can't get the current arc limit for #1grid no \#\pgfplots@ticknum\space(value \pgfplots@tick). This seems like an internal error!?}%
}{%
% get the sort index for the current tick (which is
% uniquely identified by its \pgfplots@ticknum)
\expandafter\let\expandafter\pgfplots@k\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname
%
\expandafter\pgfplotslistforeachungrouped\csname pgfplots@#1grid@stop@points\endcsname\as\pgfplots@loc@TMPa{%
\ifx\pgfplotsretval\pgfutil@empty
% we found no final limit so far. proceed.
\expandafter\pgfplots@gridlines@stop@at@unpack\pgfplots@loc@TMPa\relax
\ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty
\pgfplots@loop@CONTINUEtrue
\else
\pgfplotscoordmath{default}{if less than}{\pgfplots@tick@abs}{\pgfplots@grid@stop@at@iflt}{%
\pgfplots@loop@CONTINUEtrue
}{%
\pgfplots@loop@CONTINUEfalse
}%
\fi
%
\ifpgfplots@loop@CONTINUE
\pgfplotsmathmodint\pgfplots@k\pgfplots@grid@stop@at@eachnth
\ifnum\pgfmathresult=0
\c@pgf@counta=\pgfplots@k
\divide\c@pgf@counta by\pgfplots@grid@stop@at@eachnth\relax
\edef\pgfplots@k{\the\c@pgf@counta}%
\else
% found the final limit.
%
% Now, check the constraints which couple
% X and Y.
\let\pgfplotsretval=\pgfplots@grid@stop@at
\if1#4%
\pgfplots@get@current@grid@stop@point@handle@constraints #1#2{#3}%
\fi
\fi
\fi
\fi
}%
}%
\fi
\fi
\ifx\pgfplotsretval\pgfutil@empty
\else
\expandafter\let\csname pgfplots@final@stop@point@for@#1tick@\pgfplots@tick@prepared\endcsname=\pgfplotsretval
%\message{#1 grid line: storing end value for '#3' END[\pgfplots@tick@prepared] = \pgfplotsretval.^^J}%
\fi
}%
% PRECONDITION
% \pgfplotsretval contains a non-zero constraint for the ygrid at #1.
%
% POSTCONDITION
% either \pgfplotsretval is unchanged, or it is reset to
% \pgfutil@empty if constraints are violated.
%
% The constraints are ONLY effective if BOTH, incomplete x- and y grid
% lines are in effect. In that case, it should never happen that a
% single grid line ends in a dead-end somewhere in white space.
%
% I enforce two constraints which apply only to ygrid to fix this
% issue (this may be improved later).
%
% The idea is simple:
% 1. suppose the grid line 'x=1' stops at 'y=5'.
% Suppose further that the y grid line 'y=0.95' should stop at 'x=1'.
% Is that acceptable? Yes, because |y| < 5.
% Now, suppose an y grid line with |y| > 5 should stop at 'x=1'.
% Is this allowed? NO! Because it would become a dead end since
% the 'x=1' line ends at 'y=5'!
%
% So, whenever we consider ygrids and stop point candidates "x=X",
% acquire the value Q where the x (!) grid line "x=X" stops.
% If |y| > Q, the candidate "x=X" is rejected.
%
% 2. There might still be the case that x grid lines have dead-ends.
% The current solution applies the idea first to all y grid lines,
% and once the y grid lines are ready, it applies the same idea to
% x grid lines.
%
% Uncomment the routine(s) and run the test cases to see what happens.
\def\pgfplots@get@current@grid@stop@point@handle@constraints#1#2#3{%
\ifx\pgfplotsretval\pgfutil@empty
\else
\pgfplots@gridlines@stopmap@prepare{\pgfplotsretval}%
\let\pgfplots@loc@TMPa=\pgfmathresult
%
%\message{checking ending '#1=#3' at '#2=\pgfplotsretval'. '#2=\pgfplots@loc@TMPa' stops}%
\pgfutil@ifundefined{pgfplots@final@stop@point@for@#2tick@\pgfplots@loc@TMPa}{%
% no constraint. Ok.
%\message{ nowhere. No constraint.^^J}%
}{%
%\message{ at \pgfplots@loc@TMPa. Feasible: }%
% Oh, a constraint. That means
% further work.
\expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@final@stop@point@for@#2tick@\pgfmathresult\endcsname
\pgfplotscoordmath{default}{op}{abs}{{#3}}%
\pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@loc@TMPa}{%
% ok, we can use the found
% stop value.
%\message{YES.^^J}%
}{%
%\message{NO.^^J}%
% no, the stop value is
% invalid; it would stop in
% white space!
\let\pgfplotsretval=\pgfutil@empty
}%
}%
\fi
}%
% Returns the xtick position which should end the current arc.
%
% Note that arcs correspond to ygrid lines.
%
% #1 either x or y
% #2 either x or y
% #3 the value of the current grid line
%
% @POSTCONDITION On output, \pgfplotsretval will be filled with the
% result. If the result is empty, no restriction is imposed.
% Otherwise, it contains the #2tick value at which the current #1grid shall end.
% The result is already processed with
% \pgfplotscoordmath{default}{parsenumber}{}
%
% The method relies on the 'ygrid each nth passes x' feature, more specifically the
% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for
%
% Note that all work has already been done by
% \pgfplots@gridlines@init@grid@stop@points@for. We only need to query
% the result at this point.
% @see \pgfplots@gridlines@init@grid@stop@points@for
% @see \pgfplots@gridlines@preparation@get@current@grid@stop@point
\def\pgfplots@get@current@grid@stop@point#1#2#3{%
\def\pgfplotsretval{}%
%
% check the '#1grid stop at #2':
\expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax%
% ok. there is no such thing.
\else
%
\pgfplots@gridlines@stopmap@prepare{#3}%
\let\pgfplots@tick@prepared=\pgfmathresult
\pgfmathfloatabs@\pgfplots@tick@prepared
\let\pgfplots@tick@prepared@abs=\pgfmathresult
%
% ah - process it!
\pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{%
\let\pgfplotsretval\pgfutil@empty
}{%
\edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}%
}%
\fi
%
}%
\def\pgfplots@smithchart@draw@xcircle#1{%
\pgfplotscoordmath{default}{one}%
\let\pgfplots@loc@TMPa=\pgfmathresult
%
\pgfplotscoordmath{default}{parsenumber}{#1}%
\let\pgfplots@x=\pgfmathresult
%
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@loc@TMPa}{\pgfplots@x}}%
\let\pgfplots@radius@inverse=\pgfmathresult
\pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}%
\let\pgfplots@radius=\pgfmathresult
\pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@x}}%
\pgfplotscoordmath{default}{tofixed}{\pgfmathresult}%
\let\pgfplots@center=\pgfmathresult
%
\pgfplotscoordmath{default}{tofixed}{\pgfplots@radius}%
\let\pgfplots@radius=\pgfmathresult
%
\pgfplotscoordmath{default}{tofixed}{\pgfplots@radius@inverse}%
\let\pgfplots@radius@inverse=\pgfmathresult
%
% This here would suffice in case 'xgrid each nth passes y={}':
% \pgfpathellipse
% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}}
% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@radius}{0}}
% {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@radius}}%
%
% but we also check for the 'xgrid each nth passes y' feature:
\pgfplots@get@current@grid@stop@point xy{\pgfplots@x}%
\let\pgfplots@arc@ends@at@y@arc@value\pgfplotsretval%
%
\ifx\pgfplots@arc@ends@at@y@arc@value\pgfutil@empty
% Ok. There is no specific end point -- simply use the
% (1,0) point (i.e. draw the full circle).
%
\pgfmathadd@{\pgfplots@center}{\pgfplots@radius}%
\let\pgfplots@start=\pgfmathresult%
\def\pgfplots@startim{0}%
\def\pgfplots@startangle{0}%
\let\pgfplots@end=\pgfplots@start
\let\pgfplots@endim=\pgfplots@startim
\def\pgfplots@endangle{360}%
\else
% Ok. The arc should end before it reaches the (1,0)
% point. Determine the exact position and the
% corresponding arc end angle.
%
% In general, the intersection between the circle for
% fixed x=A and fixed y=B is given by
%
% p + j * q = (A + j * B -1 ) / ( A + j*B +1)
% see http://www.siart.de/lehre/tutorien.xhtml#smishort
\pgfplotscoordmath{default}{one}%
\let\pgfplots@one=\pgfmathresult
\pgfplotscoordmath{default}{parsenumber}{-1}%
\let\pgfplots@mone=\pgfmathresult
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@mone}}%
\let\pgfplots@A@mone=\pgfmathresult
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@one}}%
\let\pgfplots@A@one=\pgfmathresult
% oh - we should only draw a partial arc.
% Well, then compute its end point and the
% corresponding end angle.
\pgfplotscoordmathcomplexdivision
{\pgfplots@A@mone}{\pgfplots@arc@ends@at@y@arc@value}%
{\pgfplots@A@one}{\pgfplots@arc@ends@at@y@arc@value}%
\let\pgfplots@start=\pgfmathresult
\let\pgfplots@startim=\pgfmathresultim
\pgfplotscoordmath{default}{tofixed}{\pgfplots@start}%
\let\pgfplots@start=\pgfmathresult
\pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}%
\let\pgfplots@startim=\pgfmathresult
%
\pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{\pgfplots@center}{\pgfplots@radius}{\pgfplots@radius@inverse}%
\let\pgfplots@startangle=\pgfmathresult
\pgfmathsubtract@{360}{\pgfplots@startangle}%
\let\pgfplots@endangle=\pgfmathresult
\let\pgfplots@end=\pgfplots@start
\edef\pgfplots@endim{-\pgfplots@startim}%
\ifdim\pgfplots@startangle pt>\pgfplots@endangle pt
\let\pgfplots@loc@TMPa=\pgfplots@startangle
\let\pgfplots@startangle=\pgfplots@endangle
\let\pgfplots@endangle=\pgfplots@loc@TMPa
\fi
\fi
%
%\message{X grid line \#\csname pgfplots@ticknum\endcsname \space at '#1': center = (\pgfplots@center,0); radius = \pgfplots@radius\space(start angle \pgfplots@startangle, end angle = \pgfplots@endangle; stops at y = \pgfplots@arc@ends@at@y@arc@value).^^J}%
%
% Now, compute the arc.
%
% first, compute the absolute x/y radii:
\pgf@xa=\pgfplots@radius\pgf@xx
\pgf@xb=\pgfplots@radius\pgf@yy
\edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}%
\pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}%
% note that the case startangle > endangle is
% automatically correct; patharc handles that.
%\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}%
%\expandafter\pgfpatharc\pgfplots@loc@TMPa
%
% prefer \pgfpatharctoprecomputed. It is faster and more accurate
\edef\pgfplots@loc@TMPa{%
{\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}}%
{\pgfplots@startangle}%
{\pgfplots@endangle}%
{\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}%
{\pgfplots@mirror@sign\the\pgf@xa}%
{\the\pgf@xb}%
{\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}%
{\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}%
}%
\expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa
}
\def\pgfplots@smithchart@draw@yarc#1{%
\pgfplotscoordmath{default}{parsenumber}{#1}%
\let\pgfplots@y\pgfmathresult
\pgfplotscoordmath{default}{op}{abs}{{\pgfplots@y}}%
\pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@almost@zero@thresh}{%
\pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{-1}{0}}%
\pgfpathlineto{\pgfplotsqpointxy@smithchart@canvas{1}{0}}%
}{%
\pgfplotscoordmath{default}{op}{reciprocal}{{\pgfplots@y}}%
\pgfplotscoordmath{default}{tofixed}{\pgfmathresult}%
\let\pgfplots@signedradius=\pgfmathresult
%
\pgfplotscoordmath{default}{tofixed}{\pgfplots@y}%
\ifdim\pgfplots@signedradius pt<0pt
\def\pgfplots@radius@sign{-}%
\edef\pgfplots@radius@inverse{-\pgfmathresult}%
\edef\pgfplots@radius{-\pgfplots@signedradius}%
\else
\def\pgfplots@radius@sign{}%
\edef\pgfplots@radius@inverse{\pgfmathresult}%
\let\pgfplots@radius=\pgfplots@signedradius
\fi
% this here is the correct, complete circle -- together
% with a clip path, you get what you want:
%\pgfpathellipse
% {\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@signedradius}}
% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@signedradius}{0}}
% {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@signedradius}}%
% But I only want the arc (probably stopped earlier to
% improve qualtity of the chart)
%
% compute start point for the arc.
%
% To do so, we need to compute the intersection between
% the circle for fixed x=0 and the circle for y=#1.
%
% In general, the intersection between the circle for
% fixed x=A and fixed y=B is given by
%
% p + j * q = (A + j * B -1 ) / ( A + j*B +1)
% see http://www.siart.de/lehre/tutorien.xhtml#smishort
%
% inserting A = 0 and B = #1 yields the result
% p=\pgfplots@start
% q=\pgfplots@startim
% as follows:
\pgfplotscoordmath{default}{one}%
\let\pgfplots@one=\pgfmathresult
\pgfplotscoordmath{default}{parsenumber}{-1}%
\let\pgfplots@mone=\pgfmathresult
\pgfplotscoordmathcomplexdivision{\pgfplots@mone}{\pgfplots@y}{\pgfplots@one}{\pgfplots@y}%
\let\pgfplots@start=\pgfmathresult
\let\pgfplots@startim=\pgfmathresultim
\pgfplotscoordmath{default}{tofixed}{\pgfplots@start}%
\let\pgfplots@start=\pgfmathresult
\pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}%
\let\pgfplots@startim=\pgfmathresult
%
\pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}%
\let\pgfplots@startangle=\pgfmathresult
%
%
% compute end angle.
\pgfplots@get@current@grid@stop@point yx{\pgfplots@y}%
\let\pgfplots@arc@ends@at@x@circle@value\pgfplotsretval%
%
\ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty
% Ok. There is no specific end point -- simply use the
% (1,0) point (i.e. draw the full arc).
%
% The "0 degree" angle in my circles is in the direction
% of (1,0) .
\ifdim\pgfplots@startim pt>0pt
% ok; this arc belongs to the upper hemisphere.
\def\pgfplots@endangle{270}%
\else
% ok; this arc belongs to the lower hemisphere.
\def\pgfplots@endangle{90}%
\fi
\def\pgfplots@end{1}%
\def\pgfplots@endim{0}%
\else
% Ok. The arc should end before it reaches the (1,0)
% point. Determine the exact position and the
% corresponding arc end angle.
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@mone}}%
\let\pgfplots@A@mone=\pgfmathresult
\pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@one}}%
\let\pgfplots@A@one=\pgfmathresult
% oh - we should only draw a partial arc.
% Well, then compute its end point and the
% corresponding end angle.
\pgfplotscoordmathcomplexdivision{\pgfplots@A@mone}{\pgfplots@y}{\pgfplots@A@one}{\pgfplots@y}%
\let\pgfplots@end=\pgfmathresult
\let\pgfplots@endim=\pgfmathresultim
\pgfplotscoordmath{default}{tofixed}{\pgfplots@end}%
\let\pgfplots@end=\pgfmathresult
\pgfplotscoordmath{default}{tofixed}{\pgfplots@endim}%
\let\pgfplots@endim=\pgfmathresult
%
\pgfplots@compute@angle@of@point@in@circle\pgfplots@end\pgfplots@endim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}%
\let\pgfplots@endangle=\pgfmathresult
\fi
%
%
%
% Now, compute the arc.
%
% first, compute the absolute x/y radii:
%
% Note that for small y (like y=0.01), the arc is almost a
% straight line. Consequently, the ellipsis radius will be much larger
% than 16000, violating TeX's number range.
%
% To avoid that, I clip it to the highest allowed value.
% The final radius is
% \pgfplots@radius * \pgf@xx and \pgfplots@radius * \pgf@yy.
% the clipped value thus needs to respect the magnitude of \pgf@xx and \pgf@yy.
\ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@xradius@for@ycircle pt
\let\pgfplots@radius@x\pgfplots@radius
\else
\let\pgfplots@radius@x=\pgfplots@smithchart@axis@max@xradius@for@ycircle
\fi
\ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@yradius@for@ycircle pt
\let\pgfplots@radius@y\pgfplots@radius
\else
\let\pgfplots@radius@y=\pgfplots@smithchart@axis@max@yradius@for@ycircle
\fi
%\message{Y grid line \#\csname pgfplots@ticknum\endcsname\space at '#1': center = (1,\pgfplots@signedradius); signedradius = \pgfplots@signedradius\space clipped radii = \pgfplots@radius@x*\the\pgf@xx\space and \pgfplots@radius@y*\the\pgf@yy\space ( start angle \pgfplots@startangle, end angle \pgfplots@endangle, arc limit: \ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty NONE\else \pgfplots@arc@ends@at@x@circle@value\fi)^^J}%
\pgf@xa=\pgfplots@radius@x\pgf@xx
\pgf@xb=\pgfplots@radius@y\pgf@yy
\edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}%
\pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}%
% note that the case startangle > endangle is
% automatically correct; patharc handles that.
%\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}%
%\expandafter\pgfpatharc\pgfplots@loc@TMPa
%
% prefer \pgfpatharctoprecomputed. It is faster and more accurate
\ifdim\pgfplots@startangle pt>\pgfplots@endangle pt
\let\pgfplots@loc@TMPa=\pgfplots@startangle
% \let\pgfplots@startangle=\pgfplots@endangle
% \let\pgfplots@endangle=\pgfplots@loc@TMPa
\fi
\edef\pgfplots@loc@TMPa{%
{\noexpand\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@radius@sign\pgfplots@radius@y}}%
{\pgfplots@startangle}%
{\pgfplots@endangle}%
{\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}%
{\pgfplots@mirror@sign\the\pgf@xa}%
{\the\pgf@xb}%
{\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}%
{\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}%
}%
\expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa
}%
}
\def\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart#1{%
\if x\pgfplotspointonorientedsurfaceA
\pgfplots@smithchart@draw@xcircle{#1}%
\else
\pgfplots@smithchart@draw@yarc{#1}%
\fi
}%
% Given a circle with center point (#3,#4), we search for the angle
% of the point (#1,#2). The point is expected to be on the circle.
% The resulting angle is returned in \pgfmathresult
%
% #1 x coordinate of the point for which an angle is searched
% #2 y coordinate of the point for which an angle is searched
% #3 x coordinate of the circle's center point
% #4 y coordinate of the circle's center point
% #5 is either empty or it is expected to contain the inverse radius, 1/r
% this information is available in my context, so I don't recompute
% it.
%
% All coordinates are expected in standard TeX precision (numbers
% without unit)
\def\pgfplots@compute@angle@of@point@in@circle#1#2#3#4#5{%
%
% 1. compute diff vector from center=(1,\pgfplots@signedradius) to start:
\pgfmathsubtract@{#1}{#3}%
\let\pgfplots@D\pgfmathresult
\pgfmathsubtract@{#2}{#4}%
\let\pgfplots@Dim\pgfmathresult
%
% 2. compute the start angle.
% It is related to the angle between the point (1,0) and
% diff, which, in turn is given by
% < (1,0), (D,Dim) > = cos(alpha) ||(D,Dim)||
% < (1,0), (D,Dim) > = D
%
% Note that ||(D,Dim)|| = r, the radius of the involved circle
% around (#3,#4). If 1/r is already available, use it! Saves a lot
% of time.
%
\def\pgfplots@loc@TMPa{#5}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\pgfmathveclen\pgfplots@D\pgfplots@Dim
\let\pgfplots@veclen=\pgfmathresult
\pgfmathreciprocal@\pgfplots@veclen
\let\pgfplots@inverseveclen=\pgfmathresult
\else
% oh, good -- we already have 1/||(D,Dim)||. Use it.
\def\pgfplots@inverseveclen{#5}%
%\message{using already available inverseveclen '#5' }%
\fi
\pgfmathmultiply@{\pgfplots@D}{\pgfplots@inverseveclen}%
%\message{D= (\pgfplots@D,\pgfplots@Dim).. acos(\pgfplots@D * \pgfplots@inverseveclen) = acos(\pgfmathresult)}%
\pgfmathacos@{\pgfmathresult}% the '-' comes from D<0 .
%\message{= \pgfmathresult^^J}%
\let\pgfplots@tmpangle\pgfmathresult%
% ok. tmpangle is per definition less than 180; it is the
% smaller angle between (1,0) and (D,Dim).
%
% compute the angle relative to (1,0):
\ifdim\pgfplots@Dim pt<0pt
\pgfmathiftrigonometricusesdeg{%
\pgfmathsubtract@{360}{\pgfplots@tmpangle}%
}{%
\pgfmathsubtract@{6.28318530717959}{\pgfplots@tmpangle}%
}%
\fi
}%
\def\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart#1#2#3{%
\if2\csname pgfplots@#1axislinesnum\endcsname
\draw[/pgfplots/every inner #1 axis line,%
decorate,%
#1discont,%
decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}]
\pgfextra
\csname pgfplotspointonorientedsurfaceabsetupforset#3\endcsname{\csname pgfplots@logical@ZERO@#3\endcsname}{2}%
\if#1x%
\pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}%
\pgfplots@drawgridlines@onorientedsurf@fromto{0}%
\else
\pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}%
\pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}%
\fi
\endpgfextra
;
\fi
}%
\def\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis#1#2{%
\if2\csname pgfplots@#1axislinesnum\endcsname
% centered axis lines handled elsewhere.
\else
\scope[/pgfplots/every outer #1 axis line,
#1discont,decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}]
\if#1x
\draw decorate {
\pgfextra
% exchange roles of A <-> B axes:
\pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}%
\pgfplots@drawgridlines@onorientedsurf@fromto{0}%
\endpgfextra
};
\else
\pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{0}{%
\draw decorate {
\pgfextra
% exchange roles of A <-> B axes:
\pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}%
\pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2min\endcsname}%
\endpgfextra
};
}{}%
%--------------------------------------------------
% \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{1}{%
% \draw decorate {
% \pgfextra
% % exchange roles of A <-> B axes:
% \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}%
% \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2max\endcsname}%
% \endpgfextra
% };
% }{}%
%--------------------------------------------------
\fi
\endscope
\fi
}%
\def\pgfplots@BB@for@plotbox@get@unit@scales@for@limits@smithchart#1#2#3{%
% In a smith chart, the size of the image is unrelated to the
% involved data limits.
%
% The factor 2 is because we want to fit the DIAMETER into the
% prescribed dimensions, not just the radius.
\def\pgfmathresult{2}%
\let#1=\pgfmathresult
\let#2=\pgfmathresult
\def#3{1}%
}%
\def\pgfplots@handle@invalid@range@defaultlimits@smithchart{%
\pgfplotscoordmath{x}{parsenumber}{0}%
\global\let\pgfplots@xmin=\pgfmathresult
\pgfplotscoordmath{x}{parsenumber}{16000}%
\global\let\pgfplots@xmax=\pgfmathresult
\global\let\pgfplots@data@xmin=\pgfplots@xmin
\global\let\pgfplots@data@xmax=\pgfplots@xmax
%
\pgfplotscoordmath{y}{parsenumber}{0}%
\global\let\pgfplots@ymin=\pgfmathresult
\pgfplotscoordmath{y}{parsenumber}{16000}%
\global\let\pgfplots@ymax=\pgfmathresult
\global\let\pgfplots@data@ymin=\pgfplots@ymin
\global\let\pgfplots@data@ymax=\pgfplots@ymax
\pgfplotsset{enlargelimits=false}%
}
\let\pgfplots@set@default@size@options@standard=\pgfplots@set@default@size@options
\def\pgfplots@set@default@size@options@smithchart{%
\pgfplots@set@default@size@options@standard
\pgfplotsset{smithchart ticks by size={\pgfkeysvalueof{/pgfplots/width}}{\pgfkeysvalueof{/pgfplots/height}}}%
%
\if1\b@pgfplots@smithchart@defaultticks@x
\if1\b@pgfplots@smithchart@defaultticks@y
\pgfplotsset{default smithchart xytick}%
\fi
\fi
}
\def\pgfplots@assign@default@tick@foraxis@smithchart#1{%
% do nothing here. I don't know the algorithm yet... but for
% smithcharts, it may be sufficient to simply predefine several
% sets of ticks, depending on the final size.
%
% This is realized in
% \pgfplots@set@default@size@options@smithchart (which is invoked
% before the ticks are processed).
\pgfplots@determinedefaultvalues@needs@check@uniformtickfalse
\expandafter\let\csname pgfplots@tick@distance@#1\endcsname=\pgfutil@empty
%
\pgfplotsset{default smithchart #1tick}%
% ok, I expect the '#1tick' key to be set now. Process it.
% Note that the earlier processing of pgfplots has been bypassed
% at this point -- we need to preprocess the tick list *here*:
\expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tick\endcsname
\expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}%
\expandafter\let\csname pgfplots@#1tick\endcsname=\pgfplotsretval
%
\pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\else
\expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}%
\pgfkeyslet{/pgfplots/minor #1tick}\pgfplotsretval
\fi
%
}%
% #1: a \foreach list
% on output, \pgfplotsretval contains a parsed list of positions
\def\pgfplots@assign@default@tick@foraxis@smithchart@#1{%
\pgfplotsapplistXXglobalnewempty
\gdef\pgfplots@loc@TMPd{1}%
\foreach \pgfplots@loc@TMPb in {#1} {%
\ifx\pgfplots@loc@TMPb\pgfutil@empty
\else
\pgfplotscoordmath{default}{parsenumber}{\pgfplots@loc@TMPb}%
\pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% per convention...
\edef\pgfmathresult{\if0\pgfplots@loc@TMPd,\fi\pgfmathresult}%
\gdef\pgfplots@loc@TMPd{0}%
\expandafter\pgfplotsapplistXXglobalpushback\expandafter{\pgfmathresult}%
\fi
}%
\pgfplotsapplistXXgloballet\pgfplotsretval
\pgfplotsapplistXXglobalclear
}%
\let\pgfplots@show@ticklabel@@orig=\pgfplots@show@ticklabel@
\def\pgfplots@show@ticklabel@@smithchart#1#2{%
\def\pgfmathresult{#2}%
\if#1x%
\ifdim#2pt>360pt
\pgfmath@basic@mod@{#2}{360}%
\fi
\fi
\def\pgfplots@loc@TMPa{\pgfplots@show@ticklabel@@orig{#1}}%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}%
}%
\def\pgfplots@xtick@check@tickshow@smithchart{%
\pgfplots@tickshowtrue
}
\def\pgfplots@ytick@check@tickshow@smithchart{%
\pgfplots@tickshowtrue
}
\let\pgfplots@limits@ready@orig=\pgfplots@limits@ready
\def\pgfplots@limits@ready@smithchart{%
\pgfplots@limits@ready@orig
%
% Avoid tick labels at upper *and* lower angle range if both are the
% same:
\pgfmath@basic@sin@{\pgfplots@xmin}%
\let\pgfplots@loc@TMPa=\pgfmathresult
\pgfmath@basic@sin@{\pgfplots@xmax}%
\pgfplotsmath@ifapproxequal@dim
{\pgfmathresult pt}{\pgfplots@loc@TMPa pt}%
{0.002pt}
{%
\def\pgfplots@xtick@disable@last@tick{1}%
}{%
}%
}%
\def\smithchart{\smithchartaxis}
\def\endsmithchart{\endsmithchartaxis}
\def\startsmithchart{\smithchart}%
\def\stopsmithchart{\endsmithchart}%
\endinput