コード例 #1
0
ファイル: ip.c プロジェクト: zidier215/tcpip
/* 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);
}
コード例 #2
0
ファイル: main.c プロジェクト: edging1218/channel1L
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;
}