147 lines
3.7 KiB
Plaintext
147 lines
3.7 KiB
Plaintext
|
#version 430 core
|
||
|
|
||
|
#define PI 3.14159265359
|
||
|
|
||
|
layout(local_size_x = 8, local_size_y = 8) in;
|
||
|
|
||
|
layout(rgba32f) uniform image2D img_output;
|
||
|
|
||
|
uniform int width;
|
||
|
uniform int height;
|
||
|
|
||
|
uniform int quantum_n;
|
||
|
uniform int quantum_l;
|
||
|
uniform int quantum_m;
|
||
|
|
||
|
uniform float u_phi = 0;
|
||
|
//vec4 base_color = vec4(1);
|
||
|
vec4 base_color = vec4(209, 227, 255, 255) / 255.0f;
|
||
|
|
||
|
const double a0 = 5.29177210903e-11;
|
||
|
const double h = 6.582119569e-16;
|
||
|
const double mq = 9.10938356e-31;
|
||
|
const double e = 8.8541878128e-12;
|
||
|
const double q = 1.60217662e-19;
|
||
|
|
||
|
int factorial(int n){
|
||
|
int res = 1;
|
||
|
for(int i = 2; i <= n; i++){
|
||
|
res *= i;
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
double laguerre(double x, int n, double a){
|
||
|
if(n == 1)
|
||
|
return 1 + a - x;
|
||
|
else
|
||
|
return 1;
|
||
|
}
|
||
|
double harmonics(double theta, double phi){
|
||
|
double res = 1;
|
||
|
|
||
|
if(quantum_m == 0 && quantum_l == 2){
|
||
|
res *= 0.25;
|
||
|
res *= sqrt(5.0/PI);
|
||
|
res *= (3 * pow(cos(float(theta)), 2) - 1);
|
||
|
}else if(quantum_m == 1 && quantum_l == 2){
|
||
|
res *= 0.5;
|
||
|
res *= sqrt(15.0/PI);
|
||
|
res *= sin(float(theta)) * cos(float(phi)) * cos(float(theta));
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
double wave_function(double r, double theta, double phi){
|
||
|
double p1 = pow(float(2/(quantum_n*a0)),3);
|
||
|
double p21 = factorial(quantum_n-quantum_l-1);
|
||
|
double p22 = (2 * quantum_n * factorial(quantum_n+quantum_l));
|
||
|
double root = sqrt(p1 * (p21/p22));
|
||
|
|
||
|
double exponent = exp(float(-r/(quantum_n*a0)));
|
||
|
|
||
|
double p3 = pow(float((2 * r)/(quantum_n * a0)), quantum_l);
|
||
|
|
||
|
double lag = laguerre((2 * r)/(quantum_n * a0), quantum_n - quantum_l - 1, 2 * quantum_l + 1);
|
||
|
|
||
|
double Y = harmonics(theta, phi);
|
||
|
|
||
|
double wave = exponent * root * p3 * lag * Y;
|
||
|
//return root / 2e13 + (quantum_n+quantum_l+quantum_m+ r) * 0.000001f;
|
||
|
//return wave / 1e14;
|
||
|
//return (wave * wave) / 2.28e27;
|
||
|
return (wave * wave) / 1e27;
|
||
|
//return (sin(float(r/sqrt(2)) * 10) + 1.0) * 0.5 + (quantum_n+quantum_l+quantum_m) * 0.000001f;
|
||
|
}
|
||
|
|
||
|
vec4 heatmap(float x){
|
||
|
vec4 colors[6];
|
||
|
|
||
|
colors[0] = vec4(0);
|
||
|
colors[1] = vec4(58, 20, 78, 255) / 255.0f;
|
||
|
colors[2] = vec4(148, 50, 99, 255) / 255.0f;
|
||
|
colors[3] = vec4(249, 114, 13, 255) / 255.0f;
|
||
|
colors[4] = vec4(255, 198, 76, 255) / 255.0f;
|
||
|
colors[5] = vec4(1);
|
||
|
|
||
|
colors[0].w = 0.0f;
|
||
|
colors[1].w = 0.1f;
|
||
|
colors[2].w = 0.25f;
|
||
|
colors[3].w = 0.5f;
|
||
|
colors[4].w = 0.75f;
|
||
|
colors[5].w = 1.0f;
|
||
|
|
||
|
int index = -1;
|
||
|
for(int i = 1; i < 6; i++){
|
||
|
if(x <= colors[i].w){
|
||
|
index = i;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
vec4 res;
|
||
|
if(index != -1){
|
||
|
float range = colors[index].w - colors[index - 1].w;
|
||
|
res = mix(colors[index - 1], colors[index], (x - colors[index - 1].w)/range);
|
||
|
}else
|
||
|
res = colors[5];
|
||
|
res.w = 1;
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
void main(){
|
||
|
ivec2 id = ivec2(gl_GlobalInvocationID.xy);
|
||
|
|
||
|
vec2 offset = vec2(0.0f, 0.0f);
|
||
|
|
||
|
float x;
|
||
|
float y;
|
||
|
|
||
|
// map x,y to [-1,1]
|
||
|
x = ((((float(id.x) - 0.5f + offset.x)/float(width))) - 0.5f) * 2.0f;
|
||
|
y = ((((float(id.y) - 0.5f + offset.y)/float(height))) - 0.5f) * 2.0f;
|
||
|
|
||
|
double raw_r = sqrt(pow(x, 2) + pow(y, 2));
|
||
|
double r = raw_r * 35 * a0;
|
||
|
double theta = acos(float(y/raw_r));
|
||
|
float phi = u_phi;
|
||
|
|
||
|
vec4 base_color = vec4(0);
|
||
|
|
||
|
vec4 max_color = vec4(1);
|
||
|
|
||
|
// double n_ang ;
|
||
|
|
||
|
// if(x > 0){
|
||
|
// n_ang = mod(theta + phi, PI);
|
||
|
// }else
|
||
|
// n_ang = mod(theta - phi, PI);
|
||
|
|
||
|
float val = 4.0f * float(wave_function(r, theta, phi));
|
||
|
//val = 1 - exp(-1 * val * 5);
|
||
|
|
||
|
//vec4 pixel = mix(base_color, max_color, val);
|
||
|
vec4 pixel = heatmap(val);
|
||
|
|
||
|
imageStore(img_output, id, pixel);
|
||
|
//imageStore(img_output, id, heatmap(float(raw_r)));
|
||
|
}
|