Fix missing import in finiterectlat-scatter.py
[qpms.git] / oldtests / sss2.c
blob54c959dcee32bc943aee8186bbab88f75250b2f7
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>
5 #include <stdlib.h>
6 #include <qpms/vswf.h>
7 #include <qpms/indexing.h>
8 #include <stdio.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;
22 #ifndef DAGRUP
23 #define DAGRUP D4h
24 #endif
26 double uniform_random(double min, double max) {
27 double random_value = min + (max-min)*(double)rand()/RAND_MAX;
28 return random_value;
31 int main()
33 srand(666);
34 #if 0
35 qpms_vswf_set_spec_t
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);
38 #else
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));
49 #endif
50 qpms_tmatrix_t *t1 = qpms_tmatrix_init(b1);
51 qpms_tmatrix_t *t2 = qpms_tmatrix_init(b2);
53 #if 0
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);
59 #else
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;
64 #endif
66 #ifdef YLINE
67 const cart3_t pp1 = {0, 1.1, 0};
68 const cart3_t pp2 = {0, 1.4, 0};
69 #elif defined XLINE
70 const cart3_t pp1 = {1.1, 0, 0};
71 const cart3_t pp2 = {1.4, 0, 0};
72 #elif defined ZLINE
73 const cart3_t pp1 = {0, 0, 1.1};
74 const cart3_t pp2 = {0, 0, 1.4};
75 #else
76 const cart3_t pp1 = {1.1, 1, 0};
77 const cart3_t pp2 = {0, 1.4, 0};
78 #endif
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;
85 protoss.tm = tmlist;
86 protoss.tm_count=sizeof(tmlist)/sizeof(qpms_tmatrix_t *);
87 protoss.p = plist;
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);
96 const double k = 1.7;
98 complex double *S_full = qpms_scatsys_build_translation_matrix_full(
99 NULL, ss, k);
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]));
116 fputc('\n', stderr);
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]));
129 fputc('\n', stderr);
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,
136 S_full, ss, iri);
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],
142 ss, iri, true);
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]));
149 fputc('\n', stderr);
153 double maxerr = 0;
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]);
173 free(S_full);
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);
179 return 0;