1 // c99 -g -DZLINE -DDAGRUP=D3h -DDUMP_PARTICLE_POSITIONS -DDUMP_ORBIT_ACTION -DDUMP_PROJECTORMATRIX -DDUMP_ACTIONMATRIX -I.. sss2.c staticgroups.c ../qpms/scatsystem.c ../qpms/vswf.c ../qpms/error.c ../qpms/translations.c ../qpms/symmetries.c ../qpms/legendre.c ../qpms/gaunt.c ../qpms/wigner.c -lm -lgsl -lblas -llapacke
2 typedef int qpms_gmi_t
;// There is something wrong in the includes, apparently.
3 #include <qpms/qpms_types.h>
4 #include <qpms/scatsystem.h>
7 #include <qpms/indexing.h>
9 #include "staticgroups.h"
11 const qpms_finite_group_t
*D3h
= &QPMS_FINITE_GROUP_D3h
;
12 const qpms_finite_group_t
*C4v
= &QPMS_FINITE_GROUP_C4v
;
13 const qpms_finite_group_t
*TRIVG
= &QPMS_FINITE_GROUP_trivial_g
;
14 const qpms_finite_group_t
*C2v
= &QPMS_FINITE_GROUP_C2v
;
15 const qpms_finite_group_t
*C2
= &QPMS_FINITE_GROUP_C2
;
16 const qpms_finite_group_t
*C4
= &QPMS_FINITE_GROUP_C4
;
17 const qpms_finite_group_t
*D2h
= &QPMS_FINITE_GROUP_D2h
;
18 const qpms_finite_group_t
*D4h
= &QPMS_FINITE_GROUP_D4h
;
19 const qpms_finite_group_t
*x_and_z_flip
= &QPMS_FINITE_GROUP_x_and_z_flip
;
20 const qpms_finite_group_t
*y_and_z_flip
= &QPMS_FINITE_GROUP_y_and_z_flip
;
26 double uniform_random(double min
, double max
) {
27 double random_value
= min
+ (max
-min
)*(double)rand()/RAND_MAX
;
36 *b1
= qpms_vswf_set_spec_from_lMax(1,QPMS_NORMALISATION_POWER_CS
),
37 *b2
= qpms_vswf_set_spec_from_lMax(2,QPMS_NORMALISATION_POWER_CS
);
39 // Only electric waves
40 qpms_vswf_set_spec_t
*b1
= qpms_vswf_set_spec_init(),
41 *b2
= qpms_vswf_set_spec_init();
42 b1
->norm
= b2
-> norm
= QPMS_NORMALISATION_POWER_CS
;
43 for(qpms_l_t l
= 1; l
<= 1; ++l
)
44 for (qpms_m_t m
= -0l; m
<= l
; m
+= 2)
45 qpms_vswf_set_spec_append(b1
, qpms_tmn2uvswfi(QPMS_VSWF_ELECTRIC
, m
, l
));
46 for(qpms_l_t l
= 1; l
<= 1; ++l
)
47 for (qpms_m_t m
= -0l; m
<= l
; m
+= 2)
48 qpms_vswf_set_spec_append(b2
, qpms_tmn2uvswfi(QPMS_VSWF_ELECTRIC
, m
, l
));
50 qpms_tmatrix_t
*t1
= qpms_tmatrix_init(b1
);
51 qpms_tmatrix_t
*t2
= qpms_tmatrix_init(b2
);
54 // Random diagonal T-matrices
55 for(size_t i
= 0; i
< b1
->n
; ++i
)
56 t1
->m
[i
+ i
*b1
->n
] = uniform_random(-1,1) + I
*uniform_random(-1,1);
57 for(size_t i
= 0; i
< b2
->n
; ++i
)
58 t2
->m
[i
+ i
*b2
->n
] = uniform_random(-1,1) + I
*uniform_random(-1,1);
60 for(size_t i
= 0; i
< b1
->n
; ++i
)
61 t1
->m
[i
+ i
*b1
->n
] = 1;
62 for(size_t i
= 0; i
< b2
->n
; ++i
)
63 t2
->m
[i
+ i
*b2
->n
] = 1;
67 const cart3_t pp1
= {0, 1.1, 0};
68 const cart3_t pp2
= {0, 1.4, 0};
70 const cart3_t pp1
= {1.1, 0, 0};
71 const cart3_t pp2
= {1.4, 0, 0};
73 const cart3_t pp1
= {0, 0, 1.1};
74 const cart3_t pp2
= {0, 0, 1.4};
76 const cart3_t pp1
= {1.1, 1, 0};
77 const cart3_t pp2
= {0, 1.4, 0};
79 const cart3_t pp3
= {0, 0, 1};
80 qpms_tmatrix_t
* tmlist
[] = {t1
, t2
};
81 qpms_particle_tid_t plist
[] = {{pp1
,1}, {pp2
, 0}, {pp3
, 1},
84 qpms_scatsys_t protoss
;
86 protoss
.tm_count
=sizeof(tmlist
)/sizeof(qpms_tmatrix_t
*);
88 protoss
.p_count
=sizeof(plist
)/sizeof(qpms_particle_tid_t
);
90 qpms_scatsys_t
*ss
= qpms_scatsys_apply_symmetry(&protoss
, DAGRUP
);
92 printf("p_count: %d, tm_count: %d, nirreps: %d, orbit_type_count: %d\n",
93 (int)ss
->p_count
, (int)ss
->tm_count
, (int)ss
->sym
->nirreps
,
94 (int)ss
->orbit_type_count
);
98 complex double *S_full
= qpms_scatsys_build_translation_matrix_full(
101 const size_t full_len
= ss
->fecv_size
;
102 size_t fullvec_offset_dest
= 0;
103 for (qpms_ss_pi_t pdest
= 0; pdest
< ss
->p_count
; pdest
++) {
104 size_t fullvec_offset_src
= 0;
105 const size_t bspecn_dest
= ss
->tm
[ss
->p
[pdest
].tmatrix_id
]->spec
->n
;
106 for (qpms_ss_pi_t psrc
= 0; psrc
< ss
->p_count
; psrc
++) {
107 const size_t bspecn_src
= ss
->tm
[ss
->p
[psrc
].tmatrix_id
]->spec
->n
;
108 fprintf(stderr
, "Translation matrix element %d<-%d; (%g %g %g)<-(%g %g %g):\n",
109 (int)pdest
, (int)psrc
, ss
->p
[pdest
].pos
.x
, ss
->p
[pdest
].pos
.y
, ss
->p
[pdest
].pos
.z
,
110 ss
->p
[psrc
].pos
.x
, ss
->p
[psrc
].pos
.y
, ss
->p
[psrc
].pos
.z
);
112 for(size_t row
= 0; row
< bspecn_dest
; ++row
) {
113 for(size_t col
= 0; col
< bspecn_src
; ++col
)
114 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_full
[full_len
* (fullvec_offset_dest
+row
) + fullvec_offset_src
+col
]),
115 cimag(S_full
[full_len
* (fullvec_offset_dest
+row
) + fullvec_offset_src
+col
]));
118 fullvec_offset_src
+= bspecn_src
;
120 fullvec_offset_dest
+= bspecn_dest
;
124 fputs("\n\n", stderr
);
125 const size_t full_len
= ss
->fecv_size
;
126 for (size_t row
= 0 ; row
< full_len
; ++row
) {
127 for (size_t col
= 0 ; col
< full_len
; ++col
)
128 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_full
[full_len
* row
+ col
]), cimag(S_full
[full_len
* row
+ col
]));
133 complex double *S_packed
[ss
->sym
->nirreps
];
134 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
)
135 S_packed
[iri
] = qpms_scatsys_irrep_pack_matrix(NULL
,
138 complex double *S_recfull
= qpms_scatsys_irrep_unpack_matrix(NULL
,
139 S_packed
[0], ss
, 0, false);
140 for (qpms_iri_t iri
= 1; iri
< ss
->sym
->nirreps
; ++iri
)
141 qpms_scatsys_irrep_unpack_matrix(S_recfull
, S_packed
[iri
],
144 fputs("\n\n", stderr
);
145 const size_t full_len
= ss
->fecv_size
;
146 for (size_t row
= 0 ; row
< full_len
; ++row
) {
147 for (size_t col
= 0 ; col
< full_len
; ++col
)
148 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_recfull
[full_len
* row
+ col
]), cimag(S_recfull
[full_len
* row
+ col
]));
154 for (size_t i
= 0; i
< ss
->fecv_size
; ++i
) {
155 double err
= cabs(S_full
[i
] - S_recfull
[i
]);
156 maxerr
= (err
> maxerr
) ? err
: maxerr
;
160 printf("maxerr: %lg\n", maxerr
);
162 fprintf(stderr
, "pi\tpos\toti\tosn\tp\n");
163 for(qpms_ss_pi_t pi
= 0; pi
< ss
->p_count
; ++pi
) {
164 cart3_t pos
= ss
->p
[pi
].pos
;
165 qpms_ss_oti_t oti
= ss
->p_orbitinfo
[pi
].t
;
166 qpms_ss_osn_t osn
= ss
->p_orbitinfo
[pi
].osn
;
167 qpms_ss_orbit_pi_t p
= ss
->p_orbitinfo
[pi
].p
;
168 fprintf(stderr
, "%d\t(%.3g,%.3g,%.3g)\t%d\t%d\t%d\n",
169 (int)pi
, pos
.x
, pos
.y
, pos
.z
, (int)oti
, (int)osn
, (int)p
);
172 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
) free(S_packed
[iri
]);
174 qpms_scatsys_free(ss
);
175 qpms_tmatrix_free(t1
);
176 qpms_tmatrix_free(t2
);
177 qpms_vswf_set_spec_free(b1
);
178 qpms_vswf_set_spec_free(b2
);