/* Free a raw IP descriptor */ void del_ip( struct raw_ip *rpp ){ struct raw_ip *rplast = NULL; register struct raw_ip *rp; /* Do sanity check on arg */ for(rp = Raw_ip;rp != NULL;rplast=rp,rp = rp->next) if(rp == rpp) break; if(rp == NULL) return; /* Doesn't exist */ /* Unlink */ if(rplast != NULL) rplast->next = rp->next; else Raw_ip = rp->next; /* Free resources */ free_q(&rp->rcvq); free(rp); }
int main(int argc, char *argv[]){ MPI_Init(&argc, &argv); MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, &shmcomm); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); int i, j, k, n, l, indx, signal; bool flag; double deltat; double time_spend; double begin, end; FILE* energy; FILE* grid; begin = MPI_Wtime(); //read in parameters if(!read_param()){ MPI_Comm_free(&shmcomm); MPI_Finalize(); return 1; } flag = true; dE = 1; el_old = 1; cycle = 0; deltat = (0.1 - dt) / increment; S = 0.25 * (1 + 3 * sqrt(1 - 8 / (3 * U))); // printf("Theoretical value is %lf.\n", third * (1 - third * U) * S * S - 2 * third * third * third * S * S * S * U + U / 9 * S * S * S * S ); if(myid == root){ printf("S is %lf.\n\n", S); //define droplet and boundary, introduce particles, initialize qtensor; if(!initial()){ flag = false; } energy = fopen("energy.out", "w"); fprintf(energy,"cycle\tEnergy_diff\tEnergy_ldg\tEnergy_el\tEnergy_ch\tEnergy_surf\tEnergy_tot\n"); fclose(energy); grid = fopen("grid.bin", "wb"); l = 0; for(l = 0; l < tot; l++){ if(boundary[l] || nboundary[l]) signal = 1; else if(drop[l]) signal = 0; else signal = -1; fwrite(&signal, sizeof(int), 1, grid); } fclose(grid); } //For all infomation initialized in root processor, scatter them to all other processors. if(!scatter()){ flag = false; return 1; } //Evolution while(flag){ //Every 1000 steps calculate energies. if(cycle % 1000 == 0){ free_energy(); if(fabs(dE) < accuracy){ flag = false; } } if(cycle % 10000 == 0){ //Every 10000 steps check the trace of Qtensor if(myid == root){ for(i = 0; i < droplet; i++){ if(!checktr(&q[i * 6])){ flag = false; printf("Error in the trace of q.\n"); } if(flag == false) break; } //print output file output(); } MPI_Bcast(&flag, 1, MPI_BYTE, root, MPI_COMM_WORLD); } //Wait until all the processors are ready and relax the system, first bulk and then boundary. MPI_Barrier(MPI_COMM_WORLD); MPI_Win_fence(0, win); if(flag) relax_bulk(); MPI_Barrier(MPI_COMM_WORLD); MPI_Win_fence(0, win); if(flag) relax_surf(); if(dt < 0.1){ dt += deltat; if(dt >= 0.1) dt = 0.1; } cycle ++; MPI_Barrier(MPI_COMM_WORLD); MPI_Win_fence(0, win); } free_energy(); end = MPI_Wtime(); if(myid == root){ output(); //Calculate time used. time_spend = (double)(end - begin) / 60.0; energy = fopen("energy.out", "a"); if(time_spend < 60){ fprintf(energy, "\nTime used: %lf min.\n", time_spend); printf("\nTime used: %lf min.\n", time_spend); } else{ fprintf(energy, "\nTime used: %lf h.\n", time_spend / 60.0); printf("\nTime used: %lf h.\n", time_spend / 60.0); } fclose(energy); } //deallocate dynamic arrays free_q(); MPI_Win_free(&win); MPI_Comm_free(&shmcomm); MPI_Finalize(); return 0; }