/* compiles by `gcc -lm dust.c -o dust' */ #include #include #include #define MYVERSION 1.04 #define Pi 3.141592653589793 #define NUM_OF_DEF 6 #define MASS_COMPONENT 5 #define K_MAX 10000000 #define MAX_NUM_OF_COMP 10 #define MAX_PARSE 10 #define MAX_LENGTH 256 #define LAMBDA_DEFAULT 550. #define MAX_LENGTH_FLINE 80 #define ICE_A 7.87e39 #define ICE_al 0.48175 #define ICE_B 8100. #define ICE_bl 6700. #define float double #define printff ZERO_MESSAGES ? : printf float SIGMA_RANGE_MINUS=3.; float SIGMA_RANGE_PLUS=7.; int MAX_STEPS=600; unsigned char INCLUDE_ICE=0; unsigned char NO_MESSAGES=0; unsigned char ZERO_MESSAGES=0; unsigned char ALLOW=0; unsigned char USE_INDEX=0; unsigned char VERBAL=0; unsigned char DEBUG=0; char fast_flag=0; float ang=0; int line_input(char *str) { int i; char ch; if(!NO_MESSAGES) printff("> "); for(i=0;iMAX_PARSE) printff("Error: lnum must not be > %i !\n", MAX_PARSE); else{ lnum=lnum_aux; for(i=0, j=0;i 0 !\n"); else if(lnum_aux>NUM_OF_DEF) printff("Error: term must not be > %i !\n", NUM_OF_DEF); else{ mass_comp=lnum_aux; printff("term changed to %i\n", mass_comp); } } else if(!strcmp(key, "mask")){ saux+=position; for(i=0;i=K_MAX){ printf("Unrecoverable error: k_max=%i1;i--) D[i-1]=i/mx-1/(D[i]+i/mx); if(DEBUG&2){ printff("\n"); for(i=k_max;i>0;i--) printff("Step %i: D=%g %gi\n", i, __real__ D[i], __imag__ D[i]); } for(i=1;i<=k_stop+1;i++){ cx_aux=D[i]/m+i/x; a[i]=(cx_aux*(__real__ dzi[i])-(__real__ dzi[i-1]))/(cx_aux*dzi[i]-dzi[i-1]); cx_aux=m*D[i]+i/x; b[i]=(cx_aux*(__real__ dzi[i])-(__real__ dzi[i-1]))/(cx_aux*dzi[i]-dzi[i-1]); } if(DEBUG&4){ printff("\n"); for(i=1;i<=k_stop+1;i++) printff("Step %i: a=%g %gi, b=%g %gi\n", i,\ __real__ a[i], __imag__ a[i], __real__ b[i], __imag__ b[i]); } if(DEBUG&8) printff("\n"); Q_ext=0, Q_sca=0, gG=0, S1=0, S2=0; for(i=1;i<=k_stop;i++){ _Q_ext=(2*i+1)*(__real__ a[i] + __real__ b[i]); _Q_sca=(2*i+1)*(__real__ (a[i]*~a[i]) + __real__ (b[i]*~b[i])); _gG=((i*(i+2.))/(i+1))*(__real__ (a[i]*~a[i+1]) + __real__ (b[i]*~b[i+1]))+\ ((2*i+1.)/(i*(i+1)))*(__real__ (a[i]*~b[i])); _S1=((2*i+1.)/(i*(i+1)))*(a[i]*pi[i]+b[i]*tu[i]); _S2=((2*i+1.)/(i*(i+1)))*(a[i]*tu[i]+b[i]*pi[i]); if(DEBUG&8) printff("Step %i: Q_ext+=%g, Q_sca+=%g, gG+=%g\n", i, _Q_ext, _Q_sca, _gG); Q_ext+=_Q_ext, Q_sca+=_Q_sca, gG+=_gG, S1+=_S1, S2+=_S2; } if(DEBUG&8) printff("Sum: Q_ext=%g, Q_sca=%g, gG=%g\n", Q_ext, Q_sca, gG); Q_ext=(2/(x*x))*Q_ext; Q_sca=(2/(x*x))*Q_sca; gG=(4/((x*x)*Q_sca))*gG; S11=(S1*~S1+S2*~S2)/(2*(x*x)*Q_sca); S11/=Pi; // required for normalization to 1; where does this come from? if(DEBUG&16) printff("Q_ext=%g, Q_sca=%g, gG=%g\n", Q_ext, Q_sca, gG); *a1=Q_ext-Q_sca, *b1=Q_sca, *g1=gG, *s11=S11; free(dzi), free(D), free(a), free(b), free(pi), free(tu); return 0; } /* a, b, g: absorption and scattering coefficients, asymmetry parameter; lambda, n_ice; index real, index imag., radius avg., radius RMS. */ int integrate(float *a, float *b, float *g, float *s, float lambda, float n_ice, float n_r, float n_i, float r_av, float r_si) { int i; int error=0; __complex__ float m; float x; float k_lambda; float r; float a1, b1, g1, s11; float aux, area; error=0; __real__ m=n_r; __imag__ m=n_i; m=m/n_ice; k_lambda=2*Pi*n_ice/lambda; *a=0, *b=0, *g=0, *s=0; if(DEBUG&64){ r=r_av; x=k_lambda*r; error=coefficient(&a1, &b1, &g1, &s11, m, x); printff("\na=%g, b=%g, g=%g, s=%g\n", a1, b1, g1/b1, s11/b1); return 0; } for(i=0;i<=MAX_STEPS;i++){ r=r_av*pow(r_si, (SIGMA_RANGE_MINUS+SIGMA_RANGE_PLUS)*i/MAX_STEPS-SIGMA_RANGE_MINUS); x=k_lambda*r; if(DEBUG){ printff("\n\nStep #%i: proceed? ", i); while(getchar()!='\n'); } area=Pi*(r*r); area*=(SIGMA_RANGE_MINUS+SIGMA_RANGE_PLUS)*log(r_si)/MAX_STEPS; if((i==0)||(i==MAX_STEPS)) area/=2; aux=log(r/r_av)/log(r_si); area*=(1/(sqrt(2*Pi)*log(r_si)))*exp(-aux*aux/2); error=coefficient(&a1, &b1, &g1, &s11, m, x); if(DEBUG&32) printff("\na+=%g, b+=%g, g+=%g, s+=%g\n", a1*area, b1*area, g1*area, s11*area); *a+=a1*area; *b+=b1*area; *g+=b1*area*g1; *s+=b1*area*s11; } *g/=*b; *s/=*b; return 0; } int process(char *filename, float lambda) { int i, j; int error=0; int num_of_comp=0; float n_ice=1., density_ice=1.; float components[MAX_NUM_OF_COMP][NUM_OF_DEF]; float indexf[5]; float a, b, g, s, at, bt, gt, st; float abg[MAX_NUM_OF_COMP][4]; float aux; char str[MAX_LENGTH_FLINE]; char ch; FILE *fp; if((fp=fopen(filename,"r"))==NULL){ printff("cannot open output file `%s', exiting\n", filename); return 1; } error=0; if(fscanf(fp, "%lf", &n_ice)!=1) error=1; if(fscanf(fp, "%lf", &density_ice)!=1) error=1; if(fscanf(fp, "%i", &num_of_comp)!=1) error=1; if(!error) if(num_of_comp<0) printff("Nothing to be done for `%s'\n", filename), error=1; if(!error) if(num_of_comp>MAX_NUM_OF_COMP) printff("Maximum allowed number of components exceeded\n"), error=1; if(!error) for(i=0;i\ts11\t\t"); if(INCLUDE_ICE) printff("b_e=b (1-g)\t"); printff("n, [nm^-3]\n"); } for(i=0;i-SR_M) SIGMA_RANGE_MINUS=SR_M, SIGMA_RANGE_PLUS=SR_P; else printff("Warning: The lower limit of integration is greater than the \ higher,\nlimits reversed to defaults\n"); if(STEPS>0) MAX_STEPS=STEPS; else printff("Warning: Number of steps zero or negative, reversing to default\n"); if(lambda<=0) lambda=LAMBDA_DEFAULT, printff("Warning: L must be > 0, L is reset to default value\n"); if(cth>=-1 && cth<=1) ang=cth; else ang=cos(ang*Pi/180); if(NO_MESSAGES) printff("Auxiliary messages will be suppressed\n"); else{ if(DEBUG) printff("Debug option %i enabled\n", DEBUG); printff("number of integration steps is %i\n", MAX_STEPS); printff("integration goes from -%g*sigma to %g*sigma\n", SIGMA_RANGE_MINUS, SIGMA_RANGE_PLUS); if(INCLUDE_ICE) printff("a_all and b_e will be shown\n"); else printff("a_all and b_e will not be shown: use option -ice\n"); if(USE_INDEX) printff("Index formulae will be used,\n\ additional information in the data file is required\n"); if(VERBAL){ printff("You will need to supply mass densities at the program prompt\n"); if(ALLOW) printff("Use of external commands will be recognized\n"); } } for(i=1;i