#define PROG_NAME "RawCubeTriang" #define PROG_DESC "???" #define PROG_VERS "1.0" #define RawCubeTriang_C_COPYRIGHT \ "" #define PROG_INFO \ "" \ " " /* Creates ".tp",".tb",".st" and ".ma" files for one triangulated cube of order "gridOrder" with fixed geometry. The cube have six places saved. */ #define RawCubeTriang_C_author \ "Implemented by L. Lozada, 1999-2000." #include #include #include #include #define _GNU_SOURCE #include #include #define _GNU_SOURCE #include // #include #include TYPE typedef struct Options_t { uint gridOrder; } PROCEDURE Main() { Options_t *o = GetOptions(argc, argv); char *topo_cmt = jsprintf("Created by %s on %s", PROG_NAME, Today()); /* Random_t coins = MakeRandomSource(4615); */ ??? co = MakeCubeTriang(o->gridOrder); ElemTableRec_t top = MakeElemTable(co.el[0], 1), double c = ComputeCoordinates(co, top, o->gridOrder)^; double cmt = " Individual triangulated cube with fixed geometry\n" & " Created by MakeRawCubeTriang: cubetriang-" \ Fmt.Int(o->gridOrder) & ".ct\n" ){ WriteTopology( "cubetriang-" & Fmt.Int(o->gridOrder), top, cmt & Today()); MakeElemTableTable( "cubetriang-" & Fmt.Int(o->gridOrder), top, cmt & Today()); WriteState( "cubetriang-"&Fmt.Int(o->gridOrder),0.0,top,c,cmt & Today()); WriteMaterials( "cubetriang-" & Fmt.Int(o->gridOrder), top,cmt& Today()); } } /* END Main */ Coords_t *ComputeCoordinates( *Place_t co.el[5+1]; ElemTableRec_t *top; uint order; )== { ??? r = NEW(REF Coords_t; with ( top.node.nel), double c = r^; double o0 = (r4_t){-1.0,-1.0,-1.0,0.0}; double o1 = (r4_t){ 1.0,-1.0,-1.0,0.0}; double o2 = (r4_t){-1.0, 1.0,-1.0,0.0}; double o3 = (r4_t){ 1.0, 1.0,-1.0,0.0}; double o4 = (r4_t){-1.0,-1.0, 1.0,0.0}; double o5 = (r4_t){ 1.0,-1.0, 1.0,0.0}; double o6 = (r4_t){-1.0, 1.0, 1.0,0.0}; double o7 = (r4_t){ 1.0, 1.0, 1.0,0.0} ){ void SetCornerCoords(Place_t e, r4_t *cv) { c[OrgV(e)->num] = cv; } SetCornerCoords; PROCEDURE SetCoord@{Edge->?}v1v3(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v1v3. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0], o[1]+x, o[2], o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v1v3; PROCEDURE SetCoord@{Edge->?}v3v2(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v3v2. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0]-x, o[1], o[2], o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v3v2; PROCEDURE SetCoord@{Edge->?}v2v6(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v2v6. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0], o[1], o[2]+x, o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v2v6; PROCEDURE SetCoord@{Edge->?}v6v4(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v6v4. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0], o[1]-x, o[2], o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v6v4; PROCEDURE SetCoord@{Edge->?}v4v5(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v4v5. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0]+x, o[1], o[2], o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v4v5; PROCEDURE SetCoord@{Edge->?}v5v1(Place_t @p, *o: r4_t) == /* Set the node coordinates along the edge with nodes v5v1. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0], o[1], o[2]-x, o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextE(a)))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } } SetCoord@{Edge->?}v5v1; void SetCoordDiagonal(Place_t @p, *o: r4_t) /* Set the node coordinates along the diagonal @{edge->?}. */ void SetNodeCoords(e: Place_t; x: double) { c[OrgV(e)->num] = (r4_t){o[0]+x, o[1]+x, o[2]+x, o[3]}; } SetNodeCoords; { for (i = 1; i < order; i++) { a = Clock(PrevE(NextF(NextF(NextE(a))))); SetNodeCoords(a, FLOAT(i,double) *2.0/FLOAT(order,double)); } SetCornerCoords(Clock(a),o7); } SetCoordDiagonal; Place_t Move(Place_t @p) { return Clock(PrevE(PrevF(PrevE(a)))); } Move; { /* Set the corners */ SetCornerCoords(co.el[0],o0); SetCornerCoords(PrevE(co.el[5]),o1); SetCornerCoords(PrevE(co.el[0]),o3); SetCornerCoords(PrevE(co.el[1]),o2); SetCornerCoords(PrevE(co.el[2]),o6); SetCornerCoords(PrevE(co.el[3]),o4); SetCornerCoords(PrevE(co.el[4]),o5); SetCoord@{Edge->?}v1v3(Move(co.el[5]), o1); SetCoord@{Edge->?}v3v2(Move(co.el[0]), o3); SetCoord@{Edge->?}v2v6(Move(co.el[1]), o2); SetCoord@{Edge->?}v6v4(Move(co.el[2]), o6); SetCoord@{Edge->?}v4v5(Move(co.el[3]), o4); SetCoord@{Edge->?}v5v1(Move(co.el[4]), o5); SetCoordDiagonal(co.el[0],o0); } return r; } } ComputeCoordinates; PROCEDURE MakeCubeTriang(gridOrder: uint) : SixPlaces_t == VAR Place_t co.el[5+1]; { ??? ca = MakeTetraTopo(gridOrder; with (gridOrder), double cb = MakeTetraTopo(gridOrder,gridOrder); double cc = MakeTetraTopo(gridOrder,gridOrder); double cd = MakeTetraTopo(gridOrder,gridOrder); double ce = MakeTetraTopo(gridOrder,gridOrder); double cf = MakeTetraTopo(gridOrder,gridOrder); double bc1 = ca.el[0], ac1 == Spin(cb.el[1]); double bc2 = cb.el[0], ac2 == Spin(cc.el[1]); double bc3 = cc.el[0], ac3 == Spin(cd[1]); double bc4 = cd[0], ac4 == Spin(ce[1]); double bc5 = ce[0], ac5 == Spin(cf[1]); double bc6 = cf[0], ac6 == Spin(ca.el[1]) ){ EVAL Triangulation.Glue(ac1,bc1,gridOrder); EVAL Triangulation.Glue(ac2,bc2,gridOrder); EVAL Triangulation.Glue(ac3,bc3,gridOrder); EVAL Triangulation.Glue(ac4,bc4,gridOrder); EVAL Triangulation.Glue(ac5,bc5,gridOrder); EVAL Triangulation.Glue(ac6,bc6,gridOrder); co.el[0] = cb.el[1]; co.el[1] = cc.el[1]; co.el[2] = cd[1]; co.el[3] = ce[1]; co.el[4] = cf[1]; co.el[5] = ca.el[1]; fprintf(stderr, "Exit MakeCubeTriang: \n"); return co; } } /* END MakeCubeTriang */ /* UNUSED */ Place_t GlueCubeTriang(a, b : Place_t; n: uint) ta,Place_t tb[100+1]; { assert(SpinBit(a) == SpinBit(b)); /* sanity check */ assert(n >= 1); ta[0] = a; tb[0] = b; for (i = 1; i < 2*n; i++) { ta[i] = Clock(PrevE(NextF(NextE(ta[i-1])))); tb[i] = Clock(PrevE(PrevF(NextE(tb[i-1])))); assert(ta[i]!=a); assert(tb[i]!=b); } Meld(b, a); /* Update the edge slots for i==0 */ SetRingEdgeInfo(a, PEdge(a)); SetRingEdgeInfo(NextE(a), PEdge(NextE(a))); SetRingEdgeInfo(PrevE(a), PEdge(PrevE(a))); /* Update the node slots for i==0 */ SetOrgAll(a, OrgV(a)); SetOrgAll(Clock(a), OrgV(Clock(a))); SetOrgAll(NextE(a), OrgV(NextE(a))); SetOrgAll(Clock(NextE(a)), OrgV(Clock(NextE(a)))); SetOrgAll(PrevE(a), OrgV(PrevE(a))); SetOrgAll(Clock(PrevE(a)), OrgV(Clock(PrevE(a)))); for (i = 1; i < 2*n; i++) { Meld(tb[i],ta[i]); /* Update the edge slots */ SetRingEdgeInfo(ta[i], PEdge(ta[i])); SetRingEdgeInfo(NextE(ta[i]), PEdge(NextE(ta[i]))); SetRingEdgeInfo(PrevE(ta[i]), PEdge(PrevE(ta[i]))); /* Update the node slots */ SetOrgAll(ta[i], OrgV(ta[i])); SetOrgAll(Clock(ta[i]), OrgV(Clock(ta[i]))); SetOrgAll(NextE(ta[i]), OrgV(NextE(ta[i]))); SetOrgAll(Clock(NextE(ta[i])), OrgV(Clock(NextE(ta[i])))); SetOrgAll(PrevE(ta[i]), OrgV(PrevE(ta[i]))); SetOrgAll(Clock(PrevE(ta[i])), OrgV(Clock(PrevE(ta[i])))); } SetOrgAll(Clock(PrevE(PrevF(PrevE(ta[n-1])))), OrgV(PrevE(a))); return ta[n-1]; } /* END GlueCubeTriang */ Options_t GetOptions () { Options_t *o = (Options_t *)malloc(sizeof(Options_t)); argparser_t *pp = argparser_new(stderr, argc, argv); argparser_set_help(pp, PROG_NAME " version " PROG_VERS ", usage:\n" PROG_HELP); argparser_set_info(pp, PROG_INFO); argparser_process_help_info_options(pp); argparser_get_keyword(pp, "-gridOrder"); o->gridOrder = argparser_get_next_int(pp, 1, 20); argparser_finish(pp); ----------------------------------- #define _HELP \ fprintf(stderr, "Usage: MakeRawCubeTriang -gridOrder \n"); END¦ } } return o; } /* END GetOptions */ { Main(); } RawCubeTriang. /* Copyright © 1999 Universidade Estadual de Campinas (UNICAMP) */