7979(* this converts spin tag into m_s *)
8080Ms [particleSpin [A ]]= 1 / 2 ;
8181Ms [particleSpin [B ]]= - 1 / 2 ;
82+ Ms [particleSpin [none ]]= 0 ;
8283
8384stringAppendSpin [str_ ,s_ particleSpin ]:= If [s === particleSpin [none ],str , "\!\(\* SubscriptBox[\( " <> str <> "\) , \( " <> If [s === particleSpin [A ],"\[ Alpha]" ,"\[ Beta]" ]<> "\) ]\) " ];
8485
180181(* return particleSpace of particleIndex *)
181182indexSpace [a_ particleIndex ] :=
182183 Cases [a ,_ particleSpace ][[1 ]];
184+
185+ (* return spin-free particleSpace of particleIndex *)
186+ indexSpaceSpinFree [a_ particleIndex ] :=
187+ DeleteCases [indexSpace [a ],_ particleSpin ];
183188
184189(* return the particleType of a particleIndex *)
185190indexParticle [a_ particleIndex ] :=
218223 (a [[1 ]]=== b [[1 ]])&& (a [[2 ]]=== b [[2 ]]);
219224Protect [Equal ];
220225
221- (* canonical ordering of particleIndex objects is defined as follows: order by particleSpace first, then alphabetically by the symbol *)
222- Unprotect [OrderedQ ];
223- OrderedQ [A_ particleSpace ,B_ particleSpace ] :=
224- If [ OrderedQ [A [[2 ]],B [[2 ]]],
225- OrderedQ [A [[1 ]],B [[1 ]]],
226- True
227- ];
228- Protect [OrderedQ ];
226+ (* canonical ordering of particleIndex objects is defined as follows: order by spin, then the rest of particleSpace, then alphabetically by the symbol.
227+ particleSpace objects ordered by *)
228+ sqOrder [A_ particleIndex ,B_ particleIndex ] :=
229+ If [ Ms [indexSpin [A ]]!= Ms [indexSpin [B ]],
230+ If [Ms [indexSpin [A ]]> Ms [indexSpin [B ]],1 ,- 1 ],
231+ If [ Order [indexSpaceSpinFree [A ],indexSpaceSpinFree [B ]]== 0 ,
232+ Order [A [[1 ]],B [[1 ]]],
233+ Order [indexSpaceSpinFree [A ],indexSpaceSpinFree [B ]]
234+ ]];
235+ sqOrder [a_ ,b_ ]:= Order [a ,b ];
229236
230237(* this functions throws out all multiple occurences of the same index from inds *)
231238uniqueIndexList [inds_ List ] :=
@@ -801,7 +808,7 @@ CR is the head for a general result of a contraction (unless it's a zero)
801808
802809
803810
804- (* ::Subsection:: *)
811+ (* ::Subsection::Closed:: *)
805812(* Contract SQS *)
806813
807814
@@ -2058,11 +2065,11 @@ The canonical order of indices of each type (that belong to the same space) is a
20582065 permfac = 1 ;
20592066 creInds = Cases [str ,a_ particleIndex /; a [[3 ]]== indexType [cre ]];
20602067 permfac * = Signature [creInds ];
2061- creInds = Sort [creInds ];
2068+ creInds = Sort [creInds , sqOrder ];
20622069 annInds = Cases [str ,a_ particleIndex /; a [[3 ]]== indexType [ann ]];
20632070 annInds = Reverse [annInds ];
20642071 permfac * = Signature [annInds ];
2065- annInds = Sort [annInds ];
2072+ annInds = Sort [annInds , sqOrder ];
20662073 result = permfac * FlattenAt [SQS [FlattenAt [{creInds ,Reverse [annInds ]},{{1 },{2 }}]],{1 }];
20672074 Return [result ];
20682075 ];
@@ -2087,7 +2094,7 @@ The canonical order of indices of each type (that belong to the same space) is a
20872094 result = tagIndices [oper ,intInds ];
20882095 braInds = Cases [result ,a_ particleIndex /; a [[3 ]]== indexType [bra ]];
20892096 (* canonically reorder bra indices first *)
2090- braIndsOrd = Ordering [braInds ];
2097+ braIndsOrd = Ordering [braInds , Length [ braInds ], sqOrder ];
20912098 braInds = braInds [[braIndsOrd ]];
20922099 If [ symfac == - 1 ,
20932100 permfac * = Signature [braIndsOrd ];
@@ -2100,7 +2107,7 @@ degenerately ordered (e.g. there are duplicates in the lists so that
21002107 multiple permutations of the original list re ordered *)
21012108 If [ symfac == 0 ,
21022109 ketInds = ketInds [[braIndsOrd ]],
2103- ( ketIndsOrd = Ordering [ketInds ];
2110+ ( ketIndsOrd = Ordering [ketInds , Length [ ketInds ], sqOrder ];
21042111 If [ symfac == - 1 ,
21052112 permfac * = Signature [ketIndsOrd ]
21062113 ];
@@ -2332,7 +2339,7 @@ degenerately ordered (e.g. there are duplicates in the lists so that
23322339
23332340
23342341(*
2335- Remove diconnected terms. Connectedness is determined with respect to the Hamiltonian
2342+ Remove disconnected terms. Connectedness is determined with respect to the Hamiltonian
23362343*)
23372344
23382345removeDisconnectedTerms [expr_ ,externalIndices_ List :{},hamiltonianOpers_ List :defaultHamiltonianOpers ] :=
@@ -2585,7 +2592,7 @@ degenerately ordered (e.g. there are duplicates in the lists so that
25852592Protect [MatchQ ];
25862593
25872594
2588- (* ::Section::Closed:: *)
2595+ (* ::Section:: *)
25892596(* Spin*)
25902597
25912598
@@ -2620,7 +2627,7 @@ degenerately ordered (e.g. there are duplicates in the lists so that
26202627Do [ (* for every combination of spins *)
26212628(* make a list of index replacements to apply (groupings are omitted) *)
26222629repls =
2623- Table [particleIndex [indexSymbol [indGroups [[g ,i ]]],particleSpace [space_ ], rest_ ]-> particleIndex [indexSymbol [indGroups [[g ,i ]]],particleSpace [space ,particleSpin [mstuples [[t ,g ]]]],rest ],{g ,Length [indGroups ]},{i ,Length [indGroups [[g ]]]}];
2630+ Table [particleIndex [indexSymbol [indGroups [[g ,i ]]],particleSpace [space__ ], rest__ ]-> particleIndex [indexSymbol [indGroups [[g ,i ]]],particleSpace [space ,particleSpin [mstuples [[t ,g ]]]],rest ],{g ,Length [indGroups ]},{i ,Length [indGroups [[g ]]]}];
26242631repls = Flatten [repls ];
26252632If [ SeQuantDebugLevel >= 3 ,Print ["in spintrace: t=" ,t ," repls=" ,repls // TraditionalForm ," expr/.repls=" ,TraditionalForm [expr /. repls ]];
26262633];
@@ -2633,26 +2640,35 @@ degenerately ordered (e.g. there are duplicates in the lists so that
26332640
26342641(* convert to nonsymmetric n-body operators, e.g. Overscript[g, _] \[Rule] g *)
26352642(* 2-body *)
2636- result = result /. SQM [OHead [label_ String ,indexSymm [- 1 ]],particleIndex [bra1__ ],particleIndex [bra2__ ],particleIndex [ket1__ ],particleIndex [ket2__ ]]-> rhoIndex [particleIndex [bra1 ],particleIndex [bra2 ]]* rhoIndex [particleIndex [ket1 ],particleIndex [ket2 ]]* (SQM [OHead [antisymm2nonsymmSQMlabel [label ],indexSymm [0 ]],particleIndex [bra1 ],particleIndex [bra2 ],particleIndex [ket1 ],particleIndex [ket2 ]]- SQM [OHead [antisymm2nonsymmSQMlabel [label ],indexSymm [0 ]],particleIndex [bra1 ],particleIndex [bra2 ],particleIndex [ket2 ],particleIndex [ket1 ]]);
2643+ result = result /. SQM [OHead [label_ String ? ( RefLink [ StringContainsQ , paclet : ref / StringContainsQ ][ # , StartOfLine ~~ "Overscript[" ~~ __ ] & ) ,indexSymm [- 1 ]],particleIndex [bra1__ ],particleIndex [bra2__ ],particleIndex [ket1__ ],particleIndex [ket2__ ]]-> rhoIndex [particleIndex [bra1 ],particleIndex [bra2 ]]* rhoIndex [particleIndex [ket1 ],particleIndex [ket2 ]]* (SQM [OHead [antisymm2nonsymmSQMlabel [label ],indexSymm [0 ]],particleIndex [bra1 ],particleIndex [bra2 ],particleIndex [ket1 ],particleIndex [ket2 ]]- SQM [OHead [antisymm2nonsymmSQMlabel [label ],indexSymm [0 ]],particleIndex [bra1 ],particleIndex [bra2 ],particleIndex [ket2 ],particleIndex [ket1 ]]);
26372644(* 3-body *)
2638- result=result/.SQM[OHead[label_String,indexSymm[-1]],particleIndex[bra1__],particleIndex[bra2__],particleIndex[bra3__],particleIndex[ket1__],particleIndex[ket2__],particleIndex[ket3__]]->rhoIndex[particleIndex[bra1],particleIndex[bra2]]*rhoIndex[particleIndex[bra1],particleIndex[bra3]]*rhoIndex[particleIndex[bra2],particleIndex[bra3]]*rhoIndex[particleIndex[ket1],particleIndex[ket2]]**rhoIndex[particleIndex[ket1],particleIndex[ket3]]**rhoIndex[particleIndex[ket2],particleIndex[ket3]](SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket1],particleIndex[ket2],particleIndex[ket3]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket2],particleIndex[ket1],particleIndex[ket3]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket1],particleIndex[ket3],particleIndex[ket2]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket3],particleIndex[ket2],particleIndex[ket1]]+SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket2],particleIndex[ket3],particleIndex[ket1]]+SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket3],particleIndex[ket1],particleIndex[ket2]]);
2639- (* eliminate rho's if EPV terms will be avoided implcitly , but summing multiple terms *)
2645+ result=result/.SQM[OHead[label_String?(RefLink[StringContainsQ,paclet:ref/StringContainsQ][#,StartOfLine~~"Overscript["~~__] &),indexSymm[-1]],particleIndex[bra1__],particleIndex[bra2__],particleIndex[bra3__],particleIndex[ket1__],particleIndex[ket2__],particleIndex[ket3__]]->rhoIndex[particleIndex[bra1],particleIndex[bra2]]*rhoIndex[particleIndex[bra1],particleIndex[bra3]]*rhoIndex[particleIndex[bra2],particleIndex[bra3]]*rhoIndex[particleIndex[ket1],particleIndex[ket2]]**rhoIndex[particleIndex[ket1],particleIndex[ket3]]**rhoIndex[particleIndex[ket2],particleIndex[ket3]](SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket1],particleIndex[ket2],particleIndex[ket3]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket2],particleIndex[ket1],particleIndex[ket3]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket1],particleIndex[ket3],particleIndex[ket2]]-SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket3],particleIndex[ket2],particleIndex[ket1]]+SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket2],particleIndex[ket3],particleIndex[ket1]]+SQM[OHead[antisymm2nonsymmSQMlabel[label],indexSymm[0]],particleIndex[bra1],particleIndex[bra2],particleIndex[bra3],particleIndex[ket3],particleIndex[ket1],particleIndex[ket2]]);
2646+ (* eliminate rho's if EPV terms will be avoided implicitly , but summing multiple terms *)
26402647result = If [explicitEPV ,result ,(result /. rhoIndex [__ ]-> 1 )];
26412648result = Expand [result ];
2649+ (* canonicalize to make spin tracing easier*)
2650+ result = Map [maporder ,result ,2 ];
26422651If [ SeQuantDebugLevel >= 2 ,Print ["in spintrace: after expanding antisymmetric operators = " ,TraditionalForm [result ]];
26432652];
26442653
26452654(* zero out integrals that don't conserve spin quantum numbers *)
26462655(* 1-body *)
2647- result = result /. SQM [OHead [op__ ],particleIndex [bra1_ String ,particleSpace [bra1space_ ,bra1spin_ ],bra1rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ,ket1spin_ ],ket1rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],SQM [OHead [op ],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],0 ];
2648- result = result /. rhoIndex [particleIndex [bra1_ String ,particleSpace [bra1space_ ,bra1spin_ ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ,ket1spin_ ],ket1rest___ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],rhoIndex [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],1 ];
2649- result = result /. deltaIndex [particleIndex [bra1_ String ,particleSpace [bra1space_ ,bra1spin_ ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ,ket1spin_ ],ket1rest___ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],rhoIndex [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],0 ];
2650- (* 2-body *)
2651- result = result /. SQM [OHead [label_ String ,indexSymm [0 ]],particleIndex [bra1_ String ,particleSpace [bra1space_ ,bra1spin_ ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space_ ,bra2spin_ ],bra2rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ,ket1spin_ ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space_ ,ket2spin_ ],ket2rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ],SQM [OHead [label ,indexSymm [0 ]],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ],particleIndex [ket2 ,particleSpace [ket2space ,ket2spin ],ket2rest ]],0 ];
2652- (* 3-body *)
2653- result = result /. SQM [OHead [label_ String ,indexSymm [0 ]],particleIndex [bra1_ String ,particleSpace [bra1space_ ,bra1spin_ ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space_ ,bra2spin_ ],bra2rest_ ],
2654- particleIndex [bra3_ String ,particleSpace [bra3space_ ,bra3spin_ ],bra3rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ,ket1spin_ ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space_ ,ket2spin_ ],ket2rest_ ],
2655- particleIndex [ket3_ String ,particleSpace [ket3space_ ,ket3spin_ ],ket3rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ]&& Ms [bra3spin ]== Ms [ket3spin ],SQM [OHead [label ,indexSymm [0 ]],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],
2656+ result = result /. SQM [OHead [op__ ],particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],SQM [OHead [op ],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],0 ];
2657+ result = result /. SQS [particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],SQS [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],0 ];
2658+ result = result /. rhoIndex [particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest___ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],rhoIndex [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],1 ];
2659+ result = result /. deltaIndex [particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest___ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ],rhoIndex [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ]],0 ];
2660+ (* 2-body ... N.B. SQM and SQS are canonically ordered, hence can just match spins within columns *)
2661+ result = result /. SQM [OHead [label_ String ,indexSymm [0 ]],particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space__ ,bra2spin_ particleSpin ],bra2rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space__ ,ket2spin_ particleSpin ],ket2rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ],SQM [OHead [label ,indexSymm [0 ]],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ],particleIndex [ket2 ,particleSpace [ket2space ,ket2spin ],ket2rest ]],0 ];
2662+ result = result /. SQS [particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space__ ,bra2spin_ particleSpin ],bra2rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space__ ,ket2spin_ particleSpin ],ket2rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ],SQS [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ],particleIndex [ket2 ,particleSpace [ket2space ,ket2spin ],ket2rest ]],0 ];
2663+ (* 3-body ... N.B. see above *)
2664+ result = result /. SQM [OHead [label_ String ,indexSymm [0 ]],particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space__ ,bra2spin_ particleSpin ],bra2rest_ ],
2665+ particleIndex [bra3_ String ,particleSpace [bra3space__ ,bra3spin_ particleSpin ],bra3rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space__ ,ket2spin_ particleSpin ],ket2rest_ ],
2666+ particleIndex [ket3_ String ,particleSpace [ket3space__ ,ket3spin_ particleSpin ],ket3rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ]&& Ms [bra3spin ]== Ms [ket3spin ],SQM [OHead [label ,indexSymm [0 ]],particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],
2667+ particleIndex [bra3 ,particleSpace [bra3space ,bra3spin ],bra3rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ],particleIndex [ket2 ,particleSpace [ket2space ,ket2spin ],ket2rest ],
2668+ particleIndex [ket3 ,particleSpace [ket3space ,ket3spin ],ket3rest ]],0 ];
2669+ result = result /. SQS [particleIndex [bra1_ String ,particleSpace [bra1space__ ,bra1spin_ particleSpin ],bra1rest_ ],particleIndex [bra2_ String ,particleSpace [bra2space__ ,bra2spin_ particleSpin ],bra2rest_ ],
2670+ particleIndex [bra3_ String ,particleSpace [bra3space__ ,bra3spin_ particleSpin ],bra3rest_ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ,ket1spin_ particleSpin ],ket1rest_ ],particleIndex [ket2_ String ,particleSpace [ket2space__ ,ket2spin_ particleSpin ],ket2rest_ ],
2671+ particleIndex [ket3_ String ,particleSpace [ket3space__ ,ket3spin_ particleSpin ],ket3rest_ ]]-> If [Ms [bra1spin ]== Ms [ket1spin ]&& Ms [bra2spin ]== Ms [ket2spin ]&& Ms [bra3spin ]== Ms [ket3spin ],SQS [particleIndex [bra1 ,particleSpace [bra1space ,bra1spin ],bra1rest ],particleIndex [bra2 ,particleSpace [bra2space ,bra2spin ],bra2rest ],
26562672particleIndex [bra3 ,particleSpace [bra3space ,bra3spin ],bra3rest ],particleIndex [ket1 ,particleSpace [ket1space ,ket1spin ],ket1rest ],particleIndex [ket2 ,particleSpace [ket2space ,ket2spin ],ket2rest ],
26572673particleIndex [ket3 ,particleSpace [ket3space ,ket3spin ],ket3rest ]],0 ];
26582674result = Expand [result ];
@@ -2667,7 +2683,7 @@ degenerately ordered (e.g. there are duplicates in the lists so that
26672683];
26682684
26692685(* optionally replace rhoIndex with deltaIndex ... and reduce the deltas *)
2670- result = If [! rhoToDelta ,result ,result /. rhoIndex [particleIndex [bra1_ String ,particleSpace [bra1space_ ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space_ ],ket1rest___ ]]-> (1 - deltaIndex [particleIndex [bra1 ,particleSpace [bra1space ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ],ket1rest ]])];
2686+ result = If [! rhoToDelta ,result ,result /. rhoIndex [particleIndex [bra1_ String ,particleSpace [bra1space__ ],bra1rest___ ],particleIndex [ket1_ String ,particleSpace [ket1space__ ],ket1rest___ ]]-> (1 - deltaIndex [particleIndex [bra1 ,particleSpace [bra1space ],bra1rest ],particleIndex [ket1 ,particleSpace [ket1space ],ket1rest ]])];
26712687If [ rhoToDelta && SeQuantDebugLevel >= 2 ,Print ["in spintrace: after replacing rhos with deltas = " ,TraditionalForm [result ]];
26722688];
26732689result = If [! rhoToDelta ,result ,reduceWick [Expand [result ],extInds ,intInds ]];
0 commit comments