<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pheno | Riasat Sheikh | Personal website</title><link>https://riasat-sheikh.github.io/tags/pheno/</link><atom:link href="https://riasat-sheikh.github.io/tags/pheno/index.xml" rel="self" type="application/rss+xml"/><description>Pheno</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-gb</language><lastBuildDate>Sat, 25 Jul 2026 00:00:00 +0000</lastBuildDate><image><url>https://riasat-sheikh.github.io/media/logo_hu_c65988a447571d3.png</url><title>Pheno</title><link>https://riasat-sheikh.github.io/tags/pheno/</link></image><item><title>How to scan parameters of DM model with micrOMEGAs.</title><link>https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/</link><pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate><guid>https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/</guid><description>&lt;p&gt;In this post I show how to scan the parameter space of a BSM dark matter model with micrOMEGAs.
If you haven&amp;rsquo;t set it up yet, download the latest version from its
and compile it once&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzf micromegas_6.x.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; micromegas_6.x
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;If you encounter any installation issue refer to micrOMEGAs manual or README for more details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, now let us start with a very common task in DM phenomenology, i.e.,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For every DM mass (say $m_{\rm DM}^{}$), find the coupling that reproduces the
, $\Omega h^2 = 0.120 \pm 0.001$.&lt;/li&gt;
&lt;li&gt;The resulting curve is the &lt;em&gt;thermal target&lt;/em&gt; of the model, and it is the starting point for confronting the model with direct detection, indirect detection and collider bounds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a working example I use the simplest DM model there is, the real singlet scalar.
micrOMEGAs ships with this model already implemented inside the &lt;code&gt;SingletDM&lt;/code&gt; folder, so we can skip model building entirely and focus on the scan.&lt;/p&gt;
&lt;h2 id="the-model"&gt;The model&lt;/h2&gt;
&lt;p&gt;Take a real scalar $S$ that is a SM singlet and odd under a $\mathbb{Z}_2$ symmetry, $S \to -S$, while all SM fields are even. The scalar potential is&lt;/p&gt;
&lt;!-- prettier-ignore --&gt;
$$\mathcal{V}(S, \Phi) = \underbrace{\frac{\mu_S^2}{2} S^2 +\frac{\lambda_S}{4} S^4}_\text{Dark singlet scalar} + ~\underbrace{\frac{\mu_\Phi^2}{2} \abs{\Phi}^2 + \frac{\lambda_\Phi}{2} \abs{\Phi}^4}_\text{SM Higgs}+ ~\blue{\underbrace{\lambda_{\Phi S} \abs{\Phi}^2 S^2}_\text{Higgs portal}}.$$&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;/th&gt;
&lt;th style="text-align: center"&gt;$\text{SU}(3)_c$&lt;/th&gt;
&lt;th style="text-align: center"&gt;$\text{SU}(2)_L$&lt;/th&gt;
&lt;th style="text-align: center"&gt;$\text{U}(1)_Y$&lt;/th&gt;
&lt;th style="text-align: center"&gt;$\mathbb{Z}_2$&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;$\Phi$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$\mathbf{1}$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$\mathbf{2}$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$+\tfrac{1}{2}$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$+1$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;$S$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$\mathbf{1}$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$\mathbf{1}$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$0$&lt;/td&gt;
&lt;td style="text-align: center"&gt;$-1$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Table: Representation of the SM Higgs doublet $\Phi$ and the real singlet $S$.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The $\mathbb{Z}_2$ makes $S$ stable, and the Higgs portal (in blue) is its only link to the SM.
After electroweak symmetry breaking the singlet keeps a vanishing vacuum expectation value $\langle S \rangle = 0$ so the $\mathbb{Z}_2$ stays unbroken, while in unitary gauge&lt;/p&gt;
$$\Phi = \frac{1}{\sqrt{2}} \pmqty{0 \\ v + h}\,.$$&lt;p&gt;The masses are then&lt;/p&gt;
$$m_h^2 = \lambda_\Phi v^2, \qquad m_{\text{DM}}^2 = \mu_S^2 + \lambda_{\Phi S} v^2 .$$&lt;p&gt;The portal produces a trilinear vertex $\lambda_{\Phi S}\, v\, h S^2$, which drives both annihilation through an $s$-channel Higgs and scattering off nuclei. The self-coupling $\lambda_S$ plays no role at tree level (I fix $\lambda_S = 0.2$), so the phenomenology is controlled entirely by $(m_{\text{DM}}, \lambda_{\Phi S})$. This is the plane we scan.&lt;/p&gt;
&lt;h2 id="the-workflow"&gt;The workflow&lt;/h2&gt;
&lt;p&gt;Each box below is one of the steps that follow.&lt;/p&gt;
&lt;div class="mermaid"&gt;---
config:
block:
padding: 18
---
block-beta
columns 3
A["&lt;b&gt;1. SingletDM model&lt;/b&gt;&lt;br/&gt;parameter names"] space B["&lt;b&gt;2. Relic density&lt;/b&gt;&lt;br/&gt;darkOmega"]
space:3
E["&lt;b&gt;Results&lt;/b&gt;&lt;br/&gt;λ(mDM) curve"] space D["&lt;b&gt;3. Solve for λ&lt;/b&gt;&lt;br/&gt;Ωh² = 0.120 ± 0.001"]
A --&gt; B
B --&gt; D
D --&gt; E
&lt;/div&gt;
&lt;h3 id="1-the-singletdm-model"&gt;1. The SingletDM model&lt;/h3&gt;
&lt;p&gt;Open your favorite terminal (I like iTerm2!) in the &lt;code&gt;micromegas_6.x/SingletDM&lt;/code&gt; directory.
The model is defined by the CalcHEP files in &lt;code&gt;work/models/&lt;/code&gt;.
All we need from them is which variable in the code corresponds to which parameter of the Lagrangian:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Code name&lt;/th&gt;
&lt;th style="text-align: left"&gt;Meaning&lt;/th&gt;
&lt;th style="text-align: left"&gt;Defined in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;Mdm1&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;DM mass $m_{\text{DM}}$&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;vars1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;laSH&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Higgs-portal coupling $\lambda_{\Phi S}$&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;vars1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;laS&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Dark quartic $\lambda_S$&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;vars1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;Mh&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Higgs mass $m_h$&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;vars1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;muSq1&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mu_S^2 = m_{\text{DM}}^2 - \lambda_{\Phi S} v^2$ (derived)&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;func1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;~x1&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;The dark scalar $S$&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;prtcls1.mdl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Table: Variables of the &lt;code&gt;SingletDM&lt;/code&gt; model.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One thing you should know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The tilde (~).&lt;/strong&gt; micrOMEGAs decides which particles are odd under the dark symmetry by their &lt;em&gt;name&lt;/em&gt;: anything whose name starts with &lt;code&gt;~&lt;/code&gt; is treated as dark. That is why the singlet is called &lt;code&gt;~x1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Using your own model?&lt;/strong&gt; Generate the CalcHEP model files (with FeynRules or LanHEP), making sure the dark particles&amp;rsquo; names start with &lt;code&gt;~&lt;/code&gt;. Then create a project with &lt;code&gt;./newProject MyModel&lt;/code&gt;, copy the files into &lt;code&gt;MyModel/work/models/&lt;/code&gt;, and everything below works the same, apart from the parameter names in &lt;code&gt;assignValW&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I put my own driver (&lt;code&gt;relic.c&lt;/code&gt;) directly in the &lt;code&gt;SingletDM&lt;/code&gt; directory and compile it with &lt;code&gt;make main=relic.c&lt;/code&gt;.
You can always play with the provided &lt;code&gt;main.c&lt;/code&gt; to check single points.
But we want a scan, right?&lt;/p&gt;
&lt;h3 id="2-relic-density"&gt;2. Relic density&lt;/h3&gt;
&lt;p&gt;The heart of the driver I use is a function that takes $(\lambda_{\Phi S}, m_{\text{DM}})$ and returns $\Omega h^2$:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;relicDensity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;laSH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Beps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0e-4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;cdmName&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ForceUG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* matrix elements in unitary gauge */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;assignValW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;laSH&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;laSH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* Higgs-portal coupling lambda_{Phi S} */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;assignValW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Mdm1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* DM mass */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sortOddParticles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cdmName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* recompute spectrum, find the LOP */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Can&amp;#39;t compute spectrum: problem with %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cdmName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;darkOmega&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Beps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Warning: darkOmega returned err = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assignValW(name, value)&lt;/code&gt; sets a parameter by its name in &lt;code&gt;vars1.mdl&lt;/code&gt; and warns if the name does not exist. These are the names from the table above.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sortOddParticles&lt;/code&gt; &lt;strong&gt;must&lt;/strong&gt; be called after every parameter change. It recomputes the derived parameters and masses and finds the lightest odd particle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;darkOmega&lt;/code&gt; solves the Boltzmann equation and returns $\Omega h^2$. It also returns $X_f = m_{\text{DM}}/T_f$, which should be around 20–25 for a WIMP, a useful sanity check. &lt;code&gt;fast = 1&lt;/code&gt; uses the faster approximate integration; &lt;code&gt;Beps&lt;/code&gt; controls which coannihilation channels are kept and is irrelevant with a single dark particle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ForceUG = 1&lt;/code&gt; makes micrOMEGAs compute the matrix elements in unitary gauge. Physical results do not depend on the gauge, but it is a safe habit, and necessary for model files that only implement unitary gauge (it is a global switch, so setting it once at the start of &lt;code&gt;main&lt;/code&gt; works just as well).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-solving-for-the-coupling"&gt;3. Solving for the coupling&lt;/h3&gt;
&lt;p&gt;At fixed $m_{\rm DM}^{}$, $\Omega h^2$ decreases monotonically with $\lambda_{\Phi S}$, so finding the right coupling is a one-dimensional root-finding problem,&lt;/p&gt;
$$f(\lambda_{\Phi S}) \equiv \Omega h^2(\lambda_{\Phi S}) - 0.120 \simeq 0,$$&lt;p&gt;and bisection method is the simplest tool for it. Since the required coupling spans about four orders of magnitude over the mass range, it is much better to bisect in $\log\lambda$, i.e. take the geometric mean $\sqrt{\lambda_{\rm lo} \lambda_{\rm hi}}$ as the midpoint:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define MAX_BISECT 60 &lt;/span&gt;&lt;span class="cm"&gt;/* It seldom needs to bisect this much unless something is wrong!!*/&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;findCoupling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;la_lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;la_hi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;laOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;omegaOut&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;f_lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;relicDensity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;la_lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;f_hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;relicDensity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;la_hi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f_lo&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f_hi&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* root not bracketed */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;MAX_BISECT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;la_mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;la_lo&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;la_hi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* midpoint in log space */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;relicDensity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;la_mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Xf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;f_mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fabs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f_mid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* converged */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;laOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;la_mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;omegaOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f_lo&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f_mid&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;la_hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;la_mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;f_hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f_mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;la_lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;la_mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;f_lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f_mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* no convergence */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The scan is then a loop over log-spaced masses, calling &lt;code&gt;findCoupling(mDM, 1e-5, 10.0, 0.120, 1e-3, &amp;amp;laSH, &amp;amp;omega)&lt;/code&gt; for each one and writing &lt;code&gt;mDM, laSH, omega&lt;/code&gt; to a file (&lt;code&gt;scan.dat&lt;/code&gt; below). A tolerance of $10^{-3}$ on $\Omega h^2$ matches the Planck uncertainty, so there is no point going tighter. Write the coupling with &lt;code&gt;%e&lt;/code&gt;, not &lt;code&gt;%f&lt;/code&gt;: near the resonance it is $\mathcal{O}(10^{-4})$.&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Values of the Higgs portal coupling that give the correct relic abundance as a function of the DM mass."
srcset="https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/relic_contour_hu_efecec1525621c5f.webp 320w, https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/relic_contour_hu_1f93b45b36bb375e.webp 480w, https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/relic_contour_hu_9522410b92729f71.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/relic_contour_hu_efecec1525621c5f.webp"
width="760"
height="504"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;em&gt;Figure: Higgs-portal coupling giving $\Omega h^2 = 0.120 \pm 0.001$ as a function of the DM mass, for $\lambda_S = 0.2$ and $m_h = 125$ GeV. The red (purple) region is excluded by invisible Higgs decays (perturbative unitarity).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every point on the curve gives exactly the observed relic abundance; above(below) it the DM is under-(over-)abundant. If your scan works, you should see three features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Light DM&lt;/strong&gt; ($m_{\rm DM}^{}\lesssim 50$ GeV): a nearly flat $\lambda_{\Phi S} \sim 0.1$–$0.2$, from annihilation into $b\bar b$ through an $s$-channel Higgs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Higgs resonance&lt;/strong&gt; ($m_{\rm DM}^{}\approx m_h/2$): a sharp dip down to $\lambda_{\Phi S} \sim 10^{-4}$, because the narrow Higgs enhances the $s$-channel enormously.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heavy DM&lt;/strong&gt; ($m_{\rm DM}^{}\gg m_h$): a straight line on the log-log plot, since a fixed $\sigma v \propto \lambda_{\Phi S}^2/m_{\text{DM}}^2$ requires $\lambda_{\Phi S} \propto m_{\text{DM}}$.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="practical-tips"&gt;Practical tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sample the resonance densely.&lt;/strong&gt; The dip is only a few GeV wide; a 100-point log grid from 10 GeV to 10 TeV puts just a couple of points inside it. Run a separate fine scan over 55–70 GeV and merge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flush the output.&lt;/strong&gt; Call &lt;code&gt;fflush&lt;/code&gt; after each point so that a long scan killed halfway keeps what it already computed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;One simple application of the scan is to confront the model with direct detection.&lt;/p&gt;
&lt;p&gt;The relic scan is the only step that needs micrOMEGAs.
DM-nucleon scattering, $S N \xrightarrow{h} S N $ through a $t$-channel Higgs, involves the same vertex $\lambda_{\Phi S} v\, h S^2$, and at tree level the spin-independent cross section is analytic:&lt;/p&gt;
$$\sigma_{\rm el.} \simeq \frac{f_N^2}{\pi} \left(\frac{m_N}{m_h}\right)^4 \frac{\lambda_{\Phi S}^2}{s}, \qquad s = (m_{\text{DM}} + m_N)^2 \simeq m_{\text{DM}}^2,$$&lt;p&gt;where $f_N \simeq 0.3$ is the Higgs–nucleon coupling. With $m_N \simeq 0.939$ GeV and $m_h = 125$ GeV this gives the handy estimate&lt;/p&gt;
$$\sigma_{\rm el.} \simeq 4 \times 10^{-45}~\text{cm}^2 \left(\frac{\lambda_{\Phi S}}{0.1}\right)^2 \left(\frac{300~\text{GeV}}{m_{\text{DM}}}\right)^2 .$$&lt;p&gt;So once you have the $(m_{\text{DM}}, \lambda_{\Phi S})$ points, a few lines of Python give $\sigma_{\rm el.}$ along the relic curve:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mDM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;laSH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;omega&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loadtxt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;scan.dat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# output of the scan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.939&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;125.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt; &lt;span class="c1"&gt;# GeV, GeV, Higgs-nucleon coupling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GeV2_to_cm2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3894e-27&lt;/span&gt; &lt;span class="c1"&gt;# 1 GeV^-2 in cm^2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mDM&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;# s in the non-relativistic limit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sigmaEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fN&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mN&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;laSH&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;GeV2_to_cm2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Spin-independent DM-nucleon cross section along the relic density curve, compared with the LZ 2024 limit."
srcset="https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/sigma_si_hu_fbe3560f895b30cf.webp 320w, https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/sigma_si_hu_5a4c997cb7e0b01.webp 480w, https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/sigma_si_hu_7c42fee0d50fd409.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://riasat-sheikh.github.io/blog/micromegas-parameter-scan/sigma_si_hu_fbe3560f895b30cf.webp"
width="760"
height="498"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;em&gt;Figure: Spin-independent cross section along the $\Omega h^2 = 0.120 \pm 0.001$ curve. The shaded region is excluded by LZ (2024).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At large mass $\lambda_{\Phi S} \propto m_{\rm DM}$, so $\sigma_{\rm el.}$ is constant, and it sits above the LZ limit all the way to 10 TeV. Only the narrow window on the Higgs resonance survives. This is the generic problem of the minimal Higgs portal.&lt;/p&gt;
&lt;p&gt;On a different note, this is one of the reasons why we move to
, which can naturally evade these bounds due to its derivative (momentum-dependent) couplings!&lt;/p&gt;</description></item></channel></rss>