/* ISOTOPE2PRECISE4.CGI */ /* Author: Jeffrey Lee Date: 6/30/00 Modified: 1/3/03 by Mike Verkouteren (new d18O value assignments for RMs 8562-8564) (R18 value of VPDB-CO2 now fixed at 0.002088349077) (Calculation of eta values) (Santrock parameters made more obvious) (Other non-substantive changes to improve clarity) */ #include #include #include "../cgic/cgic.h" /* Globals */ #define MAX_ARRAY 10 /* For Multi-Dimensional Arrays */ /* Number of Inputs from Web Page */ #define MAX_FIELDS 17 /* Maximum Error-Checking Fields */ #define MAX_SPECIAL 3 /* Maximum Special Error-Checking Fields */ #define MAX_OPTION 1 /* Optional Fields */ #define MAX_CSTRINGS 5 /* (VPDB-IAEA, VSMOW-Santrock, Oxygen-Nier, VSMOW-Li, User Defined) */ #define MAX_RMSTRINGS 5 /* (NBS-19-CO2, RM8562, RM8563, RM8564, User Defined) */ #define MAX_BOUNDS 5 /* Number of Bounded Input Values */ /* Constants */ #define MAX_A 5 /* Number of "a" Constants - (0.5, 0.516, 0.52, 0.528, User Defined) */ #define ALPHA 1.01025 #define ITERATION 20 /* Number of Iterations for loop in do_algorithm() */ /* Table of Constant Definitions */ #define CONSTANTS_R 5 /* Number of Constants in Constant Array */ #define VPDB_ 0 /* Same as the above VPDB_C Row */ #define CRAIG 1 #define NIER 2 #define VSMOW 3 #define USER_D 4 #define CONSTANTS_C 3 /* Initial Three Constants */ #define S13 0 #define S17 1 #define S18 2 /* CGI Values */ #define CGI_VALS_R 21 #define A_INDEX 0 #define A 1 #define ABS_O 2 #define O_S17 3 #define O_S18 4 /* Ref2 CGI Values */ #define REF_MAT0 5 #define REF_MAT1 6 #define REF1_D13 7 #define REF1_D18 8 #define REF1_D45 9 #define REF1_D46 10 #define REF1_D47 11 /* Special CGI Value */ /* Ref2 CGI Values */ #define REF2_D13 12 #define REF2_D18 13 #define REF2_D45 14 #define REF2_D46 15 #define REF2_D47 16 /* Special CGI Value */ /* Sample CGI Values */ #define SAM_D45 17 #define SAM_D46 18 #define SAM_D47 19 /* Special CGI Value */ /* Extra CGI Values */ #define K 20 /* Reference Array Definitions */ #define REF_C 4 /* Reference Array Columns*/ #define REF1 0 #define VPDB 1 /* Not in Excel, but Needed for Calculations */ #define VPDBC 2 #define REF2 3 #define REF_R 9 /* Reference Array Rows */ #define R13 0 #define R18 1 #define R17 2 #define R45 3 #define R46 4 #define R47 5 #define D45VC 6 #define D46VC 7 #define D47VC 8 /* Sample Array Definitions */ #define SAM_C 8 /* Sample Columns */ #define S_R1 0 #define S_R1V 1 #define S_R2 2 #define S_R2V 3 #define S_R2_vV 4 #define S_WMG1 5 /* WMG Reference Values */ #define S_WMG2 6 #define S_WMGS 7 #define SAM_R 6 /* Sample Rows */ #define S_D45 0 #define S_D46 1 #define S_D47 2 #define S_R45 3 #define S_R46 4 #define S_R47 5 /* Re-Use of Columns Above, for S_R4x Rows */ #define S_NORM S_R1V /* Same Space as S_R1V */ #define S_R2R1 S_R2V /* Same Space as S_R2V */ /* Re-Use of Rows Above, for S_R2_vV Column */ #define R2_VR45 0 #define R2_VR46 1 #define R2_VR47 2 /* Iteration Array Definitions */ #define ITER_C 7 #define I_R1 0 #define I_R2 1 #define I_R2R1 2 #define I_NORM 3 #define I_WMG1 4 /* WMG Values */ #define I_WMG2 5 #define I_WMGS 6 #define ITER_R 13 #define I_R18 0 #define I_A 1 #define I_B 2 #define I_C 3 #define I_R17 4 #define I_R13 5 #define I_R47 6 #define I_dV_R18 7 #define I_dV_R13 8 #define I_dV_R47 9 #define I_dVPDBC 10 #define I_dVSMOW 11 #define I_dVSMOWC 12 /* Delta47 Values */ #define DEL47_R 6 #define D_R1_WMG 0 #define D_R2_WMG 1 #define D_SAM_WMG 2 #define D_R1_R2 3 #define D_SAM_R1 4 #define D_SAM_R2 5 /* Error Variables */ /* Array to contain Error code string names */ char rstrings[MAX_FIELDS+MAX_SPECIAL][150] = { "  Oxygen Isotope Relationship Constant", "  User Defined Oxygen Isotope Relationship Constant", "  Absolute Oxygen Isotope Abundance", "  User Defined Absolute Oxygen Isotope R17 Value", "  User Defined Absolute Oxygen Isotope R18 Value", "  Reference Material 1", "  Reference Material 2", "  d-45 RM-1 vs. Working Gas (‰)", "  d-46 RM-1 vs. Working Gas (‰)", "  d-45 Sample vs. Working Gas (‰)", "  d-46 Sample vs. Working Gas (‰)", "  d-13 RM-1 (‰)", "  d-18 RM-1 (‰)", /* Extra Values */ "  d-13 RM-2 (‰)", "  d-18 RM-2 (‰)", "  d-45 RM-2 vs. Working Gas (‰)", "  d-46 RM-2 vs. Working Gas (‰)", /* Special Values */ "  d-47 RM-1 vs. Working Gas (‰)", "  d-47 RM-2 vs. Working Gas (‰)", "  d-47 Sample vs. Working Gas (‰)" }; char cstrings[MAX_CSTRINGS][20] = { "VPDB-IAEA", "VSMOW-Santrock", "Oxygen-Nier", "VSMOW-Li", "User Defined" }; char rmstrings[MAX_RMSTRINGS][30] = { "NBS-19-CO2", "RM8562", "RM8563", "RM8564", "User Defined" }; /* Array for Out of Bounds String Names */ char bstrings[MAX_BOUNDS][100] = { "  Oxygen Isotope Relationship Constant Must Be Between 0 and 1", "  Absolute Oxygen Isotope Values Must be Greater than 0", "  R-45 Values of RM-1 and RM-2 Cannot be Equal", "  R-46 Values of RM-1 and RM-2 Cannot be Equal", "  Sample Data Input are Generating Invalid delta values" }; /* Keep Results to Complain for Missing Fields */ /* Array of Filled Field Results */ int results[MAX_FIELDS+MAX_SPECIAL+MAX_OPTION]; /* Array of Errors */ int errors[MAX_FIELDS+MAX_SPECIAL]; /* Array of Out of Bounds Errors */ int out_Bounds[MAX_BOUNDS]; int is_Error = 0; int is_Special = 0; /* Flag if Web Page is Special */ /* Optional Variables */ char sam_name[20]; /* Array for "a" Values */ double a_array[MAX_A] = {0.5, 0.516, 0.52, 0.528, 0}; /* Constants */ double constants[CONSTANTS_R][CONSTANTS_C] = { {0.011237200000, 0.000378866601, 0.002067160680}, {0.0, 0.00040232610, 0.002005200000}, {0.0, 0.00037750000, 0.0020515000}, {0.0, 0.000379900000, 0.002005200000}, {0.0, 0.0, 0.0} }; /* Variable Arrays */ double cgi_vals[CGI_VALS_R]; double ref_array[REF_C][REF_R]; double sam_array[SAM_C][SAM_R]; double iter_array[ITER_C][ITER_R]; double del47_array[DEL47_R]; /* Selection Variables */ int p_choice = 0; /* Function Declaractions */ void calc_delta47(void); void do_algorithm(double sam[], double iter[]); void do_wrg_algorithm(double sam[], double iter[]); void error_check(void); void fill_array(void); void fill_iter(void); void fill_sam(void); void fill_wrg(void); void fill_wrg_iter(void); void init_array(double a[], int max); void init_arrays(void); void main_func(void); void print_array(char* name, double a[], int start, int max); void print_intro(void); void print_end(void); void print_error(void); void print_results(void); void print_results1(void); void print_results2(void); void print_special_page(void); void print_special_results1(void); void print_special_results2(void); void read_cgi(void); void test_print(void); /* Main CGI Procedure */ int cgiMain() { /* Output MIME header */ cgiHeaderContentType("text/html"); /* Print HTML */ print_intro(); /* Perform Initializations */ init_arrays(); /* Gather CGI Form Data */ read_cgi(); /* Perform Main Function */ main_func(); /* test_print(); */ /* Print Ending HTML */ print_end(); return 0; } /* HTML Printing Functions */ /* Print Intro. Page */ void print_intro(void) { /* Start HTML document */ fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "

NIST Interactive Algorithm for Isotopic CO2 Measurements

\n"); /* Print out Javascript Code */ fprintf(cgiOut, "\n\n"); /* Print Web Page Code */ fprintf(cgiOut, "\n"); } /* Print Ending Footer */ void print_end(void) { fprintf(cgiOut, "


\n"); fprintf(cgiOut, "
Please send questions on this topic to the "); fprintf(cgiOut, "Webmaster
\n"); fprintf(cgiOut, "\n"); } /* Print Errors in Page */ void print_error(void) { int i; fprintf(cgiOut, "

Please fill out all the required fields

\n"); fprintf(cgiOut, "

These fields are missing:

\n"); for (i = 0; i < MAX_FIELDS; i++) { if (errors[i]) fprintf(cgiOut, "

%s

\n", rstrings[i]); } /* Print Possible Special Errors */ if (is_Special) { for (i = MAX_FIELDS; i < MAX_FIELDS+MAX_SPECIAL; i++) { if (errors[i]) fprintf(cgiOut, "

%s

\n", rstrings[i]); } } fprintf(cgiOut, "

Please return to the previous page, fill in the missing "); fprintf(cgiOut, "entries and try again.

\n"); fprintf(cgiOut, "

To return, press the \"Back\" button on your browser

\n"); } /* Print Results Section */ void print_results(void) { fprintf(cgiOut, "

Standardized Results of Calculations

\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "

Calculated delta values for"); if (results[20] == cgiFormSuccess) fprintf(cgiOut, " %s: ", sam_name); else fprintf(cgiOut, " Sample"); fprintf(cgiOut, "   (* All delta and eta values are per mill - ‰)

\n"); /* Print for Two Reference */ if (p_choice) { print_results2(); } /* Or Print for One Reference */ else { print_results1(); } /* Print Rest of Tables */ fprintf(cgiOut, "\n"); fprintf(cgiOut, "

High precisions are reported for convenience, although they may not be justified by measurement uncertainties.\n"); fprintf(cgiOut, "


Based on:\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n"); if (!p_choice) fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[A]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cstrings[(int)cgi_vals[ABS_O]]); fprintf(cgiOut, " \n", cgi_vals[O_S17]); fprintf(cgiOut, " \n", cgi_vals[O_S18]); fprintf(cgiOut, " \n"); fprintf(cgiOut, "
  One Point Realization of VPDB Scale
  Oxygen Isotope Relationship Constant = %.3f
  Absolute Oxygen Isotope Abundance: \"%s\"S-17 = %.10f,S-18 = %.10f
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n", rmstrings[(int)cgi_vals[REF_MAT0]]); fprintf(cgiOut, " \n", cgi_vals[REF1_D13]); fprintf(cgiOut, " \n", (cgi_vals[REF1_D18] - 10.25) / 1.01025); fprintf(cgiOut, "\n"); if (p_choice) { fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n", rmstrings[(int)cgi_vals[REF_MAT1]]); fprintf(cgiOut, " \n", cgi_vals[REF2_D13]); fprintf(cgiOut, " \n", (cgi_vals[REF2_D18] - 10.25) / 1.01025); fprintf(cgiOut, "\n"); } fprintf(cgiOut, "
d-13 (vs. VPDB)d-18 (vs. VPDB-CO2)
  Reference 1 Values: \"%s\"%.4f%.4f
  Reference 2 Values: \"%s\"%.4f%.4f
\n"); fprintf(cgiOut, "

To submit more values for calculation, press the \"Back\" button on your \n"); fprintf(cgiOut, "browser and enter new values.

\n"); } /* Print Results for One Reference Section */ void print_results1(void) { fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF1][D45VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D45]); fprintf(cgiOut, " \n", cgi_vals[SAM_D45]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R1V][S_D45]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF1][D46VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D46]); fprintf(cgiOut, " \n", cgi_vals[SAM_D46]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R1V][S_D46]); fprintf(cgiOut, " \n"); /* Possibly Print Special Section */ if (is_Special) { print_special_results1(); } fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D13]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", iter_array[I_R1][I_dV_R13]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (cgi_vals[REF1_D18] - 10.25) / ALPHA); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", iter_array[I_R1][I_dVPDBC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref.
vs.
WMG
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Sam
vs.
WMG
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
 
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref.
vs.
VPDB-CO"); fprintf(cgiOut, "2
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Sam
vs.
VPDB-CO"); fprintf(cgiOut, "2
\n"); fprintf(cgiOut, "
 d45-Ref.   %.3f 
 d45-Obs.%.3f%.3f  %.3f
      
 d46-Ref.   %.3f 
 d46-Obs.%.3f%.3f  %.3f
      
 d13-Ref.   %.3f 
 d13-Obs.    %.3f
      
 d18-Ref.   %.3f 
 d18-Obs.    %.3f
\n"); } /* Print Results for Two References Section */ void print_results2(void) { fprintf(cgiOut, "\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF1][D45VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF2][D45VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D45]); fprintf(cgiOut, " \n", cgi_vals[REF2_D45]); fprintf(cgiOut, " \n", cgi_vals[SAM_D45]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R1V][S_D45]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R2_vV][R2_VR45]); fprintf(cgiOut, " \n", ref_array[REF1][D45VC] + ((cgi_vals[SAM_D45] - cgi_vals[REF1_D45]) / (cgi_vals[REF2_D45] - cgi_vals[REF1_D45])) * (ref_array[REF2][D45VC] - ref_array[REF1][D45VC])); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF2][D45VC] - sam_array[S_R2_vV][R2_VR45]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (ref_array[REF2][D45VC] - sam_array[S_R2_vV][R2_VR45]) / (ref_array[REF2][D45VC] / 1000 * (2 + sam_array[S_R2_vV][R2_VR45] / 1000))); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF1][D46VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF2][D46VC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D46]); fprintf(cgiOut, " \n", cgi_vals[REF2_D46]); fprintf(cgiOut, " \n", cgi_vals[SAM_D46]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R1V][S_D46]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", sam_array[S_R2_vV][R2_VR46]); fprintf(cgiOut, " \n", ref_array[REF1][D46VC] + ((cgi_vals[SAM_D46] - cgi_vals[REF1_D46]) / (cgi_vals[REF2_D46] - cgi_vals[REF1_D46])) * (ref_array[REF2][D46VC] - ref_array[REF1][D46VC])); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", ref_array[REF2][D46VC] - sam_array[S_R2_vV][R2_VR46]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (ref_array[REF2][D46VC] - sam_array[S_R2_vV][R2_VR46]) / (ref_array[REF2][D46VC] / 1000 * (2 + sam_array[S_R2_vV][R2_VR46] / 1000))); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); /* Possibly Print Special Section */ if (is_Special) { print_special_results2(); } fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF1_D13]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", cgi_vals[REF2_D13]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", iter_array[I_R1][I_dV_R13]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", iter_array[I_R2R1][I_dV_R13]); fprintf(cgiOut, " \n", cgi_vals[REF1_D13] + ((iter_array[I_R1][I_dV_R13] - cgi_vals[REF1_D13]) / (iter_array[I_R2R1][I_dV_R13] - cgi_vals[REF1_D13])) * (cgi_vals[REF2_D13] - cgi_vals[REF1_D13])); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (cgi_vals[REF1_D18] - 10.25) / ALPHA); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (cgi_vals[REF2_D18] - 10.25) / ALPHA); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", iter_array[I_R1][I_dVPDBC]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n", (iter_array[I_R2R1][I_dV_R18] - 10.25) / ALPHA); fprintf(cgiOut, " \n", ((cgi_vals[REF1_D18] - 10.25) / ALPHA) + ((iter_array[I_R1][I_dVPDBC] - ((cgi_vals[REF1_D18] - 10.25) / ALPHA)) / (((iter_array[I_R2R1][I_dV_R18] - 10.25) / ALPHA) - ((cgi_vals[REF1_D18] - 10.25) / ALPHA))) * (((cgi_vals[REF2_D18] - 10.25) / ALPHA) - ((cgi_vals[REF1_D18] - 10.25) / ALPHA))); fprintf(cgiOut, " \n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref. 1
vs.
WMG
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref. 2
vs.
WMG
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Sam
vs.
WMG
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
 
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref. 1
vs.
VPDB-CO2
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Sam
vs.
VPDB-CO2
(via Ref. 1)
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
 
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Ref. 2
vs.
VPDB-CO2
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
Sam
vs.
VPDB-CO2
(norm)
\n"); fprintf(cgiOut, "
 d45-Ref.    %.3f  %.3f 
 d45-Obs.%.3f%.3f%.3f  %.3f %.3f%.3f
 d45-Diff.       %.3f 
 eta-45       %.4f 
          
 d46-Ref.    %.3f  %.3f 
 d46-Obs.%.3f%.3f%.3f  %.3f %.3f%.3f
 d46-Diff.       %.3f 
 eta-46       %.4f 
          
 d13-Ref.    %.3f  %.3f 
 d13-Obs.     %.3f %.3f%.3f
          
 d18-Ref.    %.3f  %.3f 
 d18-Obs.     %.3f %.3f%.3f
\n"); } /* Print Out Special Page */ void print_special_page(void) { fprintf(cgiOut, "
\n"); fprintf(cgiOut, "

SPECIAL Calculation Page:

\n"); fprintf(cgiOut, "

Fill in the Following Values:

\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n
\n"); fprintf(cgiOut, "Oxygen Isotopeper mill Relationship Constant:\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "(0.5: IAEA Recommendation)
\n"); fprintf(cgiOut, "Basis for Absolute Oxygen Isotope Abundance Value:\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
S-17

\n"); fprintf(cgiOut, "

S-18

\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "RM-1
To Realize VPDB Scale:
\n"); fprintf(cgiOut, "\n
d-13
\n"); fprintf(cgiOut, "

d-18
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "RM-2
To Normalize VPDB Scale:
\n"); fprintf(cgiOut, "\n
\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n\n"); fprintf(cgiOut, "

d-45

d-46

d-47
RM-1 vs. Working Gas (‰)
RM-2 vs. Working Gas (‰)
Sample vs. Working Gas (‰)
 
Optional - Sample Name:
(Max 15 Chars)
 

\n\n"); fprintf(cgiOut, "     \n"); fprintf(cgiOut, "\n

\n
\n\n"); } /* Print Special Results for One References Section */ void print_special_results1(void) { fprintf(cgiOut, " \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Ref.\n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ref_array[REF1][D47VC]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Ref. (Meas)\n"); fprintf(cgiOut, " %.3f\n", del47_array[D_R1_WMG]); fprintf(cgiOut, " %.3f\n", del47_array[D_SAM_WMG]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", (iter_array[I_R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Obs.\n"); fprintf(cgiOut, " %.3f\n", cgi_vals[REF1_D47]); fprintf(cgiOut, " %.3f\n", cgi_vals[SAM_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", sam_array[S_R1V][S_D47]); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Diff.\n"); fprintf(cgiOut, " %.3f\n", del47_array[D_R1_WMG] - cgi_vals[REF1_D47]); fprintf(cgiOut, " %.3f\n", del47_array[D_SAM_WMG] - cgi_vals[SAM_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ((iter_array[I_R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0) - sam_array[S_R1V][S_D47]); fprintf(cgiOut, " \n"); } /* Print Special Results for Two References Section */ void print_special_results2(void) { fprintf(cgiOut, " \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Ref.\n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ref_array[REF1][D47VC]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ref_array[REF2][D47VC]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Ref. (Meas)\n"); fprintf(cgiOut, " %.3f\n", del47_array[D_R1_WMG]); fprintf(cgiOut, " %.3f\n", del47_array[D_R2_WMG]); fprintf(cgiOut, " %.3f\n", del47_array[D_SAM_WMG]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", (iter_array[I_R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", (iter_array[I_R2R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Obs.\n"); fprintf(cgiOut, " %.3f\n", cgi_vals[REF1_D47]); fprintf(cgiOut, " %.3f\n", cgi_vals[REF2_D47]); fprintf(cgiOut, " %.3f\n", cgi_vals[SAM_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", sam_array[S_R1V][S_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", sam_array[S_R2_vV][R2_VR47]); fprintf(cgiOut, " %.3f\n", ref_array[REF1][D47VC] + ((cgi_vals[SAM_D47] - cgi_vals[REF1_D47]) / (cgi_vals[REF2_D47] - cgi_vals[REF1_D47])) * (ref_array[REF2][D47VC] - ref_array[REF1][D47VC])); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  d47-Diff.\n"); fprintf(cgiOut, " %.3f\n", del47_array[D_R1_WMG] - cgi_vals[REF1_D47]); fprintf(cgiOut, " %.3f\n", del47_array[D_R2_WMG] - cgi_vals[REF2_D47]); fprintf(cgiOut, " %.3f\n", del47_array[D_SAM_WMG] - cgi_vals[SAM_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ((iter_array[I_R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0) - sam_array[S_R1V][S_D47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.3f\n", ((iter_array[I_R2R1][I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0) - sam_array[S_R2_vV][R2_VR47]); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "  eta-47\n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " %.4f\n", (ref_array[REF2][D47VC] - sam_array[S_R2_vV][R2_VR47]) / (ref_array[REF2][D47VC] / 1000 * (2 + sam_array[S_R2_vV][R2_VR47] / 1000))); fprintf(cgiOut, "  \n"); fprintf(cgiOut, " \n"); } /* CGI Functions */ /* Read in CGI Form Data & Error-Check */ void read_cgi(void) { int i; cgiFormIntegerBounded("PageChoice", &p_choice, 0, 1, 0); results[0] = cgiFormDouble("a", &cgi_vals[A_INDEX], -1.0); results[1] = cgiFormDouble("AVal", &cgi_vals[A], -1.0); results[2] = cgiFormDouble("AbsoluteO", &cgi_vals[ABS_O], -1.0); results[3] = cgiFormDouble("OxyVal17", &cgi_vals[O_S17], -1.0); results[4] = cgiFormDouble("OxyVal18", &cgi_vals[O_S18], -1.0); results[5] = cgiFormDouble("RefMat0", &cgi_vals[REF_MAT0], -1.0); results[6] = cgiFormDouble("RefMat1", &cgi_vals[REF_MAT1], -1.0); results[7] = cgiFormDouble("DEL45NBS191", &cgi_vals[REF1_D45], -1.0); results[8] = cgiFormDouble("DEL46NBS191", &cgi_vals[REF1_D46], -1.0); results[9] = cgiFormDouble("DEL45SAM", &cgi_vals[SAM_D45], -1.0); results[10] = cgiFormDouble("DEL46SAM", &cgi_vals[SAM_D46], -1.0); results[11] = cgiFormDouble("RefVal0", &cgi_vals[REF1_D13], -1.0); results[12] = cgiFormDouble("RefVal1", &cgi_vals[REF1_D18], -1.0); /* Extra Values */ results[13] = cgiFormDouble("RefVal3", &cgi_vals[REF2_D13], -1.0); results[14] = cgiFormDouble("RefVal4", &cgi_vals[REF2_D18], -1.0); results[15] = cgiFormDouble("DEL45NBS192", &cgi_vals[REF2_D45], -1.0); results[16] = cgiFormDouble("DEL46NBS192", &cgi_vals[REF2_D46], -1.0); /* Special Values */ results[17] = cgiFormDouble("DEL47NBS191", &cgi_vals[REF1_D47], -1.0); results[18] = cgiFormDouble("DEL47NBS192", &cgi_vals[REF2_D47], -1.0); results[19] = cgiFormDouble("DEL47SAM", &cgi_vals[SAM_D47], -1.0); results[20] = cgiFormString("SAMNAME", sam_name, 17); } /* Perform Main Function */ void main_func(void) { int i; /* Check for Special Back Door... */ if (cgi_vals[REF1_D45] == 4321.0 && cgi_vals[REF1_D46] == 4321.0) { print_special_page(); } else { /* Check for Errors in CGI Values */ error_check(); if (is_Error) { print_error(); } /* Else OK, Calculate Reference Values */ else { /* Fill Reference Array */ fill_array(); /* Fill Sample Array */ fill_sam(); /* Fill Iteration Array */ fill_iter(); /* Fill WMG Section of Sample Array */ fill_wrg(); /* Fill WMG Section of Iteration Array */ fill_wrg_iter(); if (is_Special) { /* Calculate Delta47 Values */ calc_delta47(); } /* Print the Results Page */ print_results(); } } } /* Check for Errors in CGI Values */ void error_check(void) { int i; /* Check for Special Page */ if (results[MAX_FIELDS] == cgiFormSuccess) is_Special = 1; if (results[MAX_FIELDS] == cgiFormEmpty) errors[MAX_FIELDS] = 1; /* Check for Missing Fields */ for (i = 0; i < MAX_FIELDS-6; i++) { if (results[i] != cgiFormSuccess && results[i] != cgiFormNotFound) errors[i] = 1; } for (i = MAX_FIELDS-6; i < MAX_FIELDS-4; i++) { if (cgi_vals[REF_MAT0] == 4 && results[i] != cgiFormSuccess) errors[i] = 1; } /* Do Check for NonNecessary A-Value and Oxygen Values */ errors[1] = 0; errors[3] = 0; errors[4] = 0; if (cgi_vals[A_INDEX] == 4 && results[1] != cgiFormSuccess) errors[1] = 1; if (cgi_vals[ABS_O] == 4 && results[3] != cgiFormSuccess) errors[3] = 1; if (cgi_vals[ABS_O] == 4 && results[4] != cgiFormSuccess) errors[4] = 1; /* Do Special Check of Reference 2 Existence */ if (is_Special) { /* Default to Two References */ p_choice = 1; /* Check if Reference 2 Values Exist */ for (i = MAX_FIELDS-2; i < MAX_FIELDS; i++) { if (results[i] != cgiFormSuccess) p_choice = 0; } if (p_choice) { for (i = MAX_FIELDS-4; i < MAX_FIELDS-2; i++) { if (cgi_vals[REF_MAT1] == 4 && results[i] != cgiFormSuccess) errors[i] = 1; } /* Check for Delta 47 Input */ if (results[MAX_FIELDS+1] != cgiFormSuccess) errors[MAX_FIELDS+1] = 1; } /* Check for Delta 47 Input */ if (results[MAX_FIELDS+2] != cgiFormSuccess) errors[MAX_FIELDS+2] = 1; } /* Not Special Page */ else { /* Check if Reference 2 Fields Exist */ if (results[MAX_FIELDS-2] == cgiFormSuccess || results[MAX_FIELDS-1] == cgiFormSuccess) p_choice = 1; else p_choice = 0; if (p_choice) { /* Now Check for Missing Extra Fields */ for (i = MAX_FIELDS-4; i < MAX_FIELDS-2; i++) { if (cgi_vals[REF_MAT1] == 4 && results[i] != cgiFormSuccess) errors[i] = 1; } for (i = MAX_FIELDS-2; i < MAX_FIELDS; i++) { if (results[i] != cgiFormSuccess) errors[i] = 1; } } } /* If Error in Fields, give error page */ for (i = 0; i < MAX_FIELDS; i++) if (errors[i]) is_Error = 1; /* Special Errors */ if (is_Special) for (i = MAX_FIELDS; i < MAX_FIELDS+MAX_SPECIAL; i++) if (errors[i]) is_Error = 1; } /* Fill in Reference Array */ void fill_array(void) { /* Check for Out of Bounds Oxygen Constant */ if (cgi_vals[A_INDEX] == 4 && (cgi_vals[A] < 0 || cgi_vals[A] > 1)) { out_Bounds[0] = 1; /* Set to Safe Values */ cgi_vals[A] = 0.05; } /* Set Oxygen Isotope Values - If User Defined, Replace NBS19C constants */ /* Check for Out of Bounds Oxygen Values */ if (cgi_vals[O_S17] <= 0 || cgi_vals[O_S18] <= 0) { out_Bounds[1] = 1; /* Set to Safe Values */ cgi_vals[O_S17] = 0.0003; cgi_vals[O_S17] = 0.002; } /* Fill in Other CGI Values */ cgi_vals[K] = cgi_vals[O_S17] / pow(cgi_vals[O_S18], cgi_vals[A]); /* Fill in VPDB Section in Reference Array */ ref_array[VPDB][R13] = constants[VPDB_][S13]; ref_array[VPDB][R18] = constants[VPDB_][S18]; ref_array[VPDB][R17] = cgi_vals[O_S17] * pow((ref_array[VPDB][R18] / cgi_vals[O_S18]), cgi_vals[A]); ref_array[VPDB][R45] = ref_array[VPDB][R13] + (2 * ref_array[VPDB][R17]); ref_array[VPDB][R46] = (2 * ref_array[VPDB][R18]) + (2 * ref_array[VPDB][R13] * ref_array[VPDB][R17]) + (ref_array[VPDB][R17] * ref_array[VPDB][17]); ref_array[VPDB][R47] = (ref_array[VPDB][R13] * pow(ref_array[VPDB][R17], 2.0)) + (2 * ref_array[VPDB][R13] * ref_array[VPDB][R18]) + (2 * ref_array[VPDB][R17] * ref_array[VPDB][R18]); /* Fill in VPDBC Section in Reference Array */ ref_array[VPDBC][R13] = ref_array[VPDB][R13]; ref_array[VPDBC][R18] = ALPHA * ref_array[VPDB][R18]; ref_array[VPDBC][R17] = cgi_vals[O_S17] * pow((ref_array[VPDBC][R18] / cgi_vals[O_S18]), cgi_vals[A]); ref_array[VPDBC][R45] = ref_array[VPDBC][R13] + (2 * ref_array[VPDBC][R17]); ref_array[VPDBC][R46] = (2 * ref_array[VPDBC][R18]) + (2 * ref_array[VPDBC][R13] * ref_array[VPDBC][R17]) + (ref_array[VPDBC][R17] * ref_array[VPDBC][R17]); ref_array[VPDBC][R47] = (ref_array[VPDBC][R13] * pow(ref_array[VPDBC][R17], 2.0)) + (2 * ref_array[VPDBC][R13] * ref_array[VPDBC][R18]) + (2 * ref_array[VPDBC][R17] * ref_array[VPDBC][R18]); /* Fill in Reference 1 Section in Reference Array */ ref_array[REF1][R13] = (cgi_vals[REF1_D13] / 1000.0 + 1) * ref_array[VPDBC][R13]; ref_array[REF1][R18] = (cgi_vals[REF1_D18] / 1000.0 + 1) * ref_array[VPDBC][R18] / ALPHA; ref_array[REF1][R17] = cgi_vals[O_S17] * pow((ref_array[REF1][R18] / cgi_vals[O_S18]), cgi_vals[A]); ref_array[REF1][R45] = ref_array[REF1][R13] + (2 * ref_array[REF1][R17]); ref_array[REF1][R46] = (2 * ref_array[REF1][R18]) + (2 * ref_array[REF1][R13] * ref_array[REF1][R17]) + (ref_array[REF1][R17] * ref_array[REF1][R17]); ref_array[REF1][R47] = (ref_array[REF1][R13] * pow(ref_array[REF1][R17], 2.0)) + (2 * ref_array[REF1][R13] * ref_array[REF1][R18]) + (2 * ref_array[REF1][R17] * ref_array[REF1][R18]); /* Calculate Delta VPDBC Values */ ref_array[REF1][D45VC] = (ref_array[REF1][R45] / ref_array[VPDBC][R45] - 1.0) * 1000.0; ref_array[REF1][D46VC] = (ref_array[REF1][R46] / ref_array[VPDBC][R46] - 1.0) * 1000.0; ref_array[REF1][D47VC] = (ref_array[REF1][R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0; /* If Values Exist, Fill Reference 2 Section */ if (p_choice) { ref_array[REF2][R13] = (cgi_vals[REF2_D13] / 1000.0 + 1) * ref_array[VPDBC][R13]; ref_array[REF2][R18] = (cgi_vals[REF2_D18] / 1000.0 + 1) * ref_array[VPDBC][R18] / ALPHA; ref_array[REF2][R17] = cgi_vals[O_S17] * pow((ref_array[REF2][R18] / cgi_vals[O_S18]), cgi_vals[A]); ref_array[REF2][R45] = ref_array[REF2][R13] + (2 * ref_array[REF2][R17]); ref_array[REF2][R46] = (2 * ref_array[REF2][R18]) + (2 * ref_array[REF2][R13] * ref_array[REF2][R17]) + (ref_array[REF2][R17] * ref_array[REF2][R17]); ref_array[REF2][R47] = (ref_array[REF2][R13] * pow(ref_array[REF2][R17], 2.0)) + (2 * ref_array[REF2][R13] * ref_array[REF2][R18]) + (2 * ref_array[REF2][R17] * ref_array[REF2][R18]); /* Calculate Delta VPDBC Values */ ref_array[REF2][D45VC] = (ref_array[REF2][R45] / ref_array[VPDBC][R45] - 1.0) * 1000.0; ref_array[REF2][D46VC] = (ref_array[REF2][R46] / ref_array[VPDBC][R46] - 1.0) * 1000.0; ref_array[REF2][D47VC] = (ref_array[REF2][R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0; } } /* Fill Sample Array */ void fill_sam(void) { /* Sample vs. Ref1 */ sam_array[S_R1][S_D45] = ((cgi_vals[SAM_D45] + 1000.0) / (cgi_vals[REF1_D45] + 1000.0) - 1.0) * 1000.0; sam_array[S_R1][S_D46] = ((cgi_vals[SAM_D46] + 1000.0) / (cgi_vals[REF1_D46] + 1000.0) - 1.0) * 1000.0; sam_array[S_R1V][S_D45] = ((sam_array[S_R1][S_D45] / 1000.0 + 1.0) * ref_array[REF1][R45] / ref_array[VPDBC][R45] - 1.0) * 1000.0; sam_array[S_R1V][S_D46] = ((sam_array[S_R1][S_D46] / 1000.0 + 1.0) * ref_array[REF1][R46] / ref_array[VPDBC][R46] - 1.0) * 1000.0; /* via Ref1 */ sam_array[S_R1][S_R45] = (sam_array[S_R1V][S_D45] / 1000.0 + 1.0) * ref_array[VPDBC][R45]; sam_array[S_R1][S_R46] = (sam_array[S_R1V][S_D46] / 1000.0 + 1.0) * ref_array[VPDBC][R46]; /* D47 Values */ if (is_Special) { sam_array[S_R1][S_D47] = ((cgi_vals[SAM_D47] + 1000.0) / (cgi_vals[REF1_D47] + 1000.0) - 1.0) * 1000.0; sam_array[S_R1V][S_D47] = ((sam_array[S_R1][S_D47] / 1000.0 + 1.0) * ref_array[REF1][R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0; sam_array[S_R1][S_R47] = (sam_array[S_R1V][S_D47] / 1000.0 + 1.0) * ref_array[VPDBC][R47]; } /* If Values Exist, Fill Reference 2 Section of Sample Array */ if (p_choice) { /* Sample vs. Ref2 */ sam_array[S_R2V][S_D45] = ref_array[REF1][D45VC] + ((cgi_vals[SAM_D45] - cgi_vals[REF1_D45]) / (cgi_vals[REF2_D45] - cgi_vals[REF1_D45])) * (ref_array[REF2][D45VC] - ref_array[REF1][D45VC]); sam_array[S_R2V][S_D46] = ref_array[REF1][D46VC] + ((cgi_vals[SAM_D46] - cgi_vals[REF1_D46]) / (cgi_vals[REF2_D46] - cgi_vals[REF1_D46])) * (ref_array[REF2][D46VC] - ref_array[REF1][D46VC]); sam_array[S_R2][S_D45] = ((cgi_vals[SAM_D45] + 1000.0) / (cgi_vals[REF2_D45] + 1000.0) - 1.0) * 1000.0; sam_array[S_R2][S_D46] = ((cgi_vals[SAM_D46] + 1000.0) / (cgi_vals[REF2_D46] + 1000.0) - 1.0) * 1000.0; /* Normalized */ sam_array[S_NORM][S_R45] = (sam_array[S_R2V][S_D45] / 1000.0 + 1.0) * ref_array[VPDBC][R45]; sam_array[S_NORM][S_R46] = (sam_array[S_R2V][S_D46] / 1000.0 + 1.0) * ref_array[VPDBC][R46]; /* via Ref1 */ sam_array[S_R2][S_R45] = (sam_array[S_R2][S_D45] / 1000.0 + 1.0) * ref_array[REF2][R45]; sam_array[S_R2][S_R46] = (sam_array[S_R2][S_D46] / 1000.0 + 1.0) * ref_array[REF2][R46]; /* Ref1 vs. Ref2 */ sam_array[S_R2R1][S_R45] = ((cgi_vals[REF2_D45] + 1000.0) / (cgi_vals[REF1_D45] + 1000.0) - 1.0) * 1000.0; sam_array[S_R2R1][S_R46] = ((cgi_vals[REF2_D46] + 1000.0) / (cgi_vals[REF1_D46] + 1000.0) - 1.0) * 1000.0; /* Ref2 vs. VPDBC */ sam_array[S_R2_vV][R2_VR45] = ((sam_array[S_R2R1][S_R45] / 1000.0 + 1.0) * ref_array[REF1][R45] / ref_array[VPDBC][R45] - 1.0) * 1000.0; sam_array[S_R2_vV][R2_VR46] = ((sam_array[S_R2R1][S_R46] / 1000.0 + 1.0) * ref_array[REF1][R46] / ref_array[VPDBC][R46] - 1.0) * 1000.0; /* Ref2 R Values (Normalized) */ sam_array[S_R2_vV][S_R45] = (sam_array[S_R2_vV][R2_VR45] / 1000.0 + 1.0) * ref_array[VPDBC][R45]; sam_array[S_R2_vV][S_R46] = (sam_array[S_R2_vV][R2_VR46] / 1000.0 + 1.0) * ref_array[VPDBC][R46]; /* D47 Values */ if (is_Special) { sam_array[S_R2V][S_D47] = ref_array[REF1][D47VC] + ((cgi_vals[SAM_D47] - cgi_vals[REF1_D47]) / (cgi_vals[REF2_D47] - cgi_vals[REF1_D47])) * (ref_array[REF2][D47VC] - ref_array[REF1][D47VC]); sam_array[S_R2][S_D47] = ((cgi_vals[SAM_D47] + 1000.0) / (cgi_vals[REF2_D47] + 1000.0) - 1.0) * 1000.0; sam_array[S_NORM][S_R47] = (sam_array[S_R2V][S_D47] / 1000.0 + 1.0) * ref_array[VPDBC][R47]; sam_array[S_R2][S_R47] = (sam_array[S_R2][S_D47] / 1000.0 + 1.0) * ref_array[REF2][R47]; sam_array[S_R2R1][S_R47] = ((cgi_vals[REF2_D47] + 1000.0) / (cgi_vals[REF1_D47] + 1000.0) - 1.0) * 1000.0; sam_array[S_R2_vV][R2_VR47] = ((sam_array[S_R2R1][S_R47] / 1000.0 + 1.0) * ref_array[REF1][R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0; sam_array[S_R2_vV][S_R47] = (sam_array[S_R2_vV][R2_VR47] / 1000.0 + 1.0) * ref_array[VPDBC][R47]; } } } /* Fill Iteration Arrays */ void fill_iter(void) { /* Reference 1 */ do_algorithm(sam_array[S_R1], iter_array[I_R1]); /* 2 References */ if (p_choice) { /* Reference 2 */ do_algorithm(sam_array[S_R2], iter_array[I_R2]); /* Normalized */ do_algorithm(sam_array[S_NORM], iter_array[I_NORM]); /* Ref2 vs. Ref1 */ do_algorithm(sam_array[S_R2_vV], iter_array[I_R2R1]); } } /* Perform Iteration Algorithm */ void do_algorithm(double sam[], double iter[]) { int i; /* Calculate Sample Values */ iter[I_R18] = sam[S_R46] / 2.0; for (i = 0; i < ITERATION; i++) { /* Calculate Reduction Algorithm Values */ iter[I_A] = 2.0 * cgi_vals[K] * sam[S_R45] * pow(iter[I_R18], (cgi_vals[A] - 2.0)); iter[I_B] = -3.0 * pow(cgi_vals[K], 2.0) * pow(iter[I_R18], (2.0 * cgi_vals[A] - 1.0)) + 2.0; iter[I_C] = -sam[S_R46]; iter[I_R18] = (-iter[I_B] + pow(pow(iter[I_B], 2.0) - 4.0 * iter[I_A] * iter[I_C], 0.5)) / (2.0 * iter[I_A]); } /* Calculate Other R Values */ iter[I_R17] = cgi_vals[O_S17] * pow(iter[I_R18] / cgi_vals[O_S18], cgi_vals[A]); iter[I_R13] = sam[S_R45] - 2.0 * iter[I_R17]; iter[I_R47] = iter[I_R13] * pow(iter[I_R17], 2.0) + 2.0 * iter[I_R13] * iter[I_R18] + 2.0 * iter[I_R17] * iter[I_R18]; /* Calculate Delta vs. Values */ iter[I_dV_R18] = (iter[I_R18] / ref_array[VPDBC][R18] * ALPHA - 1.0) * 1000.0; iter[I_dV_R13] = (iter[I_R13] / ref_array[VPDBC][R13] - 1.0) * 1000.0; iter[I_dV_R47] = (iter[I_R47] / ref_array[VPDBC][R47] - 1.0) * 1000.0; iter[I_dVPDBC] = (iter[I_R18] / ref_array[VPDBC][R18] - 1.0) * 1000.0; iter[I_dVSMOW] = 1.03092 * iter[I_dV_R18] + 30.92; iter[I_dVSMOWC] = (iter[I_dVSMOW] - 41.2) / 1.0412; } /* Fill WMG Sections of Sample Array */ void fill_wrg(void) { /* Reference 1 */ sam_array[S_WMG1][S_R45] = 1000.0 * ref_array[REF1][R45] / (cgi_vals[REF1_D45] + 1000.0); sam_array[S_WMG1][S_R46] = 1000.0 * ref_array[REF1][R46] / (cgi_vals[REF1_D46] + 1000.0); sam_array[S_WMGS][S_R45] = 1000.0 * sam_array[S_NORM][S_R45] / (cgi_vals[SAM_D45] + 1000.0); sam_array[S_WMGS][S_R46] = 1000.0 * sam_array[S_NORM][S_R46] / (cgi_vals[SAM_D46] + 1000.0); /* R47 Values */ if (is_Special) { sam_array[S_WMG1][S_R47] = 1000.0 * ref_array[REF1][R47] / (cgi_vals[REF1_D47] + 1000.0); sam_array[S_WMGS][S_R47] = 1000.0 * sam_array[S_NORM][S_R47] / (cgi_vals[SAM_D47] + 1000.0); } /* Reference 2 */ if (p_choice) { sam_array[S_WMG2][S_R45] = 1000.0 * ref_array[REF2][R45] / (cgi_vals[REF2_D45] + 1000.0); sam_array[S_WMG2][S_R46] = 1000.0 * ref_array[REF2][R46] / (cgi_vals[REF2_D46] + 1000.0); /* R47 Values */ if (is_Special) { sam_array[S_WMG2][S_R47] = 1000.0 * ref_array[REF2][R47] / (cgi_vals[REF2_D47] + 1000.0); } } } /* Fill WMG Sections of Iteration Array */ void fill_wrg_iter(void) { do_wrg_algorithm(sam_array[S_WMG1], iter_array[I_WMG1]); do_wrg_algorithm(sam_array[S_WMG2], iter_array[I_WMG2]); do_wrg_algorithm(sam_array[S_WMGS], iter_array[I_WMGS]); } /* Perform WMG Iteration Algorithm */ void do_wrg_algorithm(double sam[], double iter[]) { int i; /* Calculate Sample Values */ iter[I_R18] = 0.002; for (i = 0; i < ITERATION; i++) { /* Calculate Reduction Algorithm Values */ iter[I_A] = 2.0 * cgi_vals[K] * sam[S_R45] * pow(iter[I_R18], (cgi_vals[A] - 2.0)); iter[I_B] = -3.0 * pow(cgi_vals[K], 2.0) * pow(iter[I_R18], (2.0 * cgi_vals[A] - 1.0)) + 2.0; iter[I_C] = -sam[S_R46]; iter[I_R18] = (-iter[I_B] + pow(pow(iter[I_B], 2.0) - 4.0 * iter[I_A] * iter[I_C], 0.5)) / (2.0 * iter[I_A]); } /* Calculate Other R Values */ iter[I_R17] = cgi_vals[O_S17] * pow(iter[I_R18] / cgi_vals[O_S18], cgi_vals[A]); iter[I_R13] = sam[S_R45] - 2.0 * iter[I_R17]; iter[I_R47] = iter[I_R13] * pow(iter[I_R17], 2.0) + 2.0 * iter[I_R13] * iter[I_R18] + 2.0 * iter[I_R17] * iter[I_R18]; } /* Calculate Expected Delta47 Values */ void calc_delta47(void) { del47_array[D_R1_WMG] = (ref_array[REF1][R47] / iter_array[I_WMG1][I_R47] - 1.0) * 1000.0; del47_array[D_SAM_WMG] = (iter_array[I_R1][I_R47] / iter_array[I_WMG1][I_R47] - 1.0) * 1000.0; /* 2 References */ if (p_choice) { del47_array[D_R2_WMG] = (iter_array[I_R2R1][I_R47] / iter_array[I_WMG1][I_R47] - 1.0) * 1000.0; } } /* Extra Array Functions */ /* Initialize Array - Set Values to 0 */ void init_array(double a[], int max) { int i; for (i = 0; i < max; i++) a[i] = 0.0; } /* Initialize Arrays - Set Values to 0 */ void init_arrays(void) { int i, j; /* Clear Error Array */ for (i = 0; i < MAX_FIELDS+MAX_SPECIAL; i++) errors[i] = 0.0; /* Clear Out of Bounds Error Array */ for (i = 0; i < MAX_BOUNDS; i++) out_Bounds[i] = 0.0; } /* Print Section of Array */ void print_array(char* name, double a[], int start, int max) { int i; fprintf(cgiOut, "

"); fprintf(cgiOut, "%s: ", name); for (i = start; i < start+max; i++) { fprintf(cgiOut, "%d: %4.10f ___ ", i, a[i]); } fprintf(cgiOut, "

"); } /* Test Print */ void test_print(void) { print_array("CGI", cgi_vals, 0, CGI_VALS_R); print_array("REF1", ref_array[REF1], 0, REF_R); print_array("VPDBC", ref_array[VPDBC], 0, REF_R); print_array("S_R1", sam_array[S_R1], 0, SAM_R); print_array("S_R1V", sam_array[S_R1V], 0, SAM_R); print_array("REF2", ref_array[REF2], 0, REF_R); print_array("S_R2V", sam_array[S_R2V], 0, SAM_R); print_array("S_R2", sam_array[S_R2], 0, SAM_R); print_array("S_R2_vV", sam_array[S_R2_vV], 0, SAM_R); print_array("I_R1", iter_array[I_R1], 0, ITER_R); print_array("I_R2", iter_array[I_R2], 0, ITER_R); print_array("I_NORM", iter_array[I_NORM], 0, ITER_R); print_array("I_R2R1", iter_array[I_R2R1], 0, ITER_R); print_array("S_WMG1", sam_array[S_WMG1], 0, SAM_R); print_array("S_WMG2", sam_array[S_WMG2], 0, SAM_R); print_array("S_WMGS", sam_array[S_WMGS], 0, SAM_R); print_array("I_WMG1", iter_array[I_WMG1], 0, ITER_R); print_array("I_WMG2", iter_array[I_WMG2], 0, ITER_R); print_array("I_WMGS", iter_array[I_WMGS], 0, ITER_R); print_array("DEL47", del47_array, 0, DEL47_R); }