-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathmatsubara-contour-3.typ
120 lines (103 loc) · 3.47 KB
/
matsubara-contour-3.typ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#import "@preview/cetz:0.3.4": canvas, draw
#import draw: line, content, circle, arc, set-style
#set page(width: auto, height: auto, margin: 8pt)
// Constants
#let x-range = 3
#let y-range = 3
#let main-radius = y-range + 1.5
#let pole-radius = 0.5
#let dot-radius = 0.05
#let small-dot-radius = 0.03
#let y-offset = 0.25
// Styles
#let arrow-style = (mark: (end: "stealth", scale: 0.5))
#let dark-blue = blue.darken(20%)
#let marc-style = (symbol: "stealth", fill: dark-blue, scale: 0.5, shorten-to: none)
#let gray-line = (paint: gray, thickness: 0.2pt)
#let contour-style = (paint: dark-blue, thickness: 0.8pt)
// Helper function to draw poles
#let draw-poles(poles-label-pos) = {
content(poles-label-pos, [poles of $h(p_0)$], name: "poles-label")
// Pole positions: (x, y, name, anchor)
let pole-positions = (
(1.5, 3, "p1", "west"),
(2, -2, "p2", "north"),
(-3, 1, "p3", "south"),
(-2, -1.5, "p4", "north"),
)
for (x, y, name, anchor) in pole-positions {
circle((x, y), radius: dot-radius, fill: black, name: name)
content(name, $p_#name.last()$, anchor: anchor, padding: 2pt)
let connect-point = if name == "p3" { "poles-label.west" } else { "poles-label" }
line(connect-point, name, stroke: gray-line)
}
}
// Helper function to draw a semicircle with arrows
#let draw-semicircle(center-x, start-angle, end-angle, name) = {
arc(
(center-x, 0),
radius: main-radius,
start: start-angle,
stop: end-angle,
stroke: contour-style,
mark: (
end: (
(pos: 25%, ..marc-style),
(pos: 50%, ..marc-style),
(pos: 75%, ..marc-style),
),
),
name: name,
anchor: "origin",
)
}
// Helper function to draw a vertical line with arrows
#let draw-vertical-line(x, start-y, end-y, name) = {
line(
(x, start-y),
(x, end-y),
stroke: contour-style,
mark: (
end: (
(pos: 25%, ..marc-style),
(pos: 50%, ..marc-style),
(pos: 75%, ..marc-style),
),
),
name: name,
)
}
#canvas({
// Draw axes
line((-main-radius - y-offset, 0), (main-radius + y-offset, 0), ..arrow-style, name: "x-axis")
content("x-axis.end", $"Re"(p_0)$, anchor: "south-east", padding: 2pt)
line((0, -main-radius), (0, main-radius), ..arrow-style, name: "y-axis")
content("y-axis.97%", $"Im"(p_0)$, anchor: "north-east", padding: (right: 8pt))
// Draw Matsubara frequencies
for n in range(-y-range, y-range + 1) {
if n != 0 {
circle((0, n), radius: small-dot-radius, fill: black, name: "freq-" + str(n))
content(
"freq-" + str(n),
$i omega_#text(size: 0.7em)[#n]$,
anchor: "west",
padding: (left: 10pt),
)
}
}
// Draw origin
circle((0, 0), radius: small-dot-radius, fill: black, name: "origin")
content("origin", [0], anchor: "south-west", padding: (left: 10pt, bottom: 3pt))
// Draw split contour
// Right half (C₁): vertical line down + right semicircle
draw-vertical-line(y-offset, main-radius, -main-radius, "right-line")
draw-semicircle(y-offset, -90deg, 90deg, "right-arc")
// Left half (C₂): vertical line up + left semicircle
draw-vertical-line(-y-offset, -main-radius, main-radius, "left-line")
draw-semicircle(-y-offset, 90deg, 270deg, "left-arc")
// Add contour labels
content("right-line.end", text(fill: dark-blue)[$C_1$], anchor: "south-west", padding: 4pt)
content("left-line.start", text(fill: dark-blue)[$C_2$], anchor: "south-east", padding: 4pt)
// Draw poles
draw-poles((2.5, 1.5))
})