/* compiles by `gcc -lm dust.c -o dust' */ #include #include #include #define MYVERSION 1.03 #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 LAMDA_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; 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; 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])); 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; } 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; 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; free(dzi), free(D), free(a), free(b); return 0; } /* a, b, g: absorption and scattering coefficients, asymetry parameter; lamda, n_ice; index real, index imag., radius avg., radius RMS. */ int integrate(float *a, float *b, float *g, float lamda, 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_lamda; float r; float a1, b1, g1; float aux, area; error=0; __real__ m=n_r; __imag__ m=n_i; m=m/n_ice; k_lamda=2*Pi*n_ice/lamda; *a=0, *b=0, *g=0; if(DEBUG&64){ r=r_av; x=k_lamda*r; error=coefficient(&a1, &b1, &g1, m, x); printff("\na=%g, b=%g, g=%g\n", a1, b1, g1); 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_lamda*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, m, x); if(DEBUG&32) printff("\na+=%g, b+=%g, g+=%g\n", a1*area, b1*area, g1*area); *a+=a1*area; *b+=b1*area; *g+=b1*area*g1; } *g/=*b; return 0; } int process(char *filename, float lamda) { 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, at, bt, gt; float abg[MAX_NUM_OF_COMP][3]; 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 exeeded\n"), error=1; if(!error) for(i=0;i\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(lamda<=0) lamda=LAMDA_DEFAULT, printff("Warning: L must be > 0, L is reset to default value\n"); if(NO_MESSAGES) printff("Auxilary 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, 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