384 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
385 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
386 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
387 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
388 -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
389 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
391 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
392 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
393 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
394 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
395 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
396 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
398 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
399 -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
400 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
401 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
402 -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
403 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
405 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
406 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
407 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
408 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
409 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
410 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
412 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
413 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
414 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
415 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
416 -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
417 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
419 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
420 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
421 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
422 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
423 -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
424 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
526 int i, j, k, l, m, n, o;
530 cvol = (paral[0][1]*paral[1][2]-paral[0][2]*paral[1][1])*paral[2][0];
531 cvol += (paral[0][2]*paral[1][0]-paral[0][0]*paral[1][2])*paral[2][1];
532 cvol += (paral[0][0]*paral[1][1]-paral[0][1]*paral[1][0])*paral[2][2];
536 object_3d * slab = g_malloc0 (
sizeof*slab);
538 slab -> num_vertices = 36*(
plot -> abc -> extra_cell[0]+1)*(
plot -> abc -> extra_cell[1]+1)*(
plot -> abc -> extra_cell[2]+1);
539 slab -> vertices =
allocfloat (slab -> vert_buffer_size*slab -> num_vertices);
548 pos = vec3 (slab -> vertices[j], slab -> vertices[j+1], slab -> vertices[j+2]);
549 pos = m4_mul_pos (rot, pos);
550 slab -> vertices[j] = pos.
x +
cpos.x;
551 slab -> vertices[j+1] = pos.
y +
cpos.y;
552 slab -> vertices[j+2] = pos.
z +
cpos.z;
555 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
557 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
559 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
570 slab -> vertices[m+6+o] = (o) ? 1.0 : 0.0;
574 if (! o) slab -> vertices[m+6+o] =
col.
red;
575 if (o == 1) slab -> vertices[m+6+o] =
col.
green;
576 if (o == 2) slab -> vertices[m+6+o] =
col.
blue;
580 pos = m4_mul_pos (rot, pos);
581 slab -> vertices[m+3] = pos.
x;
582 slab -> vertices[m+4] = pos.
y;
583 slab -> vertices[m+5] = pos.
z;
584 slab -> vertices[m+9] = slab_alpha;
606 double ang[3], cang[3], sang[3];
611 if (
wingl -> cell_win -> cparam[i+15] == 90.0)
619 ang[i] =
wingl -> cell_win -> cparam[i+15]*
pi/180.0;
620 sang[i] = sin(ang[i]);
621 cang[i] = cos(ang[i]);
624 paral[0][0] =
wingl -> cell_win -> cparam[9];
627 paral[1][0] =
wingl -> cell_win -> cparam[10] * cang[2];
628 paral[1][1] =
wingl -> cell_win -> cparam[10] * sang[2];
630 paral[2][0] =
wingl -> cell_win -> cparam[11] * cang[1];
631 tmp = (cang[0] - cang[1]*cang[2]) / sang[2];
632 paral[2][1] =
wingl -> cell_win -> cparam[11] * tmp;
633 paral[2][2] =
wingl -> cell_win -> cparam[11] * sqrt(sang[1]*sang[1] - tmp*tmp);
636 vec3(
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]),
637 paral, null,
wingl -> cell_win -> slab_alpha);
642 vec3_t cat = vec3(
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]);
646 for (i=-1; i<2; i+=2)
648 for (j=-1; j<2; j+=2)
650 for (k=-1; k<2; k+=2)
652 ps[l].
x = 0.5*(i*paral[0][0] + j*paral[1][0] + k*paral[2][0]);
653 ps[l].
y = 0.5*(i*paral[0][1] + j*paral[1][1] + k*paral[2][1]);
654 ps[l].
z = 0.5*(i*paral[0][2] + j*paral[1][2] + k*paral[2][2]);
655 ps[l] = m4_mul_pos (rot, ps[l]);
656 ps[l]= v3_add (ps[l], cat);
665 pmax[0] =
max(pmax[0],ps[l].
x);
666 pmax[1] =
max(pmax[1],ps[l].
y);
667 pmax[2] =
max(pmax[2],ps[l].
z);
681 ps[0] = v3_sub (ps[0], cat);
682 ps[7] = v3_sub (ps[7], cat);
684 for (i=0; i<
proj_gl -> nspec; i++)
wingl -> cell_win -> slab_lot[i] = 0;
685 wingl -> cell_win -> slab_atoms = 0;
689 slab_center.
x = cat.
x;
690 slab_center.
y = cat.
y;
691 slab_center.
z = cat.
z;
695 at = vec3(slab_center.
x+at_slab.
x, slab_center.
y+at_slab.
y, slab_center.
z+at_slab.
z);
696 if (at.
x <= pmax[0] && at.
y <= pmax[1] && at.
z <= pmax[2])
699 atc = v3_sub (at, cat);
703 val = v3_dot (ps[k], pn[j]);
704 vbl = v3_dot (atc, pn[j]);
705 if (fabs(vbl) < fabs(
val))
714 if (m == 6 && (! at_slab.
pbc ||
wingl -> cell_win -> slab_pbc))
716 wingl -> cell_win -> slab_atoms ++;
718 wingl -> cell_win -> slab_lot[l] ++;
735 vec3_t pos_a = vec3(-
wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
736 vec3_t pos_b = vec3(
wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
737 pos_a = m4_mul_pos (rot, pos_a);
738 pos_b = m4_mul_pos (rot, pos_b);
739 vec3_t cat = vec3 (
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]);
740 pos_a = v3_add (pos_a, cat);
741 pos_b = v3_add (pos_b, cat);
745 object_3d * slab = g_malloc0 (
sizeof*slab);
746 object_3d * slab_cap = g_malloc0 (
sizeof*slab_cap);
748 slab -> num_instances = (
plot -> abc -> extra_cell[0]+1)*(
plot -> abc -> extra_cell[1]+1)*(
plot -> abc -> extra_cell[2]+1);
752 slab_cap -> num_instances = 2 * slab -> num_instances;
761 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
763 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
765 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
770 pos_a = v3_add (pos_a,
shift);
771 pos_b = v3_add (pos_b,
shift);
773 pos_a = v3_sub (pos_a,
shift);
774 pos_b = v3_sub (pos_b,
shift);
781 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
783 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
785 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
790 pos_a = v3_add (pos_a,
shift);
791 pos_b = v3_add (pos_b,
shift);
794 pos_a = v3_sub (pos_a,
shift);
795 pos_b = v3_sub (pos_b,
shift);
802 wingl -> cell_win -> slab_vol =
pi*pow(
wingl -> cell_win -> cparam[13], 2)*
wingl -> cell_win -> cparam[12];
803 for (i=0; i<
proj_gl -> nspec; i++)
wingl -> cell_win -> slab_lot[i] = 0;
804 wingl -> cell_win -> slab_atoms = 0;
808 slab_center.
x = cat.
x;
809 slab_center.
y = cat.
y;
810 slab_center.
z = cat.
z;
815 if (
wingl -> cell_win -> slab_pbc || ! at_slab.
pbc)
817 atc = vec3(at_slab.
x, at_slab.
y, at_slab.
z);
818 patc = v3_proj (atc,
axis);
819 if (v3_length(patc) <=
wingl -> cell_win -> cparam[12]/2.0 && v3_length(v3_sub(patc,atc)) <=
wingl -> cell_win -> cparam[13])
821 wingl -> cell_win -> slab_atoms ++;
823 wingl -> cell_win -> slab_lot[j] ++;