Esempio n. 1
0
void leimkuhler_tree(double maxtime)
{
    int i;
    const double tinterval = 1.0;
    float time_start, time_end;

    if (verbosity > 0)
    {
        fprintf(err, "Using leimkuhler_tree integrator.\n"
                     "TIME_CAP:      %3i\n", 
                     TIME_CAP);
        fprintf(err, "-------------------------------------------------\n");
    }

    /*========================================================================
     * Calculate the initial forces and time steps, start the integrator
     * by first drifting.
     *======================================================================*/
    for (i=0; i < NPARTICLES; i++)
        lkACCEL_AND_POTENTIAL(ps[i], 0);

    for (i=0; i < NPARTICLES; i++)
    {
        double h2 = sqrt(SELECT_TIME_STEP(ps[i]));
        DRIFT(ps[i], h2);
        ps[i]->time = 0;
        ps[i]->timeNext = h2;
    }
    write_state(0);

    /*========================================================================
     * Put each particle into the priority queue
     *======================================================================*/
    struct pqNode *head = ps[0];
    for (i=1; i < NPARTICLES; i++)
    {
        struct pqNode *p = ps[i];
        PQ_MERGE(head, p);
    }

    pTree *tree;

    tree = pintBuildTree(ps, NULL);

#if 1
    time_start = CPUTIME;
    for (i=0; i < 50000; i++)
        tree = pintBuildTree(ps, NULL);
    time_end   = CPUTIME;
#endif
#if DYNAMIC_TREE
    //fprintf(err, "tree->cell.fMass = %e\n", tree->cell.fMass);
#endif
    fprintf(err, "comparisonCount = %i\n", comparisonCount);
    fprintf(err, "nodeCount = %i\n", nodeCount);
    fprintf(err, "tree construction time = %e\n", (time_end - time_start) / 50000.);
    //fprintf(err, "tree construction time = %e\n", (time_end - time_start) );
    //assert(tree->cell.fMass == 1.0);

#if 0
#if DYNAMIC_TREE
    int len = walk_tree(tree, NULL, 0);
    fprintf(err, "\n");
#else
    int len = walk_tree(tree, ps, 0);
    fprintf(err, "\n");
#endif
#endif

#if 0
#if DYNAMIC_TREE
    fprintf(err, "\n\n");
    struct pqNode **ps2 = (struct pqNode **)malloc(NPARTICLES * sizeof(struct pqNode *));
    int len = walk_tree(tree, ps2, 0);
    fprintf(err, "len = %i\n", len);
    assert(len == NPARTICLES);

    struct pqNode *ps3 = (struct pqNode *)malloc(NPARTICLES * sizeof(struct pqNode));
    assert(ps3 != NULL);
    for (i=0; i < NPARTICLES; i++)
        memcpy(&(ps3[i]), ps2[i], sizeof(struct pqNode));

    for (i=0; i < NPARTICLES; i++)
        ps2[i] = &(ps3[i]);

    time_start = CPUTIME;
    for (i=0; i < 5000; i++)
        tree = pintBuildTree(ps2, NULL);
    time_end   = CPUTIME;
    fprintf(err, "tree->cell.fMass = %e\n", tree->cell.fMass);
    fprintf(err, "tree construction time = %e\n", (time_end - time_start) / 5000.);
#endif
#endif
    //assert(tree->cell.fMass == 1.0);

    return;

    /*========================================================================
     * Run the simulation
     *======================================================================*/
    double prevtimeNext = 0;
    double tout = tinterval;

    fflush(out);
    fflush(err);

    RESET_ACCEL_HIST();
    while (1)
    {
        struct pqNode *p;
        PQ_REMOVE_MIN(head, p);

        assert(prevtimeNext <= p->timeNext);
        prevtimeNext = p->timeNext;

        fprintf(out, "%i %f %f %f\n", p->id, p->r[0], p->r[1], p->r[2]);
        fflush(out);

        /*====================================================================
         * Write output
         *==================================================================*/
        if (p->timeNext < tout && tout <= head->timeNext) 
        {
            tout += tinterval;
            RESET_ACCEL_HIST();
            for (i=0; i < NPARTICLES; i++) ACCEL_HIST(ps[i]->a);

            write_state(p->timeNext);
            AccelCount = 0;

            if (p->timeNext < maxtime && maxtime <= head->timeNext) break;

#if !DYNAMIC_TREE
            //tree = pintBuildTree2(ps, tree);
            tree = pintBuildTree(ps, NULL);
#endif
        }

        /*====================================================================
         * Drift, Kick, Drift
         *==================================================================*/
        double h1 = p->timeNext - p->time;
        DRIFT(p, h1);
        lkACCEL_AND_POTENTIAL(p, p->timeNext);
        KICK(p, h1);
        double h2 = SELECT_TIME_STEP(p) / h1;
        KICK(p, h2);
        DRIFT(p, h2);

        /*====================================================================
         * Update particle's time and put it back in the queue
         *==================================================================*/
        p->time = p->timeNext + h2;
        p->timeNext = p->time + h2;

#if DYNAMIC_TREE
        _DA_ time_start = CPUTIME;
        tree = tree_update(p, tree);
        _DA_ time_end = CPUTIME;
        _DA_ fprintf(err, "tree update time = %e\n", time_end - time_start);
#endif

#if 0
#if DYNAMIC_TREE
        _DA_ time_start = CPUTIME;
        tree = tree_insert(p, tree);
        _DA_ time_end = CPUTIME;
        _DA_ fprintf(err, "tree insert time = %e\n", time_end - time_start);
#endif
#endif
        PQ_MERGE(head, p);
    }
}
Esempio n. 2
0
int main(int argc, char *argv[])
{
	char buffer[MAX_PACKET_SIZE];
	static struct sockaddr_in addr;
	int rc, i, count;
	struct timeval t1, t2, dt;


	KICK(argc < 3, "incorrect usage\n"
	"Usage:\n"
	"./linphone_proxy <local_ip> <remote_ip>\n");
	local_ip = argv[1];
	remote_ip = argv[2];

	add_poll(&fds[0], STDIN_FILENO);

	proxy_to_linphone_socket = create_socket(SOCK_DGRAM, SIP_LINPHONE);
	init_sockaddr(&proxy_to_linphone_addr, "127.0.0.1", SIP_PORT);
	add_poll(&fds[1], proxy_to_linphone_socket);
	eprintf("created proxy_to_linphone SIP socket   SRC:localhost:%d - DST:localhost:%d\n",
			SIP_LINPHONE, SIP_PORT);

	proxy_to_proxy_socket = create_socket(SOCK_DGRAM, SIP_PROXY);
	init_sockaddr(&proxy_to_proxy_addr, remote_ip, SIP_PROXY);
	add_poll(&fds[2], proxy_to_proxy_socket);
	eprintf("created proxy_to_sip SIP socket        SRC:localhost:%d - DST:%s:%d\n",
			SIP_PROXY, remote_ip, SIP_PROXY);

	proxy_to_linphone_data_socket = create_socket(SOCK_DGRAM, DATA_LINPHONE);
	init_sockaddr(&proxy_to_linphone_data_addr, "127.0.0.1", DATA_PORT);
	add_poll(&fds[3], proxy_to_linphone_data_socket);
	eprintf("created proxy_to_linphone DATA socket  SRC:localhost:%d - DST:localhost:%d\n",
			DATA_LINPHONE, DATA_PORT);

	proxy_to_proxy_data_socket = create_socket(SOCK_DGRAM, DATA_PROXY);
	init_sockaddr(&proxy_to_proxy_data_addr, remote_ip, DATA_PROXY);
	add_poll(&fds[4], proxy_to_proxy_data_socket);
	eprintf("created proxy_to_proxy DATA socket     SRC:localhost:%d - DST:%s:%d\n",
			DATA_PROXY, remote_ip, DATA_PROXY);

	manager_socket = create_socket(SOCK_DGRAM, MANAGER_PORT);
	init_sockaddr(&manager_addr, "0.0.0.0", MANAGER_PORT);
	add_poll(&fds[5], manager_socket);
	eprintf("created manager socket                 SRC:localhost:%d - DST:0.0.0.0:0\n",
			MANAGER_PORT);

	while (1) {
		rc = poll(fds, NUM_FDS, -1);
		DIE(-1 == rc, "poll");

		for (i = 0; i < NUM_FDS; i++) {
			if (0 == fds[i].revents) {
				continue;
			}

			switch(i) {
			/* receive line from console */
			case 0:
				break;

			/* receive SIP packet from linphone */
			case 1:
				gettimeofday_safe(&t1);
				count = recv_msg(fds[i].fd, &proxy_to_linphone_addr, buffer);

				if (begins_with(buffer, "INVITE")) {
					copy_packet(&out_invite, buffer, count);
					//printf("captured INVITE packet:\n%s\n", out_invite.buffer);
				} else if (begins_with(buffer, "ACK")) {
					copy_packet(&out_ack, buffer, count);
					//printf("captured ACK packet:\n%s\n", out_ack.buffer);
				} else if (strstr(buffer, "200 OK") && strstr(buffer, "OPTIONS" )) {
					copy_packet(&out_op_ok, buffer, count);
					//printf("captured OPTIONS OK packet:\n%s\n", out_op_ok.buffer);
				}

				send_msg(proxy_to_proxy_socket, &proxy_to_proxy_addr, buffer, count);
				gettimeofday_safe(&t2);
				time_diff(&t1, &t2, &dt);
				printf("time case 1: %lu.%06lu\n", dt.tv_sec, dt.tv_usec);

				break;

			/* receive SIP packet from proxy */
			case 2:
				gettimeofday_safe(&t1);
				count = recv_msg(fds[i].fd, &addr, buffer);
				send_msg(proxy_to_linphone_socket, &proxy_to_linphone_addr, buffer, count);
				gettimeofday_safe(&t2);
				time_diff(&t1, &t2, &dt);
				printf("time case 2: %lu.%06lu\n", dt.tv_sec, dt.tv_usec);
				break;

			/* receive data packet from linphone */
			case 3:
				gettimeofday_safe(&t1);
				count = recv_msg(fds[i].fd, &proxy_to_linphone_data_addr, buffer);
				send_msg(proxy_to_proxy_data_socket, &proxy_to_proxy_data_addr, buffer, count);
				gettimeofday_safe(&t2);
				time_diff(&t1, &t2, &dt);
				printf("time case 3: %lu.%06lu\n", dt.tv_sec, dt.tv_usec);
				break;

			/* receive data packet from proxy */
			case 4:
				gettimeofday_safe(&t1);
				count = recv_msg(fds[i].fd, &addr, buffer);
				send_msg(proxy_to_linphone_data_socket, &proxy_to_linphone_data_addr, buffer, count);
				gettimeofday_safe(&t2);
				time_diff(&t1, &t2, &dt);
				printf("time case 4: %lu.%06lu\n", dt.tv_sec, dt.tv_usec);
				break;

			/* receive command from manager */
			case 5:
				count = recv_msg(fds[i].fd, &manager_addr, buffer);

				if (begins_with(buffer, "IP: ")) {					
					while (!isdigit(buffer[count - 1])) {
						buffer[--count] = 0;
					}
					strcpy(migrate_ip, buffer + 4);
					migrate_init();
				} else if (begins_with(buffer, "establish")) {
					migrate_establish();
				} else if (begins_with(buffer, "redirect: ")) {
					while (!isdigit(buffer[count - 1])) {
						buffer[--count] = 0;
					}
					strcpy(redirect_ip, buffer + 10);	
					migrate_redirect();
				}
				break;

			/* error */
			default:
				break;
			}
		}
	}

	return EXIT_SUCCESS;
}