summaryrefslogtreecommitdiff
path: root/graphics/pstricks/contrib/pst-magneticfield/tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pstricks/contrib/pst-magneticfield/tex
Initial commit
Diffstat (limited to 'graphics/pstricks/contrib/pst-magneticfield/tex')
-rw-r--r--graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex237
1 files changed, 237 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex b/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex
new file mode 100644
index 0000000000..690afeca27
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex
@@ -0,0 +1,237 @@
+%% Package `pst-magneticfield.tex'
+%%
+%% Manuel Luque
+%% Jürgen Gilg
+%% Herbert Voß
+%%
+%% This program can be redistributed and/or modified under
+%% the terms of the LaTeX Project Public License Distributed
+%% from CTAN archives in directory macros/latex/base/lppl.txt.
+%%
+%% A PSTricks related package to draw magnetic field lines
+%% It uses the method from Heun
+%%
+\csname PSTMagneticFieldLoaded\endcsname
+\let\PSTMagneticFieldLoaded\endinput
+%
+% Requires some packages
+\ifx\PSTricksLoaded\endinput\else \input pstricks \fi
+\ifx\PSTthreeDLoaded\endinput\else\input pst-3d \fi
+\ifx\PSTnodesLoaded\endinput\else \input pst-node \fi
+\ifx\PSTarrowLoaded\endinput\else \input pst-arrow \fi
+\ifx\MultidoLoaded\endinput\else \input multido.tex\fi
+\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi
+%
+\def\fileversion{1.16}
+\def\filedate{2019/01/21}
+\message{`pst-magneticfield' v\fileversion, \filedate\space (ml,jg,hv)}
+%
+\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
+%
+\SpecialCoor
+\pst@addfams{pst-magneticfield}
+
+%% prologue for postcript
+\pstheader{pst-magneticfield.pro}%
+
+% the first three parameter cannot be read with \pst@getint, because \pstFP.. do not like
+% the values ... used in \psmagenticfieldThreeD
+\define@key[psset]{pst-magneticfield}{R}[1]{\def\psk@magneticfieldR{#1}}% rayon d'une spire
+\define@key[psset]{pst-magneticfield}{N}[6]{\def\psk@magneticfieldN{#1}}% nombre de spires
+\define@key[psset]{pst-magneticfield}{L}[4]{\def\psk@magneticfieldL{#1}}% Longueur de la bobine
+\define@key[psset]{pst-magneticfield}{nL}[8]{\pst@getint{#1}\psk@magneticfieldNL}% nombre de lignes de champ
+\define@key[psset]{pst-magneticfield}{numSpires}[]{\def\psk@magneticfieldChoixSpires{#1}}% choix individuel des spires
+\psset[pst-magneticfield]{numSpires=}% toutes les spires par défaut
+\define@key[psset]{pst-magneticfield}{pointsB}[500]{\pst@getint{#1}\psk@magneticfieldB}
+\define@key[psset]{pst-magneticfield}{pointsS}[1000]{\pst@getint{#1}\psk@magneticfieldS}% nombre de points autour de chaque spire
+\define@key[psset]{pst-magneticfield}{PasB}[0.02]{\pst@checknum{#1}\psk@magneticfieldPasB}% incrément du tracé autour de la bobine
+\define@key[psset]{pst-magneticfield}{PasS}[0.00275]{\pst@checknum{#1}\psk@magneticfieldPasS}% incrément du tracé autour de chaque spire
+\define@key[psset]{pst-magneticfield}{nS}[1]{\pst@getint{#1}\psk@magneticfieldNS}% nombre de lignes autour de chaque spire
+\define@key[psset]{pst-magneticfield}{styleSpire}[styleSpire]{\def\psk@styleSpire{#1}}
+\define@key[psset]{pst-magneticfield}{styleCourant}[sensCourant]{\def\psk@styleCourant{#1}}
+%
+\newpsstyle{styleSpire}{linecap=1,linecolor=red,linewidth=2\pslinewidth}
+\newpsstyle{sensCourant}{linecolor=red,linewidth=2\pslinewidth,arrowinset=0.1}
+%
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{drawSelf}[true]{}
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{AntiHelmholtz}[true]{}
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{StreamDensityPlot}[true]{}
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{setgray}[true]{}
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{changeNS}[true]{}
+%
+\psset[pst-magneticfield]{R=1,L=4,N=6,pointsB=500,pointsS=1000,
+ PasB=0.02,PasS=0.00275,nS=1,nL=8,drawSelf,styleSpire=styleSpire,
+ styleCourant=sensCourant,AntiHelmholtz=false,StreamDensityPlot=false,setgray=false,
+ changeNS=false}
+%
+\def\tx@MFieldDict{ tx@MFieldDict begin }
+%
+\def\psmagneticfield{\pst@object{psmagneticfield}}
+\def\psmagneticfield@i{\@ifnextchar({\psmagneticfield@ii}{\psmagneticfield@iii(-6,-5)(6,5)}}
+\def\psmagneticfield@ii(#1,#2){\@ifnextchar({\psmagneticfield@iii(#1,#2)}{\psmagneticfield@iii(#1,#2)(6,5)}}
+\def\psmagneticfield@iii(#1,#2)(#3,#4){%
+ \pst@killglue%
+ \ifPst@AntiHelmholtz\addbefore@par{N=2}\fi%
+ \begin@SpecialObj%
+ \pst@Verb{% make it global
+ /NombreSpires \psk@magneticfieldN\space def
+ /Radius \psk@magneticfieldR\space def
+ /nombreLignes \psk@magneticfieldNL\space def
+ /TableauSpires [\psk@magneticfieldChoixSpires] def
+ /StepLines Radius nombreLignes 1 add div def
+ NombreSpires 1 eq
+ { /Longueur 0 def
+ /inter 0 def }
+ { /Longueur \psk@magneticfieldL\space def
+ /inter Longueur NombreSpires 1 sub div def } ifelse % intervalle entre 2 spires
+ \ifPst@AntiHelmholtz
+ /AntiHelmholtz true def
+ TableauSpires length 0 eq {/TS [1 2] def}
+ {/TS TableauSpires def } ifelse
+ /inter Radius def
+ /yA Radius 2 div def
+ \else
+ /AntiHelmholtz false def
+ TableauSpires length 0 eq {/TS [1 1 NombreSpires {} for] def}
+ {/TS TableauSpires def } ifelse
+ /yA Longueur 2 div def
+ \fi
+ /NbrePointsB \psk@magneticfieldB\space def
+ /NbrePointsS \psk@magneticfieldS\space def
+ /PasB \psk@magneticfieldPasB\space def
+ /PasS \psk@magneticfieldPasS\space def
+ /nS \psk@magneticfieldNS\space def
+% pour la carte de densite
+ /xMin #1 def
+ /xMax #3 def
+ % NombreSpires 1 eq {/yMax 2 Radius mul def}{/yMax Longueur 2 mul def} ifelse
+ /yMax #4 def
+ /yMin #2 def
+ /Unit \pst@number\psunit def
+ /xUnit \pst@number\psxunit def
+ /yUnit \pst@number\psyunit def
+ /StreamDensityPlot \ifPst@StreamDensityPlot true \else false \fi def
+ /Setgray \ifPst@setgray true \else false \fi def
+ }%
+ \addto@pscode{ \tx@MFieldDict %\pst@magnetrotate rotate
+ MagneticField end }%
+ \ifPst@drawSelf
+ \ifPst@AntiHelmholtz
+ \psline[style=\psk@styleSpire](!Radius neg Radius 2 div)(!Radius Radius 2 div)
+ \psline[style=\psk@styleSpire](!Radius neg Radius 2 div neg)(!Radius Radius 2 div neg)
+ \ifPst@changeNS
+ \psline[style=\psk@styleCourant]{->}(!-0.2 Radius 2 div)(!0.2 Radius 2 div)
+ \psline[style=\psk@styleCourant]{<-}(!-0.2 Radius 2 div neg)(!0.2 Radius 2 div neg)
+ \else
+ \psline[style=\psk@styleCourant]{<-}(!-0.2 Radius 2 div)(!0.2 Radius 2 div)
+ \psline[style=\psk@styleCourant]{->}(!-0.2 Radius 2 div neg)(!0.2 Radius 2 div neg)
+ \fi
+ \else
+ \ifPst@changeNS
+ \multido{\i=1+1}{\psk@magneticfieldN}{% numero de la spire
+ \pst@Verb{ /Yspire yA \i\space 1 sub inter mul sub def } % position de la spire
+ \psline[style=\psk@styleSpire](! Radius neg Yspire)(! Radius Yspire)
+ \psline[style=\psk@styleCourant]{<-}(! -0.2 Yspire)(! 0.2 Yspire)}%
+ \else
+ \multido{\i=1+1}{\psk@magneticfieldN}{% numero de la spire
+ \pst@Verb{ /Yspire yA \i\space 1 sub inter mul sub def } % position de la spire
+ \psline[style=\psk@styleSpire](! Radius neg Yspire)(! Radius Yspire)
+ \psline[style=\psk@styleCourant]{->}(! -0.2 Yspire)(! 0.2 Yspire)}%
+ \fi
+ \fi
+ \fi
+ \end@SpecialObj
+ \ignorespaces}
+%
+\newpsstyle{grille}{subgriddiv=0,gridcolor=lightgray,griddots=10}
+\newpsstyle{cadre}{linecolor=green!20}
+%
+\def\psmagneticfieldThreeD{\pst@object{psmagneticfieldThreeD}}
+\def\psmagneticfieldThreeD@i(#1,#2)(#3,#4){%
+ \ifPst@AntiHelmholtz\addto@par{N=2}\fi
+ \begingroup
+ \use@par
+ \ifPst@AntiHelmholtz
+ \pstFPdiv\yA{\psk@magneticfieldR}{2}
+ \ThreeDput{%
+ \begin{psclip}{\psframe(#1,#2)(#3,#4)}
+ \psframe*[style=cadre](#1,#2)(#3,#4)
+ \psgrid[style=grille](#1,#2)(#3,#4)
+ \psmagneticfield[drawSelf=false](#1,#2)(#3,#4)%
+ \end{psclip}}
+ \ThreeDput[normal=0 1 0](0,\yA,0){%
+ \psarc[linecolor=red,linewidth=3\pslinewidth](0,0){\psk@magneticfieldR}{0}{180}
+ \psarc[linecolor=red,linewidth=3\pslinewidth]{<-}(0,0){\psk@magneticfieldR}{80}{90}
+ \psarc[linecolor=red,linewidth=1\pslinewidth,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}}
+ \ThreeDput[normal=0 1 0](0,-\yA,0){%
+ \psarc[linecolor=red,linewidth=3\pslinewidth](0,0){\psk@magneticfieldR}{0}{180}
+ \psarc[linecolor=red,linewidth=3\pslinewidth]{->}(0,0){\psk@magneticfieldR}{80}{90}
+ \psarc[linecolor=red,linewidth=1\pslinewidth,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}}
+ \else
+ \ifnum\psk@magneticfieldN=1
+ \def\MF@inter{0}
+ \def\yA{0}
+ \else
+ \pstFPsub\CalcIntermediaire{\psk@magneticfieldN}{1}
+ \pstFPdiv\MF@inter{\psk@magneticfieldL}{\CalcIntermediaire}
+ \pstFPdiv\yA{\psk@magneticfieldL}{2}
+ \fi
+ \ThreeDput{%
+ \begin{psclip}{\psframe(#1,#2)(#3,#4)}
+ \psframe*[style=cadre](#1,#2)(#3,#4)
+ \psgrid[style=grille](#1,#2)(#3,#4)
+ \psmagneticfield[drawSelf=false](#1,#2)(#3,#4)%
+ \end{psclip}}
+ \multido{\iN=1+1,\iS=0+1}{\psk@magneticfieldN}{%
+ \pstFPmul\MF@calcA{\iS}{\MF@inter}
+ \pstFPsub\posSpire{\yA}{\MF@calcA}
+ \ThreeDput[normal=0 1 0](0,\posSpire,0){%
+ \psarc[style=\psk@styleSpire](0,0){\psk@magneticfieldR}{0}{180}
+ \psarc[style=\psk@styleCourant]{->}(0,0){\psk@magneticfieldR}{80}{90}
+ \psarc[style=\psk@styleSpire,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}}%
+ }%
+ \fi
+ \endgroup}
+%
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{showField}[true]{}
+\define@boolkey[psset]{pst-magneticfield}[Pst@]{showPoleLabels}[true]{}
+\define@key[psset]{pst-magneticfield}{fontstyle}[\large\bfseries\sffamily]{\def\psk@label@fontstyle{#1}}
+\define@key[psset]{pst-magneticfield}{magnetScale}[1 1]{\def\pst@magnetscale{#1}}
+\psset[pst-magneticfield]{showPoleLabels,fontstyle=\large\bfseries\sffamily,showField=false,
+ magnetScale=1 1}
+
+\def\ps@Bar@Magnet{%
+ \psscalebox{\pst@magnetscale}{%
+ \psframe*[linecolor=Green](-0.75,-1.75)(0.75,0)%
+ \psframe*[linecolor=BrickRed](-0.75,0)(0.75,1.75)%
+ \ifPst@showPoleLabels
+ \rput{0}(0,1){\textcolor{white}{\psk@label@fontstyle N}}%
+ \rput{0}(0,-1){\textcolor{white}{\psk@label@fontstyle S}}%
+ \fi}
+}%
+
+\def\psBarMagnet{\pst@object{psBarMagnet}}
+\def\psBarMagnet@i{\@ifnextchar(\psBarMagnet@ii{\psBarMagnet@ii(0,0)}}%
+\def\psBarMagnet@ii(#1){%
+ \pst@killglue
+ \begingroup
+ \addbefore@par{linewidth=2pt,R=0.8,L=3,N=4,pointsS=200,nL=9,nS=0,PasB=0.1,numSpires=0,arrowscale=1.5,arrowinset=0.1}%
+ \use@par
+ \ifPst@showField
+ \rput(#1){%
+ \psscalebox{0.4 0.5}{\psmagneticfield[drawSelf=false](-8,-10)(8,10)%
+ \multido{\rA=0.6+0.3,\rB=0.8+0.4,\iA=-60+20,\iB=60+-20}{4}{%
+ \pccurve[ncurv=\rB,angleA=\iA,angleB=\iB,ArrowInside=->,ArrowInsideNo=2](0.7,\rA)(0.7,-\rA)%
+ \psscalebox{-1 1}{\pccurve[ncurv=\rB,angleA=\iA,angleB=\iB,ArrowInside=->,ArrowInsideNo=2](0.7,\rA)(0.7,-\rA)}%
+ }}}%
+ \fi
+ \rput(#1){\ps@Bar@Magnet}%
+ \endgroup
+ \ignorespaces
+}
+%
+\catcode`\@=\PstAtCode\relax
+%
+%% END
+\endinput
+