LOCAL bool check_curve3d( CURVE *c, INTERFACE *intfc) { BOND *b; BOND_TRI **bts, **bts0; NODE *ns, *ne; SURFACE *s, **ss; TRI *tri, **tris; bool status = YES; char warn[1024]; int nsides, nbts, i; int ntris; (void) sprintf(warn,"WARNING in check_curve3d(), curve %llu inconsistent ", curve_number(c)); if (c->interface != intfc) { (void) printf("%s c->interface (%llu) != intfc (%llu)\n", warn,interface_number(c->interface), interface_number(intfc)); status = NO; } ns = c->start; if (!pointer_is_in_array(c,ns->out_curves)) { (void) printf("%s curve in not in start node (%llu) " "out_curves\n",warn,node_number(ns)); status = NO; } ne = c->end; if (!pointer_is_in_array(c,ne->in_curves)) { (void) printf("%s curve in not in end node (%llu) " "in_curves\n",warn,node_number(ne)); status = NO; } if (ns->posn != c->first->start) { (void) printf("%s ns->posn != c->first->start\n" "c->first->start = %llu, " "ns = %llu, ns->posn = %llu\n", warn,point_number(c->first->start), node_number(ns),point_number(ns->posn)); status = NO; } if (ne->posn != c->last->end) { (void) printf("%s ne->posn != c->last->end\n" "c->last->end = %llu, " "ne = %llu, ne->posn = %llu\n", warn,point_number(c->last->end), node_number(ne),point_number(ne->posn)); print_general_vector("c->last->end", Coords(c->last->end), 3, "\n"); print_general_vector("ne->posn", Coords(ne->posn), 3, "\n"); print_curve(c); status = NO; } if (!Boundary_point(ns->posn)) { (void) printf("%s ns->posn (ns = %llu, ns->posn = %llu) is not a " "boundary point\n", warn,node_number(ns),point_number(ns->posn)); status = NO; } if (!Boundary_point(ne->posn)) { (void) printf("%s ne->posn (ne = %llu, ne->posn = %llu) is not a " "boundary point\n", warn,node_number(ne),point_number(ne->posn)); status = NO; } if (!Boundary_point(c->first->start)) { (void) printf("%s c->first->start = %llu is not a " "boundary point\n", warn,point_number(c->first->start)); status = NO; } if (!Boundary_point(c->last->end)) { (void) printf("%s c->last->end = %llu is not a " "boundary point\n", warn,point_number(c->last->end)); status = NO; } for (ss = c->pos_surfaces; ss && *ss; ++ss) { if (!pointer_is_in_array(c,(*ss)->pos_curves)) { (void) printf("%s curve in not s->pos_curves " " s = %llu but s is in c->neg_surfaces\n", warn,surface_number(*ss)); status = NO; } } for (ss = c->neg_surfaces; ss && *ss; ++ss) { if (!pointer_is_in_array(c,(*ss)->neg_curves)) { (void) printf("%s curve in not s->neg_curves " " s = %llu but s is in c->neg_surfaces\n", warn,surface_number(*ss)); status = NO; } } b = c->first; bts0 = Btris(b); for (nbts = 0, bts = Btris(b); bts && *bts; ++nbts, ++bts); if (nbts == 0) { if (c->pos_surfaces || c->neg_surfaces) { (void) printf("%s curve has no bond tris but is " "connected to some surface\n",warn); status = NO; } } if (c->first->prev != NULL) { (void) printf("%s c->first->prev != NULL\n",warn); print_bond(c->first); print_bond(c->first->prev); status = NO; } if (c->last->next != NULL) { (void) printf("%s c->last->next != NULL\n",warn); print_bond(c->last); print_bond(c->last->next); status = NO; } for (b = c->first; b != NULL; b = b->next) { if (b->next && b->next->start != b->end) { (void) printf("%s bond pair (%llu -> %llu) point pointers " "inconsistent\n", warn,bond_number(b,intfc), bond_number(b->next,intfc)); print_bond(b); print_bond(b->next); status = NO; } if (!Boundary_point(b->start)) { (void) printf("%s b->start = %llu is not a " "boundary point\n", warn,point_number(b->start)); print_bond(b); status = NO; } if (!Boundary_point(b->end)) { (void) printf("%s b->end = %llu is not a " "boundary point\n", warn,point_number(b->end)); print_bond(b); status = NO; } for (i = 0, bts = Btris(b); bts && *bts; ++i, ++bts) { if ((i < nbts) && !(((*bts)->surface == bts0[i]->surface) && ((*bts)->orient == bts0[i]->orient))) { (void) printf("%s inconsistent surface numbers on " "bond tri\n",warn); (void) printf("surface = %llu surface[%d] = %llu\n", surface_number((*bts)->surface),i, surface_number(bts0[i]->surface)); (void) printf("orient = %s orient[%d] = %s\n", orientation_name((*bts)->orient),i, orientation_name(bts0[i]->orient)); print_bond(b); status = NO; } } if (i != nbts) { (void) printf("%s inconsistent %d != %d number of bond tris " "on bond\n",warn,i,nbts); print_bond(b); status = NO; } for (bts = Btris(b); bts && *bts; ++bts) { if ((*bts)->curve != c) { (void) printf("%s bond tri curve field (%llu) != c\n", warn,curve_number((*bts)->curve)); print_bond(b); status = NO; } if ((*bts)->bond != b) { (void) printf("%s bond tri bond field (%llu) != b (%llu)\n", warn,bond_number((*bts)->bond,intfc), bond_number(b,intfc)); print_bond(b); status = NO; } tri = (*bts)->tri; s = Surface_of_tri(tri); if ((*bts)->surface != s) { (void) printf("%s bond tri surface field (%llu)" "!= Surface_of_tri(tri) (%llu)\n", warn,surface_number((*bts)->surface), surface_number(s)); print_bond(b); status = NO; } for (nsides = 0, i = 0; i < 3; ++i) { if (is_side_bdry(tri,i) && (b==Bond_on_side(tri,i))) ++nsides; } if (nsides == 0) { (void) printf("%s bond not found on tri side\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; } else if (nsides > 1) { (void) printf("%s bond found on multiple tri sides\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; } else { if (orientation_of_bond_at_tri(b,tri) != (*bts)->orient) { (void) printf("%s inconsistent orientation at " "bond tri\n",warn); print_tri(tri,intfc); print_bond(b); status = NO; } switch ((*bts)->orient) { case POSITIVE_ORIENTATION: if (!pointer_is_in_array(c,s->pos_curves)) { (void) printf("%s curve in not s->pos_curves " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } if (!pointer_is_in_array(s,c->pos_surfaces)) { (void) printf("%s surface in not c->pos_surfaces " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } break; case NEGATIVE_ORIENTATION: if (!pointer_is_in_array(c,s->neg_curves)) { (void) printf("%s curve in not s->neg_curves " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } if (!pointer_is_in_array(s,c->neg_surfaces)) { (void) printf("%s surface in not c->neg_surfaces " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } break; case ORIENTATION_NOT_SET: (void) printf("%s inconsistent point and tri " "points\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; break; } } if (b->prev) { TRI *t0, *t1; ntris = set_tri_list_around_point(b->start,tri,&tris,intfc); t0 = tris[0]; t1 = tris[ntris-1]; if (!(((side_of_tri_with_bond(b,t0) < 3) && (side_of_tri_with_bond(b->prev,t1) < 3)) || ((side_of_tri_with_bond(b,t1) < 3) && (side_of_tri_with_bond(b->prev,t0) < 3))) ) { (void) printf("%s, corrupt tri list at b->start\n", warn); (void) printf("Bond b\n"); print_bond(b); (void) printf("Bond b->prev\n"); print_bond(b->prev); print_tri(tri,intfc); (void) printf("number of tris at point = %d\n",ntris); for (i = 0; i < ntris; ++i) { (void) printf("tris[%d] - ",i); print_tri(tris[i],intfc); } status = NO; } } } } return status; } /*end check_curve3d*/
int main(){ // seed random number unsigned long int seed; seed=time(NULL); init_genrand(seed); //read parameters from the input file int L; unsigned long int nsteps; double T; FILE *in_file = fopen("input.dat","r"); if (in_file == NULL ){ printf("Error! Could not open input file (input.dat: L, T, nsteps)\n"); return 2; } fscanf(in_file,"%i %lf %li", &L, &T, &nsteps); fclose(in_file); double K = 1.0 / T, inv_K = 1.0 / K, P_acc; int N = L * L; int ira = 0, masha = 0, new_masha; int nb, ibond, delta_nb, Nb = 0, Nb_tot = 0; unsigned long int step, Z = 0; // build site->x and site->y tables int x[N], y[N]; for (int site=0; site<N; site++){ x[site] = site - (site / L) * L; y[site] = site / L; } // build neighbors table int nbr[N][4]; for (int site=0; site<N; site++){ nbr[site][0] = (site / L) * L + (site + 1 + N) % L; nbr[site][1] = (site + L) % N; nbr[site][2] = (site / L) * L + (site - 1 + N) % L; nbr[site][3] = (site - L + N) % N; } // initialize bond weights int bonds[N * 2]; for (int b=0; b<N * 2; b++){ bonds[b] = 0; } // main Monte Carlo loop for (step=0; step<nsteps; step++){ if (ira == masha){ ira = (int)floor(genrand() * N); masha = ira; Z += 1; Nb_tot -= Nb; } // shift move -- start new_masha = nbr[masha][(int)floor(genrand() * 4)]; ibond = bond_number(masha, new_masha, x, y, L); nb = bonds[ibond]; if (genrand() < 0.5){ delta_nb = 1; P_acc = K / (nb + 1.0); } else { delta_nb = - 1; P_acc = nb * inv_K; } if (genrand() < P_acc){ bonds[ibond] += delta_nb; Nb += delta_nb; masha = new_masha; } // shift move -- end } // end MC loop // print output FILE *out_file = fopen("output.dat","w"); fprintf(out_file, "%4i %.12f %.12f %.12lf %.12lf\n", L, T, K, Z / (nsteps * 1.0), Nb_tot * T / (Z * N * 1.0)); fclose(out_file); } //end main
LOCAL bool check_curve2d( CURVE *c, INTERFACE *intfc) { BOND *b; NODE *ns, *ne; bool status = YES; char warn[1024]; (void) sprintf(warn,"WARNING in check_curve(), curve %llu inconsistent ", curve_number(c)); if (c->interface != intfc) { (void) printf("%s c->interface (%llu) != intfc (%llu)\n", warn,interface_number(c->interface), interface_number(intfc)); status = NO; } ns = c->start; if (!pointer_is_in_array(c,ns->out_curves)) { (void) printf("%s curve in not in start node (%llu) " "out_curves\n",warn,node_number(ns)); status = NO; } ne = c->end; if (!pointer_is_in_array(c,ne->in_curves)) { (void) printf("%s curve in not in end node (%llu) " "in_curves\n",warn,node_number(ne)); status = NO; } if (ns->posn != c->first->start) { (void) printf("%s ns->posn != c->first->start\n" "c->first->start = %llu, " "ns = %llu, ns->posn = %llu\n", warn,point_number(c->first->start), node_number(ns),point_number(ns->posn)); status = NO; } if (ne->posn != c->last->end) { (void) printf("%s ne->posn != c->last->end\n" "c->last->end = %llu, " "ne = %llu, ne->posn = %llu\n", warn,point_number(c->last->end), node_number(ne),point_number(ne->posn)); status = NO; } if (c->first->prev != NULL) { (void) printf("%s c->first->prev != NULL\n",warn); print_bond(c->first); print_bond(c->first->prev); status = NO; } if (c->last->next != NULL) { (void) printf("%s c->last->next != NULL\n",warn); print_bond(c->last); print_bond(c->last->next); status = NO; } for (b = c->first; b != NULL; b = b->next) { if (b->next && b->next->start != b->end) { (void) printf("%s bond pair (%llu -> %llu) point pointers " "inconsistent\n", warn,bond_number(b,intfc), bond_number(b->next,intfc)); print_bond(b); print_bond(b->next); status = NO; } if ((b->next && b->next->prev != b) || (b->prev && b->prev->next != b) || b->next == b || b->prev == b) { (void) printf("%s bond pair (%llu -> %llu) link pointers " "inconsistent\n", warn,bond_number(b,intfc), bond_number(b->next,intfc)); print_bond(b); print_bond(b->next); return NO; /* this is a potential deadloop, so exit */ } } return status; } /*end check_curve2d*/