void ps_dump()
{
	DIR *d;
	struct dirent *de;
	char *namefilter = 0;
	int pidfilter = 0;
	int threads = 0;

	d = opendir("/proc");
	if(d == 0) return;

	if(filter_by_system == 1)
	{
	    process_info psinfo;
	    memset(&psinfo, 0, sizeof(process_info));

	    psinfo.uid = 0;
	    strcpy(psinfo.owner, "root");
	    strcpy(psinfo.name, "System");
	    psinfo.status = 'S';
	    ps_list_add(&psinfo);
	}

	while((de = readdir(d)) != 0)
	{
		if(isdigit(de->d_name[0]))
		{
			int pid = atoi(de->d_name);
			ps_instance_dump(pid);
		}
	}
	closedir(d);
}
Пример #2
0
int main(int argc, char **argv) {

	int i;
	
	if (2 != argc) {
		printf("test_ls_list infile\n");
		return 1;
	}

	char* infname = argv[1];
	FILE *infile = fopen(infname, "r");
	PS_DATA data = ps_data_read_bin(infile);
	fclose(infile);
	
	PS_SOLUTION *solution;
	
	PS_LIST list = ps_list_create();
	for(i=0; i<5; i++) {
		solution = (PS_SOLUTION*)malloc(sizeof(PS_SOLUTION));
		solution->energy = i;
		solution->wavefunction = ps_data_copy(data);
		ps_list_add(list, solution);
		printf("List Size=%i\n", ps_list_size(list));
	}
	free(data);

	PS_SOLUTION *listnode = ps_list_front(list);
	i = 0;
	while (listnode != NULL) {
		printf("Node %i\n", ++i);
		printf("Energy=%f\n", listnode->energy);
		ps_data_write_ascii(listnode->wavefunction, stdout);
		listnode = ps_list_next(list);
	}
	
	ps_list_destroy_all(list);
	return 0;
}	
void ps_instance_dump(int pid)
{
	char statline[BUFFERSIZE*2];
    struct stat stats;
    process_info psinfo;
    FILE *ps;
    struct passwd *pw;
    int n;

    memset(&psinfo, 0, sizeof(process_info));

    psinfo.pid = pid;

    snprintf(statline, BUFFERSIZE*2, "/proc/%d", pid);
    stat(statline, &stats);

	psinfo.uid = (int) stats.st_uid;

    pw = getpwuid(stats.st_uid);
    if(pw == 0)
    {
    	snprintf(psinfo.owner, 80, "%d", (int)stats.st_uid);
    }
    else
    {
    	strncpy(psinfo.owner, pw->pw_name, 80);
    }


    snprintf(statline, BUFFERSIZE*2, "/proc/%d/stat", pid);
    ps = fopen(statline, "r");
    if (ps != 0)
    {

        /* Scan rest of string. */
        fscanf(ps, "%*d %*s %c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d "
                     "%lu %lu %*d %*d %*d %*d %d %*lu %lu %*lu %ld",
                     &psinfo.status, &psinfo.delta_utime, &psinfo.delta_stime,
					 &psinfo.threadnum, &psinfo.start_time, &psinfo.rss);

        fclose(ps);
    }

    snprintf(statline, BUFFERSIZE*2, "/proc/%d/cmdline", pid);
    ps = fopen(statline, "r");
    if(ps == 0) {
    	n = 0;
    }
    else
    {
    	n = fread(psinfo.name, 1, 80, ps);
    	fclose(ps);
    	if(n < 0) n = 0;
    }
    psinfo.name[n] = 0;

    if(strlen(psinfo.name) == 0)
    {
        snprintf(statline, BUFFERSIZE*2, "/proc/%d/stat", pid);
        ps = fopen(statline, "r");
        if(ps!= 0)
        {
        	n = fscanf(ps, "%d (%s)", &pid, psinfo.name);
        	fclose(ps);
        	if(n == 2)
        		psinfo.name[strlen(psinfo.name)-1] = 0;
        }
    }

    psinfo.nice = getpriority(PRIO_PROCESS, psinfo.pid);

    if(filter_by_system == 1)
    {
    	if((strcmp(psinfo.owner, "root") != 0) &&
    	   (strstr(psinfo.name, "/system/") == 0) &&
    	   (strstr(psinfo.name, "/sbin/") == 0))
    		ps_list_add(&psinfo);
    	else
    		ps_system_add(&psinfo);

    }
    else
    {
    	ps_list_add(&psinfo);
    }

}
Пример #4
0
/*
//
//The 2D version of the solving engine.
//
//intial eqn                 
//-->  Div*F = G/M	
//
//convert to finite diff eqn, use a uniform mesh, Let, dx = dy = d  and Let P[x,y] = G[x,y]/M[x,y] = G*m
//-->  (F[x+d,y]-2F[x,y]+F[x-d,y])/d^2 + (F[x,y+d]-2F[x,y]+F[x,y-d])/d^2 = P[x,y]
//
//rearrange:
//-->  F[x+d,y] + F[x-d,y] + F[x,y+d] + F[x,y-d] - 4F[x,y] = d^2 * P[x,y]
//
//convert to c style: Let x = x0+j*d     and    y = y0+l*d 
//                  where j = 0,1,2...J  and    l = 0,1,2...L
//-->  F[j+1,l] + F[j-1,l] + F[j,l+1] + F[j,l-1] - 4F[j,l] = d^2 * P[j,l]y
//
//Goal: make a linear system of eqns in matrix form -- firstly we make a vector out of F. i.e. map j,l to a linear index 'i'
//     Let, i = j(L+1) + l   ...where j = 0,1,...J and l = 0,1,...L
//-->  F[i+L+1] + F[i-(L+1)] + F[i+1] + F[i-1] - 4F[i] = d^2 * P[i]
//    ...where this eqn holds for the interior points: j = 1,2,...,J and l = 1,2,...,L
//
//On the boundries F should be specified, i.e. where:
//    j = 0    or    i = 0, 1, 2, ..,L
//    j = J    or    i = J(L+1), J(L+1)+1, J(L+1)+2, ...,J(L+1)+L
//    l = 0    or    i = 0, (L+1), 2(L+1), ..., J(L+1)
//    l = L    or    i = L, (L+1)+L, 2(L+1)+L, ..., J(L+1)+L         */
PS_LIST ps_solve_2D(PS_DATA potential, PS_SOLVE_PARAMETERS *params) {
	
	char log_message[256];
	ps_log("PsiShooter -- a shooting method solver for the time independant Schrodinger equation under the effective mass approximation.\n");
	
    // This is a linked list for storing solutions
	PS_LIST solution_list = ps_list_create();

    ps_log("Iterate through Energy Eigenvalues to find the lowest bound state.\n");      
	
	// wavefunction storage.  
	int Nx = potential->xsize; // used for generating strings with sprintf for sending to ps_log
	int Ny = potential->ysize; // used for generating strings with sprintf for sending to ps_log
	
	//	double dx = potential->xstep; //cm, size of differential length 
	//(TODO: Compute dx inside loop in order to support meshes with non-uniform differential steps)
	double dx = ps_data_dx_at(potential, 2); 
	double dy = ps_data_dy_at(potential, 2); // 0 to 1 is wierd, maybe. 
	double dx_dy = dx/dy; 
	double dy_dx = dy/dx;
	//F
	//intial eqn                 -->  Div*F = G * m_eff	
	//convert to finite diff eqn -->  (F[x+dx,y]-F[x,y])/dx + (F[x,y]-F[x,y-dy])/dy = G[x,y]M[x,y]	
	//rearrange                  -->  F[x+dx,y]-F[x,y] + dx*(F[x,y]-F[x,y-dy])/dy = dx*G[x,y]/M[x,y]
	//                           -->  F[x+dx,y] = dx*G[x,y]/M[x,y]+F[x,y]-dx/dy*(F[x,y]-F[x,y-dy])
	//                                What does this mean for our 2D simulations? The more closely spaced the y
	//                                Coordinate mesh points are, the more significant their effects will be. That
	//                                Is pretty terrible for us. 
	//
	//                                We need to decouple the coordinates so we don't need to know future F and G from
	//                                from future calculated y mesh points...
	//                                Is there some other way we can decouple them? We can't just look back instead of forward.
	//
	//                                How about we fill the array with 1D shots across the 1 direction, and then refill
	//                                with the 2D shots? Then the array will have some approximate knowledge of the future
	//                                and the algorithm might work.
	
	//convert to c style         -->  F[x+dx,y] = F[i][j+1]
	// *****README*******    	 --> (NOTE: x is iterated over with j index. x=columns, i=rows) -jns

	//in 2D                      -->  F[i][j+1] = dx*G[i][j]/M[i][j] + F[i][j] - dx/dy*(F[i][j]-F[i-1][j])

	
	//convert to 1D              -->  (F[x+dx]-F[x-dx])/(2dx) = G[x]/M[x]	
	//rearrange                  -->  F[x+dx] = (2dx)*G[x]/M[x] + F[x-dx]
	//convert to c style         -->  F[i+1] = (2dx)*G[i]*m[i] + F[i-1]
	//                                F[i+1] = F_coeff*G[i]*m[i] + F[i-1]
	double F_coeff = dx; //handy prefactor that would otherwise be for every point evaluated
	//from dx to 2*dx jh sometime in may
	
	//G
	//intial eqn                 -->  Div*G = F * 2*(V-E)/h_bar^2
	//convert to finite diff eqn -->  (G[x+dx,y]-G[x-dx,y])/(2dx) + (G[x,y+dy]-G[x,y-dy])/(2dy) = F[x,y]*2*(V[x,y]-E[x,y])/h_bar^2
	//in 2d:                     -->  G[x+dx,y] = (2dx)*F[x,y]*2*(V[x,y]-e[x,y])/h_bar^2+G[x-dx][y]-(2dx)/(2dy)(G[x,y+dy]-G[x,y-dy])
	//                           -->  G[i][j+1] = G_coeff * F[i][j]*(V[i][j]-E) + G[i][j-1] - dx/dy(G[i+1][j] + G[i-1][j])
	//
	// The equivalent FWD DIFFEQ -->  G[x+dx][y] = dx*F[x,y]*2*(V[x,y] - e[x,y])/h_bar^2 + G[x,y] - dx/dy(G[x,y] - G[x,y-dy])
	// 						     -->  G[i][j+1] = dx*F[i][j]*2*(V[i][j] - e[i][j])/h_bar^2 + G[i][j] - dx/dy(G[i][j] - G[i-1][j])


	//convert to 1D              -->  G[x+dx]-G[x-dx]/(2dx) = F[x]*2*(V[x]-E)/h_bar^2	
	//rearrange                  -->  G[x+dx] = (2dx)*F[x]*2*(V[x]-E)/h_bar^2 + G[x-dx]
	//convert to c style         -->  G[i+1] = 4*dx/hbar^2 * F[i]*(V[i]-E) + G[i-1]
	//                                G[i+1] = G_coeff * F[i]*(V[i]-E) + G[i-1]
//	double G_coeff = 2*dx/(HBAR_PLANCK_SQ); //handy prefactor that would otherwise be computed for every point evaluated 
	//from 4*dx to 2*dx jh sometime in may

	double G_coeff = 2*dx*G_COEFF;
	
	//dx = dy here.
	double F[Nx][Ny]; //the envelope function (wavefunction)
	double f_cache[params->n_iter]; // We cache the last value of the envelope for each solution
	double G[Nx][Ny]; //the aux function
	int bound_state_count = 0;	
	int threshold_set_flag = 0; 
	double F_threshold = 0;
	int i, j, iter;
	double E = params->energy_min;
	double Estep = (params->energy_max - params->energy_min)/(params->n_iter); 
	double V; //meV, Current potential
//	double m_eff = MASS_ELECTRON*M_EFF_GAAS;
	double m_eff = M_EFF_GAAS;

	// To Do: make the electron mass be part of the structure that we are simulating. i.e. 
	//in general it can be a position dependant quantity just like the potential 
	//(think heterostructures with different band edge curvatures)
		
	for (iter = 0; iter < params->n_iter; iter++) {

	  //Going to try filling the array with y-direction shots and then running the 2D shots based on those.
		
	  //initial conditions
	  for (j=0; j<Nx; j++){
	    F[0][j] = 0;
	    G[0][j] = 1;
		F[1][j] = 1;
		G[1][j] = 1;
	  }
	
	  for(i=1; i<Ny-1; i++) {

		    for(j=1; j<Nx-1; j++) {
		     	V = ps_data_value(potential, i,j); //V[i][j]
				// 5-point stencil in X and Y
				F[i+1][j] = dx*dx*m_eff*G[i][j]  - F[i][j+1] - F[i][j-1] - F[i-1][j] + 4*F[i][j];
				G[i+1][j] = 2*dx*dx*G_COEFF*(V-E)*F[i][j] - G[i][j+1] - G[i][j-1] - G[i-1][j] + 4*G[i][j];
		    }
			// For First and last point, Compute slope in x direction for F and G directly

			// F[x+3] = F[x] + 3h*F'[x] + (3h)^2/2!*F''[x]  (Taylor Expansion)
			// F'[x] = 1/(12*h)*[-F[x+2] + 8*F[x+1] - 8*F[x-1] + F[x-2]]  (5-point stencil)
			// F''[x] = 1/(12*h*h)*[-F[x+2] + 16*F[x+1] -30*F[x] +16*F[x+1] - F[x-2]] (5-point stencil)
			G[i+1][j] = G[i+1][j-3] + 0.25*(-G[i+1][j-1] + 8*G[i+1][j-2] - 8*G[i+1][j-4] + G[i+1][j-5]) + 9.0/24.0*(-G[i+1][j-5] + 16*G[i+1][j-4] - 30*G[i+1][j-3] + 16*G[i+1][j-2] - G[i+1][j-1]);
			F[i+1][j] = F[i+1][j-3] + 0.25*(-F[i+1][j-1] + 8*F[i+1][j-2] - 8*F[i+1][j-4] + F[i+1][j-5]) + 9.0/24.0*(-F[i+1][j-5] + 16*F[i+1][j-4] - 30*F[i+1][j-3] + 16*F[i+1][j-2] - F[i+1][j-1]);			

			// F[x-3] = F[x] - 3h*F'[x] + (3h)^2/2!*F''[x]  (Taylor Expansion)
			// F'[x] = 1/(12*h)*[-F[x+2] + 8*F[x+1] - 8*F[x-1] + F[x-2]]
			// F''[x] = 1/(12*h*h)*[-F[x+2] + 16*F[x+1] -30*F[x] +16*F[x+1] - F[x-2]]
			G[i+1][0] = G[i+1][3] - 0.25*(-G[i+1][5] + 8*G[i+1][4] - 8*G[i+1][2] + G[i+1][1]) + 9.0/24.0*(-G[i+1][5] + 16*G[i+1][4] - 30*G[i+1][3] + 16*G[i+1][2] - G[i+1][1]);
			F[i+1][0] = F[i+1][3] - 0.25*(-F[i+1][5] + 8*F[i+1][4] - 8*F[i+1][2] + F[i+1][1]) + 9.0/24.0*(-F[i+1][5] + 16*F[i+1][4] - 30*F[i+1][3] + 16*F[i+1][2] - F[i+1][1]);			
	  }
	  //Why not just look at the change on the very last point? This definitely won't be representative, but it
	  //might be useful during debugging.
	  // It needs to check the entire boundary. (jns)
	  f_cache[iter] = F[Nx-1][Ny-1];
		
	  // Consider removing this for speed
	  //         sprintf(log_message, "\tE=%g eV\tF[N-1]=%g\n", E/EV_TO_ERGS, F[N-1]);
	  // ps_log(log_message);
		
	  //Try to detect which solutions are eigen states (bound states)
	  //if((iter > 0) && ((f_cache[iter] > 0 && f_cache[iter-1] < 0) || (f_cache[iter] < 0 && f_cache[iter-1] > 0))) { 
	    //if there was a change in sign between the last point of the prev
	    // and current envelope function then there was a zero crossing and there a solution
	    // test for a sign crossing

	    PS_DATA wavefunction = ps_data_copy(potential); // copy the potential
	    ps_data_set_data(wavefunction, (double*)F); // Overwrite the potential with the wavefunction
			
	    PS_SOLUTION *solution = (PS_SOLUTION*)malloc(sizeof(PS_SOLUTION));
	    solution->energy = E;
	    solution->wavefunction = wavefunction;
			
	    // Add the solution to the list of bound states
	    ps_list_add(solution_list, solution);

		// Save the g solutions
		PS_DATA g = ps_data_copy(potential);
		ps_data_set_data(g, (double*)G);
		PS_SOLUTION *gsolution = (PS_SOLUTION*)malloc(sizeof(PS_SOLUTION));
		gsolution->energy = E;
		gsolution->wavefunction = g;
		ps_list_add(g_solutions, gsolution);
		
	    // print a log message
        sprintf(log_message, "\tBoundstate number %d with E=%e found, F[Nx][Ny]=%e < F_threshold=%e\n", ++bound_state_count, solution->energy/EV_TO_ERGS, F[Nx][Ny], F_threshold);
	    ps_log(log_message);
	    //}

	  // Increment the energy
	  E += Estep;
	}    	
	
	return solution_list;
}
Пример #5
0
/*
//
// Solve for the bound energies given by the potential. 
// energies is a buffer of energies to test.
// bound_energies is where the actual bound energies will be stored.  It should be the same size as energies.
// both buffers should be of size buf_size.
// returns the number of bound energies found, 0 or negative for error
//
////////////////////////
//Solving the 1D TISE //
////////////////////////
//
//(0)    H * Psi = E * Psi
//
//E is the eignenvalue
//H is the hamiltonian operator: H = T + V = p^2/(2m) + V  
//    ... where p is the momentum operator, p = h/i * Div
//
//Moving to the effective mass regime we no longer solve for the wavefunction
//but instead we sove for an envelope function. Careful consideration shows that 
//if mass is allowed to vary with positon, m -> m(x), then simple subsitution of 
//m(x) for m in H causes H to become non-Hermitian. 
//Fortunately that can be worked around, the result is:
//
//(1)    T * F = -h_bar^2/2 * Div * ( m_eff(x,y,E)^-1 * Div * F )
//           ...note: F is the envelope function that is replacing the role of Psi
// 
//Put it all together to get the effective mass equation that we are going to
//use:
//    +--------------------------------------------------------------+                               
//(2) |    -h_bar^2/2 * Div * (1/m_eff * Div * F) + V * F = E * F    |  
//    +--------------------------------------------------------------+----> This is the main equation
//
//Note: Skip to equations (14) & (15) to see how we are going to proceed in the actual solver we are implenting.
//
	//Rearranging (2):
	//(3)    Div * (M * Div * F) = 2*(V-E)*F/h_bar^2
	//           ... note: Let 1/m_eff(x,y,E) = M  (For compactness of these notes only, it is still the effective mass that is position dependant)
	//take the coordinate system to be cartesisian and Div becomes: Div = d/dx + d/dy   -->   Div*F = dF/dx + dF/dy
	//(4)    Div * { M(dF/dx) + M(dF/dy) } = 2*(V-E)*F/h_bar^2
	//  
	//The LHS of (4) has a (2D) divergance of 2 terms that each have a product of two functions (M, dF), both of which depend on x and y. 
	//The chain rule will get invoked and there will be quite a few terms after we expand this
	//(5)    Div*(M(dF/dx)) + Div*(M(dF/dy)) = ...     ...note: I am leaving off the RHS for awhile
	//(6)    (d/dx + d/dy)*(M(dF/dx)) + (d/dx + d/dy)*(M(dF/dy)) = ...
	//(7)    (d/dx)*(M(dF/dx)) + (d/dy)*(M(dF/dx)) + (d/dx)*(M(dF/dy)) + (d/dy)*(M(dF/dy))= ...
	//(8)    (M)(d^2F/dx^2) + (dF/dx)(dM/dx)  + (M)(d^2F/(dxdy)) + (dF/dx)(dM/dy) + (M)(d^2F/(dydx)) + (dF/dy)(dM/dx) + (M)(d^2F/dy^2) + (dF/dy)(dM/dy) = ...
	//(9)    (M)(d^2F/dx^2) + (M)(d^2F/dy^2) + 2(M)(d^2F/(dxdy)) + (dF/dx)(dM/dx) + (dF/dx)(dM/dy) + (dF/dy)(dM/dx) + (dF/dy)(dM/dy) = ...
	//
	//The next step is to expand (9) out in terms of finite differences, here are some pieces that will be used:
	//(10)   dF/dx = (F[x+dx]-F[x-dx])/(2dx)
	//(11)   d^2F/dx^2 = ((F[x+dx+dx]-F[x+dx-dx])/(2dx) - (F[x-dx+dx]-F[x-dx-dx])/(2dx)) / (2dx)
	//                 = (F[x+2dx] - 2F[x] + F[x-2dx])*(2dx)^-2
	//(12)   d^2F/(dxdy) = (d/dy) * dF/dx
	//                   = (d/dy) * (F[x+dx]-F[x-dx])/(2dx)
	//                   = ((F[x+dx,y+dy]-F[x-dx,y+dy])/(2dx) - (F[x+dx,y-dy]-F[x-dx,y-dy])/(2dx)) / (2dy)
	//                   = ((F[x+dx,y+dy]-F[x-dx,y+dy]) - (F[x+dx,y-dy]-F[x-dx,y-dy])) / (2dx2dy)
	//
	//Using the finite differencing versions (10)-(12) of the derivatives in (9) and making M & F explcit functions of x & y: 
	//(9)    (M)(d^2F/dx^2) +         --> (13)    M[x,y] * (F[x+2dx,y] - 2F[x,y] + F[x-2dx,y])*(2dx)^-2 +  
	//       (M)(d^2F/dy^2) +         -->         M[x,y] * (F[x,y+2dy] - 2F[x,y] + F[x,y-2dy])*(2dy)^-2 + 
	//       2(M)(d^2F/(dxdy)) +      -->         2*M[x,y] * ((F[x+dx,y+dy]-F[x-dx,y+dy])-(F[x+dx,y-dy]-F[x-dx,y-dy]))/(2dx2dy) +
	//       (dF/dx)(dM/dx) +         -->         (F[x+dx,y]-F[x-dx,y])/(2dx) * (M[x+dx,y]-M[x-dx,y])/(2dx) + 
	//       (dF/dx)(dM/dy) +         -->         (F[x+dx,y]-F[x-dx,y])/(2dx) * (M[x,y+dy]-M[x,y-dy])/(2dy) +
	//       (dF/dy)(dM/dx) +         -->         (F[x,y+dy]-F[x,y-dy])/(2dy) * (M[x+dx,y]-M[x-dx,y])/(2dx) +
	//       (dF/dy)(dM/dy) = ...     -->         (F[x,y+dy]-F[x,y-dy])/(2dy) * (M[x,y+dy]-M[x,y-dy])/(2dy) = 2*(V[x,y]-E)*F[x,y]/h_bar^2
	//
	//The form in (13) can be rearranged so that you can use the shooting method. 
	//
//Instead of proceeding directly with that we are going to first write the 
//orginal 2nd order differential equation (3) as a system of coupled ODEs
//(3)    Div * (1/m_eff * Div * F) = 2*(V-E)*F/h_bar^2
//
//Choose simplifying units, such as: 
//     hbar = 1
//     m_electron = 1/2  ...note: 1/m_eff = 1/(m_electron * m_relative) = 2/m_relative
//
//The equation in (3) becomes simpler:
//    Div * (1/m_r * Div * F) = (V-E)*F
//       ...note that m_relative has been shortened to m_r 
// 
//Let:  
//(14)    G = (1/m_r) * Div * F
//Then (3) becomes:
//(15)   Div * G = (V-E)*F
//
//Rearranging (14) and (15) slightly:
//      +--------------------------------------------------------------+
//(16)  |             Div*F = G * m_r                                  |
//(17)  |             Div*G = F * (V-E)                                |
//      +--------------------------------------------------------------+----> These are the useful equations the solver will implement
//
//Expanding (16) with finite differencing:
//       Div*F = G*m_r
//             = dF/dx + dF/dy = G*m_r
//(18)         = (F[x+dx,y]-F[x-dx,y])/(2dx) + (F[x,y+dy]-F[x,y-dy])/(2dy) = G[x,y]*m_r[x,y]
//
//Expanding (17) with finite differencing:
//       Div*G = F * (V-E)
//             = dG/dx + dG/dy = F * (V-E)
//(19)         = (G[x+dx,y]-G[x-dx,y])/(2dx) + (G[x,y+dy]-G[x,y-dy])/(2dy) = F[x,y]*(V[x,y]-E)
//
//
/////////////////////
//Initial Conditons//
/////////////////////
//
//Take the structure to start in a barrier high enough enough to warrant using:
//(20)   F[0,0] = 0
//
//As for the initial value of G: G is porportional to the slope of F (the envelope function)
//solutions for the envelope function will be approx. exponentials inside barrier regions.
//Exponentials are fast functions so any reasonable value of G will get the value of F going 
//to where it is going to converge too. i.e. the overall tragectory will not be sensitive to
//the intial value of G if we are starting deep enough inside a tall barrier.
//
//(21)   G[0,0] = 1    
//
//additional FD notes:
/////////////////////////////////////////////////////////////////////////////////////////		  
//Consider three points on the x axis separated by distance "h" and indexed by "i" ... i.e. i-1, i, i+1  -->  x-h, x, x+h
//The function F(x) has the values at those positions: F[i-1], F[i], F[i+1]
//Taylor expand F(x) at the i-1 and the i+1 point:
//(22)   F[i-1] = F[i] - dF/dx|i * h + d^2F/dx^2|i * h^2/2! - d^3F/dx^3|i * h^3/3 + ...
//(23)   F[i+1] = F[i] + dF/dx|i * h + d^2F/dx^2|i * h^2/2! + d^3F/dx^3|i * h^3/3 + ...
//        ...where  dF/dx|i means take the derivative with respect to x at point i
//If you add (22) and (23) every other term in the expansions cancel, such that:
//(24)   F[i-1] + F[i+1] = 2*F[i] + d^2F/dx^2|i * h^2 + d^4F/dx^4|i + ...
//Rearrange (24) to put the seconcd derivative of F with respect to x on the LHS  
//(25)   d^2F/dx^2|i = (F[i+1] - 2*F[i] + F[i-1]) / h^2  -  d^4F/dx^4|i + ...
//Drop the higher order corrections b/c a second order finite differencing approx of d^2F/dx^2|i is all we should need
//     +----------------------------------------------------------------+
//(26) |  d^2F/dx^2|i = (F[i+1] - 2*F[i] + F[i-1]) / h^2 + O(h^2)       |
//     +----------------------------------------------------------------+--------> 
//The error contained in O(h^2) is of the order h^2 and therefore will be small.
//BTW, subtracting (22) and (23) you can rearrange to get an accurate approx for dF/dx|i
//     +---------------------------------------------------------+
//(27) |       dF/dx|i = (F[i+1] - F[i-1]) / (2h) + O(h^2)       |
//     +---------------------------------------------------------+--------> 
*/
PS_LIST ps_solve_1D(PS_DATA potential, PS_DATA effective_mass, PS_SOLVE_PARAMETERS *params) {
	char log_message[256];
	ps_log("PsiShooter -- a shooting method solver for the time independant Schrodinger equation under the effective mass approximation.\n");
	ps_log("Iterate through Energy Eigenvalues to find the lowest bound state.\n");      
	
	PS_LIST solution_list = ps_list_create(); // This is a linked list for storing solutions

	// wavefunction storage.  
	int N = potential->xsize; // used for generating strings with sprintf for sending to ps_log
	//	double dx = potential->xstep; //cm, size of differential length (TODO: Compute dx inside loop)
	double dx = ps_data_dx_at(potential, 2); // in case 0 to 1 is wierd, this will do 1 to 2	
	
	//sanity checks, the effective mass should be on the same grid as the potential
	if(N != effective_mass->xsize) {
		//problem
		sprintf(log_message, "\tThat's wierd... there are %d elements in the x axis mesh for the potential, but %d elements in the effective mass x axis mesh. Check to make sure the files for potential and effective mass have the same mesh. \n", N, effective_mass->xsize);
		ps_log(log_message);
		return NULL;
	}
	if(dx != ps_data_dx_at(effective_mass, 2)) {
		//more problems
		sprintf(log_message, "\tThat's wierd... the step size for the potential x axis is %e nm, and the the step size for the effective mass x axis mesh is %e nm. They need the same meshes to work", dx, ps_data_dx_at(effective_mass, 2));
		ps_log(log_message);
		return NULL;
	}
	
	double F[N]; //the envelope function (wavefunction)
	double F_endpoint[params->n_iter]; // We save the last value of the envelope for each solution
	double G[N]; //the aux function
	
	//F
	//intial eqn                 -->  Div*F = G*m_r	
	//convert to finite diff eqn -->  (F[x+dx,y]-F[x-dx,y])/(2dx) + (F[x,y+dy]-F[x,y-dy])/(2dy) = G[x,y]/M[x,y]	
	//convert to 1D              -->  (F[x+dx]-F[x-dx])/(2dx) = G[x]/M[x]	
	//rearrange                  -->  F[x+dx] = (2dx)*G[x]/M[x] + F[x-dx]
	//convert to c style         -->  F[i+1] = (2dx)*G[i]*m[i] + F[i-1]
	//                                F[i+1] = F_coeff*G[i]*m[i] + F[i-1]
	double F_coeff = 2*dx; //handy prefactor that would otherwise be for every point evaluated
	
	//G
	//intial eqn                 -->  Div*G = F * 2*(V-E)/h_bar^2
	//convert to finite diff eqn -->  (G[x+dx,y]-G[x-dx,y])/(2dx) + (G[x,y+dy]-G[x,y-dy])/(2dy) = F[x,y]*2*(V[x,y]-E[x,y])/h_bar^2
	//convert to 1D              -->  G[x+dx]-G[x-dx]/(2dx) = F[x]*2*(V[x]-E)/h_bar^2	
	//rearrange                  -->  G[x+dx] = (2dx)*F[x]*2*(V[x]-E)/h_bar^2 + G[x-dx]
	//convert to c style         -->  G[i+1] = 4*dx/hbar^2 * F[i]*(V[i]-E) + G[i-1]
	//                                G[i+1] = G_coeff * F[i]*(V[i]-E) + G[i-1]
    //double G_coeff = 4*dx/(HBAR_PLANCK_SQ); //handy prefactor that would otherwise be computed for every point evaluated 
	double G_coeff = 4*dx*G_COEFF; // Redefined to use M_ELECTRON/HBAR^2 using assuming units of nm and eV
    
	int bound_state_count = 0;	
	int i, iter;
	double E = params->energy_min;
	double Estep = (params->energy_max - params->energy_min)/(params->n_iter); 
	double V; //eV, Current potential
	double m_eff; 
	
	for (iter = 0; iter < params->n_iter; iter++) {

		//initial conditions
		F[0] = 0;
		G[0] = 1;
		F[1] = F_coeff * G[0] * m_eff + 0;    
		G[1] = G_coeff * F[0] * (V-E) + G[0]; 
		
		for(i=1; i<N; i++) {
			V = ps_data_value(potential, 0,i); //V[i]
			m_eff = ps_data_value(effective_mass, 0,i); //m_eff[i]
			
			//Lets eliminate bad solutions by checking if the forward and backwards solutions overlap
			F[i+1] = F_coeff * G[i] * m_eff + F[i-1];  //subbed in m_eff for m[i], To Do: support a position dependant
			G[i+1] = G_coeff * F[i] * (V-E) + G[i-1];	 // mass by storing different masses at different locations (add to the PS_DATA structure probably)		
		  
		  /*  
		//Mix the bidirectional and forward derivatives to prevent two seperate solutions from forming. This
	    //Makes the upper solutions stable and oscillation free. (Probably only required on the i==1 index -jns) 
		// TODO compare results of this branching statement with IF (1==i) ... ELSE ...
	    if (i%2==1){
	      F[i+1] = F_coeff * G[i] * m_eff + F[i]; 
	      //subbed in m_eff for m[i], To Do: support a position dependant
	      // mass by storing different masses at different locations (add to the PS_DATA structure probably)
	      G[i+1] = G_coeff * F[i] * (V-E) + G[i];
	    }
	    if (i%2==0){
	      F[i+1] = 2*F_coeff * G[i] * m_eff + F[i-1]; 
	      //subbed in m_eff for m[i], To Do: support a position dependant
	      // mass by storing different masses at different locations (add to the PS_DATA structure probably)
	      G[i+1] = 2*G_coeff * F[i] * (V-E) + G[i-1];
	    }
		 */
		}
		F_endpoint[iter] = F[N-1]; //store the last point of the solution in an array, use this to bracket roots by looking for sign changes (zero crossings)
		
		//Try to detect which solutions are eigen states (bound states)
		if((iter > 0) && 
				((F_endpoint[iter] > 0 && F_endpoint[iter-1] < 0) || 
				 (F_endpoint[iter] < 0 && F_endpoint[iter-1] > 0)))
		{ 
			/*
			 
			//if there was a change in sign between the last point of the prev and current envelope function then there probably was a zero crossing and there a solution test for a sign crossing
			//in order to reject solutions that appear to just be amplified/oscillating numerical error run
			//shoot solutions backwards to see if you get basically the same enevelope function. If they really
			//are just amplified error then the shots will look like this:
			// forwards:  ----.'.'.       increasing amplitude in this direcion--> 
			// backwards: .'.'.----    <--increasing amplitude in this direcion
			F[N] = 0;
			G[N] = 1;
			F[N-1] = F_coeff * G[0] * m_eff + 0;   
			G[N-1] = G_coeff * F[0] * (V-E) + G[0];

			//Lets eliminate bad solutions by checking if the forward and backwards solutions overlap
			for(i=N-1; i>0; i--) {
				V = ps_data_value(potential, 0,i); //V[i]
				F[i-1] = F[i+1] - F_coeff * G[i] * m_eff;  //subbed in m_eff for m[i], To Do: support a position dependant
				G[i-1] = G[i+1] + G_coeff * F[i] * (E-V);	 // mass by storing different masses at different locations (add to the PS_DATA structure probably)				
			}
			
			//ToDo:
			//see if the overlap is about unity.
			
			 */
			
			
			
			
			// Add the solution to the list of bound states
			PS_DATA wavefunction = ps_data_copy(potential); // copy the potential to get the x,y coordinate stuff and sizes
			ps_data_set_data(wavefunction, F); // Overwrite the potential with the wavefunction
			PS_SOLUTION *solution = (PS_SOLUTION*)malloc(sizeof(PS_SOLUTION));
			solution->energy = E;
			solution->wavefunction = wavefunction;
			ps_list_add(solution_list, solution);
			bound_state_count++;
			
			// print a log message
			sprintf(log_message, "\tBoundstate number %d with E=%e found, F[N]=%e\n", bound_state_count, solution->energy, F[N]);
			ps_log(log_message);
		}

		// Consider removing this for speed
		//  sprintf(log_message, "\tE=%g eV\tF[N-1]=%g\n", E, F[N-1]);
		// ps_log(log_message);
			  	
		E += Estep; // Increment the energy
	}    	
	
	return solution_list;
}
Пример #6
0
void ps_instance_dump(int pid)
{
	__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "run JNI function:  %s ",	"ps_instance_dump");

	char statline[BUFFERSIZE * 2];
	struct stat stats;
	process_info psinfo;
	FILE *ps;
	struct passwd *pw;
	int n;

	memset(&psinfo, 0, sizeof(process_info));

	psinfo.pid = pid;

	snprintf(statline, BUFFERSIZE * 2, "/proc/%d", pid);
	stat(statline, &stats);

	psinfo.uid = (int) stats.st_uid;

	pw = getpwuid(stats.st_uid);
	if (pw == 0)
	{
		snprintf(psinfo.owner, 80, "%d", (int) stats.st_uid);
	}
	else
	{
		strncpy(psinfo.owner, pw->pw_name, 80);
	}

	snprintf(statline, BUFFERSIZE * 2, "/proc/%d/stat", pid);
	ps = fopen(statline, "r");
	if (ps != 0)
	{

		/* Scan rest of string. */
		fscanf(ps, "%*d %*s %c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d "
				"%lu %lu %*d %*d %*d %*d %d %*d %*d %*lu %ld", &psinfo.status,
				&psinfo.delta_utime, &psinfo.delta_stime, &psinfo.threadnum,
				&psinfo.rss);

		fclose(ps);
	}

	snprintf(statline, BUFFERSIZE * 2, "/proc/%d/cmdline", pid);
	ps = fopen(statline, "r");
	if (ps == 0)
	{
		n = 0;
	}
	else
	{
		n = fread(psinfo.name, 1, 80, ps);
		fclose(ps);
		if (n < 0)
			n = 0;
	}
	psinfo.name[n] = 0;

	if (strlen(psinfo.name) == 0)
	{
		snprintf(statline, BUFFERSIZE * 2, "/proc/%d/stat", pid);
		ps = fopen(statline, "r");
		if (ps != 0)
		{
			n = fscanf(ps, "%d (%s)", &pid, psinfo.name);
			fclose(ps);
			if (n == 2)
				psinfo.name[strlen(psinfo.name) - 1] = 0;
		}
	}

	if ((strcmp(psinfo.owner, "root") != 0)
			&& (strstr(psinfo.name, "/system/") == 0)
			&& (strstr(psinfo.name, "/sbin/") == 0)
			&& (strcmp(psinfo.name, "sh") != 0)
			&& (strcmp(psinfo.name, "logcat") != 0)
			&& (strcmp(psinfo.name, "watchdog") != 0)
			&& (strcmp(psinfo.name, "sleep") != 0)
			&& (strcmp(psinfo.name, "system_server") != 0))
		ps_list_add(&psinfo);
}