コード例 #1
0
ファイル: trialfct.cpp プロジェクト: AndreasLeonhardt/Proj1
//=============================================================================================
// calculate the ratio brut-force
double TrialFct::SlaterRatio(int particleNumber ,positions * Rold,positions * Rnew)
{
    mat Slaternew  = zeros(nParticleshalf,nParticleshalf);
    mat Slaterold  = zeros(nParticleshalf,nParticleshalf);

    if (particleNumber<nParticleshalf)
    {
         for (int i=0;i<nParticleshalf;i++)
         {
             for (int j=0;j<nParticleshalf;j++)
             {
                 Slaternew(i,j) = hydrogen(i,j,Rnew);
                 Slaterold(i,j) = hydrogen(i,j,Rold);
             }
         }
    }
    else
    {
        for (int i=0;i<nParticleshalf;i++)
        {
            for (int j=0;j<nParticleshalf;j++)
            {
                Slaternew(i,j) = hydrogen(i+nParticleshalf,j,Rnew);
                Slaterold(i,j) = hydrogen(i+nParticleshalf,j,Rold);
            }
        }
    }

   return det(Slaternew)/det(Slaterold);

}
コード例 #2
0
ファイル: trialfct.cpp プロジェクト: AndreasLeonhardt/Proj1
double TrialFct::getValue(positions * R)
{
    double result = 0.0;

    // create Slater matrix
    mat Slaterup  = zeros(nParticleshalf,nParticleshalf);
    mat Slaterdown  = zeros(nParticleshalf,nParticleshalf);



    for (int i=0;i<nParticleshalf;i++)
    {
        for (int j=0;j<nParticleshalf;j++)
        {
            Slaterup(i,j)   = hydrogen(i,j,R);
            Slaterdown(i,j) = hydrogen(i+nParticleshalf,j,R);
        }
    }
    result = det(Slaterup)*det(Slaterdown);


    // jastrow factor
    double jastrow = 0.0;
    double dist;

    for (int i=0;i<nParticleshalf;i++)
    {   // equal spin, factor 1/2
        for (int j=0;j<i;j++)
        {
            dist = R->get_rr(i-1,j);
            jastrow += dist/(2+2*funcParameters[1]*dist);

            dist = R->get_rr(nParticleshalf+i-1,nParticleshalf+j);
            jastrow += dist/(2+2*funcParameters[1]*dist);
        }

        // opposite spin, factor 1/4
        for (int j=nParticleshalf;j<nParticles;j++)
        {
            dist = R->get_rr(j-1,i);
            jastrow += dist/(4+4*funcParameters[1]*dist);
        }

    }

    result *= exp(jastrow);

    return result;
}
コード例 #3
0
ファイル: trialfct.cpp プロジェクト: AndreasLeonhardt/Proj1
void TrialFct::setSlaterinv(positions * R)
{
    // create Slater matrix
    mat Slaterup  = zeros(nParticleshalf,nParticleshalf);
    mat Slaterdown  = zeros(nParticleshalf,nParticleshalf);



    for (int i=0;i<nParticleshalf;i++)
    {
        for (int j=0;j<nParticleshalf;j++)
        {
            Slaterup(i,j)   = hydrogen(i,               j,R);
            Slaterdown(i,j) = hydrogen(i+nParticleshalf,j,R);
        }
    }

    // calculate the inverse of the Slatermatrix for spin up and down
    // respectively. This is used for later updates of the position.
    inverseSlaterDown = inv(Slaterdown);
    inverseSlaterUp   = inv(Slaterup);
}
コード例 #4
0
ファイル: h2o.c プロジェクト: tomasscavnicky/IOS
void hydrogen_maker()
{
    int hydro_pid;
 
    //creates 2N hydrogen atom processes
    for (int i = 0; i < (vars->N)*2; i++)
    {
        hydro_pid = fork();
        if (hydro_pid == 0)
        {
            usleep((rand() % vars->GH*1000 + 1));
            hydrogen(i+1);
        }
    }
    free_resources();
    _Exit(0);
}
コード例 #5
0
ファイル: as5.c プロジェクト: ShaunHoward/eecs338
int main(int argc, char *argv[]) {
	int semid, shmid;
	unsigned short sem_vals[SEM_COUNT];
	struct common *shared;

	// initialize semaphore space
	union semin semctlarg;
	// seed random
	srand((unsigned)time(&t));

	if ((semid = semget(IPC_PRIVATE, SEM_COUNT, 0777)) < 0) {
		perror("semget_main");
		exit(EXIT_FAILURE);
	}

    // initialize semaphore values
	sem_vals[S] = S_VAL;
	sem_vals[SH] = SH_VAL;
	sem_vals[SC] = SC_VAL;
	semctlarg.array = sem_vals;

    // initialize actual semaphores
	if ((semctl(semid, SEM_COUNT, SETALL, semctlarg)) < 0) {
		perror("semctl_main_1");
		exit(EXIT_FAILURE);
	}

	// find memory id for shared
	if ((shmid = shmget(IPC_PRIVATE, 1*K, 0777)) < 0) {
		perror("shmget_main");
		exit(EXIT_FAILURE);
	}

	// get shared memory pointer
	if ((shared = (struct common *)shmat(shmid, 0, 0)) < 0) {
		perror("shmat_main");
		exit(EXIT_FAILURE);
	}

	// initialize shared memory
	shared->waiting_c = 0;
	shared->waiting_h = 0;

    // count number of carb and hydro atoms randomly spawned
	int carb_count = 0;
	int hydro_count = 0;

	// do random execution
	int i;
	int ret_val = 0;
	for (i = 0; i < ATOM_COUNT; i++) {
		// spawn carbon atom when rand odd
		int val = rand();
		if (val % 2 != 0) {
			if ((ret_val = fork()) == 0){
				carbon(semid, shmid);
			} else if (ret_val < 0) {
				perror("fork");
				exit(EXIT_FAILURE);
			} else {
				carb_count++;
			}
		} else {
			// otherwise, spawn hydrogen atom when rand even
			if ((ret_val = fork()) == 0)
				hydrogen(semid, shmid);
			else if (ret_val < 0){
				perror("fork");
				exit(EXIT_FAILURE);
			} else {
				hydro_count++;
			}
		}
	}


	// determine number of carbon atoms already satisfied
	int num_carb_satisfied = hydro_count / 4;
	// determine hydrogen left over from previous spawn loop
	int hydro_left_over = hydro_count % 4;
	// determine number of carbon left to satisfy
	int num_carb_left = carb_count - num_carb_satisfied;
	// determine number of hydrogen needed to satisfy all carbons
	int num_hydro_left = (num_carb_left * 4) - hydro_left_over;

	// compensate for mis-matched spawning with extra hydrogen
	for (i = 0; i < num_hydro_left; i++) {
		printf("Spawning extra hydrogen...\n");
		fflush(stdout);
		// spawn hydrogen atom
		if ((ret_val = fork()) == 0){
			hydrogen(semid, shmid);
		} else if (ret_val < 0) {
			perror("fork");
			exit(EXIT_FAILURE);
		}
	}

	int total_atom_count = ATOM_COUNT + num_hydro_left;

    // wait for all atoms to be destroyed, even though science states that's impossible
    for (i = 0; i < total_atom_count; i++) {
    	fflush(stdout);
    	printf("Waiting for process %d to exit...\n", i);
    	fflush(stdout);
    	if (wait(0) < 0) {
    		perror("wait");
    		exit(EXIT_FAILURE);
    	}
    }

    fflush(stdout);
    printf("Sequential CH4 making complete. Shared memory and semaphores are being removed.\n");
    fflush(stdout);

    // remove shared memory
    if (shmctl(shmid, IPC_RMID, 0) < 0) {
    	perror("shmctl_main");
    	exit(EXIT_FAILURE);
    }

    // remove semaphores
    if (semctl(semid, SEM_COUNT, IPC_RMID, 0) < 0) {
    	perror("semctl_main_2");
    	exit(EXIT_FAILURE);
    }

    fflush(stdout);
    printf("Exiting sequential CH4 program...\n");
    fflush(stdout);

    return EXIT_SUCCESS;
}