1 // c99 -g -DNLINE -DDAGRUP=C4v -DDUMP_PARTICLE_POSITIONS -DDUMP_ORBIT_ACTION -DDUMP_PROJECTORMATRIX -DDUMP_ACTIONMATRIX -I.. sss3.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 -llapacke ~/repo/CBLAS/lib/cblas_LINUX.a ~/repo/BLAS-3.8.0/blas_LINUX.a
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
);
96 fputs("Orbit projection matrices:\n", stderr
);
97 for (qpms_ss_oti_t oti
= 0; oti
< ss
->orbit_type_count
; ++oti
) {
98 fprintf(stderr
, "Orbit type %d:\n", (int)oti
);
99 const qpms_ss_orbit_type_t
*ot
= &(ss
->orbit_types
[oti
]);
101 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
) {
102 assert(row
*ot
->size
*ot
->bspecn
== ot
->irbase_offsets
[iri
]);
103 fprintf(stderr
, "---------- IR %d (%s) -------------\n", (int)iri
, ss
->sym
->irreps
[iri
].name
);
104 for (size_t irbi
= 0; irbi
< ot
->irbase_sizes
[iri
]; ++irbi
) {
105 for(qpms_ss_orbit_pi_t opi
= 0; opi
< ot
->size
; ++opi
){
107 for(size_t i
= 0; i
< ot
->bspecn
; ++i
) {
108 const complex double elem
= ot
->irbases
[row
* ot
->size
* ot
->bspecn
109 + opi
* ot
->bspecn
+ i
];
110 fprintf(stderr
, "%+.3f%+.3fj ", creal(elem
), cimag(elem
));
113 fputs("|\n", stderr
);
117 fputs("------------------------\n\n",stderr
);
120 const double k
= 1.7;
122 complex double *S_full
= qpms_scatsys_build_translation_matrix_full(
125 const size_t full_len
= ss
->fecv_size
;
126 size_t fullvec_offset_dest
= 0;
127 for (qpms_ss_pi_t pdest
= 0; pdest
< ss
->p_count
; pdest
++) {
128 size_t fullvec_offset_src
= 0;
129 const size_t bspecn_dest
= ss
->tm
[ss
->p
[pdest
].tmatrix_id
]->spec
->n
;
130 for (qpms_ss_pi_t psrc
= 0; psrc
< ss
->p_count
; psrc
++) {
131 const size_t bspecn_src
= ss
->tm
[ss
->p
[psrc
].tmatrix_id
]->spec
->n
;
132 fprintf(stderr
, "Translation matrix element %d<-%d; (%g %g %g)<-(%g %g %g):\n",
133 (int)pdest
, (int)psrc
, ss
->p
[pdest
].pos
.x
, ss
->p
[pdest
].pos
.y
, ss
->p
[pdest
].pos
.z
,
134 ss
->p
[psrc
].pos
.x
, ss
->p
[psrc
].pos
.y
, ss
->p
[psrc
].pos
.z
);
136 for(size_t row
= 0; row
< bspecn_dest
; ++row
) {
137 for(size_t col
= 0; col
< bspecn_src
; ++col
)
138 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_full
[full_len
* (fullvec_offset_dest
+row
) + fullvec_offset_src
+col
]),
139 cimag(S_full
[full_len
* (fullvec_offset_dest
+row
) + fullvec_offset_src
+col
]));
142 fullvec_offset_src
+= bspecn_src
;
144 fullvec_offset_dest
+= bspecn_dest
;
148 fputs("\n\n", stderr
);
149 const size_t full_len
= ss
->fecv_size
;
150 for (size_t row
= 0 ; row
< full_len
; ++row
) {
151 for (size_t col
= 0 ; col
< full_len
; ++col
)
152 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_full
[full_len
* row
+ col
]), cimag(S_full
[full_len
* row
+ col
]));
157 complex double *S_packed
[ss
->sym
->nirreps
];
158 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
) {
159 S_packed
[iri
] = qpms_scatsys_irrep_pack_matrix(NULL
,
161 fprintf(stderr
, "--- Packed matrix for irrep %d (%s):\n", (int) iri
, ss
->sym
->irreps
[iri
].name
);
162 for (size_t row
= 0; row
< ss
->saecv_sizes
[iri
]; ++row
) {
163 for (size_t col
= 0; col
< ss
->saecv_sizes
[iri
]; ++col
) {
164 complex double elem
= S_packed
[iri
][row
* ss
->saecv_sizes
[iri
] + col
];
165 fprintf(stderr
, "%+.3f+%.3fj ", creal(elem
), cimag(elem
));
171 complex double *S_partrecfull
= qpms_scatsys_irrep_unpack_matrix(NULL
,
172 S_packed
[0], ss
, 0, false);
173 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
) {
174 qpms_scatsys_irrep_unpack_matrix(S_partrecfull
, S_packed
[iri
],
176 fprintf(stderr
, "\nPartial reconstruction %d (%s):\n", (int)iri
, ss
->sym
->irreps
[iri
].name
);
177 const size_t full_len
= ss
->fecv_size
;
178 for (size_t row
= 0 ; row
< full_len
; ++row
) {
179 for (size_t col
= 0 ; col
< full_len
; ++col
)
180 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_partrecfull
[full_len
* row
+ col
]), cimag(S_partrecfull
[full_len
* row
+ col
]));
186 for (size_t i
= 0; i
< ss
->fecv_size
; ++i
) {
187 double err
= cabs(S_full
[i
] - S_partrecfull
[i
]);
188 maxerr
= (err
> maxerr
) ? err
: maxerr
;
194 complex double *S_recfull
= qpms_scatsys_irrep_unpack_matrix(NULL
,
195 S_packed
[0], ss
, 0, false);
196 for (qpms_iri_t iri
= 1; iri
< ss
->sym
->nirreps
; ++iri
)
197 qpms_scatsys_irrep_unpack_matrix(S_recfull
, S_packed
[iri
],
200 fputs("\n\n", stderr
);
201 const size_t full_len
= ss
->fecv_size
;
202 for (size_t row
= 0 ; row
< full_len
; ++row
) {
203 for (size_t col
= 0 ; col
< full_len
; ++col
)
204 fprintf(stderr
, "%+2.3f%+2.3fj ", creal(S_recfull
[full_len
* row
+ col
]), cimag(S_recfull
[full_len
* row
+ col
]));
210 for (size_t i
= 0; i
< ss
->fecv_size
; ++i
) {
211 double err
= cabs(S_full
[i
] - S_recfull
[i
]);
212 maxerr
= (err
> maxerr
) ? err
: maxerr
;
216 printf("maxerr: %lg\n", maxerr
);
218 fprintf(stderr
, "pi\tpos\toti\tosn\tp\n");
219 for(qpms_ss_pi_t pi
= 0; pi
< ss
->p_count
; ++pi
) {
220 cart3_t pos
= ss
->p
[pi
].pos
;
221 qpms_ss_oti_t oti
= ss
->p_orbitinfo
[pi
].t
;
222 qpms_ss_osn_t osn
= ss
->p_orbitinfo
[pi
].osn
;
223 qpms_ss_orbit_pi_t p
= ss
->p_orbitinfo
[pi
].p
;
224 fprintf(stderr
, "%d\t(%.3g,%.3g,%.3g)\t%d\t%d\t%d\n",
225 (int)pi
, pos
.x
, pos
.y
, pos
.z
, (int)oti
, (int)osn
, (int)p
);
228 for (qpms_iri_t iri
= 0; iri
< ss
->sym
->nirreps
; ++iri
) free(S_packed
[iri
]);
230 qpms_scatsys_free(ss
);
231 qpms_tmatrix_free(t1
);
232 qpms_tmatrix_free(t2
);
233 qpms_vswf_set_spec_free(b1
);
234 qpms_vswf_set_spec_free(b2
);