10000 REM******************************************************************* 10005 REM Program CSDSYNQ.BAS 10010 REM CSD Program for synthetic (computer generated) CSD's 10015 REM Written by: Ronald G. Resmini 10020 REM Department of Earth and Planetary Sciences - Igneous Petrology Group 10025 REM The Johns Hopkins University, Baltimore, Maryland 21218 10030 REM (410) 516-7034 10035 REM January 15, 2000 10040 REM******************************************************************* 10100 REM Main Processing Section 10105 REM******************************************************************* 10107 REM $DYNAMIC 10108 CLS 10109 DEFDBL A-B, D-Z 10110 GOSUB 11000 10120 GOSUB 12000 10130 GOSUB 13000 10135 GOSUB 15000 10140 GOSUB 14000 10160 GOSUB 16000 10170 GOSUB 17000 10190 GOSUB 18000 10200 GOSUB 19000 10250 GOSUB 20000 10300 REM****************************************************************** 10500 STOP 10505 REM****************************************************************** 10510 REM****************************************************************** 10515 REM Subroutines and Procedures Section 10520 REM****************************************************************** 11000 REM Procedure to obtain user input values(s): 11010 PRINT "Procedure to obtain user input values - lines 11000 to 11555 " 11015 PRINT 11020 INPUT " Enter the name of the CSD file to be processed: ", IN.FILE$ 11025 PRINT 11030 INPUT " Enter the name of the output file: ", OUT.FILE$ 11035 PRINT 11050 INPUT " Enter the number of intervals: ", INTERVALS 11070 PRINT 11075 INPUT " Enter the name of the regression I/P file: ", REG.FILE$ 11080 PRINT 11085 INPUT " Enter the number of data points: ", I 11555 RETURN 11770 REM****************************************************************** 12000 REM Procedure to open I/P file and input the raw CSD data: 12060 PRINT "Procedure to input raw CSD data - lines 12000 to 12530 " 12063 DIM CSD.NUM(11320), CSD.SIZE(11320) 12065 OPEN IN.FILE$ FOR INPUT AS #1 12070 REM 12110 FOR z = 1 TO I 12220 INPUT #1, CSD.SIZE(z), CSD.NUM(z) 12222 CSD.SIZE(z) = 2! * CSD.SIZE(z) * 100! 12223 CSD.NUM(z) = (CSD.NUM(z) / 15625!) 12224 REM CSD.NUM(z) = INT(CSD.NUM(z) / 15625!) 12225 REM PRINT z, CSD.SIZE(z), CSD.NUM(z) 12520 NEXT z 12525 CLOSE #1 12530 RETURN 12535 REM****************************************************************** 13000 REM Procedure to find the largest crystal size: 13020 PRINT "Procedure to find largest crystal size - line 13000 to 13050 " 13025 LARGEST = CSD.SIZE(1) 13030 FOR J = 2 TO I 13035 IF CSD.SIZE(J) > LARGEST THEN LARGEST = CSD.SIZE(J) 13040 NEXT J 13050 RETURN 13055 REM****************************************************************** 14000 REM Procedure to build the 1-D main crystal-size processing array: 14015 PRINT "Procedure to build main CSD array - lines 14000 to 14200 " 14020 DIM CSD(INTERVALS), CSD.SIZE.MAIN(INTERVALS) 14025 SIZE.STEP = LARGEST / INTERVALS 14030 CSD(0) = TOTAL 14033 CSD.SIZE.MAIN(0) = 0! 14035 LOW.SIZE = 0! 14040 HIGH.SIZE = LOW.SIZE + SIZE.STEP 14050 FOR J = 1 TO INTERVALS 14055 PRINT "Hi: "; HIGH.SIZE, "Lo: "; LOW.SIZE 14060 FOR K = 1 TO I 14070 IF (CSD.SIZE(K) > LOW.SIZE) AND (CSD.SIZE(K) <= HIGH.SIZE) THEN CSD(J) = CSD(J) + CSD.NUM(K) 14075 NEXT K 14077 CSD.SIZE.MAIN(J) = HIGH.SIZE 14080 LOW.SIZE = LOW.SIZE + SIZE.STEP 14090 HIGH.SIZE = HIGH.SIZE + SIZE.STEP 14095 NEXT J 14100 FOR J = 1 TO (INTERVALS - 1) 14110 CSD(J) = CSD(J - 1) - CSD(J) 14115 NEXT J 14120 CSD(INTERVALS) = 0! 14200 RETURN 14210 REM******************************************************************* 15000 REM Procedure to fing total number of crystals 15020 PRINT "Procedure to find total crystals - lines 15000 - 15070 " 15030 TOTAL = 0! 15040 FOR J = 1 TO I 15050 TOTAL = TOTAL + CSD.NUM(J) 15060 NEXT J 15070 RETURN 15900 REM******************************************************************* 16000 REM Procedure to calculate the slope: 16020 PRINT "Procedure to calculate slope - lines 16000 to 16060 " 16030 DIM SLOPE(INTERVALS) 16035 SLOPE(0) = 0! 16040 FOR J = 1 TO (INTERVALS - 1) 16050 SLOPE(J) = ((CSD(J - 1) - CSD(J + 1)) / (2 * SIZE.STEP)) 16055 NEXT J 16057 SLOPE(INTERVALS) = 0! 16060 RETURN 16070 REM******************************************************************* 17000 REM Procedure to calculate the ln(n): 17020 PRINT "Procedure to calculate ln(n) - lines 17000 to 17060 " 17030 DIM CSD.LN(INTERVALS) 17040 FOR J = 0 TO INTERVALS 17050 IF (SLOPE(J) > 0!) THEN CSD.LN(J) = LOG(SLOPE(J)) ELSE CSD.LN(J) = 0! 17055 NEXT J 17060 RETURN 17070 REM******************************************************************* 18000 REM Procedure to write output file: 18020 PRINT "Procedure to write output file - lines 18000 to 18580 " 18030 OPEN OUT.FILE$ FOR OUTPUT AS #1 18040 FOR J = 0 TO INTERVALS 18050 PRINT #1, USING "####.#######^^^^"; CSD.SIZE.MAIN(J); 18055 PRINT #1, CHR$(9); 18060 PRINT #1, " , "; 18063 PRINT #1, CHR$(9); 18065 PRINT #1, USING "#####.######^^^^"; CSD(J); 18067 PRINT #1, CHR$(9); 18070 PRINT #1, " , "; 18073 PRINT #1, CHR$(9); 18085 PRINT #1, USING "#####.######^^^^"; SLOPE(J); 18087 PRINT #1, CHR$(9); 18090 PRINT #1, " , "; 18093 PRINT #1, CHR$(9); 18095 PRINT #1, USING "#####.######^^^^"; CSD.LN(J) 18560 NEXT J 18570 CLOSE #1 18580 RETURN 18590 REM******************************************************************* 19000 REM Procedure to build regression arrays: 19020 PRINT "Procedure to build regression arrays - lines 19000 to 19580 " 19025 DIM DATA.X(INTERVALS), DATA.Y(INTERVALS) 19035 NUMOFDATA = 0 19040 FOR J = 0 TO INTERVALS 19045 IF (CSD.SIZE(J) = 0!) OR (CSD.LN(J) = 0!) THEN 19560 19047 NUMOFDATA = NUMOFDATA + 1 19050 DATA.X(NUMOFDATA) = CSD.SIZE.MAIN(J) 19095 DATA.Y(NUMOFDATA) = CSD.LN(J) 19560 NEXT J 19580 RETURN 19590 REM******************************************************************* 20000 REM Procedure to perform the regression analysis: 20020 PRINT "Procedure to perform regression - lines 20000 to 23300 " 20500 OPEN REG.FILE$ FOR OUTPUT AS #1 20800 REM Perform the regression analysis: 20900 SUM.X = 0! 21000 SUM.Y = 0! 21100 FOR J = 1 TO NUMOFDATA 21200 SUM.X = SUM.X + DATA.X(J) 21300 SUM.Y = SUM.Y + DATA.Y(J) 21400 NEXT J 21500 AVERAGE.X = SUM.X / NUMOFDATA 21600 AVERAGE.Y = SUM.Y / NUMOFDATA 21700 SUM.SQUARED.X.X = 0! 21800 SUM.SQUARED.X.Y = 0! 21900 FOR J = 1 TO NUMOFDATA 22000 SUM.SQUARED.X.X = SUM.SQUARED.X.X + ((DATA.X(J) - AVERAGE.X) ^ 2) 22100 SUM.SQUARED.X.Y = SUM.SQUARED.X.Y + ((DATA.X(J) - AVERAGE.X) * (DATA.Y(J) - AVERAGE.Y)) 22200 NEXT J 22300 SLOPE = SUM.SQUARED.X.Y / SUM.SQUARED.X.X 22400 INTERCEPT = AVERAGE.Y - (SLOPE * AVERAGE.X) 22500 REM 22700 FOR J = 1 TO NUMOFDATA 22900 PRINT #1, USING "#####.#####^^^^"; DATA.X(J); 22905 PRINT #1, CHR$(9); 22910 PRINT #1, " , "; 22913 PRINT #1, CHR$(9); 22915 PRINT #1, USING "#####.#####^^^^"; DATA.Y(J) 23000 NEXT J 23010 PRINT #1, 23015 PRINT #1, USING "#####.#####^^^^"; SLOPE 23020 PRINT #1, 23025 PRINT #1, USING "#####.#####^^^^"; INTERCEPT 23100 CLOSE #1 23300 RETURN 23350 REM********************************************************************