diff --git a/qpms/latticegens.c b/qpms/latticegens.c index 44dfd8f..bb1ae98 100644 --- a/qpms/latticegens.c +++ b/qpms/latticegens.c @@ -10,7 +10,7 @@ PGenPolReturnData PGen_next_pol_from_cart2(PGen *g) { return PGenPolDoneVal; else { PGenPolReturnData p; - p.flags = c.flags; + p.flags = (c.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_POL; p.point_pol = cart2pol(c.point_cart2); return p; } @@ -22,7 +22,7 @@ PGenCart2ReturnData PGen_next_cart2_from_pol(PGen *g) { return PGenCart2DoneVal; else { PGenCart2ReturnData c; - c.flags = p.flags; + c.flags = (p.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_CART2; c.point_cart2 = pol2cart(p.point_pol); return c; } @@ -34,7 +34,7 @@ PGenSphReturnData PGen_next_sph_from_cart3(PGen *g) { return PGenSphDoneVal; else { PGenSphReturnData s; - s.flags = c.flags; + s.flags = (c.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_SPH; s.point_sph = cart2sph(c.point_cart3); return s; } @@ -46,7 +46,7 @@ PGenCart3ReturnData PGen_next_cart3_from_cart2xy(PGen *g) { return PGenCart3DoneVal; else { PGenCart3ReturnData c3; - c3.flags = c2.flags; + c3.flags = (c2.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_CART3; c3.point_cart3 = cart22cart3xy(c2.point_cart2); return c3; } @@ -58,7 +58,7 @@ PGenSphReturnData PGen_next_sph_from_cart2(PGen *g) { return PGenSphDoneVal; else { PGenSphReturnData s; - s.flags = c.flags; + s.flags = (c.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_SPH; s.point_sph = cart22sph(c.point_cart2); return s; } @@ -70,7 +70,7 @@ PGenCart3ReturnData PGen_next_cart3_from_sph(PGen *g) { return PGenCart3DoneVal; else { PGenCart3ReturnData c; - c.flags = s.flags; + c.flags = (s.flags & ~QPMS_COORDS_BITRANGE) | QPMS_COORDS_CART3; c.point_cart3 = sph2cart(s.point_sph); return c; } @@ -569,13 +569,13 @@ const PGenClassInfo PGen_xyWeb = { "PGen_xyWeb", 2, PGEN_COORDS_CART2, - NULL,//PGen_xyWeb_next, + NULL,//PGen_xyWeb_next, // FIXME I should really implement this. NULL,//PGen_xyWeb_next_z, PGen_next_pol_from_cart2, //NULL,//PGen_xyWeb_next_pol, PGen_next_sph_from_cart2, //NULL,//PGen_xyWeb_next_sph, PGen_xyWeb_next_cart2, // native PGen_next_cart3_from_cart2xy, //NULL,//PGen_xyWeb_next_cart3, - NULL,//PGen_xyWeb_fetch, + NULL,//PGen_xyWeb_fetch, // FIXME I should really implement this NULL,//PGen_xyWeb_fetch_z, NULL,//PGen_xyWeb_fetch_pol, NULL,//PGen_xyWeb_fetch_sph, diff --git a/qpms/lattices2d.c b/qpms/lattices2d.c index ee99d06..0f5978c 100644 --- a/qpms/lattices2d.c +++ b/qpms/lattices2d.c @@ -907,7 +907,7 @@ size_t qpms_emptylattice2_modes_maxfreq(double **target_freqs, QPMS_CRASHING_MALLOC(Kpoints, sizeof(cart2_t) * capacity); PGen Kgen = PGen_xyWeb_new(b1, b2, rtol, k, 0, true, maxk_safe, true); - size_t generated; + size_t generated = 0; PGenReturnDataBulk rd; while((rd = PGen_fetch_cart2(&Kgen, capacity - generated, Kpoints + generated)).flags & PGEN_NOTDONE) generated += rd.generated; diff --git a/qpms/qpms_cdefs.pxd b/qpms/qpms_cdefs.pxd index 48b1a39..16c4050 100644 --- a/qpms/qpms_cdefs.pxd +++ b/qpms/qpms_cdefs.pxd @@ -199,6 +199,16 @@ cdef extern from "lattices.h": PGenClassInfo* c void *statedata void PGen_destroy(PGen *g) + + int l2d_reciprocalBasis2pi(cart2_t b1, cart2_t b2, cart2_t *rb1, cart2_t *rb2); + double l2d_unitcell_area(cart2_t b1, cart2_t b2) + void l2d_reduceBasis(cart2_t in1, cart2_t in2, cart2_t *out1, cart2_t *out2) + + const double BASIS_RTOL + size_t qpms_emptylattice2_modes_maxfreq(double **target_freqs, cart2_t b1_rec, cart2_t b2_rec, + double rtol, cart2_t k, double wave_speed, double maxomega) + void qpms_emptylattice2_modes_nearest(double *target_freqs, cart2_t b1_rec, cart2_t b2_rec, + double rtol, cart2_t k, double wave_speed, double omega) # now the individual PGen implementations: # FIXME Is bint always guaranteed to be equivalent to _Bool? (I dont't think so.) @@ -211,10 +221,9 @@ cdef extern from "lattices.h": double maxR, bint inc_maxR, PGen_1D_incrementDirection incdir) int qpms_reduce_lattice_basis(double *b, size_t bsize, size_t ndim, double delta) - size_t qpms_emptylattice2_modes_maxfreq(double **target_freqs, cart2_t b1_rec, cart2_t b2_rec, - double rtol, cart2_t k, double wave_speed, double maxomega) - size_t qpms_emptylattice2_modes_nearest(double *target_freqs, cart2_t b1_rec, cart2_t b2_rec, - double rtol, cart2_t k, double wave_speed, double omega) +cdef extern from "vectors.h": + cart2_t cart2_substract(cart2_t a, cart2_t b) + cart2_t cart2_scale(const double c, cart2_t b) cdef extern from "quaternions.h": diff --git a/qpms/vectors.h b/qpms/vectors.h index fcc471a..e1dd31a 100644 --- a/qpms/vectors.h +++ b/qpms/vectors.h @@ -708,6 +708,7 @@ static inline void qpms_array_coord_transform(void *dest, qpms_coord_system_t td /** The dest and src arrays must not overlap */ static inline void anycoord_arr2something(void *dest, qpms_coord_system_t tdest, const anycoord_point_t *src, qpms_coord_system_t tsrc, size_t nmemb) { + if(nmemb) { switch(tdest & QPMS_COORDS_BITRANGE) { case QPMS_COORDS_SPH: { @@ -833,6 +834,7 @@ static inline void anycoord_arr2something(void *dest, qpms_coord_system_t tdest, break; } QPMS_WTF; + } }