VMPS++
Loading...
Searching...
No Matches
ZN.h
Go to the documentation of this file.
1#ifndef ZN_H_
2#define ZN_H_
3
4//include <array>
5//include <cstddef>
7#include <unordered_set>
9
10#include "DmrgTypedefs.h"
11#include "DmrgExternal.h"
12//include "qarray.h"
13
14namespace Sym{
15
23template<typename Kind, int N, typename Scalar=double>
24class ZN
25{
26public:
27 typedef Scalar Scalar_;
28
29 static constexpr int Nq=1;
30
31 static constexpr bool HAS_CGC = false;
32 static constexpr bool NON_ABELIAN = false;
33 static constexpr bool ABELIAN = true;
34 static constexpr bool IS_TRIVIAL = false;
35 static constexpr bool IS_MODULAR = true;
36 static constexpr int MOD_N = N;
37
38 static constexpr bool IS_CHARGE_SU2() { return false; }
39 static constexpr bool IS_SPIN_SU2() { return false; }
40 static constexpr bool IS_SPIN_U1() { return false; }
41
42 static constexpr bool NO_SPIN_SYM() { return false;}
43 static constexpr bool NO_CHARGE_SYM() { return false;}
44
46
47 ZN() {};
48
49 inline static constexpr qType qvacuum() { return {0}; }
50
51 inline static constexpr size_t lowest_qs_size = 2; // for compatibility with g++-8
52 inline static constexpr std::array<qType,2> lowest_qs()
53 {
54 return std::array<qType,2>{{ qarray<1>(std::array<int,1>{{1}}),
55 qarray<1>(std::array<int,1>{{N-1}}) }};
56 }
57
58 inline static std::string name()
59 {
60 stringstream ss;
61 ss << "Z" << N;
62 return ss.str();
63 }
64 inline static constexpr std::array<KIND,Nq> kind() { return {Kind::name}; }
65 inline static constexpr std::array<int,Nq> mod() { return {MOD_N}; }
66
67 inline static qType flip( const qType& q ) { return {posmod<N>(N-q[0])}; }
68 inline static int degeneracy( const qType& q ) { return 1; }
69
70 inline static int spinorFactor() { return +1; }
72
75 static std::vector<qType> reduceSilent( const qType& ql, const qType& qr);
80 static std::vector<qType> reduceSilent( const qType& ql, const qType& qm, const qType& qr);
84 static std::vector<qType> reduceSilent( const std::vector<qType>& ql, const qType& qr);
88 static std::vector<qType> reduceSilent( const std::vector<qType>& ql, const std::vector<qType>& qr, bool UNIQUE = false);
89
90 static vector<tuple<qarray<1>,size_t,qarray<1>,size_t,qarray<1> > > tensorProd ( const std::vector<qType>& ql, const std::vector<qType>& qr );
92
94
100 inline static Scalar coeff_unity();
101 inline static Scalar coeff_dot(const qType& q1);
102 inline static Scalar coeff_rightOrtho(const qType& q1, const qType& q2);
103 inline static Scalar coeff_leftSweep(const qType& q1, const qType& q2);
104
105 inline static Scalar coeff_swapPhase(const qType& q1, const qType& q2, const qType& q3);
106 inline static Scalar coeff_leftSweep2(const qType& q1, const qType& q2, const qType& q3);
107 inline static Scalar coeff_leftSweep3(const qType& q1, const qType& q2, const qType& q3);
108 inline static Scalar coeff_sign(const qType& q1, const qType& q2, const qType& q3);
109 inline static Scalar coeff_sign2(const qType& q1, const qType& q2, const qType& q3) {return 1.;};
110 inline static Scalar coeff_adjoint(const qType& q1, const qType& q2, const qType& q3);
111 inline static Scalar coeff_splitAA(const qType& q1, const qType& q2, const qType& q3);
112
113 inline static Scalar coeff_3j(const qType& q1, const qType& q2, const qType& q3,
114 int q1_z, int q2_z, int q3_z);
115 inline static Scalar coeff_CGC(const qType& q1, const qType& q2, const qType& q3,
116 int q1_z, int q2_z, int q3_z);
117
118 inline static Scalar coeff_6j(const qType& q1, const qType& q2, const qType& q3,
119 const qType& q4, const qType& q5, const qType& q6);
120 inline static Scalar coeff_Apair(const qType& q1, const qType& q2, const qType& q3,
121 const qType& q4, const qType& q5, const qType& q6);
122 static Scalar coeff_splitAA(const qType& q1, const qType& q2, const qType& q3,
123 const qType& q4, const qType& q5, const qType& q6);
124
125 inline static Scalar coeff_9j(const qType& q1, const qType& q2, const qType& q3,
126 const qType& q4, const qType& q5, const qType& q6,
127 const qType& q7, const qType& q8, const qType& q9);
128 inline static Scalar coeff_tensorProd(const qType& q1, const qType& q2, const qType& q3,
129 const qType& q4, const qType& q5, const qType& q6,
130 const qType& q7, const qType& q8, const qType& q9);
131 inline static Scalar coeff_buildL(const qType& q1, const qType& q2, const qType& q3,
132 const qType& q4, const qType& q5, const qType& q6,
133 const qType& q7, const qType& q8, const qType& q9);
134 inline static Scalar coeff_buildR(const qType& q1, const qType& q2, const qType& q3,
135 const qType& q4, const qType& q5, const qType& q6,
136 const qType& q7, const qType& q8, const qType& q9);
137 inline static Scalar coeff_HPsi(const qType& q1, const qType& q2, const qType& q3,
138 const qType& q4, const qType& q5, const qType& q6,
139 const qType& q7, const qType& q8, const qType& q9);
140 inline static Scalar coeff_AW(const qType& q1, const qType& q2, const qType& q3,
141 const qType& q4, const qType& q5, const qType& q6,
142 const qType& q7, const qType& q8, const qType& q9);
143
144 inline static Scalar coeff_Wpair(const qType& q1, const qType& q2, const qType& q3,
145 const qType& q4, const qType& q5, const qType& q6,
146 const qType& q7, const qType& q8, const qType& q9,
147 const qType& q10, const qType& q11, const qType& q12);
148 inline static Scalar coeff_prod(const qType& q1, const qType& q2, const qType& q3,
149 const qType& q4, const qType& q5, const qType& q6);
150 inline static Scalar coeff_MPOprod6(const qType& q1, const qType& q2, const qType& q3,
151 const qType& q4, const qType& q5, const qType& q6);
152 inline static Scalar coeff_MPOprod9(const qType& q1, const qType& q2, const qType& q3,
153 const qType& q4, const qType& q5, const qType& q6,
154 const qType& q7, const qType& q8, const qType& q9);
155 static Scalar coeff_twoSiteGate(const qType& q1, const qType& q2, const qType& q3,
156 const qType& q4, const qType& q5, const qType& q6);
158
163 template<std::size_t M>
164 static bool compare ( const std::array<qType,M>& q1, const std::array<qType,M>& q2 );
165
171 template<std::size_t M>
172 static bool validate( const std::array<qType,M>& qs );
173
174 static bool triangle( const std::array<qType,3>& qs );
175 static bool pair( const std::array<qType,2>& qs );
176
177};
178
179template<typename Kind, int N, typename Scalar>
180std::vector<typename ZN<Kind,N,Scalar>::qType> ZN<Kind,N,Scalar>::
181reduceSilent( const qType& ql, const qType& qr )
182{
183 std::vector<qType> vout;
184 vout.push_back({posmod<N>(ql[0]+qr[0])});
185 //cout << "ql=" << ql[0] << ", qr=" << qr[0] << ", posmod=" << posmod<N>(ql[0]+qr[0]) << endl;
186 return vout;
187}
188
189template<typename Kind, int N, typename Scalar>
190std::vector<typename ZN<Kind,N,Scalar>::qType> ZN<Kind,N,Scalar>::
191reduceSilent( const qType& ql, const qType& qm, const qType& qr )
192{
193 std::vector<qType> vout;
194 vout.push_back({posmod<N>(ql[0]+qm[0]+qr[0])});
195 return vout;
196}
197
198template<typename Kind, int N, typename Scalar>
199std::vector<typename ZN<Kind,N,Scalar>::qType> ZN<Kind,N,Scalar>::
200reduceSilent( const std::vector<qType>& ql, const qType& qr )
201{
202 std::vector<typename ZN<Kind,N,Scalar>::qType> vout;
203 for (std::size_t q=0; q<ql.size(); q++)
204 {
205 vout.push_back({posmod<N>(ql[q][0]+qr[0])});
206 }
207 return vout;
208}
209
210template<typename Kind, int N, typename Scalar>
211std::vector<typename ZN<Kind,N,Scalar>::qType> ZN<Kind,N,Scalar>::
212reduceSilent( const std::vector<qType>& ql, const std::vector<qType>& qr, bool UNIQUE )
213{
214 if (UNIQUE)
215 {
216 std::unordered_set<qType> uniqueControl;
217 std::vector<qType> vout;
218 for (std::size_t q=0; q<ql.size(); q++)
219 for (std::size_t p=0; p<qr.size(); p++)
220 {
221 int i = posmod<N>(ql[q][0]+qr[p][0]);
222 if (auto it = uniqueControl.find({i}) == uniqueControl.end()) {uniqueControl.insert({i}); vout.push_back({i});}
223 }
224 return vout;
225 }
226 else
227 {
228 std::vector<qType> vout;
229
230 for (std::size_t q=0; q<ql.size(); q++)
231 for (std::size_t p=0; p<qr.size(); p++)
232 {
233 vout.push_back({posmod<N>(ql[q][0]+qr[p][0])});
234 }
235 return vout;
236 }
237}
238
239template<typename Kind, int N, typename Scalar>
240vector<tuple<qarray<1>,size_t,qarray<1>,size_t,qarray<1> > > ZN<Kind,N,Scalar>::
241tensorProd ( const std::vector<qType>& ql, const std::vector<qType>& qr )
242{
243 vector<tuple<qarray<1>,size_t,qarray<1>,size_t,qarray<1> > > out;
244 for (std::size_t q=0; q<ql.size(); q++)
245 for (std::size_t p=0; p<qr.size(); p++)
246 {
247 out.push_back(make_tuple(ql[q], q, qr[p], p, qarray<1>{posmod<N>(ql[q][0]+qr[p][0])}));
248 }
249 return out;
250}
251
252template<typename Kind, int N, typename Scalar>
255{
256 Scalar out = Scalar(1.);
257 return out;
258}
259
260template<typename Kind, int N, typename Scalar>
262coeff_dot(const qType& q1)
263{
264 Scalar out = Scalar(1.);
265 return out;
266}
267
268template<typename Kind, int N, typename Scalar>
270coeff_rightOrtho(const qType& q1, const qType& q2)
271{
272 Scalar out = Scalar(1.);
273 return out;
274}
275
276template<typename Kind, int N, typename Scalar>
278coeff_swapPhase(const qType& q1, const qType& q2, const qType& q3)
279{
280 Scalar out = Scalar(1.);
281 return out;
282}
283
284template<typename Kind, int N, typename Scalar>
286coeff_leftSweep2(const qType& q1, const qType& q2, const qType& q3)
287{
288 Scalar out = Scalar(1.);
289 return out;
290}
291
292template<typename Kind, int N, typename Scalar>
294coeff_leftSweep3(const qType& q1, const qType& q2, const qType& q3)
295{
296 Scalar out = Scalar(1.);
297 return out;
298}
299
300template<typename Kind, int N, typename Scalar>
302coeff_leftSweep(const qType& q1, const qType& q2)
303{
304 Scalar out = Scalar(1.);
305 return out;
306}
307
308template<typename Kind, int N, typename Scalar>
310coeff_sign(const qType& q1, const qType& q2, const qType& q3)
311{
312 Scalar out = Scalar(1.);
313 return out;
314}
315
316template<typename Kind, int N, typename Scalar>
318coeff_adjoint(const qType& q1, const qType& q2, const qType& q3)
319{
320 Scalar out = Scalar(1.);
321 return out;
322}
323
324template<typename Kind, int N, typename Scalar>
326coeff_3j(const qType& q1, const qType& q2, const qType& q3,
327 int q1_z, int q2_z, int q3_z)
328{
329 return Scalar(1.);
330}
331
332template<typename Kind, int N, typename Scalar>
334coeff_CGC(const qType& q1, const qType& q2, const qType& q3,
335 int q1_z, int q2_z, int q3_z)
336{
337 return Scalar(1.);
338}
339
340template<typename Kind, int N, typename Scalar>
342coeff_6j(const qType& q1, const qType& q2, const qType& q3,
343 const qType& q4, const qType& q5, const qType& q6)
344{
345 return Scalar(1.);
346}
347
348template<typename Kind, int N, typename Scalar>
350coeff_Apair(const qType& q1, const qType& q2, const qType& q3,
351 const qType& q4, const qType& q5, const qType& q6)
352{
353 Scalar out = Scalar(1.);
354 return out;
355}
356
357template<typename Kind, int N, typename Scalar>
359coeff_9j(const qType& q1, const qType& q2, const qType& q3,
360 const qType& q4, const qType& q5, const qType& q6,
361 const qType& q7, const qType& q8, const qType& q9)
362{
363 return Scalar(1.);
364}
365
366template<typename Kind, int N, typename Scalar>
368coeff_buildR(const qType& q1, const qType& q2, const qType& q3,
369 const qType& q4, const qType& q5, const qType& q6,
370 const qType& q7, const qType& q8, const qType& q9)
371{
372 return Scalar(1.);
373}
374
375template<typename Kind, int N, typename Scalar>
377coeff_buildL(const qType& q1, const qType& q2, const qType& q3,
378 const qType& q4, const qType& q5, const qType& q6,
379 const qType& q7, const qType& q8, const qType& q9)
380{
381 Scalar out = Scalar(1.);
382 return out;
383}
384
385template<typename Kind, int N, typename Scalar>
387coeff_tensorProd(const qType& q1, const qType& q2, const qType& q3,
388 const qType& q4, const qType& q5, const qType& q6,
389 const qType& q7, const qType& q8, const qType& q9)
390{
391 Scalar out = Scalar(1.);
392 return out;
393}
394
395template<typename Kind, int N, typename Scalar>
397coeff_HPsi(const qType& q1, const qType& q2, const qType& q3,
398 const qType& q4, const qType& q5, const qType& q6,
399 const qType& q7, const qType& q8, const qType& q9)
400{
401 Scalar out = Scalar(1.);
402 return out;
403}
404
405template<typename Kind, int N, typename Scalar>
407coeff_AW(const qType& q1, const qType& q2, const qType& q3,
408 const qType& q4, const qType& q5, const qType& q6,
409 const qType& q7, const qType& q8, const qType& q9)
410{
411 Scalar out = Scalar(1.);
412 return out;
413}
414
415template<typename Kind, int N, typename Scalar>
417coeff_Wpair(const qType& q1, const qType& q2, const qType& q3,
418 const qType& q4, const qType& q5, const qType& q6,
419 const qType& q7, const qType& q8, const qType& q9,
420 const qType& q10, const qType& q11, const qType& q12)
421{
422 Scalar out = Scalar(1.);
423 return out;
424}
425
426template<typename Kind, int N, typename Scalar>
428coeff_prod(const qType& q1, const qType& q2, const qType& q3,
429 const qType& q4, const qType& q5, const qType& q6)
430{
431 Scalar out = Scalar(1.);
432 return out;
433}
434
435template<typename Kind, int N, typename Scalar>
437coeff_MPOprod6(const qType& q1, const qType& q2, const qType& q3,
438 const qType& q4, const qType& q5, const qType& q6)
439{
440 Scalar out = Scalar(1.);
441 return out;
442}
443
444template<typename Kind, int N, typename Scalar>
446coeff_MPOprod9(const qType& q1, const qType& q2, const qType& q3,
447 const qType& q4, const qType& q5, const qType& q6,
448 const qType& q7, const qType& q8, const qType& q9)
449{
450 Scalar out = Scalar(1.);
451 return out;
452}
453
454template<typename Kind, int N, typename Scalar>
456coeff_splitAA(const qType& q1, const qType& q2, const qType& q3)
457{
458 Scalar out = Scalar(1.);
459 return out;
460}
461
462template<typename Kind, int N, typename Scalar>
464coeff_splitAA(const qType& q1, const qType& q2, const qType& q3,
465 const qType& q4, const qType& q5, const qType& q6)
466{
467 Scalar out = Scalar(1.);
468 return out;
469}
470
471template<typename Kind, int N, typename Scalar>
473coeff_twoSiteGate(const qType& q1, const qType& q2, const qType& q3,
474 const qType& q4, const qType& q5, const qType& q6)
475{
476 Scalar out = Scalar(1.);
477 return out;
478}
479
480template<typename Kind, int N, typename Scalar>
481template<std::size_t M>
483compare ( const std::array<ZN<Kind,N,Scalar>::qType,M>& q1, const std::array<ZN<Kind,N,Scalar>::qType,M>& q2 )
484{
485 for (std::size_t m=0; m<M; m++)
486 {
487 if (q1[m][0] > q2[m][0]) {return false;}
488 else if (q1[m][0] < q2[m][0]) {return true; }
489 }
490 return false;
491}
492
493template<typename Kind, int N, typename Scalar>
495triangle ( const std::array<ZN<Kind,N,Scalar>::qType,3>& qs )
496{
497 //check the triangle rule for ZN quantum numbers
498 if (posmod<N>(qs[0][0]+qs[1][0]) == posmod<N>(qs[2][0])) {return true;}
499 return false;
500}
501
502template<typename Kind, int N, typename Scalar>
504pair ( const std::array<ZN<Kind,N,Scalar>::qType,2>& qs )
505{
506 //check if two quantum numbers fulfill the flow equations: simply qin = qout
507 if ( qs[0] == qs[1] ) {return true;}
508 return false;
509}
510
511template<typename Kind, int N, typename Scalar>
512template<std::size_t M>
514validate ( const std::array<ZN<Kind,N,Scalar>::qType,M>& qs )
515{
516 if constexpr( M == 1 ) { return true; }
517 else if constexpr( M == 2 ) { return ZN<Kind,N,Scalar>::pair(qs); }
518 else if constexpr( M==3 ) { return ZN<Kind,N,Scalar>::triangle(qs); }
519 else { cout << "This should not be printed out!" << endl; return true; }
520}
521
522} //end namespace Sym
523
524/*#ifndef STREAM_OPERATOR_ARR_1_INT
525#define STREAM_OPERATOR_ARR_1_INT
526std::ostream& operator<< (std::ostream& os, const typename Sym::ZN<double>::qType &q)
527{
528 os << q[0];
529 return os;
530}
531#endif*/
532
533#endif
Definition: ZN.h:25
Scalar Scalar_
Definition: ZN.h:27
static constexpr std::array< qType, 2 > lowest_qs()
Definition: ZN.h:52
static Scalar coeff_tensorProd(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:387
static constexpr bool IS_TRIVIAL
Definition: ZN.h:34
static constexpr bool NON_ABELIAN
Definition: ZN.h:32
static Scalar coeff_buildL(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:377
static Scalar coeff_MPOprod6(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
Definition: ZN.h:437
static constexpr std::array< KIND, Nq > kind()
Definition: ZN.h:64
static qType flip(const qType &q)
Definition: ZN.h:67
static std::vector< qType > reduceSilent(const qType &ql, const qType &qr)
Definition: ZN.h:181
static Scalar coeff_sign2(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:109
static Scalar coeff_sign(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:310
static Scalar coeff_leftSweep3(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:294
static int spinorFactor()
Definition: ZN.h:70
static constexpr bool IS_CHARGE_SU2()
Definition: ZN.h:38
static Scalar coeff_leftSweep2(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:286
static bool validate(const std::array< qType, M > &qs)
static bool triangle(const std::array< qType, 3 > &qs)
Definition: ZN.h:495
static Scalar coeff_Apair(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
Definition: ZN.h:350
static constexpr bool NO_CHARGE_SYM()
Definition: ZN.h:43
static constexpr int Nq
Definition: ZN.h:29
static bool pair(const std::array< qType, 2 > &qs)
Definition: ZN.h:504
static Scalar coeff_CGC(const qType &q1, const qType &q2, const qType &q3, int q1_z, int q2_z, int q3_z)
Definition: ZN.h:334
static Scalar coeff_prod(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
Definition: ZN.h:428
static Scalar coeff_twoSiteGate(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
Definition: ZN.h:473
static constexpr bool IS_SPIN_SU2()
Definition: ZN.h:39
static constexpr size_t lowest_qs_size
Definition: ZN.h:51
static vector< tuple< qarray< 1 >, size_t, qarray< 1 >, size_t, qarray< 1 > > > tensorProd(const std::vector< qType > &ql, const std::vector< qType > &qr)
Definition: ZN.h:241
static constexpr std::array< int, Nq > mod()
Definition: ZN.h:65
static Scalar coeff_leftSweep(const qType &q1, const qType &q2)
Definition: ZN.h:302
qarray< Nq > qType
Definition: ZN.h:45
static constexpr bool NO_SPIN_SYM()
Definition: ZN.h:42
static Scalar coeff_MPOprod9(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:446
static Scalar coeff_rightOrtho(const qType &q1, const qType &q2)
Definition: ZN.h:270
static constexpr qType qvacuum()
Definition: ZN.h:49
static constexpr bool IS_SPIN_U1()
Definition: ZN.h:40
static Scalar coeff_6j(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6)
Definition: ZN.h:342
static Scalar coeff_dot(const qType &q1)
Definition: ZN.h:262
ZN()
Definition: ZN.h:47
static Scalar coeff_9j(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:359
static Scalar coeff_AW(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:407
static Scalar coeff_adjoint(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:318
static Scalar coeff_buildR(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:368
static bool compare(const std::array< qType, M > &q1, const std::array< qType, M > &q2)
static Scalar coeff_Wpair(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9, const qType &q10, const qType &q11, const qType &q12)
Definition: ZN.h:417
static Scalar coeff_3j(const qType &q1, const qType &q2, const qType &q3, int q1_z, int q2_z, int q3_z)
Definition: ZN.h:326
static Scalar coeff_unity()
Definition: ZN.h:254
static int degeneracy(const qType &q)
Definition: ZN.h:68
static Scalar coeff_splitAA(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:456
static std::string name()
Definition: ZN.h:58
static Scalar coeff_swapPhase(const qType &q1, const qType &q2, const qType &q3)
Definition: ZN.h:278
static constexpr bool ABELIAN
Definition: ZN.h:33
static constexpr int MOD_N
Definition: ZN.h:36
static constexpr bool IS_MODULAR
Definition: ZN.h:35
static Scalar coeff_HPsi(const qType &q1, const qType &q2, const qType &q3, const qType &q4, const qType &q5, const qType &q6, const qType &q7, const qType &q8, const qType &q9)
Definition: ZN.h:397
static constexpr bool HAS_CGC
Definition: ZN.h:31
Definition: qarray.h:26