Cosmological perturbations in KGB

We study cosmological perturbations in kinetic gravity braiding using xPand.

The second-order action for KGB can be found in arXiv:1008.0603 (Kobayashi, Yamaguchi, and Yokohama) and arXiv:1008.0048 (Deffayet, Pujolas, Sawicki, and Vikman).

0. Setup

Import xPand. Start xAct.

<<xAct`xPand`;

(*optional*)
$CovDFormat="Prefix";
$PrePrint=ScreenDollarIndices;
Options[MakeRule];
Options[ContractMetric];

DefManifold[M,4,{b,c,d,e,i,j,l,q,s}];
DefMetric[-1,g[-b,-c],CD,{";","∇"}];
PrintAs[RiemannCD]^="R";
PrintAs[RicciCD]^="R";
PrintAs[RicciScalarCD]^="R";
PrintAs[ChristoffelCD]^="Γ";
PrintAs[EinsteinCD]^="G";

At this point, we can perform a 3+1 decomposition using SetSlicing[]. We consider a normal vector n, induced/spatial metric h, a covariant derivative cd on the hypersurface, and curved Friedmann-Lemaitre slices (other options: Minkowski, FLCurved, FLFlat, Bianchi, BianchiA, BianchiI).

Also, we define the metric perturbation dg, matter velocity u, and velocity perturbation du.

(*3+1 decomposition*)
SetSlicing[g,n,h,cd,{"|","(OverBar[D])"},"FLFlat"];

(*metric and matter velocity perturbations*)
DefMetricFields[g,dg,h];
DefMatterFields[u,du,h];

To make the output more appealing (setup by Cyril Pitrou)...

(*aesthetics*)
MakeBoxes[ϵ,StandardForm]:=
StyleBox[ToString[$PerturbationParameter],FontColor->RGBColor[0.0, 1.0, 0.0]]

(*organizes in perturbation order*)
org[expr_]:=NoScalar@Collect[ContractMetric[expr],$PerturbationParameter,ToCanonical]

(*kills unwanted second order terms*)
kill2O:=(bigexpr:(expr_[LI[x_],LI[y_],___]/;x>1)):>0

Finally, we consider the redefined xPand master function (see xPand documentation)...

MyToxPand[expr_,gauge_,order_]:=ToxPand[expr,dg,u,du,h, gauge,order]

For variational differentiation...

PerturbAction[expr_,g_?MetricQ[a_?UpIndexQ,b_?UpIndexQ]|g_?MetricQ[a_?DownIndexQ,b_?DownIndexQ]]:=Module[{pertexpr,res,dgloc,(*dummyloc,*)hp},

(* We define the metric perturbation, if not defined already *)
dgloc=SymbolJoin["δ",g];

hp=Head@Perturbation[g[DownIndex@a,DownIndex@b]];

If[hp===Perturbation,DefMetricPerturbation[g,dgloc,SymbolJoin["ϵ",g]],dgloc=hp];


Block[{$DefInfoQ=False},

(* We perturb wrt to the metric and if it is the inverse metric we put a minus sign *)
pertexpr=(If[DownIndexQ[a],1,-1])*ToCanonical@ContractMetric@ExpandPerturbation@Perturbation[expr]/.Perturbation[tens_]:>0;

(*We then use VarD. It happens that some trivial Kronecker appear which need to be handle manually *)
res=ToCanonical[(SameDummies@ContractMetric@VarD[dgloc[LI[1],a,b],CovDOfMetric[g]][pertexpr])/.delta[-LI[n_],LI[m_]]:>KroneckerDelta[NoScalar[n],NoScalar[m]]];
];
res
]
PerturbAction[expr_,tensor_?xTensorQ,covd_]:=Module[{res,dummyloc,pertexpr,inds},
Block[{$DefInfoQ=False},

(* We use a dummy name for the variation of the tensor, and use it to replace the formal first order perturbation the tensor *)
(* So first we define this dummy tensor *)
dummyloc=SymbolJoin["Var",tensor];
inds=DummyIn/@SlotsOfTensor[tensor];
If[!xTensorQ[dummyloc],DefTensor[dummyloc@@inds,First@DependenciesOfTensor@tensor]];
SymmetryGroupOfTensor[dummyloc]^=SymmetryGroupOfTensor[tensor];

(* Then we perturb the action and replace Perturbation[Tensor[..]] by this dummy tensor *)
pertexpr=(ToCanonical@ContractMetric[ExpandPerturbation@Perturbation[expr]/.Perturbation[tens_?((#=!=tensor)&)[ar___]]:>0/.Perturbation[tensor[ind___]]:>dummyloc[ind]]);

(* With this simple head, VarD works correctly. Again we need to handel some trivial Kronecker *)
res=ToCanonical[(SameDummies@ContractMetric@VarD[dummyloc@@inds,covd][pertexpr])/.delta[-LI[n_],LI[m_]]:>KroneckerDelta[NoScalar[n],NoScalar[m]]];
];
res
]
PerturbAction[expr_,tensor_[inds___]]:=PerturbAction[expr,tensor[inds],CovDOfMetric@First@$Metrics]
PerturbAction[expr_,tensor_?xTensorQ[inds___],covd_]:=Module[{res,dummyloc,pertexpr},
Block[{$DefInfoQ=False},
dummyloc=SymbolJoin["Var",tensor];

If[!xTensorQ[dummyloc],DefTensor[dummyloc[inds],First@DependenciesOfTensor@tensor]];
SymmetryGroupOfTensor[dummyloc]^=SymmetryGroupOfTensor[tensor];

(* Perturbation with xPert*)
pertexpr=(ToCanonical@ContractMetric[ExpandPerturbation@Perturbation[expr]/.Perturbation[tens_?((#=!=tensor)&)[ar___]]:>0/.Perturbation[tensor[ind___]]:>dummyloc[ind]]);
(* VarD and removal of KroneckerDelta*)
res=ToCanonical[(SameDummies@ContractMetric@VarD[dummyloc[inds],covd][pertexpr])/.delta[-LI[n_],LI[m_]]:>KroneckerDelta[NoScalar[n],NoScalar[m]]];
];
res
]
VarAction[expr_,g_?MetricQ[as__?((UpIndexQ[#]||DownIndexQ[#])&)]]:=Module[{sqrtg},
sqrtg=Sqrt[SignDetOfMetric[g]Determinant[g][]];
ToCanonical[PerturbAction[expr,g[as]]+ReplaceDummies@expr*PerturbAction[sqrtg,g[as]]/sqrtg ]
]
VarAction[expr_,tensor_?((xTensorQ[#]&&Not[MetricQ[#]])&),g_?MetricQ]:=PerturbAction[expr,tensor,CovDOfMetric[g]]
VarAction[expr_,tensor_?((xTensorQ[#]&&Not[MetricQ[#]])&)]:=VarAction[expr,tensor,First@$Metrics];

VarAction[expr_,tensor_?((xTensorQ[#]&&Not[MetricQ[#]])&)[inds___],g_?MetricQ]:=PerturbAction[expr,tensor[inds],CovDOfMetric[g]]
VarAction[expr_,tensor_?((xTensorQ[#]&&Not[MetricQ[#]])&)[inds___]]:=VarAction[expr,tensor[inds],First@$Metrics];

I. Kinetic gravity braiding

The Lagrangian of the theory is...

DefScalarFunction/@{V,G};
DefConstantSymbol[κ];
DefTensor[χ[],M];
X=-(1/2)CD[b][χ[]]CD[-b][χ[]];
LK=V[χ[],X](*quadratic sector*);
LG=-G[χ[],X]CD[i][CD[-i][χ[]]];
LEH=κ RicciScalarCD[];

"L"==LK+LG+LEH

The scalar field’s stress-energy tensor (SET) is...

TK=-2 SortCovDs[VarAction[LK,g[b,c]],CD]//ToCanonical;
TG=-2 SortCovDs[VarAction[LG,g[b,c]],CD]//ToCanonical;

"((Subscript[T, bc])^((K)))"==TK
"((Subscript[T, bc])^((G)))"==TG

The Einstein equation is given by...

DefTensor[TM[-b,-c],M,Symmetric[{-b,-c}],PrintAs->"T"];
EE=VarAction[LEH,g[b,c]]-(TK/2)-(TG/2)==((TM[-b,-c])/2);
EE

The scalar field equation is given by...

SFE=(SortCovDs[VarAction[LK+LG,χ[]],CD]//ToCanonical)==0;
SFE

II. Prelude to scalar perturbations

In this section, we study the scalar perturbations in KGB. But to do so, let’s first see how the metric is perturbed in xPand.

Metric perturbations in xPand

Master function = MyToxPand[...]

$ConformalTime=False;
"(Subscript[g, bc])"==VisualizeTensor[MyToxPand[g[-b,-c],"AnyGauge",1],h]

We want to work with so-called unitary gauge wherein the scalar field χ will be used instead as a clock (i.e., δχ=0). This is already built-in in xPand through the (pre-defined) scalar field φ and “ScalarFieldComovingGauge”. To focus on scalar perturbations, we remove the vector and tensor modes as well...

$FirstOrderVectorPerturbations=False;
$FirstOrderTensorPerturbations=False;

"(Subscript[g, bc])"==VisualizeTensor[MyToxPand[g[-b,-c],"ScalarFieldComovingGauge",1],h]
"χ"==MyToxPand[φ[],"ScalarFieldComovingGauge",1]

Metric perturbations are of course tied to the matter perturbations via the Einstein equation. To see this, we set the matter fluid to be a perfect fluid...

(*assume perfect fluid matter*)
$Dust=False;
IndexSet[TM[α_,β_],((ρ[u][]+If[$Dust,0,P[u][]])u[α]u[β]+(If[$Dust,0,P[u][]])g[α,β])];

(*aesthetics*)
PrintAs[ρu]^="ρ";
PrintAs[Pu]^="P";
PrintAs[Vvhu]^="(OverBar[V])";
PrintAs[Vshu]^="V";

The matter SET’s linearized perturbations is given by...

TMO1=MyToxPand[TM[-b,-c],"ScalarFieldComovingGauge",1];

"((Subscript[T, bc])^((M)))"==VisualizeTensor[TMO1,h]

We can assume that matter perturbations to vanish (for simplicity) using the following rule...

NoMat={ρu[LI[1],LI[x_]]:>0,Pu[LI[1],LI[x_]]:>0,Vvhu[LI[1],LI[x_],y_]:>0,Vshu[LI[1],LI[x_]]:>0};

Einstein equation

Before we start, we introduce the following simplifying rules...

Cosmicφ=cd[x_][Scalar[φ[LI[y_],LI[z_]]]]:>0;

CollectXh[expr_]:=Collect[expr,{ϕh[LI[1],_],cd[-x_][cd[x_][ϕh[LI[1],_]]],cd[-x_][cd[x_][Bsh[LI[1],_]]],ψh[LI[1],_],cd[-x_][cd[x_][ψh[LI[1],_]]]},Simplify];

simpV={V[u_,v_]:>V,Derivative[x_,y_][V][u_,v_]:>Derivative[x,y][V]};
simpG={G[u_,v_]:>G,Derivative[x_,y_][G][u_,v_]:>Derivative[x,y][G]};
simp=Union[simpV,simpG];

ScalarHa={Scalar[Hh[x_,y_]]:>Hh[x,y],Scalar[ah[x_,y_]]:>ah[x,y]};

The linearized Einstein equation is given by...

EElhs=MyToxPand[EE[[1]]/.χ[]->φ[],"ScalarFieldComovingGauge",1]//ToCanonical;
EErhs=MyToxPand[EE[[2]]/.χ[]->φ[],"ScalarFieldComovingGauge",1]//ToCanonical;

We extract the components of the Einstein equation beginning with the zeroth-order (a.k.a. Friedmann equations)...

EE0lhs=ExtractOrder[EElhs,0];
EE0rhs=ExtractOrder[EErhs,0];

FE1=ExtractComponents[EE0lhs-EE0rhs,h,{"Time","Time"}]==0;
FE2=(h[b,c]ExtractComponents[EE0lhs-EE0rhs,h,{"Space","Space"}]//ToCanonical//NoScalar)==0;

FE1/.simp
FE2/.simp

For later, we solve for H and (OverDot[H])...

(*let Q = (H^2)*)
fes=Solve[{FE1,FE2}/.((Hh[LI[0],LI[0]])^2)->Q,{Q,Hh[LI[0],LI[1]]}][[1]];
fes/.simp

These are the Friedmann equations of KGB.

The first-order perturbations of the Einstein equation provide the Hamiltonian and momentum constraints and the dynamical equation for the scalar perturbation. Let’s check it out...

EE1lhs=ExtractOrder[EElhs,1];
EE1rhs=ExtractOrder[EErhs,1];

(*Hamiltonian constraint*)
Hconst=(ExtractComponents[EE1lhs-EE1rhs,h,{"Time","Time"}]//ToCanonical//NoScalar//CollectXh)==0;
(*Momentum constraint*)
Pconst=(ExtractComponents[EE1lhs-EE1rhs,h,{"Time","Space"}]/.((Hh[LI[0],LI[0]])^2)->Q/.fes//ToCanonical//NoScalar//CollectXh)==0;

Hconst/.simp
Pconst/.simp

We make use of these to eliminate the nondynamical ϕ and B (which bring no time derivatives). 

It is useful to notice that the momentum constraint is just a total derivative (in space). We could therefore integrate this by simply removing the covariant derivatives...

DefProjectedTensor[J[],h]

Pconst2=(Pconst[[1]]-J[LI[0],LI[0]]/.cd[x_][ph_[LI[y_],LI[z_]]]->ph[LI[y],LI[z]])==0;
Pconst2/.simp

(*proof*)
(cd[-c][Pconst2[[1]]]==0/.Solve[%Pconst,cd[-c][Bsh[LI[1],LI[0]]]][[1]]/.Cosmicφ)//Simplify

We solve B from this and eliminate B from the Hamiltonian constraint...

(*B = B[ϕ,ψ]*)
DefProjectedTensor[A[],h];
Bsol=Solve[Pconst2,Bsh[LI[1],LI[0]]][[1]];
Bden=((Bsh[LI[1],LI[0]]/.Bsol//Denominator)/(ah[LI[0],LI[0]]))->A[LI[0],LI[0]];
dB=((LieD[n[l]][Bsh[LI[1],LI[0]]])/(ah[LI[0],LI[0]]))->(((LieD[n[l]][Bsh[LI[1],LI[0]]/.(Bsol/.Bden)])/(ah[LI[0],LI[0]]))//Simplification//NoScalar);

Bsol/.Bden/.simp

We substituting this into the Hamiltonian constraint to obtain...

Hconstϕψ=((Hconst[[1]]-Hconst[[2]]/.(Bsol/.Bden)/.Cosmicφ//ToCanonical//NoScalar)/.Scalar[A[x_,y_]]:>A[x,y]//CollectXh)==0;
Hconstϕψ/.simp

Let’s check out the space-space component...

ψeq=(h[b,c]ExtractComponents[EE1lhs-EE1rhs,h,{"Space","Space"}]/.((Hh[LI[0],LI[0]])^2)->Q/.fes//ToCanonical//ContractMetric//NoScalar//CollectXh)==0;
ψeq/.simp

Eliminating B using the momentum constraint, we obtain...

ddψϕ=((ψeq[[1]]/.(Bsol/.Bden)/.dB//ToCanonical//NoScalar)/.Scalar[A[x_,y_]]:>A[x,y]//CollectXh)==0;
ddψϕ/.simp

ddψϕ and Hconstϕψ are two equations for ϕ and ψ with understanding that ψ is the dynamical variable. It should be possible to express this in terms of the single dynamical variable ψ by using the constraints further. However, the dynamics is much simpler to understand at the level of the second-order action.

Scalar field equation

Before dealing with the second-order action, we take a short look at the scalar field equation. Expanding it...

SFEO1=MyToxPand[SFE[[1]]/.χ[]->φ[],"ScalarFieldComovingGauge",1];

Extracting the background part...

SFE0=ExtractOrder[SFEO1,0]==0;
SFE0/.simp

The linearized part is...

SFE1=(ExtractOrder[SFEO1,1]/.((Hh[LI[0],LI[0]])^2)->Q/.fes//Simplification//NoScalar//CollectXh)==0;
SFE1/.simp

Second-order action for k-essence

To prepare for variational differentiation, we setup the simplifying rule and time differentiation...

DeltaRule=delta[-LI[x_],LI[y_]]:>If[x==y,1,0];

dt[expr_]:=(1/(ah[LI[0],LI[0]]))LieD[n[l]][expr]//ToCanonical//NoScalar

CollectXh2[expr_]:=Collect[expr,{((((Overscript[\[Null], (1)])ϕ))^2),((Overscript[\[Null], (1)])ϕ) ((Overscript[\[Null], (1)])ψ),((((Overscript[\[Null], (1)])ψ))^2),((Overscript[\[Null], (1)])ϕ) ((Overscript[\[Null], (1)])(OverDot[ψ])),((((Overscript[\[Null], (1)])(OverDot[ψ])))^2),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])B) (((OverBar[D])^b)(Overscript[\[Null], (1)])B),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ϕ),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ϕ) (((OverBar[D])^b)(Overscript[\[Null], (1)])B),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])(OverDot[ψ])) (((OverBar[D])^b)(Overscript[\[Null], (1)])B)},Simplify]

To understand the derivation of the master equation for scalar perturbations, we look at the second-order action of k-essence...

"L"==LEH+LK

Just to check how variational differentiation works, let us derive the background field equations. First, here’s the total action expanded up to second order and its linear pieces...

SK012=MyToxPand[(Sqrt[-Detg[]])(LK+LEH)/.χ[]->φ[],"ScalarFieldComovingGauge",2]/.kill2O/.Sqrt[-Detg[]((Scalar[ah[]])^8)]->((ah[LI[0],LI[0]])^3)//Expand//org;

SK1=ExtractOrder[SK012,1];

"(S^((1)))"==SK1/.simpV//CollectXh

What we want to do here is to place all of the time derivatives away from the perturbations by (manual) partial differentiation...

SK1final=SK1/.((ah[LI[0],LI[0]])^3)ψh[LI[1],LI[2]]->-ψh[LI[1],LI[1]]dt[((ah[LI[0],LI[0]])^3)]/.expr_ ph_[LI[1],LI[1]]:>-ph[LI[1],LI[0]]dt[expr]/.expr_ cd[-x_][cd[x_][Bsh[LI[1],LI[1]]]]:>-cd[-x][cd[x][Bsh[LI[1],LI[0]]]]dt[expr]//CollectXh;

"(S^((1)))"==SK1final/.simpV

From this, it’s easy to just read out the Friedmann equations as the coefficients of ϕ and ψ, but let’s use variational differentiation anyway...

fe1=(VarD[ϕh[LI[1],LI[0]],cd][SK1final]/.DeltaRule//NoScalar)==0;
fe2=(VarD[ψh[LI[1],LI[0]],cd][SK1final]/.DeltaRule//NoScalar)==0;

fesVar=Solve[{fe1,fe2}/.((Hh[LI[0],LI[0]])^2)->Q,{Q,Hh[LI[0],LI[1]]}][[1]];
fesVar/.simp

These are of course the same background equations derived in the previous section.

We now extract the quadratic pieces of the action...

SK2=ExtractOrder[SK012,2]//ToCanonical//NoScalar;

"(S^((2)))"==SK2/.simpV

This looks so bad. But note that some of the terms above vanish after integration by parts (which we do manually using the rules below starting with)...

IBP1=ph1_[LI[1],LI[y_]] cd[-x_][cd[x_][ph2_[LI[1],LI[z_]]]]:>-cd[-x][ph1[LI[1],LI[y]]]cd[x][ph2[LI[1],LI[z]]];

SK2ibp=SK2/.IBP1;

"(S^((2)))"==SK2ibp/.simpV

Notice that because the induced metric (Subscript[h, bc]) is flat then the terms ((Subscript[(OverBar[D]), b])((OverBar[D])^b)(Overscript[, (1)])B) ((Subscript[(OverBar[D]), c])((OverBar[D])^c)(Overscript[, (1)])B) and ((Subscript[(OverBar[D]), c])(Subscript[(OverBar[D]), b])(Overscript[, (1)])B) (((OverBar[D])^c)((OverBar[D])^b)(Overscript[, (1)])B) above also cancel out each other. It can also be checked via VarD[...] that this term does not contribute to the dynamics...

(*variations wrt ϕ and ψ obvious*)
Hold["(((δS)^((2)))/(δB))"]==SortCovDs[VarD[Bsh[LI[1],LI[0]],cd][κ a ((Subscript[(OverBar[D]), b])((OverBar[D])^b)(Overscript[\[Null], (1)])B) ((Subscript[(OverBar[D]), c])((OverBar[D])^c)(Overscript[\[Null], (1)])B)-κ a ((Subscript[(OverBar[D]), c])(Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])B) (((OverBar[D])^c)((OverBar[D])^b)(Overscript[\[Null], (1)])B)]//ToCanonical,cd]

We enforce this via the rule...

DDXDDXrule=cd[-x_][cd[x_][xh_[LI[1],LI[z_]]]]cd[-y_][cd[y_][xh_[LI[1],LI[z_]]]]:>cd[-x][cd[-y][xh[LI[1],LI[z]]]]cd[x][cd[y][xh[LI[1],LI[z]]]];

To simplify this further, we take note of several total time derivatives appearing in this expression...

dotHϕϕ=Hold["(d/dt)"(((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]((ϕh[LI[1],LI[0]])^2))]==(dt[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]((ϕh[LI[1],LI[0]])^2)]//ToCanonical//NoScalar);
dotHψψ=Hold["(d/dt)"[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]((ψh[LI[1],LI[0]])^2)]]==(dt[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]((ψh[LI[1],LI[0]])^2)]//ToCanonical//NoScalar);
dotHϕψ=Hold["(d/dt)"[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]ϕh[LI[1],LI[0]]ψh[LI[1],LI[0]]]]==(dt[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]ϕh[LI[1],LI[0]]ψh[LI[1],LI[0]]]//ToCanonical//NoScalar);
dotHdϕdψ=Hold["(d/dt)"[((ah[LI[0],LI[0]])^3)ϕh[LI[1],LI[0]]ψh[LI[1],LI[1]]]]==(dt[((ah[LI[0],LI[0]])^3)ϕh[LI[1],LI[0]]ψh[LI[1],LI[1]]]//ToCanonical//NoScalar);
dotHcdBcdB=Hold["(d/dt)"[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]cd[-b][Bsh[LI[1],LI[0]]]cd[b][Bsh[LI[1],LI[0]]]]]==(dt[((ah[LI[0],LI[0]])^3)Hh[LI[0],LI[0]]cd[-b][Bsh[LI[1],LI[0]]]cd[b][Bsh[LI[1],LI[0]]]]//ContractMetric//ToCanonical//NoScalar);
dotcdϕcdB=Hold["(d/dt)"[((ah[LI[0],LI[0]])^2)cd[-b][ϕh[LI[1],LI[0]]]cd[b][Bsh[LI[1],LI[0]]]]]==(dt[((ah[LI[0],LI[0]])^2)cd[-b][ϕh[LI[1],LI[0]]]cd[b][Bsh[LI[1],LI[0]]]]//ContractMetric//ToCanonical//NoScalar);

These total derivatives can be added to the action without changing the dynamical evolution. Therefore, we simplify SEH2 further...

SK2final=((((SK2ibp)-(9κ dotHϕϕ[[2]])-(18κ dotHϕψ[[2]])-(6κ dotHdϕdψ[[2]])-(12κ dotHψψ[[2]])+(3κ dotHcdBcdB[[2]])+(2κ dotcdϕcdB[[2]])//ToCanonical//NoScalar//CollectXh2)/.DDXDDXrule/.expr_ ψh[LI[1],LI[2]]:>-ψh[LI[1],LI[1]]dt[expr])+(9κ dotHψψ[[2]])//ToCanonical//NoScalar//CollectXh2);

"(S^((2)))"==(SK2final/.simpV)

A very useful trick at this stage is to make use of the background equations. This comes from the observation that the combination V+6 κ ((H)^2)-((OverDot[φ])^2) Derivative[0,1][V] is actually the Friedmann constraint. Hence, after using the background field equations, we obtain...

SK2Final=SK2final/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar//CollectXh2;

"(S^((2)))"==(SK2Final/.simpV)

Noting that this is linear in B, we further perform an integration by parts so we can easily just read off the constraint...

SK2Final2=Collect[SK2Final/.cd[-x_][ph_[y_,z_]]cd[x_][Bsh[LI[1],LI[0]]]:>-cd[-x][cd[x][ph[y,z]]]Bsh[LI[1],LI[0]],{Bsh[LI[1],LI[0]]}];

"(S^((2)))"==(SK2Final2/.simpV)

The constraint on B drastically simplifies everything else...

ConstraintB=(VarD[Bsh[LI[1],LI[0]],cd][SK2Final2]/.DeltaRule//NoScalar)==0;ConstraintB

The exact solution to this can of course be obtained simply by removing the Laplacian...

ConstraintB2=ConstraintB/.cd[-x_][cd[x_][expr_]]:>expr;ConstraintB2

Using this constraint, we eliminate ϕ  from the action...

SK2Final3=SK2Final2/.Solve[ConstraintB2,ϕh[LI[1],LI[0]]][[1]]//ToCanonical//NoScalar//CollectXh2;

"(S^((2)))"==(SK2Final3/.simpV)

Last step is to perform an IBP over the term with a single time derivative...

aHcdψcdψ=Hold["(d/dt)"Hold[(((ah[LI[0],LI[0]])/(Hh[LI[0],LI[0]]))cd[-b][ψh[LI[1],LI[0]]]cd[b][ψh[LI[1],LI[0]]])]]==(dt[((ah[LI[0],LI[0]])/(Hh[LI[0],LI[0]]))cd[-b][ψh[LI[1],LI[0]]]cd[b][ψh[LI[1],LI[0]]]]//ContractMetric//ToCanonical//NoScalar);

SKquad=(SK2Final3-(2κ aHcdψcdψ[[2]])//ToCanonical//NoScalar//CollectXh2)/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar//ToCanonical//NoScalar//CollectXh2;

"(S^((2)))"==(SKquad/.simpV)

This is the second-order action for quintessence. Stability conditions can be read from this...

$Assumptions=ah[LI[0],LI[0]]>0&&Hh[LI[0],LI[0]]>0&&φ[LI[0],LI[1]]>0;

Coefficient[SKquad/.simpV,((((Overscript[\[Null], (1)])(OverDot[ψ])))^2)]>0//Simplify
-Coefficient[SKquad/.simpV,((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ)]>0//Simplify

III. Second-order action for scalar perturbations of KGB

In this section, we derive the second-order action of KGB. Since we’ve already dealt with k-essence, we have to just bother about the braiding terms.

We start with the full perturbed action...

SKG012=MyToxPand[(Sqrt[-Detg[]])(LK+LG+LEH)/.χ[]->φ[],"ScalarFieldComovingGauge",2]/.kill2O/.Sqrt[-Detg[]((Scalar[ah[]])^8)]->((ah[LI[0],LI[0]])^3)//Expand//org;

Background solutions

As with k-essence, we first derive the background field equations because these will drastically simplify the analysis of the second-order action later. So, extracting the first order terms from SKG012...

SKG1=ExtractOrder[SKG012,1];

"(S^((1)))"==SKG1/.simp//CollectXh

Performing partial integration (recall that dt[...] is the time derivative)...

SKG1final=SKG1/.((ah[LI[0],LI[0]])^3)ψh[LI[1],LI[2]]->-ψh[LI[1],LI[1]]dt[((ah[LI[0],LI[0]])^3)]/.expr_ ph_[LI[1],LI[1]]:>-ph[LI[1],LI[0]]dt[expr]/.expr_ cd[-x_][cd[x_][Bsh[LI[1],LI[1]]]]:>-cd[-x][cd[x][Bsh[LI[1],LI[0]]]]dt[expr]//CollectXh;

"(S^((1)))"==SKG1final/.simp

The terms with Laplacians vanish by partial differentiation because they are besides purely time-dependent terms only. The constraints, or rather, the background equations, can therefore be read off from the coefficients of ϕ and ψ...

fe1=(VarD[ϕh[LI[1],LI[0]],cd][SKG1final]/.DeltaRule//NoScalar)==0;
fe2=(VarD[ψh[LI[1],LI[0]],cd][SKG1final]/.DeltaRule//NoScalar)==0;

fesVar=Solve[{fe1,fe2}/.((Hh[LI[0],LI[0]])^2)->Q,{Q,Hh[LI[0],LI[1]]}][[1]];
fesVar/.simp

These are the background field equations.

Quadratic action

Extracting the second-order pieces of the full action...

SKG2=ExtractOrder[SKG012,2]//ToCanonical//NoScalar;

We are expecting this to already look so bad and don’t want to look at it. So, we first perform the partial differentiations done previously in k-essence...

SKG2ibp=SKG2/.IBP1/.DDXDDXrule//ToCanonical//NoScalar//CollectXh2;

"(S^((2)))"==SKG2ibp/.simp

Performing partial differentiations with respect to time...

CollectXXX[expr_]:=Collect[expr,{((((Overscript[\[Null], (1)])ψ))^2),((((Overscript[\[Null], (1)])(OverDot[ψ])))^2),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ),((Overscript[\[Null], (1)])(OverDot[ϕ])) ((Overscript[\[Null], (1)])(OverDot[ψ])),((Overscript[\[Null], (1)])ψ)((Overscript[\[Null], (1)])(OverDot[ϕ])),((Overscript[\[Null], (1)])ψ)((Overscript[\[Null], (1)])(OverDot[ψ])),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])(OverDot[B])) (((OverBar[D])^b)(Overscript[\[Null], (1)])B),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])(OverDot[ψ])) (((OverBar[D])^b)(Overscript[\[Null], (1)])B),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ϕ),((Overscript[\[Null], (1)])ϕ) ((Overscript[\[Null], (1)])(OverDot[ϕ])),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ϕ) (((OverBar[D])^b)(Overscript[\[Null], (1)])B),((Overscript[\[Null], (1)])ϕ) ((Overscript[\[Null], (1)])ψ),((((Overscript[\[Null], (1)])ϕ))^2),((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])B) (((OverBar[D])^b)(Overscript[\[Null], (1)])B)},Simplify]

SKG2final=((((SKG2ibp)-(9κ dotHϕϕ[[2]])-(18κ dotHϕψ[[2]])-(6κ dotHdϕdψ[[2]])-(12κ dotHψψ[[2]])+(3κ dotHcdBcdB[[2]])+(2κ dotcdϕcdB[[2]])//ToCanonical//NoScalar//CollectXXX)/.expr_ ψh[LI[1],LI[2]]:>-ψh[LI[1],LI[1]]dt[expr])+(9κ dotHψψ[[2]])//ToCanonical//NoScalar//CollectXXX);

"(S^((2)))"==(SKG2final/.simp)

*The set of IBPs performed above are for the Einstein-Hilbert part of the theory (i.e., just a Ricci scalar), and should not be different whether it be for pure k-essence or KGB.

We perform more IBPs since we want to put all of the time derivative to the dynamical variable ψ...

SKG2final2=SKG2final/.expr_ ϕh[LI[1],LI[1]]:>-ϕh[LI[1],LI[0]]dt[expr]//ToCanonical//NoScalar//CollectXXX;

"(S^((2)))"==(SKG2final2/.simp)

Just a few more terms to deal with, specifically, the terms ((Overscript[, (1)])ϕ) ((Overscript[, (1)])(OverDot[ϕ]))~(d/dt)((((Overscript[, (1)])ϕ))^2) and ((Subscript[(OverBar[D]), b])(Overscript[, (1)])(OverDot[B])) (((OverBar[D])^b)(Overscript[, (1)])B)~(d/dt)(((Subscript[(OverBar[D]), b])(Overscript[, (1)])B) (((OverBar[D])^b)(Overscript[, (1)])B)). Consider the total derivatives...

Gϕϕ=Hold["(d/dt)"(((a)^3) (OverDot[φ]) ((((Overscript[\[Null], (1)])ϕ))^2) (3 G+((OverDot[φ])^2) Derivative[0,1][G]))]==(dt[((a)^3) (OverDot[φ])(3 G[(φ),(((((OverDot[φ])))^2)/2)]+((OverDot[φ])^2) Derivative[0,1][G][(φ),(((((OverDot[φ])))^2)/2)])((((Overscript[\[Null], (1)])ϕ))^2)]//CollectXXX);

GBB=Hold["(d/dt)"(G ((a)^3) (OverDot[φ]) ((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])B) (((OverBar[D])^b)(Overscript[\[Null], (1)])B))]==(dt[((a)^3) G[(φ),(((((OverDot[φ])))^2)/2)] (OverDot[φ]) ((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])B) (((OverBar[D])^b)(Overscript[\[Null], (1)])B)]//ContractMetric//CollectXXX);

Gϕϕ/.simp
GBB/.simp

Performing the IBP with the above total derivatives, we end up with...

SKG2final3=(SKG2final2+((1/2)Gϕϕ[[2]])+((1/2)GBB[[2]]))//ToCanonical//NoScalar//CollectXXX;

"(S^((2)))"==(SKG2final3/.simp)

It is at this point that we appeal to the background equations. Applying them simplifies the action to [resulting expression does not reduce to k-essence limit]...

SKG2Final=SKG2final3/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar//CollectXXX;

"(S^((2)))"==(SKG2Final/.simp)

Performing an IBP to further reveal the Lagrange multiplier B...

SKG2Final2=Collect[SKG2Final/.cd[-x_][ph_[y_,z_]]cd[x_][Bsh[LI[1],LI[0]]]:>-cd[-x][cd[x][ph[y,z]]]Bsh[LI[1],LI[0]],{Bsh[LI[1],LI[0]]}];

"(S^((2)))"==(SKG2Final2/.simp)

Thus, we see again that this expression is linear in B and so varying it with respect to B should yield a functional F[ϕ,ψ]=0...

ConstraintB=(VarD[Bsh[LI[1],LI[0]],cd][SKG2Final2]/.DeltaRule//NoScalar)==0;

ConstraintB/.simp

The exact solution is (check by inspection)...

ConstraintB2=ConstraintB/.cd[-x_][cd[x_][expr_]]:>expr;

ConstraintB2/.simp

Finally, we can eliminate ϕ from the second-order action using this...

SKG2Final3=(SKG2Final2/.Solve[ConstraintB2,ϕh[LI[1],LI[0]]][[1]]//ToCanonical//NoScalar)/.ScalarHa/.Scalar[φ[x_,y_]]:>φ[x,y]//CollectXXX;

"(S^((2)))"==(SKG2Final3/.simp)

At this point, a few more total derivatives must be added to the action to rewrite the terms ((Overscript[, (1)])ψ) ((Overscript[, (1)])(OverDot[ψ]))~(d/dt)((((Overscript[, (1)])ψ))^2), and ((Subscript[(OverBar[D]), b])(Overscript[, (1)])(OverDot[ψ])) (((OverBar[D])^b)(Overscript[, (1)])ψ)~(d/dt)(((Subscript[(OverBar[D]), b])(Overscript[, (1)])ψ) (((OverBar[D])^b)(Overscript[, (1)])ψ))...

aHGψψ=Hold["(d/dt)"(3 G ((a)^3) (OverDot[φ]) ((((Overscript[\[Null], (1)])ψ))^2))]==(dt[3 ((a)^3) G[φ,(((OverDot[φ])^2)/2)] (OverDot[φ])((((Overscript[\[Null], (1)])ψ))^2)]/.ScalarHa/.Scalar[φ[x_,y_]]:>φ[x,y]//CollectXXX);
aHGcdψcdψ=Hold["(d/dt)"Hold[((16 (κ^2) a ((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ))/(4 κ H-((OverDot[φ])^3) Derivative[0,1][G]))]]==(dt[((16 (κ^2) a ((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ))/(4 κ H-((OverDot[φ])^3) Derivative[0,1][G][φ,(((OverDot[φ])^2)/2)]))]/.ScalarHa/.Scalar[φ[x_,y_]]:>φ[x,y]//ContractMetric//CollectXXX);

aHGψψ/.simp
aHGcdψcdψ/.simp

Adding appropriate amounts of these total derivative terms into the action finally leads to...

SKGquad=(((SKG2Final3-((1/2)aHGψψ[[2]])-((1/2)aHGcdψcdψ[[2]]))//ToCanonical//NoScalar//CollectXh2)/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar//ToCanonical//NoScalar)/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar/.ScalarHa/.Scalar[φ[x_,y_]]:>φ[x,y]//CollectXXX;

"(S^((2)))"==(SKGquad/.simp)

We simplify this further by defining...

DefProjectedTensor[Z[],h]
Zdef=(1/(((-4 κ H+((OverDot[φ])^3) Derivative[0,1][G][φ,(((OverDot[φ])^2)/2)]))^2))->(((Z[LI[0],LI[0]])^2)/(16 (κ^2) ((a)^2)((OverDot[φ])^2)));

SKGquadFinal=SKGquad/.Zdef;

"(S^((2)))"==(SKGquadFinal/.simp)

This is the second-order action of KGB. This is Eq. (17) in arXiv:1008.0603 (expressed in conformal time) and Eq. (A.8) in arXiv:1008.0048.

The stability conditions are therefore...

𝒢=(2/(ah[LI[0],LI[0]]((Z[LI[0],LI[0]])^2)))Coefficient[SKGquadFinal,((((Overscript[\[Null], (1)])(OverDot[ψ])))^2)]//Expand;
ℱ=-((2ah[LI[0],LI[0]])/((Z[LI[0],LI[0]])^2))Coefficient[SKGquadFinal/.simpV,((Subscript[(OverBar[D]), b])(Overscript[\[Null], (1)])ψ) (((OverBar[D])^b)(Overscript[\[Null], (1)])ψ)]//Simplify;

(ℱ/.simp)>0
(𝒢/.simp)>0

This can be compared with the established results in arXiv:1008.0603 and arXiv:1008.0048 by using X=((OverDot[φ])^2)/2 and κ=((Subscript[M, Pl])^2)/2...

DefConstantSymbol[Mpl,PrintAs->"(Subscript[M, Pl])"];
DefProjectedTensor[Xb[],h,PrintAs->"X"];

(ℱ/.simp/.{((φ[LI[0],LI[1]])^2)->2Xb[LI[0],LI[0]],((φ[LI[0],LI[1]])^3)->2Xb[LI[0],LI[0]]φ[LI[0],LI[1]],((φ[LI[0],LI[1]])^4)->(((2Xb[LI[0],LI[0]]))^2),κ->(Mpl^2)/2}//Expand)>0
(𝒢/.simp/.{((φ[LI[0],LI[1]])^2)->2Xb[LI[0],LI[0]],((φ[LI[0],LI[1]])^3)->2Xb[LI[0],LI[0]]φ[LI[0],LI[1]],((φ[LI[0],LI[1]])^4)->(((2Xb[LI[0],LI[0]]))^2),κ->(Mpl^2)/2}//Expand)>0

These are Eqs. (18) and (19) in arXiv:1008.0603 and Eqs. (A.10) and (A.12) in arXiv:1008.0048.

End of notebook.

[Bonus] Second-order action for tensor perturbations of KGB

In this section, we derive the second-order action for the tensor fluctuations in KGB. This is a much more straightforward derivation that what was considered previously in the case of scalar perturbations. Let’s get straight to it.

First, we put back the tensor perturbations and kill off the scalar perturbations in the metric (valid since there’s no expected coupling between scalar and tensor modes)...

$FirstOrderTensorPerturbations=True;
killScalar={ϕh[_,_]->0,ψh[_,_]->0,Bsh[_,_]->0};

"(Subscript[g, bc])"==VisualizeTensor[MyToxPand[g[-b,-c],"ScalarFieldComovingGauge",1]/.killScalar,h]
"χ"==MyToxPand[φ[],"ScalarFieldComovingGauge",1]

The action expanded up to second-order is given by...

SKG012Tensor=MyToxPand[(Sqrt[-Detg[]])(LK+LG+LEH)/.χ[]->φ[],"ScalarFieldComovingGauge",2]/.killScalar/.kill2O/.Sqrt[-Detg[]((Scalar[ah[]])^8)]->((ah[LI[0],LI[0]])^3)//Expand//org;

SKG1Tensor=ExtractOrder[SKG012Tensor,1];
SKG2Tensor=ExtractOrder[SKG012Tensor,2]//ToCanonical//NoScalar;

Hold["(S^((1)))"]==SKG1Tensor
"(S^((2)))"==(SKG2Tensor/.simp)

So, we see that the tensor fluctuations doesn’t add to the background dynamics. Rather, it appears at second-order as gravitational waves.

We massage the quadratic action as we did previously for scalar perturbations. Let’s start with the easier IBPs (specifically those with second-derivative)...

CollectEt[expr_]:=Collect[expr,{((Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, c}})}})) ((Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}})),((Overscript[\[Null], (1)])(OverDot[({{E, ({{ ,  }, {b, c}})}})])) ((Overscript[\[Null], (1)])(OverDot[({{E, ({{b, c}, { ,  }})}})])),((Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}})) ((Overscript[\[Null], (1)])(OverDot[({{E, ({{ ,  }, {b, c}})}})])),((Subscript[(OverBar[D]), i])(Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, c}})}})) (((OverBar[D])^i)(Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}}))},Simplify]

SKG2Tensor2=SKG2Tensor/.expr_ Eth[LI[1],LI[2],-x_,-y_]:>-Eth[LI[1],LI[1],-x,-y]dt[expr]/.expr_ cd[-x_][cd[x_][Eth[LI[1],LI[0],u_,v_]]]:>-cd[-x][expr]cd[x][Eth[LI[1],LI[0],u,v]]//ContractMetric//ToCanonical//NoScalar//CollectEt;

"(S^((2)))"==(SKG2Tensor2/.simp)

It should be reminded that the tensor (Subscript[E, ab]) is divergenceless by construction (SVT decomposition). The term ((Subscript[(OverBar[D]), c])(Overscript[, (1)])({{E, ({{ ,  }, {b, i}})}})) (((OverBar[D])^i)(Overscript[, (1)])({{E, ({{b, c}, { ,  }})}})) can therefore be eliminated by IBP...

Hold[-2 κ a ((Subscript[(OverBar[D]), c])(Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, i}})}})) (((OverBar[D])^i)(Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}}))]==(-2 κ a ((Subscript[(OverBar[D]), c])(Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, i}})}})) (((OverBar[D])^i)(Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}}))/.cd[-x_][Eth[LI[1],LI[0],-y_,-z_]]cd[z_][Eth[LI[1],LI[0],y_,x_]]:>-Eth[LI[1],LI[0],-y,-z]cd[-x][cd[z][Eth[LI[1],LI[0],y,x]]]//ToCanonical)==CommuteCovDs[-2 κ a ((Subscript[(OverBar[D]), c])(Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, i}})}})) (((OverBar[D])^i)(Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}}))/.cd[-x_][Eth[LI[1],LI[0],-y_,-z_]]cd[z_][Eth[LI[1],LI[0],y_,x_]]:>-Eth[LI[1],LI[0],-y,-z]cd[-x][cd[z][Eth[LI[1],LI[0],y,x]]]//ToCanonical,cd,{-c,-i}]

Also consider the total derivative term...

GEE=Hold["(d/dt)"(2 ((a)^3) ((Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, c}})}})) ((Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}})) (2 κ H+G (OverDot[φ])))]==dt[2 ((a)^3)(2 κ H+G[(φ),(((((OverDot[φ])))^2)/2)] (OverDot[φ]))((Overscript[\[Null], (1)])({{E, ({{ ,  }, {b, c}})}})) ((Overscript[\[Null], (1)])({{E, ({{b, c}, { ,  }})}}))]//CollectEt;
GEE/.simp

The second-order action for tensor perturbations become...

SKG2Tensor3=CommuteCovDs[(SKG2Tensor2/.cd[-x_][Eth[LI[1],LI[0],-y_,-z_]]cd[z_][Eth[LI[1],LI[0],y_,x_]]:>-Eth[LI[1],LI[0],-y,-z]cd[-x][cd[z][Eth[LI[1],LI[0],y,x]]])//ToCanonical//NoScalar,cd,{-c,-i}]+((1/2)GEE[[2]])//ToCanonical//NoScalar//CollectEt;

"(S^((2)))"==(SKG2Tensor3/.simp)

Finally, using the background field equations...

SKGquadTensor=SKG2Tensor3/.((Hh[LI[0],LI[0]])^2)->Q/.fesVar;

"(S^((2)))"==SKGquadTensor

Obviously, the tensor modes travel at the speed of light in KGB. This is expected since there’s no direct coupling between the scalar field and the curvature tensors, e.g., terms in the action like (S^((2)))~f(ϕ)R,η((Subscript[∇, a])ϕ)((Subscript[∇, b])ϕ) (G^ab).