// // this program implements the site percolation algorithm from // Newman and Ziff, PRE64, 016706 // #include #include #include #include #include #include //------------------------------------------------------ void setCellNeigbhours(int length, int latticeSize, vector &cellNeighbours) { for(int i=0;i &cellPointer) // implements path compression { if (cellPointer[i]<0) return i; return cellPointer[i] = findroot(cellPointer[i],cellPointer); } /* int findroot(int i, vector &cellPointer) // implements path halving { int r, s; r=s=i; while(cellPointer[r]>=0) { cellPointer[s]=cellPointer[r]; s=r; r=cellPointer[r]; } return r; } */ //------------------------------------------------------ void sitePercolation(int length) // length = size of one side of a 2D square lattice { // initialise some internal variables int latticeSize = length*length; // lattice size int emptyCell = -(latticeSize+1); // mark empty cells std::vector cellPointer(latticeSize,emptyCell); // assign cells to clusters // initialise observables int biggestCluster = 0; // initialise order of occupying the cells in the lattice std::vector cellOrder(latticeSize); // create vector std::iota(cellOrder.begin(), cellOrder.end(), 0); // fill it form 0 to latticeSize-1 std::shuffle(cellOrder.begin(), cellOrder.end(), std::random_device()); // suffle order // initialise neighbors of cell std::vector cellNeighbours(latticeSize*4); // each cell has 4 neighbours setCellNeigbhours(length,latticeSize,cellNeighbours); // percolate int s1, s2, r1, r2; // internal indices for the pointers vector for(int i=0; i cellPointer[r2]) { // cluster size is negative for root nodes! cellPointer[r2] += cellPointer[r1]; cellPointer[r1] = r2; r1 = r2; } else { cellPointer[r1] += cellPointer[r2]; cellPointer[r2] = r1; } // fill the observable if (-cellPointer[r1]>biggestCluster) biggestCluster = -cellPointer[r1]; } // end of merging } // end cell not empty } // end loop over neighbours // print out the observable std::cout << i << " " << biggestCluster << endl; } // end loop over cells }