From 031d24e6955ac478fb3aa49899741b7016e712a9 Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Sat, 30 Dec 2023 00:52:44 -0800 Subject: [PATCH] minor updates --- hw/rtl/VX_cluster.sv | 68 +- hw/rtl/VX_config.vh | 4 +- hw/rtl/VX_gpu_pkg.sv | 11 +- hw/rtl/VX_socket.sv | 47 +- hw/rtl/core/VX_fpu_unit.sv | 4 +- tests/opencl/Makefile | 26 +- tests/opencl/cutcp/Makefile | 9 - tests/opencl/cutcp/args.c | 617 -- tests/opencl/cutcp/atom.h | 37 - tests/opencl/cutcp/cutcpu.c | 195 - tests/opencl/cutcp/cutoff.c | 508 -- tests/opencl/cutcp/cutoff.h | 72 - tests/opencl/cutcp/excl.c | 157 - tests/opencl/cutcp/gpu_info.c | 55 - tests/opencl/cutcp/gpu_info.h | 28 - tests/opencl/cutcp/kernel.cl | 104 - tests/opencl/cutcp/macros.h | 69 - tests/opencl/cutcp/main.cc | 190 - tests/opencl/cutcp/ocl.c | 49 - tests/opencl/cutcp/ocl.h | 25 - tests/opencl/cutcp/output.c | 67 - tests/opencl/cutcp/output.h | 25 - tests/opencl/cutcp/parboil.h | 348 -- tests/opencl/cutcp/parboil_opencl.c | 1394 ----- tests/opencl/cutcp/readatom.c | 139 - tests/opencl/cutcp/watbox.sl40.pqr | 5945 ------------------- tests/opencl/fft/.depend | 7 + tests/opencl/{sgemm2 => fft}/Makefile | 2 +- tests/opencl/fft/common.h | 3 + tests/opencl/fft/fft4 | Bin 0 -> 19016 bytes tests/opencl/fft/fft_radix4.dump | 5495 +++++++++++++++++ tests/opencl/fft/kernel.cl | 63 + tests/opencl/fft/kernel.pocl | Bin 0 -> 74401 bytes tests/opencl/{sgemm2 => fft}/main.cc | 155 +- tests/opencl/fft/main.cc.o | Bin 0 -> 15368 bytes tests/opencl/mri-q/32_32_32_dataset.bin | Bin 454664 -> 0 bytes tests/opencl/mri-q/Makefile | 9 - tests/opencl/mri-q/args.c | 617 -- tests/opencl/mri-q/computeQ.c | 118 - tests/opencl/mri-q/computeQ.h | 22 - tests/opencl/mri-q/file.cc | 78 - tests/opencl/mri-q/file.h | 22 - tests/opencl/mri-q/gpu_info.c | 55 - tests/opencl/mri-q/gpu_info.h | 28 - tests/opencl/mri-q/kernel.cl | 51 - tests/opencl/mri-q/macros.h | 21 - tests/opencl/mri-q/main.cc | 321 - tests/opencl/mri-q/ocl copy.c | 50 - tests/opencl/mri-q/ocl copy.h | 21 - tests/opencl/mri-q/ocl.c | 50 - tests/opencl/mri-q/ocl.h | 31 - tests/opencl/mri-q/parboil.h | 348 -- tests/opencl/mri-q/parboil_opencl.c | 1394 ----- tests/opencl/sgemm2/kernel.cl | 73 - tests/opencl/vectorhypot/Makefile | 10 - tests/opencl/vectorhypot/cmd_arg_reader.cpp | 152 - tests/opencl/vectorhypot/cmd_arg_reader.h | 488 -- tests/opencl/vectorhypot/exception.h | 151 - tests/opencl/vectorhypot/kernel.cl | 41 - tests/opencl/vectorhypot/main.cc | 702 --- tests/opencl/vectorhypot/oclUtils.cpp | 806 --- tests/opencl/vectorhypot/oclUtils.h | 198 - tests/opencl/vectorhypot/shrQATest.h | 238 - tests/opencl/vectorhypot/shrUtils.cpp | 1954 ------ tests/opencl/vectorhypot/shrUtils.h | 642 -- 65 files changed, 5705 insertions(+), 18904 deletions(-) delete mode 100644 tests/opencl/cutcp/Makefile delete mode 100644 tests/opencl/cutcp/args.c delete mode 100644 tests/opencl/cutcp/atom.h delete mode 100644 tests/opencl/cutcp/cutcpu.c delete mode 100644 tests/opencl/cutcp/cutoff.c delete mode 100644 tests/opencl/cutcp/cutoff.h delete mode 100644 tests/opencl/cutcp/excl.c delete mode 100644 tests/opencl/cutcp/gpu_info.c delete mode 100644 tests/opencl/cutcp/gpu_info.h delete mode 100644 tests/opencl/cutcp/kernel.cl delete mode 100644 tests/opencl/cutcp/macros.h delete mode 100644 tests/opencl/cutcp/main.cc delete mode 100644 tests/opencl/cutcp/ocl.c delete mode 100644 tests/opencl/cutcp/ocl.h delete mode 100644 tests/opencl/cutcp/output.c delete mode 100644 tests/opencl/cutcp/output.h delete mode 100644 tests/opencl/cutcp/parboil.h delete mode 100644 tests/opencl/cutcp/parboil_opencl.c delete mode 100644 tests/opencl/cutcp/readatom.c delete mode 100755 tests/opencl/cutcp/watbox.sl40.pqr create mode 100644 tests/opencl/fft/.depend rename tests/opencl/{sgemm2 => fft}/Makefile (75%) create mode 100644 tests/opencl/fft/common.h create mode 100755 tests/opencl/fft/fft4 create mode 100644 tests/opencl/fft/fft_radix4.dump create mode 100644 tests/opencl/fft/kernel.cl create mode 100644 tests/opencl/fft/kernel.pocl rename tests/opencl/{sgemm2 => fft}/main.cc (61%) create mode 100644 tests/opencl/fft/main.cc.o delete mode 100755 tests/opencl/mri-q/32_32_32_dataset.bin delete mode 100644 tests/opencl/mri-q/Makefile delete mode 100644 tests/opencl/mri-q/args.c delete mode 100644 tests/opencl/mri-q/computeQ.c delete mode 100644 tests/opencl/mri-q/computeQ.h delete mode 100644 tests/opencl/mri-q/file.cc delete mode 100644 tests/opencl/mri-q/file.h delete mode 100644 tests/opencl/mri-q/gpu_info.c delete mode 100644 tests/opencl/mri-q/gpu_info.h delete mode 100644 tests/opencl/mri-q/kernel.cl delete mode 100644 tests/opencl/mri-q/macros.h delete mode 100644 tests/opencl/mri-q/main.cc delete mode 100644 tests/opencl/mri-q/ocl copy.c delete mode 100644 tests/opencl/mri-q/ocl copy.h delete mode 100644 tests/opencl/mri-q/ocl.c delete mode 100644 tests/opencl/mri-q/ocl.h delete mode 100644 tests/opencl/mri-q/parboil.h delete mode 100644 tests/opencl/mri-q/parboil_opencl.c delete mode 100644 tests/opencl/sgemm2/kernel.cl delete mode 100644 tests/opencl/vectorhypot/Makefile delete mode 100644 tests/opencl/vectorhypot/cmd_arg_reader.cpp delete mode 100644 tests/opencl/vectorhypot/cmd_arg_reader.h delete mode 100644 tests/opencl/vectorhypot/exception.h delete mode 100644 tests/opencl/vectorhypot/kernel.cl delete mode 100644 tests/opencl/vectorhypot/main.cc delete mode 100644 tests/opencl/vectorhypot/oclUtils.cpp delete mode 100644 tests/opencl/vectorhypot/oclUtils.h delete mode 100644 tests/opencl/vectorhypot/shrQATest.h delete mode 100644 tests/opencl/vectorhypot/shrUtils.cpp delete mode 100644 tests/opencl/vectorhypot/shrUtils.h diff --git a/hw/rtl/VX_cluster.sv b/hw/rtl/VX_cluster.sv index 2d220c24..02505171 100644 --- a/hw/rtl/VX_cluster.sv +++ b/hw/rtl/VX_cluster.sv @@ -82,64 +82,9 @@ module VX_cluster import VX_gpu_pkg::*; #( `endif VX_mem_bus_if #( - .DATA_SIZE (L2_WORD_SIZE), - .TAG_WIDTH (L2_TAG_WIDTH) - ) l2_mem_bus_if[L2_NUM_REQS](); - - VX_mem_bus_if #( - .DATA_SIZE (ICACHE_LINE_SIZE), - .TAG_WIDTH (ICACHE_MEM_TAG_WIDTH) - ) per_socket_icache_mem_bus_if[`NUM_SOCKETS](); - - VX_mem_bus_if #( - .DATA_SIZE (DCACHE_LINE_SIZE), - .TAG_WIDTH (DCACHE_MEM_TAG_WIDTH) - ) per_socket_dcache_mem_bus_if[`NUM_SOCKETS](); - - VX_mem_bus_if #( - .DATA_SIZE (ICACHE_LINE_SIZE), - .TAG_WIDTH (ICACHE_MEM_ARB_TAG_WIDTH) - ) icache_mem_bus_if[1](); - - VX_mem_bus_if #( - .DATA_SIZE (DCACHE_LINE_SIZE), - .TAG_WIDTH (DCACHE_MEM_ARB_TAG_WIDTH) - ) dcache_mem_bus_if[1](); - - `RESET_RELAY (l1_mem_arb_reset, reset); - - VX_mem_arb #( - .NUM_INPUTS (`NUM_SOCKETS), - .DATA_SIZE (ICACHE_LINE_SIZE), - .TAG_WIDTH (ICACHE_MEM_TAG_WIDTH), - .TAG_SEL_IDX (1), // Skip 0 for NC flag - .ARBITER ("R"), - .OUT_REG_REQ (2), - .OUT_REG_RSP (2) - ) icache_mem_arb ( - .clk (clk), - .reset (l1_mem_arb_reset), - .bus_in_if (per_socket_icache_mem_bus_if), - .bus_out_if (icache_mem_bus_if) - ); - - VX_mem_arb #( - .NUM_INPUTS (`NUM_SOCKETS), - .DATA_SIZE (DCACHE_LINE_SIZE), - .TAG_WIDTH (DCACHE_MEM_TAG_WIDTH), - .TAG_SEL_IDX (1), // Skip 0 for NC flag - .ARBITER ("R"), - .OUT_REG_REQ (2), - .OUT_REG_RSP (2) - ) dcache_mem_arb ( - .clk (clk), - .reset (l1_mem_arb_reset), - .bus_in_if (per_socket_dcache_mem_bus_if), - .bus_out_if (dcache_mem_bus_if) - ); - - `ASSIGN_VX_MEM_BUS_IF_X (l2_mem_bus_if[ICACHE_MEM_ARB_IDX], icache_mem_bus_if[0], L1_MEM_TAG_WIDTH, ICACHE_MEM_ARB_TAG_WIDTH); - `ASSIGN_VX_MEM_BUS_IF_X (l2_mem_bus_if[DCACHE_MEM_ARB_IDX], dcache_mem_bus_if[0], L1_MEM_TAG_WIDTH, DCACHE_MEM_ARB_TAG_WIDTH); + .DATA_SIZE (`L1_LINE_SIZE), + .TAG_WIDTH (L1_MEM_ARB_TAG_WIDTH) + ) per_socket_mem_bus_if[`NUM_SOCKETS](); `RESET_RELAY (l2_reset, reset); @@ -155,7 +100,7 @@ module VX_cluster import VX_gpu_pkg::*; #( .MSHR_SIZE (`L2_MSHR_SIZE), .MRSQ_SIZE (`L2_MRSQ_SIZE), .MREQ_SIZE (`L2_MREQ_SIZE), - .TAG_WIDTH (L1_MEM_TAG_WIDTH), + .TAG_WIDTH (L2_TAG_WIDTH), .WRITE_ENABLE (1), .UUID_WIDTH (`UUID_WIDTH), .CORE_OUT_REG (2), @@ -168,7 +113,7 @@ module VX_cluster import VX_gpu_pkg::*; #( `ifdef PERF_ENABLE .cache_perf (mem_perf_tmp_if.l2cache), `endif - .core_bus_if (l2_mem_bus_if), + .core_bus_if (per_socket_mem_bus_if), .mem_bus_if (mem_bus_if) ); @@ -209,8 +154,7 @@ module VX_cluster import VX_gpu_pkg::*; #( .dcr_bus_if (socket_dcr_bus_if), - .icache_mem_bus_if (per_socket_icache_mem_bus_if[i]), - .dcache_mem_bus_if (per_socket_dcache_mem_bus_if[i]), + .mem_bus_if (per_socket_mem_bus_if[i]), `ifdef GBAR_ENABLE .gbar_bus_if (per_socket_gbar_bus_if[i]), diff --git a/hw/rtl/VX_config.vh b/hw/rtl/VX_config.vh index d35d906b..80ac5fef 100644 --- a/hw/rtl/VX_config.vh +++ b/hw/rtl/VX_config.vh @@ -292,8 +292,8 @@ // Floating-Point Units /////////////////////////////////////////////////////// // Size of FPU Request Queue -`ifndef FPU_REQ_QUEUE_SIZE -`define FPU_REQ_QUEUE_SIZE (2 * (`NUM_THREADS / `NUM_FPU_LANES)) +`ifndef FPUQ_SIZE +`define FPUQ_SIZE (2 * (`NUM_THREADS / `NUM_FPU_LANES)) `endif // FNCP Latency diff --git a/hw/rtl/VX_gpu_pkg.sv b/hw/rtl/VX_gpu_pkg.sv index 94fe7684..49dc9564 100644 --- a/hw/rtl/VX_gpu_pkg.sv +++ b/hw/rtl/VX_gpu_pkg.sv @@ -141,10 +141,9 @@ package VX_gpu_pkg; /////////////////////////////// L1 Parameters ///////////////////////////// - localparam ICACHE_MEM_ARB_TAG_WIDTH = (ICACHE_MEM_TAG_WIDTH + `CLOG2(`NUM_SOCKETS)); - localparam DCACHE_MEM_ARB_TAG_WIDTH = (DCACHE_MEM_TAG_WIDTH + `CLOG2(`NUM_SOCKETS)); - localparam L1_MEM_TAG_WIDTH = `MAX(ICACHE_MEM_ARB_TAG_WIDTH, DCACHE_MEM_ARB_TAG_WIDTH); - + localparam L1_MEM_TAG_WIDTH = `MAX(ICACHE_MEM_TAG_WIDTH, DCACHE_MEM_TAG_WIDTH); + localparam L1_MEM_ARB_TAG_WIDTH = (L1_MEM_TAG_WIDTH + `CLOG2(2)); + /////////////////////////////// L2 Parameters ///////////////////////////// localparam ICACHE_MEM_ARB_IDX = 0; @@ -154,10 +153,10 @@ package VX_gpu_pkg; localparam L2_WORD_SIZE = `L1_LINE_SIZE; // Input request size - localparam L2_NUM_REQS = 2; + localparam L2_NUM_REQS = `NUM_SOCKETS; // Core request tag bits - localparam L2_TAG_WIDTH = L1_MEM_TAG_WIDTH; + localparam L2_TAG_WIDTH = L1_MEM_ARB_TAG_WIDTH; // Memory request data bits localparam L2_MEM_DATA_WIDTH = (`L2_LINE_SIZE * 8); diff --git a/hw/rtl/VX_socket.sv b/hw/rtl/VX_socket.sv index 31a01b50..563cf5ba 100644 --- a/hw/rtl/VX_socket.sv +++ b/hw/rtl/VX_socket.sv @@ -30,8 +30,7 @@ module VX_socket import VX_gpu_pkg::*; #( VX_dcr_bus_if.slave dcr_bus_if, // Memory - VX_mem_bus_if.master icache_mem_bus_if, - VX_mem_bus_if.master dcache_mem_bus_if, + VX_mem_bus_if.master mem_bus_if, `ifdef GBAR_ENABLE // Barrier @@ -79,6 +78,11 @@ module VX_socket import VX_gpu_pkg::*; #( .TAG_WIDTH (ICACHE_TAG_WIDTH) ) per_core_icache_bus_if[`SOCKET_SIZE](); + VX_mem_bus_if #( + .DATA_SIZE (ICACHE_LINE_SIZE), + .TAG_WIDTH (ICACHE_MEM_TAG_WIDTH) + ) icache_mem_bus_if(); + `RESET_RELAY (icache_reset, reset); VX_cache_cluster #( @@ -117,6 +121,11 @@ module VX_socket import VX_gpu_pkg::*; #( .DATA_SIZE (DCACHE_WORD_SIZE), .TAG_WIDTH (DCACHE_NOSM_TAG_WIDTH) ) per_core_dcache_bus_if[`SOCKET_SIZE * DCACHE_NUM_REQS](); + + VX_mem_bus_if #( + .DATA_SIZE (DCACHE_LINE_SIZE), + .TAG_WIDTH (DCACHE_MEM_TAG_WIDTH) + ) dcache_mem_bus_if(); `RESET_RELAY (dcache_reset, reset); @@ -151,6 +160,40 @@ module VX_socket import VX_gpu_pkg::*; #( .mem_bus_if (dcache_mem_bus_if) ); + /////////////////////////////////////////////////////////////////////////// + + VX_mem_bus_if #( + .DATA_SIZE (`L1_LINE_SIZE), + .TAG_WIDTH (L1_MEM_TAG_WIDTH) + ) l1_mem_bus_if[2](); + + VX_mem_bus_if #( + .DATA_SIZE (`L1_LINE_SIZE), + .TAG_WIDTH (L1_MEM_ARB_TAG_WIDTH) + ) l1_mem_arb_bus_if[1](); + + `ASSIGN_VX_MEM_BUS_IF_X (l1_mem_bus_if[0], icache_mem_bus_if, L1_MEM_TAG_WIDTH, ICACHE_MEM_TAG_WIDTH); + `ASSIGN_VX_MEM_BUS_IF_X (l1_mem_bus_if[1], dcache_mem_bus_if, L1_MEM_TAG_WIDTH, DCACHE_MEM_TAG_WIDTH); + + `RESET_RELAY (mem_arb_reset, reset); + + VX_mem_arb #( + .NUM_INPUTS (2), + .DATA_SIZE (`L1_LINE_SIZE), + .TAG_WIDTH (L1_MEM_TAG_WIDTH), + .TAG_SEL_IDX (1), // Skip 0 for NC flag + .ARBITER ("R"), + .OUT_REG_REQ (2), + .OUT_REG_RSP (2) + ) mem_arb ( + .clk (clk), + .reset (mem_arb_reset), + .bus_in_if (l1_mem_bus_if), + .bus_out_if (l1_mem_arb_bus_if) + ); + + `ASSIGN_VX_MEM_BUS_IF (mem_bus_if, l1_mem_arb_bus_if[0]); + /////////////////////////////////////////////////////////////////////////// wire [`SOCKET_SIZE-1:0] per_core_sim_ebreak; diff --git a/hw/rtl/core/VX_fpu_unit.sv b/hw/rtl/core/VX_fpu_unit.sv index 1aecd3e8..e00883b5 100644 --- a/hw/rtl/core/VX_fpu_unit.sv +++ b/hw/rtl/core/VX_fpu_unit.sv @@ -30,7 +30,7 @@ module VX_fpu_unit import VX_fpu_pkg::*; #( localparam NUM_LANES = `NUM_FPU_LANES; localparam PID_BITS = `CLOG2(`NUM_THREADS / NUM_LANES); localparam PID_WIDTH = `UP(PID_BITS); - localparam TAG_WIDTH = `LOG2UP(`FPU_REQ_QUEUE_SIZE); + localparam TAG_WIDTH = `LOG2UP(`FPUQ_SIZE); localparam PARTIAL_BW = (BLOCK_SIZE != `ISSUE_WIDTH) || (NUM_LANES != `NUM_THREADS); VX_execute_if #( @@ -87,7 +87,7 @@ module VX_fpu_unit import VX_fpu_pkg::*; #( VX_index_buffer #( .DATAW (`UUID_WIDTH + `NW_WIDTH + NUM_LANES + `XLEN + `NR_BITS + PID_WIDTH + 1 + 1), - .SIZE (`FPU_REQ_QUEUE_SIZE) + .SIZE (`FPUQ_SIZE) ) tag_store ( .clk (clk), .reset (reset), diff --git a/tests/opencl/Makefile b/tests/opencl/Makefile index 5d18f9cd..5635643e 100644 --- a/tests/opencl/Makefile +++ b/tests/opencl/Makefile @@ -15,10 +15,6 @@ all: $(MAKE) -C blackscholes $(MAKE) -C transpose $(MAKE) -C convolution -# $(MAKE) -C cutcp -# $(MAKE) -C sgemm2 -# $(MAKE) -C vectorhypot -# $(MAKE) -C mri-q run-simx run-simx: $(MAKE) -C vecadd run-simx @@ -37,10 +33,6 @@ run-simx: $(MAKE) -C blackscholes run-simx $(MAKE) -C transpose run-simx $(MAKE) -C convolution run-simx -# $(MAKE) -C cutcp run-simx -# $(MAKE) -C sgemm2 run-simx -# $(MAKE) -C vectorhypot run-simx -# $(MAKE) -C mri-q run-simx run-rtlsim: $(MAKE) -C vecadd run-rtlsim @@ -59,10 +51,6 @@ run-rtlsim: $(MAKE) -C oclprintf run-rtlsim $(MAKE) -C blackscholes run-rtlsim $(MAKE) -C convolution run-rtlsim -# $(MAKE) -C cutcp run-rtlsim -# $(MAKE) -C sgemm2 run-rtlsim -# $(MAKE) -C vectorhypot run-rtlsim -# $(MAKE) -C mri-q run-rtlsim run-opae: $(MAKE) -C vecadd run-opae @@ -81,10 +69,6 @@ run-opae: $(MAKE) -C oclprintf run-opae $(MAKE) -C blackscholes run-opae $(MAKE) -C convolution run-opae -# $(MAKE) -C cutcp run-opae -# $(MAKE) -C sgemm2 run-opae -# $(MAKE) -C vectorhypot run-opae -# $(MAKE) -C mri-q run-opae clean: $(MAKE) -C vecadd clean @@ -103,10 +87,6 @@ clean: $(MAKE) -C oclprintf clean $(MAKE) -C blackscholes clean $(MAKE) -C convolution clean -# $(MAKE) -C cutcp clean -# $(MAKE) -C sgemm2 clean -# $(MAKE) -C vectorhypot clean -# $(MAKE) -C mri-q clean clean-all: $(MAKE) -C vecadd clean-all @@ -124,8 +104,4 @@ clean-all: $(MAKE) -C lbm clean-all $(MAKE) -C oclprintf clean-all $(MAKE) -C blackscholes clean-all - $(MAKE) -C convolution clean-all -# $(MAKE) -C cutcp clean-all -# $(MAKE) -C sgemm2 clean-all -# $(MAKE) -C vectorhypot clean-all -# $(MAKE) -C mri-q clean-all + $(MAKE) -C convolution clean-all \ No newline at end of file diff --git a/tests/opencl/cutcp/Makefile b/tests/opencl/cutcp/Makefile deleted file mode 100644 index d16ddb11..00000000 --- a/tests/opencl/cutcp/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -PROJECT = cutcp - -SRCS = main.cc args.c parboil_opencl.c ocl.c gpu_info.c cutoff.c cutcpu.c output.c readatom.c excl.c - -CXXFLAGS += -I. - -OPTS ?= - -include ../common.mk diff --git a/tests/opencl/cutcp/args.c b/tests/opencl/cutcp/args.c deleted file mode 100644 index 9d751e29..00000000 --- a/tests/opencl/cutcp/args.c +++ /dev/null @@ -1,617 +0,0 @@ - -#include -#include -#include -#include -#include -#include - -/*****************************************************************************/ -/* Memory management routines */ - -/* Free an array of owned strings. */ -void -pb_FreeStringArray(char **string_array) -{ - char **p; - - if (!string_array) return; - for (p = string_array; *p; p++) free(*p); - free(string_array); -} - -struct pb_PlatformParam * -pb_PlatformParam(char *name, char *version) -{ - if (name == NULL) { - fprintf(stderr, "pb_PlatformParam: Invalid argument\n"); - exit(-1); - } - - struct pb_PlatformParam *ret = - (struct pb_PlatformParam *)malloc(sizeof (struct pb_PlatformParam)); - - ret->name = name; - ret->version = version; - return ret; -} - -void -pb_FreePlatformParam(struct pb_PlatformParam *p) -{ - if (p == NULL) return; - - free(p->name); - free(p->version); - free(p); -} - -struct pb_DeviceParam * -pb_DeviceParam_index(int index) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_INDEX; - ret->index = index; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_cpu(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_CPU; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_gpu(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_GPU; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_accelerator(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_ACCELERATOR; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_name(char *name) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_NAME; - ret->name = name; - return ret; -} - -void -pb_FreeDeviceParam(struct pb_DeviceParam *p) -{ - if (p == NULL) return; - - switch(p->criterion) { - case pb_Device_NAME: - free(p->name); - break; - case pb_Device_INDEX: - case pb_Device_CPU: - case pb_Device_ACCELERATOR: - break; - default: - fprintf(stderr, "pb_FreeDeviceParam: Invalid argument\n"); - exit(-1); - } -} - -void -pb_FreeParameters(struct pb_Parameters *p) -{ - free(p->outFile); - pb_FreeStringArray(p->inpFiles); - pb_FreePlatformParam(p->platform); - pb_FreeDeviceParam(p->device); - free(p); -} - -/*****************************************************************************/ - -/* Parse a comma-delimited list of strings into an - * array of strings. */ -static char ** -read_string_array(char *in) -{ - char **ret; - int i; - int count; /* Number of items in the input */ - char *substring; /* Current substring within 'in' */ - - /* Count the number of items in the string */ - count = 1; - for (i = 0; in[i]; i++) if (in[i] == ',') count++; - - /* Allocate storage */ - ret = (char **)malloc((count + 1) * sizeof(char *)); - - /* Create copies of the strings from the list */ - substring = in; - for (i = 0; i < count; i++) { - char *substring_end; - int substring_length; - - /* Find length of substring */ - for (substring_end = substring; - (*substring_end != ',') && (*substring_end != 0); - substring_end++); - - substring_length = substring_end - substring; - - /* Allocate memory and copy the substring */ - ret[i] = (char *)malloc(substring_length + 1); - memcpy(ret[i], substring, substring_length); - ret[i][substring_length] = 0; - - /* go to next substring */ - substring = substring_end + 1; - } - ret[i] = NULL; /* Write the sentinel value */ - - return ret; -} - -static void -report_parse_error(const char *str) -{ - fputs(str, stderr); -} - -/* Interpret a string as a 'pb_DeviceParam' value. - * Return a pointer to a new value, or NULL on failure. - */ -static struct pb_DeviceParam * -read_device_param(char *str) -{ - /* Try different ways of interpreting 'device_string' until one works */ - - /* If argument is an integer, then interpret it as a device index */ - errno = 0; - char *end; - long device_int = strtol(str, &end, 10); - if (!errno) { - /* Negative numbers are not valid */ - if (device_int < 0 || device_int > INT_MAX) return NULL; - - return pb_DeviceParam_index(device_int); - } - - /* Match against predefined strings */ - if (strcmp(str, "CPU") == 0) - return pb_DeviceParam_cpu(); - if (strcmp(str, "GPU") == 0) - return pb_DeviceParam_gpu(); - if (strcmp(str, "ACCELERATOR") == 0) - return pb_DeviceParam_accelerator(); - - /* Assume any other string is a device name */ - return pb_DeviceParam_name(strdup(str)); -} - -/* Interpret a string as a 'pb_PlatformParam' value. - * Return a pointer to a new value, or NULL on failure. - */ -static struct pb_PlatformParam * -read_platform_param(char *str) -{ - int separator_index; /* Index of the '-' character separating - * name and version number. It's -1 if - * there's no '-' character. */ - - /* Find the last occurrence of '-' in 'str' */ - { - char *cur; - separator_index = -1; - for (cur = str; *cur; cur++) { - if (*cur == '-') separator_index = cur - str; - } - } - - /* The platform name is either the entire string, or all characters before - * the separator */ - int name_length = separator_index == -1 ? strlen(str) : separator_index; - char *name_str = (char *)malloc(name_length + 1); - memcpy(name_str, str, name_length); - name_str[name_length] = 0; - - /* The version is either NULL, or all characters after the separator */ - char *version_str; - if (separator_index == -1) { - version_str = NULL; - } - else { - const char *version_input_str = str + separator_index + 1; - int version_length = strlen(version_input_str); - - version_str = (char *)malloc(version_length + 1); - memcpy(version_str, version_input_str, version_length); - version_str[version_length] = 0; - } - - /* Create output structure */ - return pb_PlatformParam(name_str, version_str); -} - -/****************************************************************************/ -/* Argument parsing state */ - -/* Argument parsing state. - * - * Arguments that are interpreted by the argument parser are removed from - * the list. Variables 'argc' and 'argn' do not count arguments that have - * been removed. - * - * During argument parsing, the array of arguments is compacted, overwriting - * the erased arguments. Variable 'argv_put' points to the array element - * where the next argument will be written. Variable 'argv_get' points to - * the array element where the next argument will be read from. - */ -struct argparse { - int argc; /* Number of arguments. Mutable. */ - int argn; /* Current argument index. */ - char **argv_get; /* Argument value being read. */ - char **argv_put; /* Argument value being written. - * argv_put <= argv_get. */ -}; - -static void -initialize_argparse(struct argparse *ap, int argc, char **argv) -{ - ap->argc = argc; - ap->argn = 0; - ap->argv_get = ap->argv_put = argv; -} - -/* Finish argument parsing, without processing the remaining arguments. - * Write new argument count into _argc. */ -static void -finalize_argparse(struct argparse *ap, int *_argc, char **argv) -{ - /* Move the remaining arguments */ - for(; ap->argn < ap->argc; ap->argn++) - *ap->argv_put++ = *ap->argv_get++; - - /* Update the argument count */ - *_argc = ap->argc; - - /* Insert a terminating NULL */ - argv[ap->argc] = NULL; -} - -/* Delete the current argument. The argument will not be visible - * when argument parsing is done. */ -static void -delete_argument(struct argparse *ap) -{ - if (ap->argn >= ap->argc) { - fprintf(stderr, "delete_argument\n"); - } - ap->argc--; - ap->argv_get++; -} - -/* Go to the next argument. Also, move the current argument to its - * final location in argv. */ -static void -next_argument(struct argparse *ap) -{ - if (ap->argn >= ap->argc) { - fprintf(stderr, "next_argument\n"); - } - /* Move argument to its new location. */ - *ap->argv_put++ = *ap->argv_get++; - ap->argn++; -} - -static int -is_end_of_arguments(struct argparse *ap) -{ - return ap->argn == ap->argc; -} - -/* Get the current argument */ -static char * -get_argument(struct argparse *ap) -{ - return *ap->argv_get; -} - -/* Get the current argument, and also delete it */ -static char * -consume_argument(struct argparse *ap) -{ - char *ret = get_argument(ap); - delete_argument(ap); - return ret; -} - -/****************************************************************************/ - -/* The result of parsing a command-line argument */ -typedef enum { - ARGPARSE_OK, /* Success */ - ARGPARSE_ERROR, /* Error */ - ARGPARSE_DONE /* Success, and do not continue parsing */ -} result; - -typedef result parse_action(struct argparse *ap, struct pb_Parameters *params); - - -/* A command-line option */ -struct option { - char short_name; /* If not 0, the one-character - * name of this option */ - const char *long_name; /* If not NULL, the long name of this option */ - parse_action *action; /* What to do when this option occurs. - * Sentinel value is NULL. - */ -}; - -/* Output file - * - * -o FILE - */ -static result -parse_output_file(struct argparse *ap, struct pb_Parameters *params) -{ - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting file name after '-o'\n"); - return ARGPARSE_ERROR; - } - - /* Replace the output file name */ - free(params->outFile); - params->outFile = strdup(consume_argument(ap)); - - return ARGPARSE_OK; -} - -/* Input files - * - * -i FILE,FILE,... - */ -static result -parse_input_files(struct argparse *ap, struct pb_Parameters *params) -{ - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting file name after '-i'\n"); - return ARGPARSE_ERROR; - } - - /* Replace the input file list */ - pb_FreeStringArray(params->inpFiles); - params->inpFiles = read_string_array(consume_argument(ap)); - return ARGPARSE_OK; -} - -/* End of options - * - * -- - */ - -static result -parse_end_options(struct argparse *ap, struct pb_Parameters *params) -{ - return ARGPARSE_DONE; -} - -/* OpenCL device - * - * --device X - */ - -static result -parse_device(struct argparse *ap, struct pb_Parameters *params) -{ - /* Read the next argument, which specifies a device */ - - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting device specification after '--device'\n"); - return ARGPARSE_ERROR; - } - - char *device_string = consume_argument(ap); - struct pb_DeviceParam *device_param = read_device_param(device_string); - - if (!device_param) { - report_parse_error("Unrecognized device specification format on command line\n"); - return ARGPARSE_ERROR; - } - - /* Save the result */ - pb_FreeDeviceParam(params->device); - params->device = device_param; - - return ARGPARSE_OK; -} - -static result -parse_platform(struct argparse *ap, struct pb_Parameters *params) -{ - /* Read the next argument, which specifies a platform */ - - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting device specification after '--platform'\n"); - return ARGPARSE_ERROR; - } - - char *platform_string = consume_argument(ap); - struct pb_PlatformParam *platform_param = read_platform_param(platform_string); - - if (!platform_param) { - report_parse_error("Unrecognized platform specification format on command line\n"); - return ARGPARSE_ERROR; - } - - /* Save the result */ - pb_FreePlatformParam(params->platform); - params->platform = platform_param; - - return ARGPARSE_OK; -} - - -static struct option options[] = { - { 'o', NULL, &parse_output_file }, - { 'i', NULL, &parse_input_files }, - { '-', NULL, &parse_end_options }, - { 0, "device", &parse_device }, - { 0, "platform", &parse_platform }, - { 0, NULL, NULL } -}; - -static int -is_last_option(struct option *op) -{ - return op->action == NULL; -} - -/****************************************************************************/ - -/* Parse command-line parameters. - * Return zero on error, nonzero otherwise. - * On error, the other outputs may be invalid. - * - * The information collected from parameters is used to update - * 'ret'. 'ret' should be initialized. - * - * '_argc' and 'argv' are updated to contain only the unprocessed arguments. - */ -static int -pb_ParseParameters (struct pb_Parameters *ret, int *_argc, char **argv) -{ - char *err_message; - struct argparse ap; - - /* Each argument */ - initialize_argparse(&ap, *_argc, argv); - while(!is_end_of_arguments(&ap)) { - result arg_result; /* Result of parsing this option */ - char *arg = get_argument(&ap); - - /* Process this argument */ - if (arg[0] == '-') { - /* Single-character flag */ - if ((arg[1] != 0) && (arg[2] == 0)) { - delete_argument(&ap); /* This argument is consumed here */ - - /* Find a matching short option */ - struct option *op; - for (op = options; !is_last_option(op); op++) { - if (op->short_name == arg[1]) { - arg_result = (*op->action)(&ap, ret); - goto option_was_processed; - } - } - - /* No option matches */ - report_parse_error("Unexpected command-line parameter\n"); - arg_result = ARGPARSE_ERROR; - goto option_was_processed; - } - - /* Long flag */ - if (arg[1] == '-') { - delete_argument(&ap); /* This argument is consumed here */ - - /* Find a matching long option */ - struct option *op; - for (op = options; !is_last_option(op); op++) { - if (op->long_name && strcmp(&arg[2], op->long_name) == 0) { - arg_result = (*op->action)(&ap, ret); - goto option_was_processed; - } - } - - /* No option matches */ - report_parse_error("Unexpected command-line parameter\n"); - arg_result = ARGPARSE_ERROR; - goto option_was_processed; - } - } - else { - /* Other arguments are ignored */ - next_argument(&ap); - arg_result = ARGPARSE_OK; - goto option_was_processed; - } - - option_was_processed: - /* Decide what to do next based on 'arg_result' */ - switch(arg_result) { - case ARGPARSE_OK: - /* Continue processing */ - break; - - case ARGPARSE_ERROR: - /* Error exit from the function */ - return 0; - - case ARGPARSE_DONE: - /* Normal exit from the argument parsing loop */ - goto end_of_options; - } - } /* end for each argument */ - - /* If all arguments were processed, then normal exit from the loop */ - - end_of_options: - finalize_argparse(&ap, _argc, argv); - return 1; -} - -/*****************************************************************************/ -/* Other exported functions */ - -struct pb_Parameters * -pb_ReadParameters(int *_argc, char **argv) -{ - struct pb_Parameters *ret = - (struct pb_Parameters *)malloc(sizeof(struct pb_Parameters)); - - /* Initialize the parameters structure */ - ret->outFile = NULL; - ret->inpFiles = (char **)malloc(sizeof(char *)); - ret->inpFiles[0] = NULL; - ret->platform = NULL; - ret->device = NULL; - - /* Read parameters and update _argc, argv */ - if (!pb_ParseParameters(ret, _argc, argv)) { - /* Parse error */ - pb_FreeParameters(ret); - return NULL; - } - - return ret; -} - -int -pb_Parameters_CountInputs(struct pb_Parameters *p) -{ - int n; - - for (n = 0; p->inpFiles[n]; n++); - return n; -} - diff --git a/tests/opencl/cutcp/atom.h b/tests/opencl/cutcp/atom.h deleted file mode 100644 index f5a60058..00000000 --- a/tests/opencl/cutcp/atom.h +++ /dev/null @@ -1,37 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifndef ATOM_H -#define ATOM_H - -#ifdef __cplusplus -extern "C" { -#endif - - typedef struct Atom_t { - float x, y, z, q; - } Atom; - - typedef struct Atoms_t { - Atom *atoms; - int size; - } Atoms; - - typedef struct Vec3_t { - float x, y, z; - } Vec3; - - Atoms *read_atom_file(const char *fname); - void free_atom(Atoms *atom); - void get_atom_extent(Vec3 *lo, Vec3 *hi, Atoms *atom); - -#ifdef __cplusplus -} -#endif - -#endif /* ATOM_H */ diff --git a/tests/opencl/cutcp/cutcpu.c b/tests/opencl/cutcp/cutcpu.c deleted file mode 100644 index 5f440752..00000000 --- a/tests/opencl/cutcp/cutcpu.c +++ /dev/null @@ -1,195 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include -#include -#include "atom.h" -#include "cutoff.h" - -#undef DEBUG_PASS_RATE -#define CHECK_CYLINDER_CPU - -#define CELLEN 4.f -#define INV_CELLEN (1.f/CELLEN) - -extern int cpu_compute_cutoff_potential_lattice( - Lattice *lattice, /* the lattice */ - float cutoff, /* cutoff distance */ - Atoms *atoms /* array of atoms */ - ) -{ - int nx = lattice->dim.nx; - int ny = lattice->dim.ny; - int nz = lattice->dim.nz; - float xlo = lattice->dim.lo.x; - float ylo = lattice->dim.lo.y; - float zlo = lattice->dim.lo.z; - float gridspacing = lattice->dim.h; - int natoms = atoms->size; - Atom *atom = atoms->atoms; - - const float a2 = cutoff * cutoff; - const float inv_a2 = 1.f / a2; - float s; - const float inv_gridspacing = 1.f / gridspacing; - const int radius = (int) ceilf(cutoff * inv_gridspacing) - 1; - /* lattice point radius about each atom */ - - int n; - int i, j, k; - int ia, ib, ic; - int ja, jb, jc; - int ka, kb, kc; - int index; - int koff, jkoff; - - float x, y, z, q; - float dx, dy, dz; - float dz2, dydz2, r2; - float e; - float xstart, ystart; - - float *pg; - - int gindex; - int ncell, nxcell, nycell, nzcell; - int *first, *next; - float inv_cellen = INV_CELLEN; - Vec3 minext, maxext; /* Extent of atom bounding box */ - float xmin, ymin, zmin; - float xmax, ymax, zmax; - -#if DEBUG_PASS_RATE - unsigned long long pass_count = 0; - unsigned long long fail_count = 0; -#endif - - /* find min and max extent */ - get_atom_extent(&minext, &maxext, atoms); - - /* number of cells in each dimension */ - nxcell = (int) floorf((maxext.x-minext.x) * inv_cellen) + 1; - nycell = (int) floorf((maxext.y-minext.y) * inv_cellen) + 1; - nzcell = (int) floorf((maxext.z-minext.z) * inv_cellen) + 1; - ncell = nxcell * nycell * nzcell; - - /* allocate for cursor link list implementation */ - first = (int *) malloc(ncell * sizeof(int)); - for (gindex = 0; gindex < ncell; gindex++) { - first[gindex] = -1; - } - next = (int *) malloc(natoms * sizeof(int)); - for (n = 0; n < natoms; n++) { - next[n] = -1; - } - - /* geometric hashing */ - for (n = 0; n < natoms; n++) { - if (0==atom[n].q) continue; /* skip any non-contributing atoms */ - i = (int) floorf((atom[n].x - minext.x) * inv_cellen); - j = (int) floorf((atom[n].y - minext.y) * inv_cellen); - k = (int) floorf((atom[n].z - minext.z) * inv_cellen); - gindex = (k*nycell + j)*nxcell + i; - next[n] = first[gindex]; - first[gindex] = n; - } - - /* traverse the grid cells */ - for (gindex = 0; gindex < ncell; gindex++) { - for (n = first[gindex]; n != -1; n = next[n]) { - x = atom[n].x - xlo; - y = atom[n].y - ylo; - z = atom[n].z - zlo; - q = atom[n].q; - - /* find closest grid point with position less than or equal to atom */ - ic = (int) (x * inv_gridspacing); - jc = (int) (y * inv_gridspacing); - kc = (int) (z * inv_gridspacing); - - /* find extent of surrounding box of grid points */ - ia = ic - radius; - ib = ic + radius + 1; - ja = jc - radius; - jb = jc + radius + 1; - ka = kc - radius; - kb = kc + radius + 1; - - /* trim box edges so that they are within grid point lattice */ - if (ia < 0) ia = 0; - if (ib >= nx) ib = nx-1; - if (ja < 0) ja = 0; - if (jb >= ny) jb = ny-1; - if (ka < 0) ka = 0; - if (kb >= nz) kb = nz-1; - - /* loop over surrounding grid points */ - xstart = ia*gridspacing - x; - ystart = ja*gridspacing - y; - dz = ka*gridspacing - z; - for (k = ka; k <= kb; k++, dz += gridspacing) { - koff = k*ny; - dz2 = dz*dz; - dy = ystart; - for (j = ja; j <= jb; j++, dy += gridspacing) { - jkoff = (koff + j)*nx; - dydz2 = dy*dy + dz2; -#ifdef CHECK_CYLINDER_CPU - if (dydz2 >= a2) continue; -#endif - - dx = xstart; - index = jkoff + ia; - pg = lattice->lattice + index; - -#if defined(__INTEL_COMPILER) - for (i = ia; i <= ib; i++, pg++, dx += gridspacing) { - r2 = dx*dx + dydz2; - s = (1.f - r2 * inv_a2) * (1.f - r2 * inv_a2); - e = q * (1/sqrtf(r2)) * s; - *pg += (r2 < a2 ? e : 0); /* LOOP VECTORIZED!! */ - } -#else - for (i = ia; i <= ib; i++, pg++, dx += gridspacing) { - r2 = dx*dx + dydz2; - if (r2 >= a2) - { -#ifdef DEBUG_PASS_RATE - fail_count++; -#endif - continue; - } -#ifdef DEBUG_PASS_RATE - pass_count++; -#endif - s = (1.f - r2 * inv_a2); - e = q * (1/sqrtf(r2)) * s * s; - *pg += e; - } -#endif - } - } /* end loop over surrounding grid points */ - - } /* end loop over atoms in a gridcell */ - } /* end loop over gridcells */ - - /* free memory */ - free(next); - free(first); - - /* For debugging: print the number of times that the test passed/failed */ -#ifdef DEBUG_PASS_RATE - printf ("Pass :%lld\n", pass_count); - printf ("Fail :%lld\n", fail_count); -#endif - - return 0; -} diff --git a/tests/opencl/cutcp/cutoff.c b/tests/opencl/cutcp/cutoff.c deleted file mode 100644 index 4a52d528..00000000 --- a/tests/opencl/cutcp/cutoff.c +++ /dev/null @@ -1,508 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include - -#include -#include -#include -#include -#include - -#include "atom.h" -#include "cutoff.h" -#include "macros.h" -#include "ocl.h" - -static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) { - if (NULL == filename || NULL == data || 0 == size) - return CL_INVALID_VALUE; - - FILE* fp = fopen(filename, "r"); - if (NULL == fp) { - fprintf(stderr, "Failed to load kernel."); - return CL_INVALID_VALUE; - } - fseek(fp , 0 , SEEK_END); - long fsize = ftell(fp); - rewind(fp); - - *data = (uint8_t*)malloc(fsize); - *size = fread(*data, 1, fsize, fp); - - fclose(fp); - - return CL_SUCCESS; -} - -// OpenCL 1.1 support for int3 is not uniform on all implementations, so -// we use int4 instead. Only the 'x', 'y', and 'z' fields of xyz are used. -typedef cl_int4 xyz; - -//extern "C" int gpu_compute_cutoff_potential_lattice( -int gpu_compute_cutoff_potential_lattice( - struct pb_TimerSet *timers, - Lattice *lattice, /* the lattice */ - float cutoff, /* cutoff distance */ - Atoms *atoms, /* array of atoms */ - int verbose, /* print info/debug messages */ - struct pb_Parameters *parameters - ) -{ - int nx = lattice->dim.nx; - int ny = lattice->dim.ny; - int nz = lattice->dim.nz; - float xlo = lattice->dim.lo.x; - float ylo = lattice->dim.lo.y; - float zlo = lattice->dim.lo.z; - float h = lattice->dim.h; - int natoms = atoms->size; - Atom *atom = atoms->atoms; - - xyz nbrlist[NBRLIST_MAXLEN]; - int nbrlistlen = 0; - - int binHistoFull[BIN_DEPTH+1] = { 0 }; /* clear every array element */ - int binHistoCover[BIN_DEPTH+1] = { 0 }; /* clear every array element */ - int num_excluded = 0; - - int xRegionDim, yRegionDim, zRegionDim; - int xRegionIndex, yRegionIndex, zRegionIndex; - int xOffset, yOffset, zOffset; - int lnx, lny, lnz, lnall; - float *regionZeroAddr, *thisRegion; - cl_mem regionZeroCl; - int index, indexRegion; - - int c; - xyz binDim; - int nbins; - cl_float4 *binBaseAddr, *binZeroAddr; - cl_mem binBaseCl, binZeroCl; - int *bincntBaseAddr, *bincntZeroAddr; - Atoms *extra = NULL; - - cl_mem NbrListLen; - cl_mem NbrList; - - int i, j, k, n; - int sum, total; - - float avgFillFull, avgFillCover; - const float cutoff2 = cutoff * cutoff; - const float inv_cutoff2 = 1.f / cutoff2; - - size_t gridDim[3], blockDim[3]; - - // The "compute" timer should be active upon entry to this function - - /* pad lattice to be factor of 8 in each dimension */ - xRegionDim = (int) ceilf(nx/8.f); - yRegionDim = (int) ceilf(ny/8.f); - zRegionDim = (int) ceilf(nz/8.f); - - lnx = 8 * xRegionDim; - lny = 8 * yRegionDim; - lnz = 8 * zRegionDim; - lnall = lnx * lny * lnz; - - /* will receive energies from OpenCL */ - regionZeroAddr = (float *) malloc(lnall * sizeof(float)); - - /* create bins */ - c = (int) ceil(cutoff * BIN_INVLEN); /* count extra bins around lattice */ - binDim.x = (int) ceil(lnx * h * BIN_INVLEN) + 2*c; - binDim.y = (int) ceil(lny * h * BIN_INVLEN) + 2*c; - binDim.z = (int) ceil(lnz * h * BIN_INVLEN) + 2*c; - nbins = binDim.x * binDim.y * binDim.z; - binBaseAddr = (cl_float4 *) calloc(nbins * BIN_DEPTH, sizeof(cl_float4)); - binZeroAddr = binBaseAddr + ((c * binDim.y + c) * binDim.x + c) * BIN_DEPTH; - - bincntBaseAddr = (int *) calloc(nbins, sizeof(int)); - bincntZeroAddr = bincntBaseAddr + (c * binDim.y + c) * binDim.x + c; - - /* create neighbor list */ - if (ceilf(BIN_LENGTH / (8*h)) == floorf(BIN_LENGTH / (8*h))) { - float s = sqrtf(3); - float r2 = (cutoff + s*BIN_LENGTH) * (cutoff + s*BIN_LENGTH); - int cnt = 0; - /* develop neighbor list around 1 cell */ - if (2*c + 1 > NBRLIST_DIM) { - fprintf(stderr, "must have cutoff <= %f\n", - (NBRLIST_DIM-1)/2 * BIN_LENGTH); - return -1; - } - for (k = -c; k <= c; k++) { - for (j = -c; j <= c; j++) { - for (i = -c; i <= c; i++) { - if ((i*i + j*j + k*k)*BIN_LENGTH*BIN_LENGTH >= r2) continue; - nbrlist[cnt].x = i; - nbrlist[cnt].y = j; - nbrlist[cnt].z = k; - cnt++; - } - } - } - nbrlistlen = cnt; - } - else if (8*h <= 2*BIN_LENGTH) { - float s = 2.f*sqrtf(3); - float r2 = (cutoff + s*BIN_LENGTH) * (cutoff + s*BIN_LENGTH); - int cnt = 0; - /* develop neighbor list around 3-cube of cells */ - if (2*c + 3 > NBRLIST_DIM) { - fprintf(stderr, "must have cutoff <= %f\n", - (NBRLIST_DIM-3)/2 * BIN_LENGTH); - return -1; - } - for (k = -c; k <= c; k++) { - for (j = -c; j <= c; j++) { - for (i = -c; i <= c; i++) { - if ((i*i + j*j + k*k)*BIN_LENGTH*BIN_LENGTH >= r2) continue; - nbrlist[cnt].x = i; - nbrlist[cnt].y = j; - nbrlist[cnt].z = k; - cnt++; - } - } - } - nbrlistlen = cnt; - } - else { - fprintf(stderr, "must have h <= %f\n", 0.25 * BIN_LENGTH); - return -1; - } - - /* perform geometric hashing of atoms into bins */ - { - /* array of extra atoms, permit average of one extra per bin */ - Atom *extra_atoms = (Atom *) calloc(nbins, sizeof(Atom)); - int extra_len = 0; - - for (n = 0; n < natoms; n++) { - cl_float4 p; - p.x = atom[n].x - xlo; - p.y = atom[n].y - ylo; - p.z = atom[n].z - zlo; - p.w = atom[n].q; - i = (int) floorf(p.x * BIN_INVLEN); - j = (int) floorf(p.y * BIN_INVLEN); - k = (int) floorf(p.z * BIN_INVLEN); - if (i >= -c && i < binDim.x - c && - j >= -c && j < binDim.y - c && - k >= -c && k < binDim.z - c && - atom[n].q != 0) { - int index = (k * binDim.y + j) * binDim.x + i; - cl_float4 *bin = binZeroAddr + index * BIN_DEPTH; - int bindex = bincntZeroAddr[index]; - if (bindex < BIN_DEPTH) { - /* copy atom into bin and increase counter for this bin */ - bin[bindex] = p; - bincntZeroAddr[index]++; - } - else { - /* add index to array of extra atoms to be computed with CPU */ - if (extra_len >= nbins) { - fprintf(stderr, "exceeded space for storing extra atoms\n"); - return -1; - } - extra_atoms[extra_len] = atom[n]; - extra_len++; - } - } - else { - /* excluded atoms are either outside bins or neutrally charged */ - num_excluded++; - } - } - - /* Save result */ - extra = (Atoms *)malloc(sizeof(Atoms)); - extra->atoms = extra_atoms; - extra->size = extra_len; - } - - /* bin stats */ - sum = total = 0; - for (n = 0; n < nbins; n++) { - binHistoFull[ bincntBaseAddr[n] ]++; - sum += bincntBaseAddr[n]; - total += BIN_DEPTH; - } - avgFillFull = sum / (float) total; - sum = total = 0; - for (k = 0; k < binDim.z - 2*c; k++) { - for (j = 0; j < binDim.y - 2*c; j++) { - for (i = 0; i < binDim.x - 2*c; i++) { - int index = (k * binDim.y + j) * binDim.x + i; - binHistoCover[ bincntZeroAddr[index] ]++; - sum += bincntZeroAddr[index]; - total += BIN_DEPTH; - } - } - } - avgFillCover = sum / (float) total; - - if (verbose) { - /* report */ - printf("number of atoms = %d\n", natoms); - printf("lattice spacing = %g\n", h); - printf("cutoff distance = %g\n", cutoff); - printf("\n"); - printf("requested lattice dimensions = %d %d %d\n", nx, ny, nz); - printf("requested space dimensions = %g %g %g\n", nx*h, ny*h, nz*h); - printf("expanded lattice dimensions = %d %d %d\n", lnx, lny, lnz); - printf("expanded space dimensions = %g %g %g\n", lnx*h, lny*h, lnz*h); - printf("number of bytes for lattice data = %u\n", (unsigned int) (lnall*sizeof(float))); - printf("\n"); - printf("bin padding thickness = %d\n", c); - printf("bin cover dimensions = %d %d %d\n", - binDim.x - 2*c, binDim.y - 2*c, binDim.z - 2*c); - printf("bin full dimensions = %d %d %d\n", binDim.x, binDim.y, binDim.z); - printf("number of bins = %d\n", nbins); - printf("total number of atom slots = %d\n", nbins * BIN_DEPTH); - printf("%% overhead space = %g\n", - (natoms / (double) (nbins * BIN_DEPTH)) * 100); - printf("number of bytes for bin data = %u\n", - (unsigned int)(nbins * BIN_DEPTH * sizeof(cl_float4))); - printf("\n"); - printf("bin histogram with padding:\n"); - sum = 0; - for (n = 0; n <= BIN_DEPTH; n++) { - printf(" number of bins with %d atoms: %d\n", n, binHistoFull[n]); - sum += binHistoFull[n]; - } - printf(" total number of bins: %d\n", sum); - printf(" %% average fill: %g\n", avgFillFull * 100); - printf("\n"); - printf("bin histogram excluding padding:\n"); - sum = 0; - for (n = 0; n <= BIN_DEPTH; n++) { - printf(" number of bins with %d atoms: %d\n", n, binHistoCover[n]); - sum += binHistoCover[n]; - } - printf(" total number of bins: %d\n", sum); - printf(" %% average fill: %g\n", avgFillCover * 100); - printf("\n"); - printf("number of extra atoms = %d\n", extra->size); - printf("%% atoms that are extra = %g\n", (extra->size / (double) natoms) * 100); - printf("\n"); - - /* sanity check on bins */ - sum = 0; - for (n = 0; n <= BIN_DEPTH; n++) { - sum += n * binHistoFull[n]; - } - sum += extra->size + num_excluded; - printf("sanity check on bin histogram with edges: " - "sum + others = %d\n", sum); - sum = 0; - for (n = 0; n <= BIN_DEPTH; n++) { - sum += n * binHistoCover[n]; - } - sum += extra->size + num_excluded; - printf("sanity check on bin histogram excluding edges: " - "sum + others = %d\n", sum); - printf("\n"); - - /* neighbor list */ - printf("neighbor list length = %d\n", nbrlistlen); - printf("\n"); - } - - pb_Context* pb_context; - pb_context = pb_InitOpenCLContext(parameters); - if (pb_context == NULL) { - fprintf (stderr, "Error: No OpenCL platform/device can be found."); - return -1; - } - - cl_int clStatus; - cl_device_id clDevice = (cl_device_id) pb_context->clDeviceId; - cl_platform_id clPlatform = (cl_platform_id) pb_context->clPlatformId; - cl_context clContext = (cl_context) pb_context->clContext; - - cl_command_queue clCommandQueue = clCreateCommandQueue(clContext,clDevice,CL_QUEUE_PROFILING_ENABLE,&clStatus); - CHECK_ERROR("clCreateCommandQueue") - - pb_SetOpenCL(&clContext, &clCommandQueue); - - //const char* clSource[] = {readFile("src/opencl_base/kernel.cl")}; - //cl_program clProgram = clCreateProgramWithSource(clContext,1,clSource,NULL,&clStatus); - uint8_t *kernel_bin = NULL; - size_t kernel_size; - cl_int binary_status = 0; - clStatus = read_kernel_file("kernel.pocl", &kernel_bin, &kernel_size); - CHECK_ERROR("read_kernel_file") - cl_program clProgram = clCreateProgramWithBinary( - clContext, 1, &clDevice, &kernel_size, (const uint8_t**)&kernel_bin, &binary_status, &clStatus); - CHECK_ERROR("clCreateProgramWithSource") - - char clOptions[50]; - sprintf(clOptions,"-I src/opencl_base"); //-cl-nv-verbose - - clStatus = clBuildProgram(clProgram,1,&clDevice,clOptions,NULL,NULL); - if (clStatus != CL_SUCCESS) { - size_t string_size = 0; - clGetProgramBuildInfo(clProgram, clDevice, CL_PROGRAM_BUILD_LOG, - 0, NULL, &string_size); - char* string = (char*)malloc(string_size*sizeof(char)); - clGetProgramBuildInfo(clProgram, clDevice, CL_PROGRAM_BUILD_LOG, - string_size, string, NULL); - puts(string); - } - - CHECK_ERROR("clBuildProgram") - - cl_kernel clKernel = clCreateKernel(clProgram,"opencl_cutoff_potential_lattice",&clStatus); - CHECK_ERROR("clCreateKernel") - - /* setup OpenCL kernel parameters */ - blockDim[0] = 8; - blockDim[1] = 8; - blockDim[2] = 2; - gridDim[0] = 4 * xRegionDim * blockDim[0]; - gridDim[1] = yRegionDim * blockDim[1]; - gridDim[2] = 1 * blockDim[2]; - - /* allocate and initialize memory on OpenCL device */ - pb_SwitchToTimer(timers, pb_TimerID_COPY); - if (verbose) { - printf("Allocating %.2fMB on OpenCL device for potentials\n", - lnall * sizeof(float) / (double) (1024*1024)); - } - - regionZeroCl = clCreateBuffer(clContext,CL_MEM_WRITE_ONLY,lnall*sizeof(float),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - - // clMemSet(clCommandQueue,regionZeroCl,0,lnall*sizeof(float)); - - if (verbose) { - printf("Allocating %.2fMB on OpenCL device for atom bins\n", - nbins * BIN_DEPTH * sizeof(cl_float4) / (double) (1024*1024)); - } - - binBaseCl = clCreateBuffer(clContext,CL_MEM_READ_ONLY,nbins*BIN_DEPTH*sizeof(cl_float4),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - - clStatus = clEnqueueWriteBuffer(clCommandQueue,binBaseCl,CL_TRUE,0,nbins*BIN_DEPTH*sizeof(cl_float4),binBaseAddr,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - - //Sub buffers are not supported in OpenCL v1.0 - int offset = ((c * binDim.y + c) * binDim.x + c) * BIN_DEPTH; - - NbrListLen = clCreateBuffer(clContext,CL_MEM_READ_ONLY,sizeof(int),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - clStatus = clEnqueueWriteBuffer(clCommandQueue,NbrListLen,CL_TRUE,0,sizeof(int),&nbrlistlen,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - - NbrList = clCreateBuffer(clContext,CL_MEM_READ_ONLY,NBRLIST_MAXLEN*sizeof(xyz),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - clStatus = clEnqueueWriteBuffer(clCommandQueue,NbrList,CL_TRUE,0,nbrlistlen*sizeof(xyz),nbrlist,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - - if (verbose) - printf("\n"); - - clStatus = clSetKernelArg(clKernel,0,sizeof(int),&(binDim.x)); - clStatus = clSetKernelArg(clKernel,1,sizeof(int),&(binDim.y)); - clStatus = clSetKernelArg(clKernel,2,sizeof(cl_mem),&binBaseCl); - clStatus = clSetKernelArg(clKernel,3,sizeof(int),&offset); - clStatus = clSetKernelArg(clKernel,4,sizeof(float),&h); - clStatus = clSetKernelArg(clKernel,5,sizeof(float),&cutoff2); - clStatus = clSetKernelArg(clKernel,6,sizeof(float),&inv_cutoff2); - clStatus = clSetKernelArg(clKernel,7,sizeof(cl_mem),®ionZeroCl); - clStatus = clSetKernelArg(clKernel,9,sizeof(cl_mem),&NbrListLen); - clStatus = clSetKernelArg(clKernel,10,sizeof(cl_mem),&NbrList); - CHECK_ERROR("clSetKernelArg") - - /* loop over z-dimension, invoke OpenCL kernel for each x-y plane */ - pb_SwitchToTimer(timers, pb_TimerID_KERNEL); - printf("Invoking OpenCL kernel on %d region planes...\n", zRegionDim); - for (zRegionIndex = 0; zRegionIndex < zRegionDim; zRegionIndex++) { - printf(" computing plane %d\r", zRegionIndex); - fflush(stdout); - - clStatus = clSetKernelArg(clKernel,8,sizeof(int),&zRegionIndex); - CHECK_ERROR("clSetKernelArg") - - clStatus = clEnqueueNDRangeKernel(clCommandQueue,clKernel,3,NULL,gridDim,blockDim,0,NULL,NULL); - - CHECK_ERROR("clEnqueueNDRangeKernel") - - clStatus = clFinish(clCommandQueue); - - CHECK_ERROR("clFinish") - } - - printf("Finished OpenCL kernel calls\n"); - - /* copy result regions from OpenCL device */ - pb_SwitchToTimer(timers, pb_TimerID_COPY); - clStatus = clEnqueueReadBuffer(clCommandQueue,regionZeroCl,CL_TRUE,0,lnall*sizeof(float),regionZeroAddr,0,NULL,NULL); - CHECK_ERROR("clEnqueueReadBuffer") - - /* free OpenCL memory allocations */ - clStatus = clReleaseMemObject(regionZeroCl); - clStatus = clReleaseMemObject(binBaseCl); - clStatus = clReleaseMemObject(NbrListLen); - clStatus = clReleaseMemObject(NbrList); - CHECK_ERROR("clReleaseMemObject") - - clStatus = clReleaseKernel(clKernel); - clStatus = clReleaseProgram(clProgram); - clStatus = clReleaseCommandQueue(clCommandQueue); - clStatus = clReleaseContext(clContext); - - //free((void*)clSource[0]); - - /* transpose regions back into lattice */ - pb_SwitchToTimer(timers, pb_TimerID_COMPUTE); - for (k = 0; k < nz; k++) { - zRegionIndex = (k >> 3); - zOffset = (k & 7); - - for (j = 0; j < ny; j++) { - yRegionIndex = (j >> 3); - yOffset = (j & 7); - - for (i = 0; i < nx; i++) { - xRegionIndex = (i >> 3); - xOffset = (i & 7); - - thisRegion = regionZeroAddr - + ((zRegionIndex * yRegionDim + yRegionIndex) * xRegionDim - + xRegionIndex) * REGION_SIZE; - - indexRegion = (zOffset * 8 + yOffset) * 8 + xOffset; - index = (k * ny + j) * nx + i; - - lattice->lattice[index] = thisRegion[indexRegion]; - } - } - } - - /* handle extra atoms */ - if (extra->size > 0) { - printf("computing extra atoms on CPU\n"); - if (cpu_compute_cutoff_potential_lattice(lattice, cutoff, extra)) { - fprintf(stderr, "cpu_compute_cutoff_potential_lattice() failed " - "for extra atoms\n"); - return -1; - } - printf("\n"); - } - - /* cleanup memory allocations */ - free(regionZeroAddr); - free(binBaseAddr); - free(bincntBaseAddr); - free_atom(extra); - - return 0; -} diff --git a/tests/opencl/cutcp/cutoff.h b/tests/opencl/cutcp/cutoff.h deleted file mode 100644 index 4db688ba..00000000 --- a/tests/opencl/cutcp/cutoff.h +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifndef CUTOFF_H -#define CUTOFF_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define SHIFTED - - /* A structure to record how points in 3D space map to array - elements. Array element (z, y, x) - where 0 <= x < nx, 0 <= y < ny, 0 <= z < nz - maps to coordinate (xlo, ylo, zlo) + h * (x, y, z). - */ - typedef struct LatticeDim_t { - /* Number of lattice points in x, y, z dimensions */ - int nx, ny, nz; - - /* Lowest corner of lattice */ - Vec3 lo; - - /* Lattice spacing */ - float h; - } LatticeDim; - - /* An electric potential field sampled on a regular grid. The - lattice size and grid point positions are specified by 'dim'. - */ - typedef struct Lattice_t { - LatticeDim dim; - float *lattice; - } Lattice; - - LatticeDim lattice_from_bounding_box(Vec3 lo, Vec3 hi, float h); - - Lattice *create_lattice(LatticeDim dim); - void destroy_lattice(Lattice *); - - int gpu_compute_cutoff_potential_lattice( - struct pb_TimerSet *timers, - Lattice *lattice, - float cutoff, /* cutoff distance */ - Atoms *atom, /* array of atoms */ - int verbose, /* print info/debug messages */ - struct pb_Parameters *parameters - ); - - int cpu_compute_cutoff_potential_lattice( - Lattice *lattice, /* the lattice */ - float cutoff, /* cutoff distance */ - Atoms *atoms /* array of atoms */ - ); - - int remove_exclusions( - Lattice *lattice, /* the lattice */ - float exclcutoff, /* exclusion cutoff distance */ - Atoms *atom /* array of atoms */ - ); - -#ifdef __cplusplus -} -#endif - -#endif /* CUTOFF_H */ diff --git a/tests/opencl/cutcp/excl.c b/tests/opencl/cutcp/excl.c deleted file mode 100644 index 1216854a..00000000 --- a/tests/opencl/cutcp/excl.c +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include -#include - -#include "atom.h" -#include "cutoff.h" - -#define CELLEN 4.f -#define INV_CELLEN (1.f/CELLEN) - -extern int remove_exclusions( - Lattice *lattice, /* the lattice */ - float cutoff, /* exclusion cutoff distance */ - Atoms *atoms /* array of atoms */ - ) -{ - int nx = lattice->dim.nx; - int ny = lattice->dim.ny; - int nz = lattice->dim.nz; - float xlo = lattice->dim.lo.x; - float ylo = lattice->dim.lo.y; - float zlo = lattice->dim.lo.z; - float gridspacing = lattice->dim.h; - Atom *atom = atoms->atoms; - - const float a2 = cutoff * cutoff; - const float inv_gridspacing = 1.f / gridspacing; - const int radius = (int) ceilf(cutoff * inv_gridspacing) - 1; - /* lattice point radius about each atom */ - - int n; - int i, j, k; - int ia, ib, ic; - int ja, jb, jc; - int ka, kb, kc; - int index; - int koff, jkoff; - - float x, y, z, q; - float dx, dy, dz; - float dz2, dydz2, r2; - float e; - float xstart, ystart; - - float *pg; - - int gindex; - int ncell, nxcell, nycell, nzcell; - int *first, *next; - float inv_cellen = INV_CELLEN; - Vec3 minext, maxext; - - /* find min and max extent */ - get_atom_extent(&minext, &maxext, atoms); - - /* number of cells in each dimension */ - nxcell = (int) floorf((maxext.x-minext.x) * inv_cellen) + 1; - nycell = (int) floorf((maxext.y-minext.y) * inv_cellen) + 1; - nzcell = (int) floorf((maxext.z-minext.z) * inv_cellen) + 1; - ncell = nxcell * nycell * nzcell; - - /* allocate for cursor link list implementation */ - first = (int *) malloc(ncell * sizeof(int)); - for (gindex = 0; gindex < ncell; gindex++) { - first[gindex] = -1; - } - next = (int *) malloc(atoms->size * sizeof(int)); - for (n = 0; n < atoms->size; n++) { - next[n] = -1; - } - - /* geometric hashing */ - for (n = 0; n < atoms->size; n++) { - if (0==atom[n].q) continue; /* skip any non-contributing atoms */ - i = (int) floorf((atom[n].x - minext.x) * inv_cellen); - j = (int) floorf((atom[n].y - minext.y) * inv_cellen); - k = (int) floorf((atom[n].z - minext.z) * inv_cellen); - gindex = (k*nycell + j)*nxcell + i; - next[n] = first[gindex]; - first[gindex] = n; - } - - /* traverse the grid cells */ - for (gindex = 0; gindex < ncell; gindex++) { - for (n = first[gindex]; n != -1; n = next[n]) { - x = atom[n].x - xlo; - y = atom[n].y - ylo; - z = atom[n].z - zlo; - q = atom[n].q; - - /* find closest grid point with position less than or equal to atom */ - ic = (int) (x * inv_gridspacing); - jc = (int) (y * inv_gridspacing); - kc = (int) (z * inv_gridspacing); - - /* find extent of surrounding box of grid points */ - ia = ic - radius; - ib = ic + radius + 1; - ja = jc - radius; - jb = jc + radius + 1; - ka = kc - radius; - kb = kc + radius + 1; - - /* trim box edges so that they are within grid point lattice */ - if (ia < 0) ia = 0; - if (ib >= nx) ib = nx-1; - if (ja < 0) ja = 0; - if (jb >= ny) jb = ny-1; - if (ka < 0) ka = 0; - if (kb >= nz) kb = nz-1; - - /* loop over surrounding grid points */ - xstart = ia*gridspacing - x; - ystart = ja*gridspacing - y; - dz = ka*gridspacing - z; - for (k = ka; k <= kb; k++, dz += gridspacing) { - koff = k*ny; - dz2 = dz*dz; - - dy = ystart; - for (j = ja; j <= jb; j++, dy += gridspacing) { - jkoff = (koff + j)*nx; - dydz2 = dy*dy + dz2; - - dx = xstart; - index = jkoff + ia; - pg = lattice->lattice + index; - - for (i = ia; i <= ib; i++, pg++, dx += gridspacing) { - r2 = dx*dx + dydz2; - - /* If atom and lattice point are too close, set the lattice value - * to zero */ - if (r2 < a2) *pg = 0; - } - } - } /* end loop over surrounding grid points */ - - } /* end loop over atoms in a gridcell */ - } /* end loop over gridcells */ - - /* free memory */ - free(next); - free(first); - - return 0; -} diff --git a/tests/opencl/cutcp/gpu_info.c b/tests/opencl/cutcp/gpu_info.c deleted file mode 100644 index 4d641f81..00000000 --- a/tests/opencl/cutcp/gpu_info.c +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ -//#include -#include -#include -#include -#include - -#include "gpu_info.h" - -void compute_active_thread(size_t *thread, - size_t *grid, - int task, - int pad, - int major, - int minor, - int sm) -{ - int max_thread; - int max_block=8; - if(major==1) - { - if(minor>=2) - max_thread=1024; - else - max_thread=768; - } - else if(major==2) - max_thread=1536; - else - //newer GPU //keep using 2.0 - max_thread=1536; - - int _grid; - int _thread; - - if(task*pad>sm*max_thread) - { - _thread=max_thread/max_block; - _grid = ((task*pad+_thread-1)/_thread)*_thread; - } - else - { - _thread=pad; - _grid=task*pad; - } - - thread[0]=_thread; - grid[0]=_grid; -} diff --git a/tests/opencl/cutcp/gpu_info.h b/tests/opencl/cutcp/gpu_info.h deleted file mode 100644 index 5d433968..00000000 --- a/tests/opencl/cutcp/gpu_info.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifndef __GPUINFOH__ -#define __GPUINFOH__ - -#ifdef __cplusplus -extern "C" { -#endif - -void compute_active_thread(size_t *thread, - size_t *grid, - int task, - int pad, - int major, - int minor, - int sm); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/cutcp/kernel.cl b/tests/opencl/cutcp/kernel.cl deleted file mode 100644 index 7bbd24b8..00000000 --- a/tests/opencl/cutcp/kernel.cl +++ /dev/null @@ -1,104 +0,0 @@ -/* - * potential lattice is decomposed into size 8^3 lattice point "regions" - * - * THIS IMPLEMENTATION: one thread per lattice point - * thread block size 128 gives 4 thread blocks per region - * kernel is invoked for each x-y plane of regions, - * where gridDim.x is 4*(x region dimension) so that blockIdx.x - * can absorb the z sub-region index in its 2 lowest order bits - * - * Regions are stored contiguously in memory in row-major order - * - * The bins have to not only cover the region, but they need to surround - * the outer edges so that region sides and corners can still use - * neighbor list stencil. The binZeroAddr is actually a shifted pointer into - * the bin array (binZeroAddr = binBaseAddr + (c*binDim_y + c)*binDim_x + c) - * where c = ceil(cutoff / binsize). This allows for negative offsets to - * be added to myBinIndex. - * - * The (0,0,0) spatial origin corresponds to lower left corner of both - * regionZeroAddr and binZeroAddr. The atom coordinates are translated - * during binning to enforce this assumption. - */ - -#include "macros.h" - -// OpenCL 1.1 support for int3 is not uniform on all implementations, so -// we use int4 instead. Only the 'x', 'y', and 'z' fields of xyz are used. -typedef int4 xyz; - -__kernel void opencl_cutoff_potential_lattice( - int binDim_x, - int binDim_y, - __global float4 *binBaseAddr, - int offset, - float h, /* lattice spacing */ - float cutoff2, /* square of cutoff distance */ - float inv_cutoff2, - __global float *regionZeroAddr, /* address of lattice regions starting at origin */ - int zRegionIndex, - __constant int *NbrListLen, - __constant xyz *NbrList - ) -{ - __global float4* binZeroAddr = binBaseAddr + offset; - - __global float *myRegionAddr; - int Bx, By, Bz; - - /* thread id */ - const int tid = (get_local_id(2)*get_local_size(1) + - get_local_id(1))*get_local_size(0) + get_local_id(0); - - /* this is the start of the sub-region indexed by tid */ - myRegionAddr = regionZeroAddr + ((zRegionIndex*get_num_groups(1) - + get_group_id(1))*(get_num_groups(0)>>2) + (get_group_id(0)>>2))*REGION_SIZE - + (get_group_id(0)&3)*SUB_REGION_SIZE; - - /* spatial coordinate of this lattice point */ - float x = (8 * (get_group_id(0) >> 2) + get_local_id(0)) * h; - float y = (8 * get_group_id(1) + get_local_id(1)) * h; - float z = (8 * zRegionIndex + 2*(get_group_id(0)&3) + get_local_id(2)) * h; - - float dx; - float dy; - float dz; - float r2; - float s; - - int totalbins = 0; - - /* bin number determined by center of region */ - Bx = (int) floor((8 * (get_group_id(0) >> 2) + 4) * h * BIN_INVLEN); - By = (int) floor((8 * get_group_id(1) + 4) * h * BIN_INVLEN); - Bz = (int) floor((8 * zRegionIndex + 4) * h * BIN_INVLEN); - - float energy = 0.f; - int bincnt; - for (bincnt = 0; bincnt < *NbrListLen; bincnt++) { - int i = Bx + NbrList[bincnt].x; - int j = By + NbrList[bincnt].y; - int k = Bz + NbrList[bincnt].z; - - __global float4* p_global = binZeroAddr + - (((k*binDim_y + j)*binDim_x + i) * BIN_DEPTH); - - int m; - for (m = 0; m < BIN_DEPTH; m++) { - float aq = p_global[m].w; - if (0.f != aq) { - dx = p_global[m].x - x; - dy = p_global[m].y - y; - dz = p_global[m].z - z; - r2 = dx*dx + dy*dy + dz*dz; - if (r2 < cutoff2) { - s = (1.f - r2 * inv_cutoff2); - energy += aq * rsqrt(r2) * s * s; - } - } - } /* end loop over atoms in bin */ - } /* end loop over neighbor list */ - - /* store into global memory */ - myRegionAddr[tid+0] = energy; -} diff --git a/tests/opencl/cutcp/macros.h b/tests/opencl/cutcp/macros.h deleted file mode 100644 index fed9553c..00000000 --- a/tests/opencl/cutcp/macros.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __MACROSH__ -#define __MACROSH__ - -#ifdef __DEVICE_EMULATION__ -#define DEBUG -/* define which grid block and which thread to examine */ -#define BX 0 -#define BY 0 -#define TX 0 -#define TY 0 -#define TZ 0 -#define EMU(code) do { \ - if (blockIdx.x==BX && blockIdx.y==BY && \ - threadIdx.x==TX && threadIdx.y==TY && threadIdx.z==TZ) { \ - code; \ - } \ -} while (0) -#define INT(n) printf("%s = %d\n", #n, n) -#define FLOAT(f) printf("%s = %g\n", #f, (double)(f)) -#define INT3(n) printf("%s = %d %d %d\n", #n, (n).x, (n).y, (n).z) -#define FLOAT4(f) printf("%s = %g %g %g %g\n", #f, (double)(f).x, \ - (double)(f).y, (double)(f).z, (double)(f).w) -#else -#define EMU(code) -#define INT(n) -#define FLOAT(f) -#define INT3(n) -#define FLOAT4(f) -#endif - -/* report error from OpenCL */ -#define CHECK_ERROR(errorMessage) \ - if(clStatus != CL_SUCCESS) \ - { \ - printf("Error: %s!\n",errorMessage); \ - printf("Line: %d\n",__LINE__); \ - exit(1); \ - } - -/* - * neighbor list: - * stored in constant memory as table of offsets - * flat index addressing is computed by kernel - * - * reserve enough memory for 11^3 stencil of grid cells - * this fits within 16K of memory - */ -#define NBRLIST_DIM 11 -#define NBRLIST_MAXLEN (NBRLIST_DIM * NBRLIST_DIM * NBRLIST_DIM) - -/* - * atom bins cached into shared memory for processing - * - * this reserves 4K of shared memory for 32 atom bins each containing 8 atoms, - * should permit scheduling of up to 3 thread blocks per SM - */ -#define BIN_DEPTH 8 /* max number of atoms per bin */ -#define BIN_SIZE 32 /* size of bin in floats */ -#define BIN_CACHE_MAXLEN 32 /* max number of atom bins to cache */ - -#define BIN_LENGTH 4.f /* spatial length in Angstroms */ -#define BIN_INVLEN (1.f / BIN_LENGTH) -/* assuming density of 1 atom / 10 A^3, expectation is 6.4 atoms per bin - * so that bin fill should be 80% (for non-empty regions of space) */ - -#define REGION_SIZE 512 /* number of floats in lattice region */ -#define SUB_REGION_SIZE 128 /* number of floats in lattice sub-region */ - -#endif diff --git a/tests/opencl/cutcp/main.cc b/tests/opencl/cutcp/main.cc deleted file mode 100644 index 72ab37f3..00000000 --- a/tests/opencl/cutcp/main.cc +++ /dev/null @@ -1,190 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include -#include - -#include "atom.h" -#include "cutoff.h" -#include "output.h" - -#define ERRTOL 1e-4f - -#define NOKERNELS 0 -#define CUTOFF1 1 -#define CUTOFF6 32 -#define CUTOFF6OVERLAP 64 -#define CUTOFFCPU 16384 - - -int appenddata(const char *filename, int size, double time) { - FILE *fp; - fp=fopen(filename, "a"); - if (fp == NULL) { - printf("error appending to file %s..\n", filename); - return -1; - } - fprintf(fp, "%d %.3f\n", size, time); - fclose(fp); - return 0; -} - -LatticeDim -lattice_from_bounding_box(Vec3 lo, Vec3 hi, float h) -{ - LatticeDim ret; - - ret.nx = (int) floorf((hi.x-lo.x)/h) + 1; - ret.ny = (int) floorf((hi.y-lo.y)/h) + 1; - ret.nz = (int) floorf((hi.z-lo.z)/h) + 1; - ret.lo = lo; - ret.h = h; - - return ret; -} - -Lattice * -create_lattice(LatticeDim dim) -{ - int size; - Lattice *lat = (Lattice *)malloc(sizeof(Lattice)); - - if (lat == NULL) { - fprintf(stderr, "Out of memory\n"); - exit(1); - } - - lat->dim = dim; - - /* Round up the allocated size to a multiple of 8 */ - size = ((dim.nx * dim.ny * dim.nz) + 7) & ~7; - lat->lattice = (float *)calloc(size, sizeof(float)); - - if (lat->lattice == NULL) { - fprintf(stderr, "Out of memory\n"); - exit(1); - } - - return lat; -} - - -void -destroy_lattice(Lattice *lat) -{ - if (lat) { - free(lat->lattice); - free(lat); - } -} - -int main(int argc, char *argv[]) { - Atoms *atom; - - LatticeDim lattice_dim; - Lattice *gpu_lattice; - Vec3 min_ext, max_ext; /* Bounding box of atoms */ - Vec3 lo, hi; /* Bounding box with padding */ - - float h = 0.5f; /* Lattice spacing */ - float cutoff = 12.f; /* Cutoff radius */ - float exclcutoff = 1.f; /* Radius for exclusion */ - float padding = 0.5f; /* Bounding box padding distance */ - - int n; - - struct pb_Parameters *parameters; - struct pb_TimerSet timers; - - /* Read input parameters */ - parameters = pb_ReadParameters(&argc, argv); - if (parameters == NULL) { - exit(1); - } - - parameters->inpFiles = (char **)malloc(sizeof(char *) * 2); - parameters->inpFiles[0] = (char *)malloc(100); - parameters->inpFiles[1] = NULL; - strncpy(parameters->inpFiles[0], "watbox.sl40.pqr", 100); - - /* Expect one input file */ - if (pb_Parameters_CountInputs(parameters) != 1) { - fprintf(stderr, "Expecting one input file\n"); - exit(1); - } - - pb_InitializeTimerSet(&timers); - pb_SwitchToTimer(&timers, pb_TimerID_IO); - - { - const char *pqrfilename = parameters->inpFiles[0]; - - if (!(atom = read_atom_file(pqrfilename))) { - fprintf(stderr, "read_atom_file() failed\n"); - exit(1); - } - printf("read %d atoms from file '%s'\n", atom->size, pqrfilename); - } - - /* find extent of domain */ - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - get_atom_extent(&min_ext, &max_ext, atom); - printf("extent of domain is:\n"); - printf(" minimum %g %g %g\n", min_ext.x, min_ext.y, min_ext.z); - printf(" maximum %g %g %g\n", max_ext.x, max_ext.y, max_ext.z); - - printf("padding domain by %g Angstroms\n", padding); - lo = (Vec3) {min_ext.x - padding, min_ext.y - padding, min_ext.z - padding}; - hi = (Vec3) {max_ext.x + padding, max_ext.y + padding, max_ext.z + padding}; - printf("domain lengths are %g by %g by %g\n", hi.x-lo.x, hi.y-lo.y, hi.z-lo.z); - - lattice_dim = lattice_from_bounding_box(lo, hi, h); - gpu_lattice = create_lattice(lattice_dim); - printf("\n"); - - /* - * Run OpenCL kernel - * (Begin and end with COMPUTE timer active) - */ - if (gpu_compute_cutoff_potential_lattice(&timers, gpu_lattice, cutoff, atom, 0, parameters)) { - fprintf(stderr, "Computation failed\n"); - exit(1); - } - - /* - * Zero the lattice points that are too close to an atom. This is - * necessary for numerical stability. - */ - if (remove_exclusions(gpu_lattice, exclcutoff, atom)) { - fprintf(stderr, "remove_exclusions() failed for gpu lattice\n"); - exit(1); - } - - printf("\n"); - - pb_SwitchToTimer(&timers, pb_TimerID_IO); - - /* Print output */ - if (parameters->outFile) { - //write_lattice_summary(parameters->outFile, gpu_lattice); - } - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - - /* Cleanup */ - destroy_lattice(gpu_lattice); - free_atom(atom); - - pb_SwitchToTimer(&timers, pb_TimerID_NONE); - pb_PrintTimerSet(&timers); - pb_FreeParameters(parameters); - - return 0; -} diff --git a/tests/opencl/cutcp/ocl.c b/tests/opencl/cutcp/ocl.c deleted file mode 100644 index 7e48e7e6..00000000 --- a/tests/opencl/cutcp/ocl.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include -#include "ocl.h" - -char* readFile(const char* fileName) -{ - FILE* fp; - fp = fopen(fileName,"r"); - if(fp == NULL) - { - printf("Error 1!\n"); - exit(1); - } - - fseek(fp,0,SEEK_END); - long size = ftell(fp); - rewind(fp); - - char* buffer = (char*)malloc(sizeof(char)*(size+1)); - if(buffer == NULL) - { - printf("Error 2!\n"); - fclose(fp); - exit(1); - } - - size_t res = fread(buffer,1,size,fp); - if(res != size) - { - printf("Error 3!\n"); - fclose(fp); - exit(1); - } - - buffer[size] = 0; - fclose(fp); - return buffer; -} - -void clMemSet(cl_command_queue clCommandQueue, cl_mem buf, int val, size_t size) -{ - cl_int clStatus; - char* temp = (char*)malloc(size); - memset(temp,val,size); - clStatus = clEnqueueWriteBuffer(clCommandQueue,buf,CL_TRUE,0,size,temp,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - free(temp); -} diff --git a/tests/opencl/cutcp/ocl.h b/tests/opencl/cutcp/ocl.h deleted file mode 100644 index 6de9a5ec..00000000 --- a/tests/opencl/cutcp/ocl.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __OCLH__ -#define __OCLH__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void clMemSet(cl_command_queue, cl_mem, int, size_t); -char* readFile(const char*); - -#define CHECK_ERROR(errorMessage) \ - if(clStatus != CL_SUCCESS) \ - { \ - printf("Error: %s!\n",errorMessage); \ - printf("Line: %d\n",__LINE__); \ - exit(1); \ - } - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/cutcp/output.c b/tests/opencl/cutcp/output.c deleted file mode 100644 index 36ee7e2b..00000000 --- a/tests/opencl/cutcp/output.c +++ /dev/null @@ -1,67 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include -#include - -#include "atom.h" -#include "cutoff.h" - -void -write_lattice_summary(const char *filename, Lattice *lattice) -{ - float *lattice_data = lattice->lattice; - int nx = lattice->dim.nx; - int ny = lattice->dim.ny; - int nz = lattice->dim.nz; - - /* Open output file */ - FILE *outfile = fopen(filename, "w"); - - if (outfile == NULL) { - fprintf(stderr, "Cannot open output file\n"); - exit(1); - } - - /* Write the sum of the the absolute values of all lattice potentials */ - { - double abspotential = 0.0; - float tmp; - int i; - - for (i = 0; i < nx * ny * nz; i++) - abspotential += fabs((double) lattice_data[i]); - - tmp = (float) abspotential; - - fwrite(&tmp, 1, sizeof(float), outfile); - } - - /* Write the size of a lattice plane */ - { - uint32_t tmp; - - tmp = (uint32_t) (lattice->dim.nx * lattice->dim.ny); - fwrite(&tmp, 1, sizeof(uint32_t), outfile); - } - - /* Write the plane of lattice data at z=0 and z = nz-1 */ - { - int plane_size = nx * ny; - - fwrite(lattice_data, plane_size, sizeof(float), outfile); - fwrite(lattice_data + (nz-1) * plane_size, plane_size, sizeof(float), - outfile); - } - - /* Cleanup */ - fclose(outfile); -} diff --git a/tests/opencl/cutcp/output.h b/tests/opencl/cutcp/output.h deleted file mode 100644 index 13022cd9..00000000 --- a/tests/opencl/cutcp/output.h +++ /dev/null @@ -1,25 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifndef OUTPUT_H -#define OUTPUT_H - -#include "cutoff.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void -write_lattice_summary(const char *filename, Lattice *lattice); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/cutcp/parboil.h b/tests/opencl/cutcp/parboil.h deleted file mode 100644 index 4c9a8b5e..00000000 --- a/tests/opencl/cutcp/parboil.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * (c) 2010 The Board of Trustees of the University of Illinois. - */ -#ifndef PARBOIL_HEADER -#define PARBOIL_HEADER - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* A platform as specified by the user on the command line */ -struct pb_PlatformParam { - char *name; /* The platform name. This string is owned. */ - char *version; /* The platform version; may be NULL. - * This string is owned. */ -}; - -/* Create a PlatformParam from the given strings. - * 'name' must not be NULL. 'version' may be NULL. - * If not NULL, the strings should have been allocated by malloc(), - * and they will be owned by the returned object. - */ -struct pb_PlatformParam * -pb_PlatformParam(char *name, char *version); - -void -pb_FreePlatformParam(struct pb_PlatformParam *); - -/* A criterion for how to select a device */ -enum pb_DeviceSelectionCriterion { - pb_Device_INDEX, /* Enumerate the devices and select one - * by its number */ - pb_Device_CPU, /* Select a CPU device */ - pb_Device_GPU, /* Select a GPU device */ - pb_Device_ACCELERATOR, /* Select an accelerator device */ - pb_Device_NAME /* Select a device by name */ -}; - -/* A device as specified by the user on the command line */ -struct pb_DeviceParam { - enum pb_DeviceSelectionCriterion criterion; - union { - int index; /* If criterion == pb_Device_INDEX, - * the index of the device */ - char *name; /* If criterion == pb_Device_NAME, - * the name of the device. - * This string is owned. */ - }; -}; - -struct pb_DeviceParam * -pb_DeviceParam_index(int index); - -struct pb_DeviceParam * -pb_DeviceParam_cpu(void); - -struct pb_DeviceParam * -pb_DeviceParam_gpu(void); - -struct pb_DeviceParam * -pb_DeviceParam_accelerator(void); - -/* Create a by-name device selection criterion. - * The string should have been allocated by malloc(), and it will will be - * owned by the returned object. - */ -struct pb_DeviceParam * -pb_DeviceParam_name(char *name); - -void -pb_FreeDeviceParam(struct pb_DeviceParam *); - -/* Command line parameters for benchmarks */ -struct pb_Parameters { - char *outFile; /* If not NULL, the raw output of the - * computation should be saved to this - * file. The string is owned. */ - char **inpFiles; /* A NULL-terminated array of strings - * holding the input file(s) for the - * computation. The array and strings - * are owned. */ - struct pb_PlatformParam *platform; /* If not NULL, the platform - * specified on the command line. */ - struct pb_DeviceParam *device; /* If not NULL, the device - * specified on the command line. */ -}; - -/* Read command-line parameters. - * - * The argc and argv parameters to main are read, and any parameters - * interpreted by this function are removed from the argument list. - * - * A new instance of struct pb_Parameters is returned. - * If there is an error, then an error message is printed on stderr - * and NULL is returned. - */ -struct pb_Parameters * -pb_ReadParameters(int *_argc, char **argv); - -/* Free an instance of struct pb_Parameters. - */ -void -pb_FreeParameters(struct pb_Parameters *p); - -void -pb_FreeStringArray(char **); - -/* Count the number of input files in a pb_Parameters instance. - */ -int -pb_Parameters_CountInputs(struct pb_Parameters *p); - -/* A time or duration. */ -//#if _POSIX_VERSION >= 200112L -typedef unsigned long long pb_Timestamp; /* time in microseconds */ -//#else -//# error "Timestamps not implemented" -//#endif - -enum pb_TimerState { - pb_Timer_STOPPED, - pb_Timer_RUNNING, -}; - -struct pb_Timer { - enum pb_TimerState state; - pb_Timestamp elapsed; /* Amount of time elapsed so far */ - pb_Timestamp init; /* Beginning of the current time interval, - * if state is RUNNING. End of the last - * recorded time interfal otherwise. */ -}; - -/* Reset a timer. - * Use this to initialize a timer or to clear - * its elapsed time. The reset timer is stopped. - */ -void -pb_ResetTimer(struct pb_Timer *timer); - -/* Start a timer. The timer is set to RUNNING mode and - * time elapsed while the timer is running is added to - * the timer. - * The timer should not already be running. - */ -void -pb_StartTimer(struct pb_Timer *timer); - -/* Stop a timer. - * This stops adding elapsed time to the timer. - * The timer should not already be stopped. - */ -void -pb_StopTimer(struct pb_Timer *timer); - -/* Get the elapsed time in seconds. */ -double -pb_GetElapsedTime(struct pb_Timer *timer); - -/* Execution time is assigned to one of these categories. */ -enum pb_TimerID { - pb_TimerID_NONE = 0, - pb_TimerID_IO, /* Time spent in input/output */ - pb_TimerID_KERNEL, /* Time spent computing on the device, - * recorded asynchronously */ - pb_TimerID_COPY, /* Time spent synchronously moving data - * to/from device and allocating/freeing - * memory on the device */ - pb_TimerID_DRIVER, /* Time spent in the host interacting with the - * driver, primarily for recording the time - * spent queueing asynchronous operations */ - pb_TimerID_COPY_ASYNC, /* Time spent in asynchronous transfers */ - pb_TimerID_COMPUTE, /* Time for all program execution other - * than parsing command line arguments, - * I/O, kernel, and copy */ - pb_TimerID_OVERLAP, /* Time double-counted in asynchronous and - * host activity: automatically filled in, - * not intended for direct usage */ - pb_TimerID_LAST /* Number of timer IDs */ -}; - -/* Dynamic list of asynchronously tracked times between events */ -struct pb_async_time_marker_list { - char *label; // actually just a pointer to a string - enum pb_TimerID timerID; /* The ID to which the interval beginning - * with this marker should be attributed */ - void * marker; - //cudaEvent_t marker; /* The driver event for this marker */ - struct pb_async_time_marker_list *next; -}; - -struct pb_SubTimer { - char *label; - struct pb_Timer timer; - struct pb_SubTimer *next; -}; - -struct pb_SubTimerList { - struct pb_SubTimer *current; - struct pb_SubTimer *subtimer_list; -}; - -/* A set of timers for recording execution times. */ -struct pb_TimerSet { - enum pb_TimerID current; - struct pb_async_time_marker_list* async_markers; - pb_Timestamp async_begin; - pb_Timestamp wall_begin; - struct pb_Timer timers[pb_TimerID_LAST]; - struct pb_SubTimerList *sub_timer_list[pb_TimerID_LAST]; -}; - -/* Reset all timers in the set. */ -void -pb_InitializeTimerSet(struct pb_TimerSet *timers); - -void -pb_AddSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID pb_Category); - -/* Select which timer the next interval of time should be accounted - * to. The selected timer is started and other timers are stopped. - * Using pb_TimerID_NONE stops all timers. */ -void -pb_SwitchToTimer(struct pb_TimerSet *timers, enum pb_TimerID timer); - -void -pb_SwitchToSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID category); - -/* Print timer values to standard output. */ -void -pb_PrintTimerSet(struct pb_TimerSet *timers); - -/* Release timer resources */ -void -pb_DestroyTimerSet(struct pb_TimerSet * timers); - -void -pb_SetOpenCL(void *clContextPtr, void *clCommandQueuePtr); - - -typedef struct pb_Device_tag { - char* name; - void* clDevice; - int id; - unsigned int in_use; - unsigned int available; -} pb_Device; - -struct pb_Context_tag; -typedef struct pb_Context_tag pb_Context; - -typedef struct pb_Platform_tag { - char* name; - char* version; - void* clPlatform; - unsigned int in_use; - pb_Context** contexts; - pb_Device** devices; -} pb_Platform; - -struct pb_Context_tag { - void* clPlatformId; - void* clContext; - void* clDeviceId; - pb_Platform* pb_platform; - pb_Device* pb_device; -}; - -// verbosely print out list of platforms and their devices to the console. -pb_Platform** -pb_GetPlatforms(); - -// Choose a platform according to the given platform specification -pb_Platform* -pb_GetPlatform(struct pb_PlatformParam *platform); - -// choose a platform: by name, name & version -pb_Platform* -pb_GetPlatformByName(const char* name); - -pb_Platform* -pb_GetPlatformByNameAndVersion(const char* name, const char* version); - -// Choose a device according to the given device specification -pb_Device* -pb_GetDevice(pb_Platform* pb_platform, struct pb_DeviceParam *device); - -pb_Device** -pb_GetDevices(pb_Platform* pb_platform); - -// choose a device by name. -pb_Device* -pb_GetDeviceByName(pb_Platform* pb_platform, const char* name); - -pb_Platform* -pb_GetPlatformByEnvVars(); - -pb_Context* -pb_InitOpenCLContext(struct pb_Parameters* parameters); - -void -pb_ReleasePlatforms(); - -void -pb_ReleaseContext(pb_Context* c); - -void -pb_PrintPlatformInfo(pb_Context* c); - -void -perf_init(); - -//#define MEASURE_KERNEL_TIME - -#include - -#ifdef MEASURE_KERNEL_TIME -#define clEnqueueNDRangeKernel(q,k,d,o,dg,db,a,b,c) pb_clEnqueueNDRangeKernel((q), (k), (d), (o), (dg), (db), (a), (b), (c)) -cl_int -pb_clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, - cl_kernel /* kernel */, - cl_uint /* work_dim */, - const size_t * /* global_work_offset */, - const size_t * /* global_work_size */, - const size_t * /* local_work_size */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */); -#endif - -enum { T_FLOAT, T_DOUBLE, T_SHORT, T_INT, T_UCHAR }; -void pb_sig_float(char*, float*, int); -void pb_sig_double(char*, double*, int); -void pb_sig_short(char*, short*, int); -void pb_sig_int(char*, int*, int); -void pb_sig_uchar(char*, unsigned char*, unsigned int); -void pb_sig_clmem(char*, cl_command_queue, cl_mem, int); - -#ifdef __cplusplus -} -#endif - -#endif //PARBOIL_HEADER - diff --git a/tests/opencl/cutcp/parboil_opencl.c b/tests/opencl/cutcp/parboil_opencl.c deleted file mode 100644 index a4db1680..00000000 --- a/tests/opencl/cutcp/parboil_opencl.c +++ /dev/null @@ -1,1394 +0,0 @@ -/* - * (c) 2007 The Board of Trustees of the University of Illinois. - */ - -#include -#include -#include -#include -#include -#include - -#if _POSIX_VERSION >= 200112L -# include -#endif - -//#include "perfmon.h" - -cl_context *clContextPtr; -cl_command_queue *clCommandQueuePtr; - -// #define DISABLE_PARBOIL_TIMER - -/*****************************************************************************/ -/* Timer routines */ - -static int is_async(enum pb_TimerID timer) -{ - return (timer == pb_TimerID_KERNEL) || - (timer == pb_TimerID_COPY_ASYNC); -} - -static int is_blocking(enum pb_TimerID timer) -{ - return (timer == pb_TimerID_COPY) || (timer == pb_TimerID_NONE); -} - -#define INVALID_TIMERID pb_TimerID_LAST - -static int asyncs_outstanding(struct pb_TimerSet* timers) -{ - return (timers->async_markers != NULL) && - (timers->async_markers->timerID != INVALID_TIMERID); -} - -static struct pb_async_time_marker_list * -get_last_async(struct pb_TimerSet* timers) -{ - /* Find the last event recorded thus far */ - struct pb_async_time_marker_list * last_event = timers->async_markers; - if(last_event != NULL && last_event->timerID != INVALID_TIMERID) { - while(last_event->next != NULL && - last_event->next->timerID != INVALID_TIMERID) - last_event = last_event->next; - return last_event; - } else - return NULL; -} - -static void insert_marker(struct pb_TimerSet* tset, enum pb_TimerID timer) -{ - cl_int ciErrNum = CL_SUCCESS; - struct pb_async_time_marker_list ** new_event = &(tset->async_markers); - - while(*new_event != NULL && (*new_event)->timerID != INVALID_TIMERID) { - new_event = &((*new_event)->next); - } - - if(*new_event == NULL) { - *new_event = (struct pb_async_time_marker_list *) - malloc(sizeof(struct pb_async_time_marker_list)); - (*new_event)->marker = calloc(1, sizeof(cl_event)); - /* - // I don't think this is needed at all. I believe clEnqueueMarker 'creates' the event -#if ( __OPENCL_VERSION__ >= CL_VERSION_1_1 ) -fprintf(stderr, "Creating Marker [%d]\n", timer); - *((cl_event *)((*new_event)->marker)) = clCreateUserEvent(*clContextPtr, &ciErrNum); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Creating User Event Object!\n"); - } - ciErrNum = clSetUserEventStatus(*((cl_event *)((*new_event)->marker)), CL_QUEUED); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Setting User Event Status!\n"); - } -#endif -*/ - (*new_event)->next = NULL; - } - - /* valid event handle now aquired: insert the event record */ - (*new_event)->label = NULL; - (*new_event)->timerID = timer; - ciErrNum = clEnqueueMarker(*clCommandQueuePtr, (cl_event *)(*new_event)->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Enqueueing Marker!\n"); - } - -} - -static void insert_submarker(struct pb_TimerSet* tset, char *label, enum pb_TimerID timer) -{ - cl_int ciErrNum = CL_SUCCESS; - struct pb_async_time_marker_list ** new_event = &(tset->async_markers); - - while(*new_event != NULL && (*new_event)->timerID != INVALID_TIMERID) { - new_event = &((*new_event)->next); - } - - if(*new_event == NULL) { - *new_event = (struct pb_async_time_marker_list *) - malloc(sizeof(struct pb_async_time_marker_list)); - (*new_event)->marker = calloc(1, sizeof(cl_event)); - /* -#if ( __OPENCL_VERSION__ >= CL_VERSION_1_1 ) -fprintf(stderr, "Creating SubMarker %s[%d]\n", label, timer); - *((cl_event *)((*new_event)->marker)) = clCreateUserEvent(*clContextPtr, &ciErrNum); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Creating User Event Object!\n"); - } - ciErrNum = clSetUserEventStatus(*((cl_event *)((*new_event)->marker)), CL_QUEUED); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Setting User Event Status!\n"); - } -#endif -*/ - (*new_event)->next = NULL; - } - - /* valid event handle now aquired: insert the event record */ - (*new_event)->label = label; - (*new_event)->timerID = timer; - ciErrNum = clEnqueueMarker(*clCommandQueuePtr, (cl_event *)(*new_event)->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Enqueueing Marker!\n"); - } - -} - - -/* Assumes that all recorded events have completed */ -static pb_Timestamp record_async_times(struct pb_TimerSet* tset) -{ - struct pb_async_time_marker_list * next_interval = NULL; - struct pb_async_time_marker_list * last_marker = get_last_async(tset); - pb_Timestamp total_async_time = 0; - enum pb_TimerID timer; - - for(next_interval = tset->async_markers; next_interval != last_marker; - next_interval = next_interval->next) { - cl_ulong command_start=0, command_end=0; - cl_int ciErrNum = CL_SUCCESS; - - ciErrNum = clGetEventProfilingInfo(*((cl_event *)next_interval->marker), CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &command_start, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error getting first EventProfilingInfo: %d\n", ciErrNum); - } - - ciErrNum = clGetEventProfilingInfo(*((cl_event *)next_interval->next->marker), CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &command_end, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error getting second EventProfilingInfo: %d\n", ciErrNum); - } - - pb_Timestamp interval = (pb_Timestamp) (((double)(command_end - command_start)) / 1e3); - tset->timers[next_interval->timerID].elapsed += interval; - if (next_interval->label != NULL) { - struct pb_SubTimer *subtimer = tset->sub_timer_list[next_interval->timerID]->subtimer_list; - while (subtimer != NULL) { - if ( strcmp(subtimer->label, next_interval->label) == 0) { - subtimer->timer.elapsed += interval; - break; - } - subtimer = subtimer->next; - } - } - total_async_time += interval; - next_interval->timerID = INVALID_TIMERID; - } - - if(next_interval != NULL) - next_interval->timerID = INVALID_TIMERID; - - return total_async_time; -} - -static void -accumulate_time(pb_Timestamp *accum, - pb_Timestamp start, - pb_Timestamp end) -{ -//#if _POSIX_VERSION >= 200112L - *accum += end - start; -//#else -//# error "Timestamps not implemented for this system" -//#endif -} - -//#if _POSIX_VERSION >= 200112L -static pb_Timestamp get_time() -{ - //struct timeval tv; - //gettimeofday(&tv, NULL); - //return (pb_Timestamp) (tv.tv_sec * 1000000LL + tv.tv_usec); - return 0; -} -//#else -//# error "no supported time libraries are available on this platform" -//#endif - -void -pb_ResetTimer(struct pb_Timer *timer) -{ -//#ifndef DISABLE_PARBOIL_TIMER - timer->state = pb_Timer_STOPPED; - -//#if _POSIX_VERSION >= 200112L - timer->elapsed = 0; -//#else -//# error "pb_ResetTimer: not implemented for this system" -//#endif -//#endif -} - -void -pb_StartTimer(struct pb_Timer *timer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - if (timer->state != pb_Timer_STOPPED) { - fputs("Ignoring attempt to start a running timer\n", stderr); - return; - } - - timer->state = pb_Timer_RUNNING; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - timer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StartTimer: not implemented for this system" -#endif -#endif*/ -} - -void -pb_StartTimerAndSubTimer(struct pb_Timer *timer, struct pb_Timer *subtimer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - - unsigned int numNotStopped = 0x3; // 11 - if (timer->state != pb_Timer_STOPPED) { - fputs("Warning: Timer was not stopped\n", stderr); - numNotStopped &= 0x1; // Zero out 2^1 - } - if (subtimer->state != pb_Timer_STOPPED) { - fputs("Warning: Subtimer was not stopped\n", stderr); - numNotStopped &= 0x2; // Zero out 2^0 - } - if (numNotStopped == 0x0) { - fputs("Ignoring attempt to start running timer and subtimer\n", stderr); - return; - } - - timer->state = pb_Timer_RUNNING; - subtimer->state = pb_Timer_RUNNING; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - - if (numNotStopped & 0x2) { - timer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } - - if (numNotStopped & 0x1) { - subtimer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } - } -#else -# error "pb_StartTimer: not implemented for this system" -#endif - -#endif*/ -} - -void -pb_StopTimer(struct pb_Timer *timer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - - pb_Timestamp fini; - - if (timer->state != pb_Timer_RUNNING) { - fputs("Ignoring attempt to stop a stopped timer\n", stderr); - return; - } - - timer->state = pb_Timer_STOPPED; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - fini = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StopTimer: not implemented for this system" -#endif - - accumulate_time(&timer->elapsed, timer->init, fini); - timer->init = fini; - -#endif*/ -} - -void pb_StopTimerAndSubTimer(struct pb_Timer *timer, struct pb_Timer *subtimer) { -/*#ifndef DISABLE_PARBOIL_TIMER - - pb_Timestamp fini; - - unsigned int numNotRunning = 0x3; // 11 - if (timer->state != pb_Timer_RUNNING) { - fputs("Warning: Timer was not running\n", stderr); - numNotRunning &= 0x1; // Zero out 2^1 - } - if (subtimer->state != pb_Timer_RUNNING) { - fputs("Warning: Subtimer was not running\n", stderr); - numNotRunning &= 0x2; // Zero out 2^0 - } - if (numNotRunning == 0x0) { - fputs("Ignoring attempt to stop stopped timer and subtimer\n", stderr); - return; - } - - - timer->state = pb_Timer_STOPPED; - subtimer->state = pb_Timer_STOPPED; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - fini = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StopTimer: not implemented for this system" -#endif - - if (numNotRunning & 0x2) { - accumulate_time(&timer->elapsed, timer->init, fini); - timer->init = fini; - } - - if (numNotRunning & 0x1) { - accumulate_time(&subtimer->elapsed, subtimer->init, fini); - subtimer->init = fini; - } - -#endif*/ -} - -/* Get the elapsed time in seconds. */ -double -pb_GetElapsedTime(struct pb_Timer *timer) -{ - /*double ret; -#ifndef DISABLE_PARBOIL_TIMER - - if (timer->state != pb_Timer_STOPPED) { - fputs("Elapsed time from a running timer is inaccurate\n", stderr); - } - -#if _POSIX_VERSION >= 200112L - ret = timer->elapsed / 1e6; -#else -# error "pb_GetElapsedTime: not implemented for this system" -#endif -#endif - return ret;*/ - return 0; -} - -void -pb_InitializeTimerSet(struct pb_TimerSet *timers) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - int n; - - timers->wall_begin = 0; //get_time(); - timers->current = pb_TimerID_NONE; - - timers->async_markers = NULL; - - for (n = 0; n < pb_TimerID_LAST; n++) { - pb_ResetTimer(&timers->timers[n]); - timers->sub_timer_list[n] = NULL; - } -#endif*/ -} - -void pb_SetOpenCL(void *p_clContextPtr, void *p_clCommandQueuePtr) { - clContextPtr = ((cl_context *)p_clContextPtr); - clCommandQueuePtr = ((cl_command_queue *)p_clCommandQueuePtr); -} - -void -pb_AddSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID pb_Category) { -/*#ifndef DISABLE_PARBOIL_TIMER - - struct pb_SubTimer *subtimer = (struct pb_SubTimer *) malloc - (sizeof(struct pb_SubTimer)); - - int len = strlen(label); - - subtimer->label = (char *) malloc (sizeof(char)*(len+1)); - sprintf(subtimer->label, "%s\0", label); - - pb_ResetTimer(&subtimer->timer); - subtimer->next = NULL; - - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[pb_Category]; - if (subtimerlist == NULL) { - subtimerlist = (struct pb_SubTimerList *) calloc - (1, sizeof(struct pb_SubTimerList)); - subtimerlist->subtimer_list = subtimer; - timers->sub_timer_list[pb_Category] = subtimerlist; - } else { - // Append to list - struct pb_SubTimer *element = subtimerlist->subtimer_list; - while (element->next != NULL) { - element = element->next; - } - element->next = subtimer; - } - -#endif*/ -} - -void -pb_SwitchToTimer(struct pb_TimerSet *timers, enum pb_TimerID timer) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - - /* Stop the currently running timer */ - if (timers->current != pb_TimerID_NONE) { - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[timers->current]; - struct pb_SubTimer *currSubTimer = (subtimerlist != NULL) ? subtimerlist->current : NULL; - - if (!is_async(timers->current) ) { - if (timers->current != timer) { - if (currSubTimer != NULL) { - pb_StopTimerAndSubTimer(&timers->timers[timers->current], &currSubTimer->timer); - } else { - pb_StopTimer(&timers->timers[timers->current]); - } - } else { - if (currSubTimer != NULL) { - pb_StopTimer(&currSubTimer->timer); - } - } - } else { - insert_marker(timers, timer); - if (!is_async(timer)) { // if switching to async too, keep driver going - pb_StopTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - pb_Timestamp currentTime = 0; //get_time(); - - /* The only cases we check for asynchronous task completion is - * when an overlapping CPU operation completes, or the next - * segment blocks on completion of previous async operations */ - if( asyncs_outstanding(timers) && - (!is_async(timers->current) || is_blocking(timer) ) ) { - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - /* CL_COMPLETE if completed */ - - cl_int ciErrNum = CL_SUCCESS; - cl_int async_done = CL_COMPLETE; - - ciErrNum = clGetEventInfo(*((cl_event *)last_event->marker), CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &async_done, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Querying EventInfo!\n"); - } - - - if(is_blocking(timer)) { - /* Async operations completed after previous CPU operations: - * overlapped time is the total CPU time since this set of async - * operations were first issued */ - - // timer to switch to is COPY or NONE - if(async_done != CL_COMPLETE) { - accumulate_time(&(timers->timers[pb_TimerID_OVERLAP].elapsed), - timers->async_begin,currentTime); - } - - /* Wait on async operation completion */ - ciErrNum = clWaitForEvents(1, (cl_event *)last_event->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Waiting for Events!\n"); - } - - pb_Timestamp total_async_time = record_async_times(timers); - - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - if(async_done == CL_COMPLETE) { - //fprintf(stderr, "Async_done: total_async_type = %lld\n", total_async_time); - timers->timers[pb_TimerID_OVERLAP].elapsed += total_async_time; - } - - } else - /* implies (!is_async(timers->current) && asyncs_outstanding(timers)) */ - // i.e. Current Not Async (not KERNEL/COPY_ASYNC) but there are outstanding - // so something is deeper in stack - if(async_done == CL_COMPLETE ) { - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - timers->timers[pb_TimerID_OVERLAP].elapsed += record_async_times(timers); - } - } - - /* Start the new timer */ - if (timer != pb_TimerID_NONE) { - if(!is_async(timer)) { - pb_StartTimer(&timers->timers[timer]); - } else { - // toSwitchTo Is Async (KERNEL/COPY_ASYNC) - if (!asyncs_outstanding(timers)) { - /* No asyncs outstanding, insert a fresh async marker */ - - insert_marker(timers, timer); - timers->async_begin = currentTime; - } else if(!is_async(timers->current)) { - /* Previous asyncs still in flight, but a previous SwitchTo - * already marked the end of the most recent async operation, - * so we can rename that marker as the beginning of this async - * operation */ - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - last_event->label = NULL; - last_event->timerID = timer; - } - if (!is_async(timers->current)) { - pb_StartTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - timers->current = timer; - -#endif -#endif -} - -void -pb_SwitchToSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID category) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[timers->current]; - struct pb_SubTimer *curr = (subtimerlist != NULL) ? subtimerlist->current : NULL; - - if (timers->current != pb_TimerID_NONE) { - if (!is_async(timers->current) ) { - if (timers->current != category) { - if (curr != NULL) { - pb_StopTimerAndSubTimer(&timers->timers[timers->current], &curr->timer); - } else { - pb_StopTimer(&timers->timers[timers->current]); - } - } else { - if (curr != NULL) { - pb_StopTimer(&curr->timer); - } - } - } else { - insert_submarker(timers, label, category); - if (!is_async(category)) { // if switching to async too, keep driver going - pb_StopTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - pb_Timestamp currentTime = 0; //get_time(); - - /* The only cases we check for asynchronous task completion is - * when an overlapping CPU operation completes, or the next - * segment blocks on completion of previous async operations */ - if( asyncs_outstanding(timers) && - (!is_async(timers->current) || is_blocking(category) ) ) { - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - /* CL_COMPLETE if completed */ - - cl_int ciErrNum = CL_SUCCESS; - cl_int async_done = CL_COMPLETE; - - ciErrNum = clGetEventInfo(*((cl_event *)last_event->marker), CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &async_done, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Querying EventInfo!\n"); - } - - if(is_blocking(category)) { - /* Async operations completed after previous CPU operations: - * overlapped time is the total CPU time since this set of async - * operations were first issued */ - - // timer to switch to is COPY or NONE - // if it hasn't already finished, then just take now and use that as the elapsed time in OVERLAP - // anything happening after now isn't OVERLAP because everything is being stopped to wait for synchronization - // it seems that the extra sync wall time isn't being recorded anywhere - if(async_done != CL_COMPLETE) - accumulate_time(&(timers->timers[pb_TimerID_OVERLAP].elapsed), - timers->async_begin,currentTime); - - /* Wait on async operation completion */ - ciErrNum = clWaitForEvents(1, (cl_event *)last_event->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Waiting for Events!\n"); - } - pb_Timestamp total_async_time = record_async_times(timers); - - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - // If it did finish, then accumulate all the async time that did happen into OVERLAP - // the immediately preceding EventSynchronize theoretically didn't have any effect since it was already completed. - if(async_done == CL_COMPLETE /*cudaSuccess*/) - timers->timers[pb_TimerID_OVERLAP].elapsed += total_async_time; - - } else - /* implies (!is_async(timers->current) && asyncs_outstanding(timers)) */ - // i.e. Current Not Async (not KERNEL/COPY_ASYNC) but there are outstanding - // so something is deeper in stack - if(async_done == CL_COMPLETE /*cudaSuccess*/) { - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - timers->timers[pb_TimerID_OVERLAP].elapsed += record_async_times(timers); - } - // else, this isn't blocking, so just check the next time around - } - - subtimerlist = timers->sub_timer_list[category]; - struct pb_SubTimer *subtimer = NULL; - - if (label != NULL) { - subtimer = subtimerlist->subtimer_list; - while (subtimer != NULL) { - if (strcmp(subtimer->label, label) == 0) { - break; - } else { - subtimer = subtimer->next; - } - } - } - - /* Start the new timer */ - if (category != pb_TimerID_NONE) { - if(!is_async(category)) { - if (subtimerlist != NULL) { - subtimerlist->current = subtimer; - } - - if (category != timers->current && subtimer != NULL) { - pb_StartTimerAndSubTimer(&timers->timers[category], &subtimer->timer); - } else if (subtimer != NULL) { - pb_StartTimer(&subtimer->timer); - } else { - pb_StartTimer(&timers->timers[category]); - } - } else { - if (subtimerlist != NULL) { - subtimerlist->current = subtimer; - } - - // toSwitchTo Is Async (KERNEL/COPY_ASYNC) - if (!asyncs_outstanding(timers)) { - /* No asyncs outstanding, insert a fresh async marker */ - insert_submarker(timers, label, category); - timers->async_begin = currentTime; - } else if(!is_async(timers->current)) { - /* Previous asyncs still in flight, but a previous SwitchTo - * already marked the end of the most recent async operation, - * so we can rename that marker as the beginning of this async - * operation */ - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - last_event->timerID = category; - last_event->label = label; - } // else, marker for switchToThis was already inserted - - //toSwitchto is already asynchronous, but if current/prev state is async too, then DRIVER is already running - if (!is_async(timers->current)) { - pb_StartTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - timers->current = category; -#endif -#endif -} - -void -pb_PrintTimerSet(struct pb_TimerSet *timers) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - pb_Timestamp wall_end = 0; //get_time(); - - struct pb_Timer *t = timers->timers; - struct pb_SubTimer* sub = NULL; - - int maxSubLength; - - const char *categories[] = { - "IO", "Kernel", "Copy", "Driver", "Copy Async", "Compute" - }; - - const int maxCategoryLength = 10; - - int i; - for(i = 1; i < pb_TimerID_LAST-1; ++i) { // exclude NONE and OVRELAP from this format - if(pb_GetElapsedTime(&t[i]) != 0) { - - // Print Category Timer - printf("%-*s: %f\n", maxCategoryLength, categories[i-1], pb_GetElapsedTime(&t[i])); - - if (timers->sub_timer_list[i] != NULL) { - sub = timers->sub_timer_list[i]->subtimer_list; - maxSubLength = 0; - while (sub != NULL) { - // Find longest SubTimer label - if (strlen(sub->label) > maxSubLength) { - maxSubLength = strlen(sub->label); - } - sub = sub->next; - } - - // Fit to Categories - if (maxSubLength <= maxCategoryLength) { - maxSubLength = maxCategoryLength; - } - - sub = timers->sub_timer_list[i]->subtimer_list; - - // Print SubTimers - while (sub != NULL) { - printf(" -%-*s: %f\n", maxSubLength, sub->label, pb_GetElapsedTime(&sub->timer)); - sub = sub->next; - } - } - } - } - - if(pb_GetElapsedTime(&t[pb_TimerID_OVERLAP]) != 0) - printf("CPU/Kernel Overlap: %f\n", pb_GetElapsedTime(&t[pb_TimerID_OVERLAP])); - - float walltime = (wall_end - timers->wall_begin)/ 1e6; - printf("Timer Wall Time: %f\n", walltime); - -#endif -#endif -} - -void pb_DestroyTimerSet(struct pb_TimerSet * timers) -{ -#ifndef DISABLE_PARBOIL_TIMER - /* clean up all of the async event markers */ - struct pb_async_time_marker_list* event = timers->async_markers; - while(event != NULL) { - - cl_int ciErrNum = CL_SUCCESS; - ciErrNum = clWaitForEvents(1, (cl_event *)(event)->marker); - if (ciErrNum != CL_SUCCESS) { - //fprintf(stderr, "Error Waiting for Events!\n"); - } - - ciErrNum = clReleaseEvent( *((cl_event *)(event)->marker) ); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Release Events!\n"); - } - - free((event)->marker); - struct pb_async_time_marker_list* next = ((event)->next); - - free(event); - - // (*event) = NULL; - event = next; - } - - int i = 0; - for(i = 0; i < pb_TimerID_LAST; ++i) { - if (timers->sub_timer_list[i] != NULL) { - struct pb_SubTimer *subtimer = timers->sub_timer_list[i]->subtimer_list; - struct pb_SubTimer *prev = NULL; - while (subtimer != NULL) { - free(subtimer->label); - prev = subtimer; - subtimer = subtimer->next; - free(prev); - } - free(timers->sub_timer_list[i]); - } - } -#endif -} - -static pb_Platform** ptr = NULL; - -// verbosely print out list of platforms and their devices to the console. -pb_Platform** -pb_GetPlatforms() { - if (ptr == NULL) { - cl_uint num_platforms; - clGetPlatformIDs(0, NULL, &num_platforms); - if (num_platforms == 0) return NULL; - - ptr = (pb_Platform **) malloc(sizeof(pb_Platform *) * (num_platforms + 1)); - cl_platform_id* ids = (cl_platform_id *) malloc(num_platforms * sizeof(cl_platform_id)); - clGetPlatformIDs(num_platforms, ids, NULL); - - unsigned int i; - for (i = 0; i < num_platforms; i++) { - ptr[i] = (pb_Platform *) malloc(sizeof(pb_Platform)); - ptr[i]->clPlatform = ids[i]; - ptr[i]->contexts = NULL; - ptr[i]->in_use = 0; - ptr[i]->devices = NULL; - - size_t sz; - clGetPlatformInfo(ids[i], CL_PLATFORM_NAME, 0, NULL, &sz); - char* name = (char *) malloc(sz + 1); - clGetPlatformInfo(ids[i], CL_PLATFORM_NAME, sz, name, NULL); - name[sz] = '\0'; - ptr[i]->name = name; - - clGetPlatformInfo(ids[i], CL_PLATFORM_VERSION, 0, NULL, &sz); - char* version = (char *) malloc(sz + 1); - clGetPlatformInfo(ids[i], CL_PLATFORM_VERSION, sz, version, NULL); - version[sz] = '\0'; - ptr[i]->version = version; - } - ptr[i] = NULL; - - free(ids); - } - - return (pb_Platform**) ptr; -} - -pb_Context* -createContext(pb_Platform* pb_platform, pb_Device* pb_device) { - pb_Context* c = (pb_Context*) malloc(sizeof(pb_Context)); - cl_int clStatus; - cl_context_properties clCps[3] = { - CL_CONTEXT_PLATFORM, (cl_context_properties)(pb_platform->clPlatform), 0 - }; - c->clContext = - clCreateContext(clCps, 1, (cl_device_id*)&pb_device->clDevice, NULL, NULL, &clStatus); - c->clPlatformId = pb_platform->clPlatform; - c->clDeviceId = pb_device->clDevice; - c->pb_platform = pb_platform; - c->pb_device = pb_device; - pb_platform->in_use = 1; - pb_device->in_use = 1; - unsigned int i = 0; - if (pb_platform->contexts == NULL) { - pb_platform->contexts = (pb_Context**) malloc(2*sizeof(pb_Context*)); - } else { - for (i = 0; pb_platform->contexts[i] != NULL; i++) {}; - pb_platform->contexts = (pb_Context**) realloc(pb_platform->contexts, - (i+1)*sizeof(pb_Context*)); - } - pb_platform->contexts[i+1] = NULL; - pb_platform->contexts[i] = c; - return c; -} - -// choose a platform by name. -pb_Platform* -pb_GetPlatformByName(const char* name) { - pb_Platform** ps = (pb_Platform **) pb_GetPlatforms(); - if (ps == NULL) return NULL; - if (name == NULL) { - return *ps; - } - - while (*ps) { - if (strstr((*ps)->name, name)) break; - ps++; - } - return (pb_Platform*) *ps; -} - -pb_Device** -pb_GetDevices(pb_Platform* pb_platform) { - if (pb_platform->devices == NULL) { - cl_uint num_devs; - cl_device_id* dev_ids; - clGetDeviceIDs((cl_platform_id) pb_platform->clPlatform, - CL_DEVICE_TYPE_ALL, 0, NULL, &num_devs); - if (num_devs == 0) return NULL; - - pb_platform->devices = - (pb_Device **) malloc((num_devs + 1) * sizeof(pb_Device *)); - dev_ids = (cl_device_id *) malloc(sizeof(cl_device_id) * num_devs); - clGetDeviceIDs((cl_platform_id) pb_platform->clPlatform, - CL_DEVICE_TYPE_ALL, num_devs, dev_ids, NULL); - - unsigned int i; - for (i = 0; i < num_devs; i++) { - pb_platform->devices[i] = (pb_Device *) malloc(sizeof(pb_Device)); - - pb_platform->devices[i]->clDevice = dev_ids[i]; - pb_platform->devices[i]->id = i; - - size_t sz; - clGetDeviceInfo(dev_ids[i], CL_DEVICE_NAME, 0, NULL, &sz); - char* name = (char *) malloc(sz + 1); - clGetDeviceInfo(dev_ids[i], CL_DEVICE_NAME, sz, name, NULL); - name[sz] = '\0'; - pb_platform->devices[i]->name = (char *) name; - - cl_bool available; - clGetDeviceInfo(dev_ids[i], CL_DEVICE_AVAILABLE, sizeof(cl_bool), &available, NULL); - pb_platform->devices[i]->available = (int) available; - - pb_platform->devices[i]->in_use = 0; - } - pb_platform->devices[i] = NULL; - } - return (pb_Device **) pb_platform->devices; -} - -// choose a device by name. -static pb_Device* -pb_SelectDeviceByName(pb_Device **ds, const char* name) { - if (ds == NULL) return NULL; - if (name == NULL) return *ds; - while (*ds) { - if (strstr((*ds)->name, name)) break; - ds++; - } - - return *ds; -} - -// choose a device by name and set the device's 'in_use' flag. -pb_Device* -pb_GetDeviceByName(pb_Platform* pb_platform, const char* name) { - pb_Device** ds = (pb_Device **) pb_GetDevices(pb_platform); - pb_Device *d = pb_SelectDeviceByName(ds, name); - - if (d) d->in_use = 1; - - return d; -} - -void -pb_ReleasePlatforms() { - if (!ptr) return; - pb_Platform** cur_ptr = ptr; - while (*cur_ptr) { - pb_Platform* pfptr = *cur_ptr++; - if (pfptr->devices) { - pb_Device** dvptr = pfptr->devices; - while (*dvptr) { - pb_Device* d = *dvptr++; - free(d->name); - free(d); - } - free(pfptr->devices); - } - if (pfptr->contexts) { - pb_Context** cptr = pfptr->contexts; - while (*cptr) { - free(*cptr++); - } - free(pfptr->contexts); - } - free(pfptr->name); - free(pfptr); - } - free(ptr); - ptr = NULL; -} - -pb_Platform* -pb_GetPlatformByNameAndVersion(const char* name, const char* version) { - pb_Platform** ps = (pb_Platform **) pb_GetPlatforms(); - if (ps == NULL) return NULL; - if (name == NULL) return *ps; - while (*ps) { - if (strstr((*ps)->name, name) && strstr((*ps)->version, version)) break; - ps++; - } - return (pb_Platform*) *ps; -} - -/* Return a pointer to the device at the specified index, or NULL. - * Used by pb_GetDevice. */ -static pb_Device * -select_device_by_index(pb_Device** ds, int id) -{ - int i = 0; - pb_Device** p = ds; - while (*p && (i < id)) { p++; i++; } - return *p; -} - -/* Return a pointer to the device with the specified type, or NULL. - * Used by pb_GetDevice. */ -static pb_Device * -select_device_by_type(pb_Device** ds, - enum pb_DeviceSelectionCriterion criterion) -{ - cl_device_type sought_type; - - /* Determine the OpenCL device type to search for */ - switch(criterion) { - case pb_Device_CPU: - sought_type = CL_DEVICE_TYPE_CPU; - break; - case pb_Device_GPU: - sought_type = CL_DEVICE_TYPE_GPU; - break; - case pb_Device_ACCELERATOR: - sought_type = CL_DEVICE_TYPE_ACCELERATOR; - break; - default: - fprintf(stderr, "pb_GetDevice: Invalid device type"); - exit(-1); - } - - /* Find the device */ - { - pb_Device** p = ds; - cl_device_type type; - while (*p) { - clGetDeviceInfo(((cl_device_id) ((*p)->clDevice)), CL_DEVICE_TYPE, - sizeof(cl_device_type), &type, NULL); - if (type == sought_type) break; - } - - return *p; - } -} - -pb_Device* -pb_GetDevice(pb_Platform* pb_platform, struct pb_DeviceParam *device) -{ - pb_Device** ds = (pb_Device **) pb_GetDevices(pb_platform); - - // The list of devices must be nonempty - if (ds == NULL || *ds == NULL) { - fprintf(stderr, "Error: No device is found in platform: name = %s, version = %s\n.", pb_platform->name, pb_platform->version); - exit(-1); - } - - pb_Device *selected_device = NULL; - - if (device != NULL) { - /* Use 'device' to select and return a device. - * If unable to select a device, fall - * back on the default selection mechanism. */ - switch(device->criterion) { - case pb_Device_INDEX: - selected_device = select_device_by_index(ds, device->index); - break; - case pb_Device_GPU: - case pb_Device_CPU: - case pb_Device_ACCELERATOR: - selected_device = select_device_by_type(ds, device->criterion); - break; - case pb_Device_NAME: - selected_device = pb_SelectDeviceByName(ds, device->name); - break; - default: - fprintf(stderr, "pb_GetDevice: Invalid argument"); - exit(-1); - } - } - - /* By default or if user-specified selection failed, - * select the first device */ - if (selected_device == NULL) - selected_device = *ds; - - /* Set the in_use flag */ - selected_device->in_use = 1; - - return selected_device; -} - -pb_Device* -pb_GetDeviceByEnvVars(pb_Platform* pb_platform) { - - /* Convert environment variables to a 'pb_DeviceParam' */ - struct pb_DeviceParam *param = NULL; - - char* device_num = getenv("PARBOIL_DEVICE_NUMBER"); - if (device_num && strcmp(device_num, "")) { - int id = atoi(device_num); - param = pb_DeviceParam_index(id); - } - else { - char* device_name = getenv("PARBOIL_DEVICE_NAME"); - if (device_name && strcmp(device_name, "")) { - param = pb_DeviceParam_name(strdup(device_name)); - } - else { - char* device_type = getenv("PARBOIL_DEVICE_TYPE"); - if (device_type && strcmp(device_type, "")) { - if (strcmp(device_type, "CPU") == 0) - param = pb_DeviceParam_cpu(); - else if (strcmp(device_type, "GPU") == 0) - param = pb_DeviceParam_gpu(); - else if (strcmp(device_type, "ACCELERATOR") == 0) - param = pb_DeviceParam_accelerator(); - } - } - } - - /* Get a device */ - pb_Device *d = pb_GetDevice(pb_platform, param); - pb_FreeDeviceParam(param); - - return d; -} - -pb_Platform* -pb_GetPlatformByEnvVars() { - char* name = getenv("PARBOIL_PLATFORM_NAME"); - char* version = getenv("PARBOIL_PLATFORM_VERSION"); - - /* Create a pb_PlatformParam object (or NULL) representing the data from the - * environment variables */ - struct pb_PlatformParam *platform; - - if (name) { - if (version) { - platform = pb_PlatformParam(strdup(name), strdup(version)); - } - else { - platform = pb_PlatformParam(strdup(name), NULL); - } - } - else { - platform = NULL; - } - - /* Convert to a platform */ - pb_Platform *p = pb_GetPlatform(platform); - pb_FreePlatformParam(platform); - - return p; -} - -/* Choose an OpenCL platform based on the given command-line parameters. - * If NULL, use the default OpenCL platform. */ -pb_Platform* -pb_GetPlatform(struct pb_PlatformParam *platform) { - if (platform != NULL) { - /* Try to use command-line parameters to choose platform */ - char *name = platform->name; - char *version = platform->version; - - if (!name) { - fprintf(stderr, "Internal error: NULL pointer"); - exit(-1); - } - - if (version) { - pb_Platform* p = pb_GetPlatformByNameAndVersion(name, version); - if (p) return p; - } - - pb_Platform* p = pb_GetPlatformByName(name); - if (p) return p; - } - - pb_Platform* p = pb_GetPlatformByName(NULL); - if (p == NULL) { - fprintf(stderr, "Error: No OpenCL platform in this system. Exiting."); - exit(-1); - } - return p; -} - -//extern void perf_init(); -//extern void mxpa_scheduler_init(); - -pb_Context* -pb_InitOpenCLContext(struct pb_Parameters* parameters) { -#if 0 - pb_Platform* ps = pb_GetPlatform(parameters->platform); - if (!ps) return NULL; - pb_Device* ds = pb_GetDevice(ps, parameters->device); - if (!ds) return NULL; - - /* HERE INITIALIZE TIMER */ - //perf_init(); - //mxpa_scheduler_init(); - - pb_Context* c = createContext(ps, ds); - pb_PrintPlatformInfo(c); - return c; -#endif - cl_int _err; - cl_platform_id platform_id; - cl_device_id device_id; - cl_context context; - clGetPlatformIDs(1, &platform_id, NULL); - clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL); - context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &_err); - - pb_Context* c = (pb_Context*)malloc(sizeof(pb_Context)); - c->clContext = context; - c->clDeviceId = device_id; - c->clPlatformId = platform_id; - c->pb_platform = (pb_Platform*)malloc(sizeof(pb_Platform)); - c->pb_device = (pb_Device*)malloc(sizeof(pb_Device)); - c->pb_platform->devices = (pb_Device**)malloc(sizeof(pb_Device*) * 2); - c->pb_platform->devices[0] = c->pb_device; - c->pb_platform->devices[1] = NULL; - c->pb_platform->contexts = (pb_Context**)malloc(sizeof(pb_Context*) * 2); - c->pb_platform->contexts[0] = c; - c->pb_platform->contexts[1] = NULL; - c->pb_platform->in_use = 1; - c->pb_device->in_use = 1; - return c; -} - -void -pb_ReleaseOpenCLContext(pb_Context* c) { - pb_ReleasePlatforms(); -} - -void -pb_PrintPlatformInfo(pb_Context* c) { - /*pb_Platform** ps = pb_GetPlatforms(); - if (!ps) { - fprintf (stderr, "No platform found"); - return; - } - - printf ("********************************************************\n"); - printf ("DETECTED OPENCL PLATFORMS AND DEVICES:\n"); - printf ("--------------------------------------------------------\n"); - - while (*ps) { - printf ("PLATFORM = %s, %s", (*ps)->name, (*ps)->version); - if (c->pb_platform == *ps) printf (" (SELECTED)"); - printf ("\n"); - - pb_Device** ds = (pb_Device **) pb_GetDevices((*ps)); - if (ds == NULL) { - printf (" + (No devices)\n"); - } else { - while (*ds) { - printf (" + %d: %s", (*ds)->id, (*ds)->name); - if (c->pb_device == *ds) printf (" (SELECTED)"); - printf ("\n"); - ds++; - } - } - - ps++; - } - printf ("********************************************************\n");*/ -} - -#ifdef MEASURE_KERNEL_TIME - -#undef clEnqueueNDRangeKernel - -//extern void pin_trace_enable(char*); -//extern void pin_trace_disable(char*); - -cl_int -pb_clEnqueueNDRangeKernel(cl_command_queue q/* command_queue */, - cl_kernel k/* kernel */, - cl_uint d/* work_dim */, - const size_t * o/* global_work_offset */, - const size_t * gws/* global_work_size */, - const size_t * lws/* local_work_size */, - cl_uint n/* num_events_in_wait_list */, - const cl_event * w/* event_wait_list */, - cl_event * e/* event */) { - - char buf[128]; - struct timeval begin, end; - clGetKernelInfo(k, CL_KERNEL_FUNCTION_NAME, 128, buf, NULL); - -#if 0 - int i; - for (i = 0; i < d; i++) { - printf ("%s: %d: %d / %d\n", buf, i, gws[i], (lws == NULL ? 0 : lws[i])); - } -#endif - - clFinish(q); clFlush(q); - //pin_trace_enable(buf); - //gettimeofday(&begin, NULL); - cl_int result = clEnqueueNDRangeKernel(q, k, d, o, gws, lws, n, w, e); - clFinish(q); clFlush(q); - //gettimeofday(&end, NULL); - //pin_trace_disable(buf); - //float t = (float)(end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000000.0f; - fflush(stdout); - fflush(stderr); - //printf ("PBTIMER: %s: %f\n", buf, t); - return result; -} - -#endif - -void -pb_sig_float(char* c, float* p, int sz) { - int i; - double s = 0.0; - for (i = 0; i < sz; i++) s += p[i] * (float)(i+1); - printf ("[Signature] %s = %lf\n", c, s); -} - -void -pb_sig_double(char* c, double* p, int sz) { - int i; - double s = 0.0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lf\n", c, s); -} - -void -pb_sig_short(char* c, short* p, int sz) { - int i; - long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void -pb_sig_int(char* c, int* p, int sz) { - int i; - long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void -pb_sig_uchar(char* c, unsigned char* p, unsigned int sz) { - int i; - unsigned long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void pb_sig_clmem(char* s, cl_command_queue command_queue, cl_mem memobj, int ty) { - size_t sz; - if (clGetMemObjectInfo(memobj, CL_MEM_SIZE, sizeof(size_t), &sz, NULL) != CL_SUCCESS) { - printf ("Something wrong.\n"); - assert(0); - } else { - printf ("size = %d\n", sz); - } - char* hp; // = (char*) malloc(sz); - //posix_memalign((void**)&hp, 64, sz); - hp = (char*)malloc(sz); - - clEnqueueReadBuffer (command_queue, - memobj, - CL_TRUE, - 0, - sz, - hp, - 0, - NULL, - NULL); - - if (ty == T_FLOAT) pb_sig_float(s, (float*)hp, sz/sizeof(float)); - if (ty == T_DOUBLE) pb_sig_double(s, (double*)hp, sz/sizeof(double)); - if (ty == T_INT) pb_sig_int(s, (int*)hp, sz/sizeof(int)); - if (ty == T_SHORT) pb_sig_short(s, (short*)hp, sz/sizeof(short)); - if (ty == T_UCHAR) pb_sig_uchar(s, (unsigned char*)hp, sz/sizeof(char)); - - free(hp); -} - diff --git a/tests/opencl/cutcp/readatom.c b/tests/opencl/cutcp/readatom.c deleted file mode 100644 index 8fc89ff3..00000000 --- a/tests/opencl/cutcp/readatom.c +++ /dev/null @@ -1,139 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2008-2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include -#include "atom.h" - - -#define LINELEN 96 -#define INITLEN 20 - - -Atoms *read_atom_file(const char *fname) -{ - FILE *file; - char line[LINELEN]; - - Atom *atom; /* Atom array */ - int len = INITLEN; /* Size of atom array */ - int cnt = 0; /* Number of atoms read */ - - /* allocate initial atom array */ - atom = (Atom *) malloc(len * sizeof(Atom)); - if (NULL==atom) { - fprintf(stderr, "can't allocate memory\n"); - return NULL; - } - - int i; - for (i = 0; i < len; ++i) { - atom[i].x = i+0; - atom[i].y = i+1; - atom[i].z = i+2; - atom[i].q = 1; - } - -#if 0 - /* open atom "pqr" file */ - file = fopen(fname, "r"); - if (NULL==file) { - fprintf(stderr, "can't open file \"%s\" for reading\n", fname); - return NULL; - } - - /* loop to read pqr file line by line */ - while (fgets(line, LINELEN, file) != NULL) { - - if (strncmp(line, "ATOM ", 6) != 0 && strncmp(line, "HETATM", 6) != 0) { - continue; /* skip anything that isn't an atom record */ - } - - if (cnt==len) { /* extend atom array */ - void *tmp = realloc(atom, 2*len*sizeof(Atom)); - if (NULL==tmp) { - fprintf(stderr, "can't allocate more memory\n"); - return NULL; - } - atom = (Atom *) tmp; - len *= 2; - } - - /* read position coordinates and charge from atom record */ - if (sscanf(line, "%*s %*d %*s %*s %*d %f %f %f %f", &(atom[cnt].x), - &(atom[cnt].y), &(atom[cnt].z), &(atom[cnt].q)) != 4) { - fprintf(stderr, "atom record %d does not have expected format\n", cnt+1); - return NULL; - } - - cnt++; /* count atoms as we store them */ - } - - /* verify EOF and close file */ - if ( !feof(file) ) { - fprintf(stderr, "did not find EOF\n"); - return NULL; - } - if (fclose(file)) { - fprintf(stderr, "can't close file\n"); - return NULL; - } -#endif - - /* Build the output data structure */ - { - Atoms *out = (Atoms *)malloc(sizeof(Atoms)); - - if (NULL == out) { - fprintf(stderr, "can't allocate memory\n"); - return NULL; - } - - out->size = cnt; - out->atoms = atom; - - return out; - } -} - - -void free_atom(Atoms *atom) -{ - if (atom) { - free(atom->atoms); - free(atom); - } -} - -void -get_atom_extent(Vec3 *out_lo, Vec3 *out_hi, Atoms *atom) -{ - Atom *atoms = atom->atoms; - int natoms = atom->size; - Vec3 lo; - Vec3 hi; - int n; - - hi.x = lo.x = atoms[0].x; - hi.y = lo.y = atoms[0].y; - hi.z = lo.z = atoms[0].z; - - for (n = 1; n < natoms; n++) { - lo.x = fminf(lo.x, atoms[n].x); - hi.x = fmaxf(hi.x, atoms[n].x); - lo.y = fminf(lo.y, atoms[n].y); - hi.y = fmaxf(hi.y, atoms[n].y); - lo.z = fminf(lo.z, atoms[n].z); - hi.z = fmaxf(hi.z, atoms[n].z); - } - - *out_lo = lo; - *out_hi = hi; -} diff --git a/tests/opencl/cutcp/watbox.sl40.pqr b/tests/opencl/cutcp/watbox.sl40.pqr deleted file mode 100755 index 917c3faa..00000000 --- a/tests/opencl/cutcp/watbox.sl40.pqr +++ /dev/null @@ -1,5945 +0,0 @@ -CRYST1 0.000 0.000 0.000 90.00 90.00 90.00 P 1 1 -ATOM 1 OH2 TIP3 5 -16.332 -9.918 -4.096 -0.834 1.520 -ATOM 2 H1 TIP3 5 -16.776 -9.549 -4.899 0.417 1.000 -ATOM 3 H2 TIP3 5 -16.908 -9.621 -3.373 0.417 1.000 -ATOM 4 OH2 TIP3 7 -13.967 -15.124 0.891 -0.834 1.520 -ATOM 5 H1 TIP3 7 -13.922 -14.776 1.798 0.417 1.000 -ATOM 6 H2 TIP3 7 -13.408 -15.912 0.961 0.417 1.000 -ATOM 7 OH2 TIP3 8 -15.431 -16.040 9.887 -0.834 1.520 -ATOM 8 H1 TIP3 8 -16.041 -16.840 9.980 0.417 1.000 -ATOM 9 H2 TIP3 8 -16.005 -15.345 9.422 0.417 1.000 -ATOM 10 OH2 TIP3 15 -19.025 -5.993 18.567 -0.834 1.520 -ATOM 11 H1 TIP3 15 -18.863 -6.737 17.966 0.417 1.000 -ATOM 12 H2 TIP3 15 -19.381 -6.461 19.360 0.417 1.000 -ATOM 13 OH2 TIP3 21 -14.814 -3.304 -7.928 -0.834 1.520 -ATOM 14 H1 TIP3 21 -13.917 -3.021 -8.184 0.417 1.000 -ATOM 15 H2 TIP3 21 -14.663 -4.168 -7.510 0.417 1.000 -ATOM 16 OH2 TIP3 26 -5.563 -14.206 10.556 -0.834 1.520 -ATOM 17 H1 TIP3 26 -6.476 -14.681 10.532 0.417 1.000 -ATOM 18 H2 TIP3 26 -5.016 -14.887 10.973 0.417 1.000 -ATOM 19 OH2 TIP3 29 -11.676 -6.189 1.332 -0.834 1.520 -ATOM 20 H1 TIP3 29 -11.367 -6.652 2.112 0.417 1.000 -ATOM 21 H2 TIP3 29 -11.494 -6.884 0.645 0.417 1.000 -ATOM 22 OH2 TIP3 30 -8.538 6.026 11.373 -0.834 1.520 -ATOM 23 H1 TIP3 30 -8.614 6.695 12.076 0.417 1.000 -ATOM 24 H2 TIP3 30 -9.381 6.080 10.936 0.417 1.000 -ATOM 25 OH2 TIP3 44 -16.214 -3.682 -18.690 -0.834 1.520 -ATOM 26 H1 TIP3 44 -16.219 -4.612 -18.804 0.417 1.000 -ATOM 27 H2 TIP3 44 -15.472 -3.420 -19.219 0.417 1.000 -ATOM 28 OH2 TIP3 46 -13.795 -13.009 -1.558 -0.834 1.520 -ATOM 29 H1 TIP3 46 -13.218 -12.653 -0.848 0.417 1.000 -ATOM 30 H2 TIP3 46 -14.691 -12.938 -1.200 0.417 1.000 -ATOM 31 OH2 TIP3 47 -3.874 -5.299 -15.423 -0.834 1.520 -ATOM 32 H1 TIP3 47 -3.930 -5.728 -16.274 0.417 1.000 -ATOM 33 H2 TIP3 47 -3.195 -4.546 -15.555 0.417 1.000 -ATOM 34 OH2 TIP3 48 -17.250 -11.156 -10.371 -0.834 1.520 -ATOM 35 H1 TIP3 48 -17.890 -11.710 -10.002 0.417 1.000 -ATOM 36 H2 TIP3 48 -17.836 -10.755 -11.038 0.417 1.000 -ATOM 37 OH2 TIP3 52 -16.065 -3.805 2.109 -0.834 1.520 -ATOM 38 H1 TIP3 52 -15.130 -3.966 1.985 0.417 1.000 -ATOM 39 H2 TIP3 52 -16.345 -4.633 2.581 0.417 1.000 -ATOM 40 OH2 TIP3 53 -17.009 -8.838 7.860 -0.834 1.520 -ATOM 41 H1 TIP3 53 -16.406 -9.032 7.129 0.417 1.000 -ATOM 42 H2 TIP3 53 -17.586 -8.225 7.430 0.417 1.000 -ATOM 43 OH2 TIP3 55 -15.760 -12.963 7.081 -0.834 1.520 -ATOM 44 H1 TIP3 55 -15.344 -12.169 6.658 0.417 1.000 -ATOM 45 H2 TIP3 55 -16.214 -12.572 7.812 0.417 1.000 -ATOM 46 OH2 TIP3 56 -12.828 -13.001 18.581 -0.834 1.520 -ATOM 47 H1 TIP3 56 -12.960 -12.450 19.327 0.417 1.000 -ATOM 48 H2 TIP3 56 -13.756 -13.244 18.263 0.417 1.000 -ATOM 49 OH2 TIP3 64 -9.326 -11.091 -15.014 -0.834 1.520 -ATOM 50 H1 TIP3 64 -9.002 -11.129 -14.068 0.417 1.000 -ATOM 51 H2 TIP3 64 -10.252 -10.730 -14.925 0.417 1.000 -ATOM 52 OH2 TIP3 67 -19.998 -14.333 -5.409 -0.834 1.520 -ATOM 53 H1 TIP3 67 -19.517 -14.010 -6.170 0.417 1.000 -ATOM 54 H2 TIP3 67 -19.392 -14.219 -4.653 0.417 1.000 -ATOM 55 OH2 TIP3 68 -10.118 -10.844 -5.084 -0.834 1.520 -ATOM 56 H1 TIP3 68 -10.426 -10.247 -4.403 0.417 1.000 -ATOM 57 H2 TIP3 68 -9.979 -11.736 -4.711 0.417 1.000 -ATOM 58 OH2 TIP3 71 -12.036 -13.893 9.453 -0.834 1.520 -ATOM 59 H1 TIP3 71 -11.758 -14.794 9.599 0.417 1.000 -ATOM 60 H2 TIP3 71 -11.578 -13.455 10.237 0.417 1.000 -ATOM 61 OH2 TIP3 75 4.177 -5.729 18.126 -0.834 1.520 -ATOM 62 H1 TIP3 75 3.534 -6.058 17.459 0.417 1.000 -ATOM 63 H2 TIP3 75 5.062 -5.918 17.682 0.417 1.000 -ATOM 64 OH2 TIP3 76 -13.684 -14.712 7.495 -0.834 1.520 -ATOM 65 H1 TIP3 76 -13.360 -14.369 8.363 0.417 1.000 -ATOM 66 H2 TIP3 76 -14.437 -14.148 7.280 0.417 1.000 -ATOM 67 OH2 TIP3 86 -7.111 9.660 -10.913 -0.834 1.520 -ATOM 68 H1 TIP3 86 -7.422 9.796 -10.025 0.417 1.000 -ATOM 69 H2 TIP3 86 -6.236 9.337 -10.788 0.417 1.000 -ATOM 70 OH2 TIP3 87 -18.339 -13.319 -18.057 -0.834 1.520 -ATOM 71 H1 TIP3 87 -18.057 -14.261 -18.019 0.417 1.000 -ATOM 72 H2 TIP3 87 -19.222 -13.401 -18.517 0.417 1.000 -ATOM 73 OH2 TIP3 88 -15.179 0.603 -8.761 -0.834 1.520 -ATOM 74 H1 TIP3 88 -14.534 0.782 -8.037 0.417 1.000 -ATOM 75 H2 TIP3 88 -14.616 0.914 -9.544 0.417 1.000 -ATOM 76 OH2 TIP3 90 -4.978 0.855 -7.169 -0.834 1.520 -ATOM 77 H1 TIP3 90 -5.778 0.809 -6.708 0.417 1.000 -ATOM 78 H2 TIP3 90 -5.327 1.057 -8.082 0.417 1.000 -ATOM 79 OH2 TIP3 94 -18.661 -16.218 2.814 -0.834 1.520 -ATOM 80 H1 TIP3 94 -19.161 -16.575 2.087 0.417 1.000 -ATOM 81 H2 TIP3 94 -18.225 -16.923 3.138 0.417 1.000 -ATOM 82 OH2 TIP3 95 -19.515 -4.863 2.476 -0.834 1.520 -ATOM 83 H1 TIP3 95 -19.356 -4.575 3.349 0.417 1.000 -ATOM 84 H2 TIP3 95 -19.688 -4.039 1.975 0.417 1.000 -ATOM 85 OH2 TIP3 97 -6.857 -6.205 13.479 -0.834 1.520 -ATOM 86 H1 TIP3 97 -7.069 -6.447 14.356 0.417 1.000 -ATOM 87 H2 TIP3 97 -6.477 -5.338 13.519 0.417 1.000 -ATOM 88 OH2 TIP3 98 -7.579 0.595 11.343 -0.834 1.520 -ATOM 89 H1 TIP3 98 -7.670 0.621 12.303 0.417 1.000 -ATOM 90 H2 TIP3 98 -7.719 1.526 11.063 0.417 1.000 -ATOM 91 OH2 TIP3 108 -14.392 3.918 -7.041 -0.834 1.520 -ATOM 92 H1 TIP3 108 -15.160 3.622 -7.455 0.417 1.000 -ATOM 93 H2 TIP3 108 -13.963 4.336 -7.792 0.417 1.000 -ATOM 94 OH2 TIP3 111 -9.574 -12.396 -17.596 -0.834 1.520 -ATOM 95 H1 TIP3 111 -9.239 -11.599 -18.006 0.417 1.000 -ATOM 96 H2 TIP3 111 -9.752 -12.111 -16.692 0.417 1.000 -ATOM 97 OH2 TIP3 112 -11.431 5.684 -7.789 -0.834 1.520 -ATOM 98 H1 TIP3 112 -10.877 5.542 -6.985 0.417 1.000 -ATOM 99 H2 TIP3 112 -11.195 6.595 -8.073 0.417 1.000 -ATOM 100 OH2 TIP3 113 -15.731 2.752 -3.735 -0.834 1.520 -ATOM 101 H1 TIP3 113 -15.851 3.680 -4.112 0.417 1.000 -ATOM 102 H2 TIP3 113 -14.939 2.796 -3.224 0.417 1.000 -ATOM 103 OH2 TIP3 115 -16.401 -6.311 3.583 -0.834 1.520 -ATOM 104 H1 TIP3 115 -16.570 -7.124 4.062 0.417 1.000 -ATOM 105 H2 TIP3 115 -15.439 -6.231 3.661 0.417 1.000 -ATOM 106 OH2 TIP3 116 -0.048 -18.039 6.164 -0.834 1.520 -ATOM 107 H1 TIP3 116 0.414 -18.921 6.079 0.417 1.000 -ATOM 108 H2 TIP3 116 0.667 -17.347 6.013 0.417 1.000 -ATOM 109 OH2 TIP3 125 2.572 -13.758 -16.522 -0.834 1.520 -ATOM 110 H1 TIP3 125 1.705 -14.155 -16.170 0.417 1.000 -ATOM 111 H2 TIP3 125 2.951 -14.341 -17.142 0.417 1.000 -ATOM 112 OH2 TIP3 129 -12.218 8.346 0.641 -0.834 1.520 -ATOM 113 H1 TIP3 129 -11.345 8.234 1.114 0.417 1.000 -ATOM 114 H2 TIP3 129 -12.331 9.295 0.444 0.417 1.000 -ATOM 115 OH2 TIP3 130 -9.074 -14.635 -18.982 -0.834 1.520 -ATOM 116 H1 TIP3 130 -8.862 -15.231 -18.246 0.417 1.000 -ATOM 117 H2 TIP3 130 -9.343 -13.788 -18.507 0.417 1.000 -ATOM 118 OH2 TIP3 131 18.680 4.645 5.756 -0.834 1.520 -ATOM 119 H1 TIP3 131 18.621 5.384 5.135 0.417 1.000 -ATOM 120 H2 TIP3 131 19.060 4.974 6.580 0.417 1.000 -ATOM 121 OH2 TIP3 133 -11.353 -15.686 -0.722 -0.834 1.520 -ATOM 122 H1 TIP3 133 -12.036 -16.389 -0.674 0.417 1.000 -ATOM 123 H2 TIP3 133 -11.957 -14.936 -0.847 0.417 1.000 -ATOM 124 OH2 TIP3 134 -11.619 -2.681 3.275 -0.834 1.520 -ATOM 125 H1 TIP3 134 -12.484 -2.660 3.695 0.417 1.000 -ATOM 126 H2 TIP3 134 -11.569 -1.737 3.009 0.417 1.000 -ATOM 127 OH2 TIP3 135 -15.658 -8.612 5.271 -0.834 1.520 -ATOM 128 H1 TIP3 135 -15.158 -9.303 5.678 0.417 1.000 -ATOM 129 H2 TIP3 135 -15.097 -7.852 5.578 0.417 1.000 -ATOM 130 OH2 TIP3 137 -18.330 -4.325 9.166 -0.834 1.520 -ATOM 131 H1 TIP3 137 -17.880 -4.050 9.974 0.417 1.000 -ATOM 132 H2 TIP3 137 -19.237 -4.483 9.468 0.417 1.000 -ATOM 133 OH2 TIP3 145 -3.530 8.089 -17.819 -0.834 1.520 -ATOM 134 H1 TIP3 145 -3.146 7.230 -17.501 0.417 1.000 -ATOM 135 H2 TIP3 145 -4.467 7.856 -17.912 0.417 1.000 -ATOM 136 OH2 TIP3 146 -11.624 12.914 -11.264 -0.834 1.520 -ATOM 137 H1 TIP3 146 -10.900 12.283 -11.266 0.417 1.000 -ATOM 138 H2 TIP3 146 -11.193 13.795 -11.432 0.417 1.000 -ATOM 139 OH2 TIP3 149 -19.198 5.084 -14.477 -0.834 1.520 -ATOM 140 H1 TIP3 149 -19.421 6.065 -14.495 0.417 1.000 -ATOM 141 H2 TIP3 149 -18.205 5.163 -14.555 0.417 1.000 -ATOM 142 OH2 TIP3 150 -15.701 -2.226 -12.831 -0.834 1.520 -ATOM 143 H1 TIP3 150 -16.697 -2.197 -12.678 0.417 1.000 -ATOM 144 H2 TIP3 150 -15.467 -1.245 -13.076 0.417 1.000 -ATOM 145 OH2 TIP3 152 -11.108 -7.023 -14.679 -0.834 1.520 -ATOM 146 H1 TIP3 152 -11.881 -7.522 -14.557 0.417 1.000 -ATOM 147 H2 TIP3 152 -10.658 -7.443 -15.464 0.417 1.000 -ATOM 148 OH2 TIP3 153 -17.292 0.969 4.504 -0.834 1.520 -ATOM 149 H1 TIP3 153 -17.411 0.945 3.556 0.417 1.000 -ATOM 150 H2 TIP3 153 -16.877 1.835 4.549 0.417 1.000 -ATOM 151 OH2 TIP3 155 -17.572 -7.269 10.487 -0.834 1.520 -ATOM 152 H1 TIP3 155 -17.281 -7.927 9.830 0.417 1.000 -ATOM 153 H2 TIP3 155 -17.418 -6.458 10.008 0.417 1.000 -ATOM 154 OH2 TIP3 156 -8.719 11.586 4.226 -0.834 1.520 -ATOM 155 H1 TIP3 156 -8.853 10.638 4.048 0.417 1.000 -ATOM 156 H2 TIP3 156 -7.869 11.561 4.702 0.417 1.000 -ATOM 157 OH2 TIP3 167 -17.826 -1.532 -17.788 -0.834 1.520 -ATOM 158 H1 TIP3 167 -17.368 -2.372 -17.797 0.417 1.000 -ATOM 159 H2 TIP3 167 -17.069 -0.880 -17.719 0.417 1.000 -ATOM 160 OH2 TIP3 177 -14.952 -10.954 16.578 -0.834 1.520 -ATOM 161 H1 TIP3 177 -14.936 -10.111 17.059 0.417 1.000 -ATOM 162 H2 TIP3 177 -15.378 -10.776 15.743 0.417 1.000 -ATOM 163 OH2 TIP3 178 -15.182 16.858 -2.213 -0.834 1.520 -ATOM 164 H1 TIP3 178 -15.854 16.220 -2.533 0.417 1.000 -ATOM 165 H2 TIP3 178 -15.016 16.600 -1.315 0.417 1.000 -ATOM 166 OH2 TIP3 179 -10.414 15.305 16.263 -0.834 1.520 -ATOM 167 H1 TIP3 179 -10.047 15.826 17.009 0.417 1.000 -ATOM 168 H2 TIP3 179 -9.737 15.511 15.531 0.417 1.000 -ATOM 169 OH2 TIP3 180 -7.610 7.307 17.360 -0.834 1.520 -ATOM 170 H1 TIP3 180 -8.155 8.113 17.293 0.417 1.000 -ATOM 171 H2 TIP3 180 -7.955 6.920 18.175 0.417 1.000 -ATOM 172 OH2 TIP3 191 -18.669 16.142 -17.299 -0.834 1.520 -ATOM 173 H1 TIP3 191 -19.635 16.131 -17.037 0.417 1.000 -ATOM 174 H2 TIP3 191 -18.328 15.284 -16.967 0.417 1.000 -ATOM 175 OH2 TIP3 195 -17.084 11.913 -11.022 -0.834 1.520 -ATOM 176 H1 TIP3 195 -16.227 12.387 -10.984 0.417 1.000 -ATOM 177 H2 TIP3 195 -17.775 12.579 -10.972 0.417 1.000 -ATOM 178 OH2 TIP3 197 -1.130 1.460 8.971 -0.834 1.520 -ATOM 179 H1 TIP3 197 -2.097 1.288 8.721 0.417 1.000 -ATOM 180 H2 TIP3 197 -0.926 0.691 9.591 0.417 1.000 -ATOM 181 OH2 TIP3 198 -13.921 13.356 5.597 -0.834 1.520 -ATOM 182 H1 TIP3 198 -13.517 13.937 6.265 0.417 1.000 -ATOM 183 H2 TIP3 198 -14.818 13.791 5.496 0.417 1.000 -ATOM 184 OH2 TIP3 201 -16.478 9.694 7.275 -0.834 1.520 -ATOM 185 H1 TIP3 201 -17.021 9.239 8.035 0.417 1.000 -ATOM 186 H2 TIP3 201 -17.110 10.250 6.887 0.417 1.000 -ATOM 187 OH2 TIP3 202 -4.656 14.738 12.731 -0.834 1.520 -ATOM 188 H1 TIP3 202 -4.474 15.545 13.160 0.417 1.000 -ATOM 189 H2 TIP3 202 -5.087 15.025 11.884 0.417 1.000 -ATOM 190 OH2 TIP3 212 -10.936 10.446 -2.304 -0.834 1.520 -ATOM 191 H1 TIP3 212 -10.104 10.192 -1.919 0.417 1.000 -ATOM 192 H2 TIP3 212 -11.502 10.631 -1.509 0.417 1.000 -ATOM 193 OH2 TIP3 218 -1.580 12.007 2.329 -0.834 1.520 -ATOM 194 H1 TIP3 218 -2.087 11.810 3.089 0.417 1.000 -ATOM 195 H2 TIP3 218 -0.655 12.190 2.662 0.417 1.000 -ATOM 196 OH2 TIP3 222 -5.630 16.170 16.010 -0.834 1.520 -ATOM 197 H1 TIP3 222 -5.210 16.753 15.304 0.417 1.000 -ATOM 198 H2 TIP3 222 -4.931 15.483 16.044 0.417 1.000 -ATOM 199 OH2 TIP3 237 -19.435 9.252 -18.417 -0.834 1.520 -ATOM 200 H1 TIP3 237 -18.537 9.562 -18.264 0.417 1.000 -ATOM 201 H2 TIP3 237 -19.414 8.335 -18.212 0.417 1.000 -ATOM 202 OH2 TIP3 238 -6.261 13.516 17.538 -0.834 1.520 -ATOM 203 H1 TIP3 238 -6.658 13.364 16.663 0.417 1.000 -ATOM 204 H2 TIP3 238 -6.871 12.963 18.063 0.417 1.000 -ATOM 205 OH2 TIP3 239 -6.388 -2.320 -1.378 -0.834 1.520 -ATOM 206 H1 TIP3 239 -6.256 -2.586 -0.492 0.417 1.000 -ATOM 207 H2 TIP3 239 -5.474 -2.169 -1.653 0.417 1.000 -ATOM 208 OH2 TIP3 252 -10.142 18.394 -14.444 -0.834 1.520 -ATOM 209 H1 TIP3 252 -10.914 18.132 -14.008 0.417 1.000 -ATOM 210 H2 TIP3 252 -9.715 19.003 -13.917 0.417 1.000 -ATOM 211 OH2 TIP3 253 -9.918 14.674 -8.066 -0.834 1.520 -ATOM 212 H1 TIP3 253 -9.792 15.123 -7.205 0.417 1.000 -ATOM 213 H2 TIP3 253 -10.552 15.288 -8.455 0.417 1.000 -ATOM 214 OH2 TIP3 257 -14.115 15.212 -12.437 -0.834 1.520 -ATOM 215 H1 TIP3 257 -14.491 15.849 -13.109 0.417 1.000 -ATOM 216 H2 TIP3 257 -13.198 15.079 -12.688 0.417 1.000 -ATOM 217 OH2 TIP3 261 -18.713 4.132 3.737 -0.834 1.520 -ATOM 218 H1 TIP3 261 -18.765 3.924 4.731 0.417 1.000 -ATOM 219 H2 TIP3 261 -17.912 4.709 3.639 0.417 1.000 -ATOM 220 OH2 TIP3 281 -13.418 17.780 7.400 -0.834 1.520 -ATOM 221 H1 TIP3 281 -13.160 16.904 7.215 0.417 1.000 -ATOM 222 H2 TIP3 281 -12.817 18.042 8.140 0.417 1.000 -ATOM 223 OH2 TIP3 295 -11.916 12.876 -4.176 -0.834 1.520 -ATOM 224 H1 TIP3 295 -12.857 12.955 -4.219 0.417 1.000 -ATOM 225 H2 TIP3 295 -11.723 12.234 -3.503 0.417 1.000 -ATOM 226 OH2 TIP3 365 -13.635 -17.326 8.059 -0.834 1.520 -ATOM 227 H1 TIP3 365 -14.201 -16.563 7.849 0.417 1.000 -ATOM 228 H2 TIP3 365 -12.825 -16.945 8.403 0.417 1.000 -ATOM 229 OH2 TIP3 411 -10.661 -13.262 11.901 -0.834 1.520 -ATOM 230 H1 TIP3 411 -11.096 -12.764 12.634 0.417 1.000 -ATOM 231 H2 TIP3 411 -10.596 -14.162 12.222 0.417 1.000 -ATOM 232 OH2 TIP3 424 -4.586 -13.431 -17.499 -0.834 1.520 -ATOM 233 H1 TIP3 424 -3.776 -13.142 -17.872 0.417 1.000 -ATOM 234 H2 TIP3 424 -5.192 -13.300 -18.329 0.417 1.000 -ATOM 235 OH2 TIP3 432 -12.429 -16.202 14.095 -0.834 1.520 -ATOM 236 H1 TIP3 432 -13.034 -15.596 13.494 0.417 1.000 -ATOM 237 H2 TIP3 432 -12.554 -15.905 15.028 0.417 1.000 -ATOM 238 OH2 TIP3 443 -10.065 -7.124 -9.809 -0.834 1.520 -ATOM 239 H1 TIP3 443 -10.291 -7.902 -10.366 0.417 1.000 -ATOM 240 H2 TIP3 443 -10.528 -7.234 -8.982 0.417 1.000 -ATOM 241 OH2 TIP3 450 -12.940 -17.926 -0.170 -0.834 1.520 -ATOM 242 H1 TIP3 450 -12.350 -18.381 0.528 0.417 1.000 -ATOM 243 H2 TIP3 450 -13.852 -18.204 0.035 0.417 1.000 -ATOM 244 OH2 TIP3 452 -9.105 -0.675 19.064 -0.834 1.520 -ATOM 245 H1 TIP3 452 -9.633 -1.232 19.669 0.417 1.000 -ATOM 246 H2 TIP3 452 -8.214 -1.042 19.229 0.417 1.000 -ATOM 247 OH2 TIP3 465 -6.109 -18.081 -17.008 -0.834 1.520 -ATOM 248 H1 TIP3 465 -5.802 -17.319 -16.578 0.417 1.000 -ATOM 249 H2 TIP3 465 -6.788 -18.423 -16.422 0.417 1.000 -ATOM 250 OH2 TIP3 466 -11.177 -9.419 -11.173 -0.834 1.520 -ATOM 251 H1 TIP3 466 -11.817 -9.247 -11.852 0.417 1.000 -ATOM 252 H2 TIP3 466 -11.611 -9.939 -10.466 0.417 1.000 -ATOM 253 OH2 TIP3 469 -10.922 -8.033 -7.266 -0.834 1.520 -ATOM 254 H1 TIP3 469 -11.772 -8.439 -7.007 0.417 1.000 -ATOM 255 H2 TIP3 469 -10.488 -7.806 -6.440 0.417 1.000 -ATOM 256 OH2 TIP3 484 -9.718 -19.360 -17.947 -0.834 1.520 -ATOM 257 H1 TIP3 484 -9.633 -19.041 -16.984 0.417 1.000 -ATOM 258 H2 TIP3 484 -10.257 -18.677 -18.333 0.417 1.000 -ATOM 259 OH2 TIP3 485 -15.382 -11.875 -12.223 -0.834 1.520 -ATOM 260 H1 TIP3 485 -14.595 -12.081 -11.686 0.417 1.000 -ATOM 261 H2 TIP3 485 -15.998 -11.542 -11.578 0.417 1.000 -ATOM 262 OH2 TIP3 486 -16.597 -15.313 -10.185 -0.834 1.520 -ATOM 263 H1 TIP3 486 -16.891 -14.728 -10.903 0.417 1.000 -ATOM 264 H2 TIP3 486 -16.183 -16.027 -10.673 0.417 1.000 -ATOM 265 OH2 TIP3 489 -16.724 -12.535 -0.675 -0.834 1.520 -ATOM 266 H1 TIP3 489 -17.228 -13.009 -0.036 0.417 1.000 -ATOM 267 H2 TIP3 489 -16.396 -11.712 -0.247 0.417 1.000 -ATOM 268 OH2 TIP3 490 -17.109 -14.956 12.613 -0.834 1.520 -ATOM 269 H1 TIP3 490 -17.740 -15.480 13.150 0.417 1.000 -ATOM 270 H2 TIP3 490 -17.697 -14.490 12.020 0.417 1.000 -ATOM 271 OH2 TIP3 491 -18.160 -11.735 8.662 -0.834 1.520 -ATOM 272 H1 TIP3 491 -18.320 -11.956 7.747 0.417 1.000 -ATOM 273 H2 TIP3 491 -18.166 -10.789 8.733 0.417 1.000 -ATOM 274 OH2 TIP3 494 -19.263 -2.098 17.090 -0.834 1.520 -ATOM 275 H1 TIP3 494 -19.541 -1.208 17.352 0.417 1.000 -ATOM 276 H2 TIP3 494 -19.134 -2.051 16.147 0.417 1.000 -ATOM 277 OH2 TIP3 495 -10.022 -12.125 4.948 -0.834 1.520 -ATOM 278 H1 TIP3 495 -10.411 -12.374 5.845 0.417 1.000 -ATOM 279 H2 TIP3 495 -9.564 -11.344 5.187 0.417 1.000 -ATOM 280 OH2 TIP3 498 -10.073 -15.815 12.805 -0.834 1.520 -ATOM 281 H1 TIP3 498 -10.944 -16.065 13.202 0.417 1.000 -ATOM 282 H2 TIP3 498 -9.640 -16.675 12.665 0.417 1.000 -ATOM 283 OH2 TIP3 503 -16.881 -9.675 -6.842 -0.834 1.520 -ATOM 284 H1 TIP3 503 -16.402 -9.100 -7.488 0.417 1.000 -ATOM 285 H2 TIP3 503 -16.560 -10.570 -7.038 0.417 1.000 -ATOM 286 OH2 TIP3 506 -17.622 -14.194 -3.747 -0.834 1.520 -ATOM 287 H1 TIP3 506 -17.843 -13.839 -2.901 0.417 1.000 -ATOM 288 H2 TIP3 506 -16.699 -13.968 -3.874 0.417 1.000 -ATOM 289 OH2 TIP3 507 -13.618 2.271 -17.681 -0.834 1.520 -ATOM 290 H1 TIP3 507 -14.450 2.035 -18.153 0.417 1.000 -ATOM 291 H2 TIP3 507 -13.141 1.472 -17.808 0.417 1.000 -ATOM 292 OH2 TIP3 508 11.804 -7.244 -12.948 -0.834 1.520 -ATOM 293 H1 TIP3 508 11.543 -6.358 -13.269 0.417 1.000 -ATOM 294 H2 TIP3 508 12.291 -7.070 -12.133 0.417 1.000 -ATOM 295 OH2 TIP3 509 -15.983 -16.095 -0.582 -0.834 1.520 -ATOM 296 H1 TIP3 509 -16.858 -15.958 -0.868 0.417 1.000 -ATOM 297 H2 TIP3 509 -15.418 -15.273 -0.705 0.417 1.000 -ATOM 298 OH2 TIP3 511 -17.656 0.472 1.631 -0.834 1.520 -ATOM 299 H1 TIP3 511 -17.068 0.821 0.945 0.417 1.000 -ATOM 300 H2 TIP3 511 -18.533 0.548 1.138 0.417 1.000 -ATOM 301 OH2 TIP3 512 0.613 -6.384 -8.934 -0.834 1.520 -ATOM 302 H1 TIP3 512 0.739 -6.041 -9.782 0.417 1.000 -ATOM 303 H2 TIP3 512 -0.381 -6.184 -8.750 0.417 1.000 -ATOM 304 OH2 TIP3 514 -8.508 -14.452 14.846 -0.834 1.520 -ATOM 305 H1 TIP3 514 -8.837 -14.796 14.040 0.417 1.000 -ATOM 306 H2 TIP3 514 -8.614 -13.521 14.859 0.417 1.000 -ATOM 307 OH2 TIP3 515 -18.213 -10.482 4.515 -0.834 1.520 -ATOM 308 H1 TIP3 515 -17.868 -10.425 3.646 0.417 1.000 -ATOM 309 H2 TIP3 515 -18.140 -9.594 4.787 0.417 1.000 -ATOM 310 OH2 TIP3 516 -15.873 -18.130 12.761 -0.834 1.520 -ATOM 311 H1 TIP3 516 -16.170 -17.728 11.989 0.417 1.000 -ATOM 312 H2 TIP3 516 -15.270 -17.438 13.098 0.417 1.000 -ATOM 313 OH2 TIP3 517 -5.474 -9.468 0.137 -0.834 1.520 -ATOM 314 H1 TIP3 517 -5.838 -10.267 0.503 0.417 1.000 -ATOM 315 H2 TIP3 517 -5.534 -9.580 -0.806 0.417 1.000 -ATOM 316 OH2 TIP3 528 6.124 -3.406 -3.193 -0.834 1.520 -ATOM 317 H1 TIP3 528 6.948 -3.136 -2.756 0.417 1.000 -ATOM 318 H2 TIP3 528 6.137 -2.952 -4.100 0.417 1.000 -ATOM 319 OH2 TIP3 529 -11.124 8.437 -14.421 -0.834 1.520 -ATOM 320 H1 TIP3 529 -10.773 7.577 -14.642 0.417 1.000 -ATOM 321 H2 TIP3 529 -11.210 8.398 -13.467 0.417 1.000 -ATOM 322 OH2 TIP3 533 -14.427 -5.196 -0.910 -0.834 1.520 -ATOM 323 H1 TIP3 533 -14.041 -4.661 -0.192 0.417 1.000 -ATOM 324 H2 TIP3 533 -14.131 -4.587 -1.669 0.417 1.000 -ATOM 325 OH2 TIP3 534 -3.717 -12.646 2.781 -0.834 1.520 -ATOM 326 H1 TIP3 534 -4.360 -11.942 2.449 0.417 1.000 -ATOM 327 H2 TIP3 534 -4.027 -13.440 2.379 0.417 1.000 -ATOM 328 OH2 TIP3 535 2.872 -1.559 -3.212 -0.834 1.520 -ATOM 329 H1 TIP3 535 2.201 -2.136 -3.621 0.417 1.000 -ATOM 330 H2 TIP3 535 2.335 -1.019 -2.575 0.417 1.000 -ATOM 331 OH2 TIP3 538 -9.895 -19.159 19.111 -0.834 1.520 -ATOM 332 H1 TIP3 538 -10.512 -18.550 18.631 0.417 1.000 -ATOM 333 H2 TIP3 538 -9.368 -18.582 19.705 0.417 1.000 -ATOM 334 OH2 TIP3 540 -19.258 0.647 17.424 -0.834 1.520 -ATOM 335 H1 TIP3 540 -19.837 1.202 16.855 0.417 1.000 -ATOM 336 H2 TIP3 540 -18.468 0.410 16.837 0.417 1.000 -ATOM 337 OH2 TIP3 543 -14.542 -6.903 -15.411 -0.834 1.520 -ATOM 338 H1 TIP3 543 -14.327 -6.981 -16.388 0.417 1.000 -ATOM 339 H2 TIP3 543 -15.101 -6.106 -15.343 0.417 1.000 -ATOM 340 OH2 TIP3 549 7.849 -10.132 -0.827 -0.834 1.520 -ATOM 341 H1 TIP3 549 7.170 -10.280 -0.137 0.417 1.000 -ATOM 342 H2 TIP3 549 7.403 -9.581 -1.511 0.417 1.000 -ATOM 343 OH2 TIP3 550 -15.448 -18.630 0.330 -0.834 1.520 -ATOM 344 H1 TIP3 550 -15.726 -17.806 -0.047 0.417 1.000 -ATOM 345 H2 TIP3 550 -15.765 -19.199 -0.429 0.417 1.000 -ATOM 346 OH2 TIP3 551 -15.406 5.266 -4.800 -0.834 1.520 -ATOM 347 H1 TIP3 551 -16.362 5.500 -4.804 0.417 1.000 -ATOM 348 H2 TIP3 551 -15.242 4.897 -5.688 0.417 1.000 -ATOM 349 OH2 TIP3 552 -9.034 -19.513 7.664 -0.834 1.520 -ATOM 350 H1 TIP3 552 -9.165 -18.577 7.475 0.417 1.000 -ATOM 351 H2 TIP3 552 -9.442 -19.908 6.883 0.417 1.000 -ATOM 352 OH2 TIP3 553 -13.420 -7.008 9.691 -0.834 1.520 -ATOM 353 H1 TIP3 553 -13.570 -6.114 9.972 0.417 1.000 -ATOM 354 H2 TIP3 553 -13.571 -7.501 10.481 0.417 1.000 -ATOM 355 OH2 TIP3 554 -14.840 -6.256 -12.046 -0.834 1.520 -ATOM 356 H1 TIP3 554 -13.952 -6.578 -11.793 0.417 1.000 -ATOM 357 H2 TIP3 554 -14.992 -5.507 -11.472 0.417 1.000 -ATOM 358 OH2 TIP3 555 -18.512 -12.246 11.838 -0.834 1.520 -ATOM 359 H1 TIP3 555 -19.222 -11.677 12.195 0.417 1.000 -ATOM 360 H2 TIP3 555 -18.457 -11.957 10.921 0.417 1.000 -ATOM 361 OH2 TIP3 558 -9.610 -13.614 -1.172 -0.834 1.520 -ATOM 362 H1 TIP3 558 -9.312 -13.516 -0.269 0.417 1.000 -ATOM 363 H2 TIP3 558 -10.156 -14.411 -1.079 0.417 1.000 -ATOM 364 OH2 TIP3 562 -18.322 1.942 -18.965 -0.834 1.520 -ATOM 365 H1 TIP3 562 -18.728 1.280 -18.408 0.417 1.000 -ATOM 366 H2 TIP3 562 -18.502 2.809 -18.507 0.417 1.000 -ATOM 367 OH2 TIP3 568 -10.370 1.547 -17.000 -0.834 1.520 -ATOM 368 H1 TIP3 568 -10.399 2.471 -17.357 0.417 1.000 -ATOM 369 H2 TIP3 568 -10.713 0.954 -17.688 0.417 1.000 -ATOM 370 OH2 TIP3 570 -19.245 14.044 -7.077 -0.834 1.520 -ATOM 371 H1 TIP3 570 -18.622 14.200 -6.344 0.417 1.000 -ATOM 372 H2 TIP3 570 -19.669 13.221 -6.771 0.417 1.000 -ATOM 373 OH2 TIP3 573 -15.609 9.423 1.120 -0.834 1.520 -ATOM 374 H1 TIP3 573 -16.237 8.799 1.511 0.417 1.000 -ATOM 375 H2 TIP3 573 -15.406 9.044 0.208 0.417 1.000 -ATOM 376 OH2 TIP3 575 -17.656 -9.429 -17.376 -0.834 1.520 -ATOM 377 H1 TIP3 575 -17.878 -9.247 -16.447 0.417 1.000 -ATOM 378 H2 TIP3 575 -17.053 -10.209 -17.383 0.417 1.000 -ATOM 379 OH2 TIP3 576 -17.418 7.635 2.063 -0.834 1.520 -ATOM 380 H1 TIP3 576 -18.174 7.334 2.610 0.417 1.000 -ATOM 381 H2 TIP3 576 -17.859 7.873 1.227 0.417 1.000 -ATOM 382 OH2 TIP3 578 -17.381 8.047 17.820 -0.834 1.520 -ATOM 383 H1 TIP3 578 -17.531 8.994 17.611 0.417 1.000 -ATOM 384 H2 TIP3 578 -18.029 7.756 18.500 0.417 1.000 -ATOM 385 OH2 TIP3 579 -11.877 -12.110 14.105 -0.834 1.520 -ATOM 386 H1 TIP3 579 -11.717 -12.461 15.039 0.417 1.000 -ATOM 387 H2 TIP3 579 -11.271 -11.366 14.000 0.417 1.000 -ATOM 388 OH2 TIP3 580 -6.615 -10.231 9.453 -0.834 1.520 -ATOM 389 H1 TIP3 580 -6.144 -9.609 10.062 0.417 1.000 -ATOM 390 H2 TIP3 580 -7.401 -10.487 9.965 0.417 1.000 -ATOM 391 OH2 TIP3 584 -19.177 3.668 -17.112 -0.834 1.520 -ATOM 392 H1 TIP3 584 -18.364 3.316 -16.660 0.417 1.000 -ATOM 393 H2 TIP3 584 -19.747 3.978 -16.360 0.417 1.000 -ATOM 394 OH2 TIP3 591 -17.917 8.332 -12.674 -0.834 1.520 -ATOM 395 H1 TIP3 591 -18.442 8.514 -11.885 0.417 1.000 -ATOM 396 H2 TIP3 591 -18.504 7.737 -13.189 0.417 1.000 -ATOM 397 OH2 TIP3 592 -6.780 4.494 -6.908 -0.834 1.520 -ATOM 398 H1 TIP3 592 -7.109 5.383 -6.713 0.417 1.000 -ATOM 399 H2 TIP3 592 -6.944 3.918 -6.147 0.417 1.000 -ATOM 400 OH2 TIP3 593 -19.005 8.021 -9.985 -0.834 1.520 -ATOM 401 H1 TIP3 593 -19.987 7.981 -9.957 0.417 1.000 -ATOM 402 H2 TIP3 593 -18.702 7.119 -9.737 0.417 1.000 -ATOM 403 OH2 TIP3 594 -17.290 -13.815 -12.460 -0.834 1.520 -ATOM 404 H1 TIP3 594 -17.533 -13.764 -13.439 0.417 1.000 -ATOM 405 H2 TIP3 594 -16.590 -13.145 -12.420 0.417 1.000 -ATOM 406 OH2 TIP3 595 -13.089 -0.542 -2.665 -0.834 1.520 -ATOM 407 H1 TIP3 595 -12.483 0.118 -3.043 0.417 1.000 -ATOM 408 H2 TIP3 595 -13.685 -0.864 -3.412 0.417 1.000 -ATOM 409 OH2 TIP3 598 -6.664 4.461 16.785 -0.834 1.520 -ATOM 410 H1 TIP3 598 -6.761 5.164 17.434 0.417 1.000 -ATOM 411 H2 TIP3 598 -6.307 3.713 17.244 0.417 1.000 -ATOM 412 OH2 TIP3 599 -17.166 -4.957 14.374 -0.834 1.520 -ATOM 413 H1 TIP3 599 -17.721 -5.193 15.123 0.417 1.000 -ATOM 414 H2 TIP3 599 -16.393 -5.451 14.503 0.417 1.000 -ATOM 415 OH2 TIP3 602 -14.821 0.890 7.387 -0.834 1.520 -ATOM 416 H1 TIP3 602 -15.382 1.606 7.646 0.417 1.000 -ATOM 417 H2 TIP3 602 -14.804 0.211 8.107 0.417 1.000 -ATOM 418 OH2 TIP3 611 -10.661 18.413 -1.977 -0.834 1.520 -ATOM 419 H1 TIP3 611 -10.709 17.725 -1.291 0.417 1.000 -ATOM 420 H2 TIP3 611 -9.895 18.114 -2.489 0.417 1.000 -ATOM 421 OH2 TIP3 612 -3.808 2.403 -16.218 -0.834 1.520 -ATOM 422 H1 TIP3 612 -3.637 2.881 -15.378 0.417 1.000 -ATOM 423 H2 TIP3 612 -3.573 3.065 -16.914 0.417 1.000 -ATOM 424 OH2 TIP3 613 -6.460 2.220 -17.252 -0.834 1.520 -ATOM 425 H1 TIP3 613 -7.035 2.475 -16.538 0.417 1.000 -ATOM 426 H2 TIP3 613 -5.572 2.404 -16.926 0.417 1.000 -ATOM 427 OH2 TIP3 615 -10.475 8.541 10.151 -0.834 1.520 -ATOM 428 H1 TIP3 615 -9.585 8.418 9.686 0.417 1.000 -ATOM 429 H2 TIP3 615 -10.803 7.671 10.239 0.417 1.000 -ATOM 430 OH2 TIP3 616 -16.995 13.969 -5.251 -0.834 1.520 -ATOM 431 H1 TIP3 616 -16.251 14.208 -5.841 0.417 1.000 -ATOM 432 H2 TIP3 616 -16.897 13.042 -5.075 0.417 1.000 -ATOM 433 OH2 TIP3 618 -11.611 -1.835 10.992 -0.834 1.520 -ATOM 434 H1 TIP3 618 -12.032 -2.230 10.210 0.417 1.000 -ATOM 435 H2 TIP3 618 -11.583 -2.549 11.641 0.417 1.000 -ATOM 436 OH2 TIP3 619 -14.803 17.740 0.512 -0.834 1.520 -ATOM 437 H1 TIP3 619 -14.483 18.488 0.028 0.417 1.000 -ATOM 438 H2 TIP3 619 -15.762 17.952 0.773 0.417 1.000 -ATOM 439 OH2 TIP3 624 -4.674 6.968 11.402 -0.834 1.520 -ATOM 440 H1 TIP3 624 -5.547 6.736 10.928 0.417 1.000 -ATOM 441 H2 TIP3 624 -4.932 7.620 12.033 0.417 1.000 -ATOM 442 OH2 TIP3 632 -11.819 3.465 -12.363 -0.834 1.520 -ATOM 443 H1 TIP3 632 -10.993 3.937 -12.297 0.417 1.000 -ATOM 444 H2 TIP3 632 -12.483 4.117 -12.688 0.417 1.000 -ATOM 445 OH2 TIP3 634 -9.071 -5.250 -14.282 -0.834 1.520 -ATOM 446 H1 TIP3 634 -9.950 -5.459 -14.592 0.417 1.000 -ATOM 447 H2 TIP3 634 -8.599 -6.121 -14.283 0.417 1.000 -ATOM 448 OH2 TIP3 635 -0.341 5.552 -2.551 -0.834 1.520 -ATOM 449 H1 TIP3 635 0.182 6.346 -2.501 0.417 1.000 -ATOM 450 H2 TIP3 635 -1.266 5.858 -2.619 0.417 1.000 -ATOM 451 OH2 TIP3 636 -13.016 14.157 3.048 -0.834 1.520 -ATOM 452 H1 TIP3 636 -13.782 14.085 2.457 0.417 1.000 -ATOM 453 H2 TIP3 636 -13.284 13.608 3.800 0.417 1.000 -ATOM 454 OH2 TIP3 637 -13.003 14.755 15.342 -0.834 1.520 -ATOM 455 H1 TIP3 637 -12.400 14.991 15.995 0.417 1.000 -ATOM 456 H2 TIP3 637 -13.065 13.804 15.464 0.417 1.000 -ATOM 457 OH2 TIP3 638 -17.914 5.452 -1.806 -0.834 1.520 -ATOM 458 H1 TIP3 638 -17.826 5.923 -2.606 0.417 1.000 -ATOM 459 H2 TIP3 638 -18.728 5.869 -1.396 0.417 1.000 -ATOM 460 OH2 TIP3 639 -18.317 5.667 6.332 -0.834 1.520 -ATOM 461 H1 TIP3 639 -17.420 5.907 6.426 0.417 1.000 -ATOM 462 H2 TIP3 639 -18.515 5.227 7.126 0.417 1.000 -ATOM 463 OH2 TIP3 640 3.331 1.619 -1.931 -0.834 1.520 -ATOM 464 H1 TIP3 640 3.137 2.516 -1.544 0.417 1.000 -ATOM 465 H2 TIP3 640 2.663 0.985 -1.550 0.417 1.000 -ATOM 466 OH2 TIP3 642 -18.246 14.617 14.408 -0.834 1.520 -ATOM 467 H1 TIP3 642 -18.209 14.662 15.420 0.417 1.000 -ATOM 468 H2 TIP3 642 -17.432 15.011 14.179 0.417 1.000 -ATOM 469 OH2 TIP3 643 -5.300 9.177 13.075 -0.834 1.520 -ATOM 470 H1 TIP3 643 -5.425 8.887 13.996 0.417 1.000 -ATOM 471 H2 TIP3 643 -6.231 9.183 12.748 0.417 1.000 -ATOM 472 OH2 TIP3 657 -10.914 17.628 -9.139 -0.834 1.520 -ATOM 473 H1 TIP3 657 -11.399 18.463 -9.333 0.417 1.000 -ATOM 474 H2 TIP3 657 -10.805 17.683 -8.136 0.417 1.000 -ATOM 475 OH2 TIP3 659 -3.493 -2.830 1.006 -0.834 1.520 -ATOM 476 H1 TIP3 659 -2.774 -2.994 0.295 0.417 1.000 -ATOM 477 H2 TIP3 659 -3.970 -3.703 1.082 0.417 1.000 -ATOM 478 OH2 TIP3 661 -8.069 16.535 12.386 -0.834 1.520 -ATOM 479 H1 TIP3 661 -8.561 16.173 13.148 0.417 1.000 -ATOM 480 H2 TIP3 661 -7.757 15.723 11.845 0.417 1.000 -ATOM 481 OH2 TIP3 662 -16.210 3.318 6.067 -0.834 1.520 -ATOM 482 H1 TIP3 662 -15.889 3.684 6.901 0.417 1.000 -ATOM 483 H2 TIP3 662 -17.165 3.196 6.248 0.417 1.000 -ATOM 484 OH2 TIP3 666 -18.375 10.100 16.358 -0.834 1.520 -ATOM 485 H1 TIP3 666 -18.272 10.712 15.618 0.417 1.000 -ATOM 486 H2 TIP3 666 -19.088 10.549 16.843 0.417 1.000 -ATOM 487 OH2 TIP3 674 -14.786 15.728 -18.104 -0.834 1.520 -ATOM 488 H1 TIP3 674 -14.253 15.733 -18.902 0.417 1.000 -ATOM 489 H2 TIP3 674 -15.411 16.462 -18.332 0.417 1.000 -ATOM 490 OH2 TIP3 676 1.955 12.145 -7.880 -0.834 1.520 -ATOM 491 H1 TIP3 676 2.028 12.757 -7.174 0.417 1.000 -ATOM 492 H2 TIP3 676 2.702 12.400 -8.501 0.417 1.000 -ATOM 493 OH2 TIP3 679 -12.514 9.742 11.971 -0.834 1.520 -ATOM 494 H1 TIP3 679 -11.884 9.155 11.492 0.417 1.000 -ATOM 495 H2 TIP3 679 -13.222 9.096 12.064 0.417 1.000 -ATOM 496 OH2 TIP3 682 -12.565 11.116 0.100 -0.834 1.520 -ATOM 497 H1 TIP3 682 -13.422 11.264 -0.334 0.417 1.000 -ATOM 498 H2 TIP3 682 -12.686 11.542 1.014 0.417 1.000 -ATOM 499 OH2 TIP3 684 -17.843 16.500 5.355 -0.834 1.520 -ATOM 500 H1 TIP3 684 -17.109 16.045 4.935 0.417 1.000 -ATOM 501 H2 TIP3 684 -17.597 17.436 5.199 0.417 1.000 -ATOM 502 OH2 TIP3 686 -10.854 18.558 18.491 -0.834 1.520 -ATOM 503 H1 TIP3 686 -10.109 17.964 18.496 0.417 1.000 -ATOM 504 H2 TIP3 686 -10.518 19.356 18.944 0.417 1.000 -ATOM 505 OH2 TIP3 699 -8.563 13.795 -0.051 -0.834 1.520 -ATOM 506 H1 TIP3 699 -9.108 13.629 -0.834 0.417 1.000 -ATOM 507 H2 TIP3 699 -9.124 13.721 0.759 0.417 1.000 -ATOM 508 OH2 TIP3 700 -8.050 15.322 14.900 -0.834 1.520 -ATOM 509 H1 TIP3 700 -7.928 14.397 14.787 0.417 1.000 -ATOM 510 H2 TIP3 700 -7.182 15.651 15.219 0.417 1.000 -ATOM 511 OH2 TIP3 701 -13.200 17.116 2.652 -0.834 1.520 -ATOM 512 H1 TIP3 701 -13.097 16.138 2.827 0.417 1.000 -ATOM 513 H2 TIP3 701 -13.771 17.169 1.908 0.417 1.000 -ATOM 514 OH2 TIP3 703 -1.363 15.088 5.879 -0.834 1.520 -ATOM 515 H1 TIP3 703 -1.313 15.420 4.981 0.417 1.000 -ATOM 516 H2 TIP3 703 -1.991 15.716 6.359 0.417 1.000 -ATOM 517 OH2 TIP3 707 -13.869 15.299 19.590 -0.834 1.520 -ATOM 518 H1 TIP3 707 -14.501 15.415 18.908 0.417 1.000 -ATOM 519 H2 TIP3 707 -13.638 14.387 19.519 0.417 1.000 -ATOM 520 OH2 TIP3 708 -3.990 17.713 11.203 -0.834 1.520 -ATOM 521 H1 TIP3 708 -3.036 17.525 10.948 0.417 1.000 -ATOM 522 H2 TIP3 708 -4.293 18.267 10.432 0.417 1.000 -ATOM 523 OH2 TIP3 710 -13.960 16.974 14.283 -0.834 1.520 -ATOM 524 H1 TIP3 710 -13.562 17.353 15.061 0.417 1.000 -ATOM 525 H2 TIP3 710 -13.197 16.869 13.683 0.417 1.000 -ATOM 526 OH2 TIP3 721 -16.049 12.492 0.099 -0.834 1.520 -ATOM 527 H1 TIP3 721 -16.045 11.770 -0.607 0.417 1.000 -ATOM 528 H2 TIP3 721 -16.883 12.282 0.546 0.417 1.000 -ATOM 529 OH2 TIP3 737 -13.666 12.822 10.600 -0.834 1.520 -ATOM 530 H1 TIP3 737 -12.807 12.842 11.097 0.417 1.000 -ATOM 531 H2 TIP3 737 -13.370 12.523 9.704 0.417 1.000 -ATOM 532 OH2 TIP3 738 -15.938 13.760 -14.358 -0.834 1.520 -ATOM 533 H1 TIP3 738 -16.316 14.308 -13.637 0.417 1.000 -ATOM 534 H2 TIP3 738 -16.706 13.253 -14.618 0.417 1.000 -ATOM 535 OH2 TIP3 741 -8.387 14.832 -4.054 -0.834 1.520 -ATOM 536 H1 TIP3 741 -8.331 13.875 -3.795 0.417 1.000 -ATOM 537 H2 TIP3 741 -9.152 15.107 -3.614 0.417 1.000 -ATOM 538 OH2 TIP3 747 -0.600 19.416 11.031 -0.834 1.520 -ATOM 539 H1 TIP3 747 -0.618 18.448 11.348 0.417 1.000 -ATOM 540 H2 TIP3 747 -0.105 19.358 10.220 0.417 1.000 -ATOM 541 OH2 TIP3 759 -13.397 17.068 -6.343 -0.834 1.520 -ATOM 542 H1 TIP3 759 -13.152 16.670 -5.550 0.417 1.000 -ATOM 543 H2 TIP3 759 -13.286 18.036 -6.135 0.417 1.000 -ATOM 544 OH2 TIP3 778 -18.235 19.532 -12.241 -0.834 1.520 -ATOM 545 H1 TIP3 778 -19.239 19.599 -12.280 0.417 1.000 -ATOM 546 H2 TIP3 778 -18.064 18.964 -11.458 0.417 1.000 -ATOM 547 OH2 TIP3 787 0.759 17.628 5.956 -0.834 1.520 -ATOM 548 H1 TIP3 787 0.104 17.147 5.343 0.417 1.000 -ATOM 549 H2 TIP3 787 1.278 18.219 5.409 0.417 1.000 -ATOM 550 OH2 TIP3 822 -19.253 -15.531 -9.421 -0.834 1.520 -ATOM 551 H1 TIP3 822 -19.574 -16.432 -9.661 0.417 1.000 -ATOM 552 H2 TIP3 822 -18.495 -15.415 -10.010 0.417 1.000 -ATOM 553 OH2 TIP3 849 -14.644 -14.612 -3.954 -0.834 1.520 -ATOM 554 H1 TIP3 849 -14.116 -13.936 -3.539 0.417 1.000 -ATOM 555 H2 TIP3 849 -14.408 -15.378 -3.463 0.417 1.000 -ATOM 556 OH2 TIP3 852 -18.111 -14.415 9.541 -0.834 1.520 -ATOM 557 H1 TIP3 852 -18.062 -13.498 9.263 0.417 1.000 -ATOM 558 H2 TIP3 852 -18.985 -14.688 9.145 0.417 1.000 -ATOM 559 OH2 TIP3 867 -9.296 -13.279 -4.117 -0.834 1.520 -ATOM 560 H1 TIP3 867 -9.099 -13.088 -3.164 0.417 1.000 -ATOM 561 H2 TIP3 867 -9.873 -14.028 -4.002 0.417 1.000 -ATOM 562 OH2 TIP3 887 6.897 -7.906 -19.321 -0.834 1.520 -ATOM 563 H1 TIP3 887 6.514 -8.720 -19.696 0.417 1.000 -ATOM 564 H2 TIP3 887 7.875 -8.073 -19.447 0.417 1.000 -ATOM 565 OH2 TIP3 889 -17.811 -18.294 4.878 -0.834 1.520 -ATOM 566 H1 TIP3 889 -18.536 -18.909 4.710 0.417 1.000 -ATOM 567 H2 TIP3 889 -17.875 -18.195 5.900 0.417 1.000 -ATOM 568 OH2 TIP3 891 -8.237 -0.386 -10.042 -0.834 1.520 -ATOM 569 H1 TIP3 891 -7.721 0.405 -10.134 0.417 1.000 -ATOM 570 H2 TIP3 891 -7.565 -1.095 -10.099 0.417 1.000 -ATOM 571 OH2 TIP3 894 -12.136 -9.397 8.950 -0.834 1.520 -ATOM 572 H1 TIP3 894 -12.531 -8.725 9.507 0.417 1.000 -ATOM 573 H2 TIP3 894 -12.846 -10.008 8.783 0.417 1.000 -ATOM 574 OH2 TIP3 895 -15.353 -13.368 17.534 -0.834 1.520 -ATOM 575 H1 TIP3 895 -16.158 -13.824 17.198 0.417 1.000 -ATOM 576 H2 TIP3 895 -15.370 -12.514 17.090 0.417 1.000 -ATOM 577 OH2 TIP3 897 -9.107 -11.584 10.315 -0.834 1.520 -ATOM 578 H1 TIP3 897 -9.261 -12.213 9.538 0.417 1.000 -ATOM 579 H2 TIP3 897 -9.639 -12.029 10.974 0.417 1.000 -ATOM 580 OH2 TIP3 906 -12.973 -17.776 -6.589 -0.834 1.520 -ATOM 581 H1 TIP3 906 -13.815 -17.199 -6.465 0.417 1.000 -ATOM 582 H2 TIP3 906 -13.308 -18.597 -6.258 0.417 1.000 -ATOM 583 OH2 TIP3 907 -2.188 -14.229 -14.124 -0.834 1.520 -ATOM 584 H1 TIP3 907 -2.780 -13.684 -14.620 0.417 1.000 -ATOM 585 H2 TIP3 907 -2.449 -15.131 -14.331 0.417 1.000 -ATOM 586 OH2 TIP3 908 -15.972 -12.301 -7.224 -0.834 1.520 -ATOM 587 H1 TIP3 908 -15.423 -12.807 -7.862 0.417 1.000 -ATOM 588 H2 TIP3 908 -16.829 -12.680 -7.456 0.417 1.000 -ATOM 589 OH2 TIP3 911 -8.951 -10.120 6.882 -0.834 1.520 -ATOM 590 H1 TIP3 911 -8.605 -10.519 7.655 0.417 1.000 -ATOM 591 H2 TIP3 911 -8.095 -9.905 6.383 0.417 1.000 -ATOM 592 OH2 TIP3 912 2.133 -17.114 -0.157 -0.834 1.520 -ATOM 593 H1 TIP3 912 2.929 -17.404 0.262 0.417 1.000 -ATOM 594 H2 TIP3 912 1.486 -17.172 0.561 0.417 1.000 -ATOM 595 OH2 TIP3 916 0.975 -12.700 10.576 -0.834 1.520 -ATOM 596 H1 TIP3 916 1.781 -13.270 10.419 0.417 1.000 -ATOM 597 H2 TIP3 916 1.289 -12.181 11.305 0.417 1.000 -ATOM 598 OH2 TIP3 924 -7.507 -10.549 -17.785 -0.834 1.520 -ATOM 599 H1 TIP3 924 -7.092 -10.160 -17.013 0.417 1.000 -ATOM 600 H2 TIP3 924 -7.018 -11.359 -17.961 0.417 1.000 -ATOM 601 OH2 TIP3 927 -8.823 -10.390 -12.072 -0.834 1.520 -ATOM 602 H1 TIP3 927 -9.557 -9.828 -11.947 0.417 1.000 -ATOM 603 H2 TIP3 927 -9.134 -11.212 -11.702 0.417 1.000 -ATOM 604 OH2 TIP3 928 -18.162 -16.794 -4.602 -0.834 1.520 -ATOM 605 H1 TIP3 928 -17.799 -15.919 -4.455 0.417 1.000 -ATOM 606 H2 TIP3 928 -17.883 -17.001 -5.578 0.417 1.000 -ATOM 607 OH2 TIP3 929 -3.867 -7.407 -3.092 -0.834 1.520 -ATOM 608 H1 TIP3 929 -4.648 -7.231 -3.609 0.417 1.000 -ATOM 609 H2 TIP3 929 -4.113 -8.124 -2.489 0.417 1.000 -ATOM 610 OH2 TIP3 930 -18.101 -8.376 -2.107 -0.834 1.520 -ATOM 611 H1 TIP3 930 -18.861 -8.322 -2.695 0.417 1.000 -ATOM 612 H2 TIP3 930 -17.742 -7.465 -2.145 0.417 1.000 -ATOM 613 OH2 TIP3 932 -10.780 -6.096 -2.660 -0.834 1.520 -ATOM 614 H1 TIP3 932 -9.938 -5.802 -2.262 0.417 1.000 -ATOM 615 H2 TIP3 932 -10.606 -7.001 -2.898 0.417 1.000 -ATOM 616 OH2 TIP3 933 -16.542 -10.132 2.419 -0.834 1.520 -ATOM 617 H1 TIP3 933 -15.602 -9.984 2.654 0.417 1.000 -ATOM 618 H2 TIP3 933 -16.552 -9.811 1.495 0.417 1.000 -ATOM 619 OH2 TIP3 936 -17.076 -15.857 6.959 -0.834 1.520 -ATOM 620 H1 TIP3 936 -16.442 -15.454 6.376 0.417 1.000 -ATOM 621 H2 TIP3 936 -17.335 -15.170 7.592 0.417 1.000 -ATOM 622 OH2 TIP3 940 -19.250 -17.062 13.461 -0.834 1.520 -ATOM 623 H1 TIP3 940 -19.256 -17.491 14.315 0.417 1.000 -ATOM 624 H2 TIP3 940 -19.609 -16.191 13.743 0.417 1.000 -ATOM 625 OH2 TIP3 941 -9.333 -7.566 15.503 -0.834 1.520 -ATOM 626 H1 TIP3 941 -10.126 -7.052 15.227 0.417 1.000 -ATOM 627 H2 TIP3 941 -9.061 -7.055 16.214 0.417 1.000 -ATOM 628 OH2 TIP3 942 -1.559 -3.866 -16.160 -0.834 1.520 -ATOM 629 H1 TIP3 942 -1.390 -3.512 -17.032 0.417 1.000 -ATOM 630 H2 TIP3 942 -0.887 -4.593 -16.039 0.417 1.000 -ATOM 631 OH2 TIP3 947 -4.570 -16.726 -12.593 -0.834 1.520 -ATOM 632 H1 TIP3 947 -4.542 -17.259 -11.843 0.417 1.000 -ATOM 633 H2 TIP3 947 -4.067 -17.260 -13.230 0.417 1.000 -ATOM 634 OH2 TIP3 948 -6.866 -15.465 -13.441 -0.834 1.520 -ATOM 635 H1 TIP3 948 -7.566 -16.068 -13.062 0.417 1.000 -ATOM 636 H2 TIP3 948 -6.041 -15.838 -13.035 0.417 1.000 -ATOM 637 OH2 TIP3 949 -14.292 -15.574 4.418 -0.834 1.520 -ATOM 638 H1 TIP3 949 -13.998 -15.297 5.300 0.417 1.000 -ATOM 639 H2 TIP3 949 -14.843 -14.832 4.144 0.417 1.000 -ATOM 640 OH2 TIP3 950 -3.679 -0.505 -4.130 -0.834 1.520 -ATOM 641 H1 TIP3 950 -3.040 -0.841 -4.808 0.417 1.000 -ATOM 642 H2 TIP3 950 -3.146 0.132 -3.612 0.417 1.000 -ATOM 643 OH2 TIP3 951 -9.705 -5.934 -5.680 -0.834 1.520 -ATOM 644 H1 TIP3 951 -9.408 -5.933 -4.774 0.417 1.000 -ATOM 645 H2 TIP3 951 -10.678 -5.774 -5.650 0.417 1.000 -ATOM 646 OH2 TIP3 952 -3.992 -2.203 -8.590 -0.834 1.520 -ATOM 647 H1 TIP3 952 -3.305 -2.298 -9.316 0.417 1.000 -ATOM 648 H2 TIP3 952 -4.814 -2.479 -9.058 0.417 1.000 -ATOM 649 OH2 TIP3 953 -4.602 -18.448 -1.754 -0.834 1.520 -ATOM 650 H1 TIP3 953 -3.984 -18.049 -2.434 0.417 1.000 -ATOM 651 H2 TIP3 953 -5.426 -17.989 -1.891 0.417 1.000 -ATOM 652 OH2 TIP3 964 -12.170 -0.249 -18.005 -0.834 1.520 -ATOM 653 H1 TIP3 964 -12.743 -0.130 -18.753 0.417 1.000 -ATOM 654 H2 TIP3 964 -11.671 -1.077 -18.115 0.417 1.000 -ATOM 655 OH2 TIP3 970 -6.337 6.432 -13.471 -0.834 1.520 -ATOM 656 H1 TIP3 970 -6.149 6.261 -12.518 0.417 1.000 -ATOM 657 H2 TIP3 970 -6.645 7.375 -13.468 0.417 1.000 -ATOM 658 OH2 TIP3 972 -4.973 -8.751 -10.194 -0.834 1.520 -ATOM 659 H1 TIP3 972 -4.364 -9.047 -10.896 0.417 1.000 -ATOM 660 H2 TIP3 972 -5.071 -7.806 -10.455 0.417 1.000 -ATOM 661 OH2 TIP3 973 -0.470 -0.187 4.413 -0.834 1.520 -ATOM 662 H1 TIP3 973 0.399 0.251 4.331 0.417 1.000 -ATOM 663 H2 TIP3 973 -0.245 -1.124 4.418 0.417 1.000 -ATOM 664 OH2 TIP3 974 -9.726 -8.552 0.959 -0.834 1.520 -ATOM 665 H1 TIP3 974 -9.107 -8.927 1.654 0.417 1.000 -ATOM 666 H2 TIP3 974 -9.656 -9.109 0.238 0.417 1.000 -ATOM 667 OH2 TIP3 975 -8.527 -13.925 1.702 -0.834 1.520 -ATOM 668 H1 TIP3 975 -7.954 -14.333 2.431 0.417 1.000 -ATOM 669 H2 TIP3 975 -9.446 -14.061 2.100 0.417 1.000 -ATOM 670 OH2 TIP3 977 -11.682 -4.716 5.150 -0.834 1.520 -ATOM 671 H1 TIP3 977 -11.010 -4.921 5.736 0.417 1.000 -ATOM 672 H2 TIP3 977 -11.264 -4.047 4.564 0.417 1.000 -ATOM 673 OH2 TIP3 985 10.868 8.734 -17.269 -0.834 1.520 -ATOM 674 H1 TIP3 985 10.991 9.422 -17.981 0.417 1.000 -ATOM 675 H2 TIP3 985 11.515 8.043 -17.516 0.417 1.000 -ATOM 676 OH2 TIP3 988 -6.088 6.462 -17.714 -0.834 1.520 -ATOM 677 H1 TIP3 988 -6.333 7.388 -17.461 0.417 1.000 -ATOM 678 H2 TIP3 988 -6.512 5.916 -17.000 0.417 1.000 -ATOM 679 OH2 TIP3 989 -8.835 12.860 -18.664 -0.834 1.520 -ATOM 680 H1 TIP3 989 -8.617 12.035 -19.026 0.417 1.000 -ATOM 681 H2 TIP3 989 -9.094 12.669 -17.759 0.417 1.000 -ATOM 682 OH2 TIP3 990 4.449 16.400 -12.116 -0.834 1.520 -ATOM 683 H1 TIP3 990 5.434 16.551 -12.143 0.417 1.000 -ATOM 684 H2 TIP3 990 4.142 16.332 -13.058 0.417 1.000 -ATOM 685 OH2 TIP3 991 -5.665 14.997 -4.341 -0.834 1.520 -ATOM 686 H1 TIP3 991 -6.636 14.868 -4.261 0.417 1.000 -ATOM 687 H2 TIP3 991 -5.590 15.230 -5.279 0.417 1.000 -ATOM 688 OH2 TIP3 992 1.008 -16.730 -4.827 -0.834 1.520 -ATOM 689 H1 TIP3 992 0.390 -15.964 -4.916 0.417 1.000 -ATOM 690 H2 TIP3 992 1.768 -16.408 -5.251 0.417 1.000 -ATOM 691 OH2 TIP3 994 -2.690 -7.275 10.317 -0.834 1.520 -ATOM 692 H1 TIP3 994 -3.519 -6.839 10.591 0.417 1.000 -ATOM 693 H2 TIP3 994 -2.943 -8.144 9.939 0.417 1.000 -ATOM 694 OH2 TIP3 995 -13.200 -3.341 -2.816 -0.834 1.520 -ATOM 695 H1 TIP3 995 -12.857 -3.351 -3.673 0.417 1.000 -ATOM 696 H2 TIP3 995 -12.891 -2.498 -2.432 0.417 1.000 -ATOM 697 OH2 TIP3 996 -14.220 -2.484 4.024 -0.834 1.520 -ATOM 698 H1 TIP3 996 -14.894 -2.674 3.341 0.417 1.000 -ATOM 699 H2 TIP3 996 -14.250 -1.515 4.094 0.417 1.000 -ATOM 700 OH2 TIP3 998 4.714 1.300 8.954 -0.834 1.520 -ATOM 701 H1 TIP3 998 4.446 1.591 8.048 0.417 1.000 -ATOM 702 H2 TIP3 998 5.209 2.035 9.317 0.417 1.000 -ATOM 703 OH2 TIP3 1007 -5.397 -1.890 -16.787 -0.834 1.520 -ATOM 704 H1 TIP3 1007 -5.725 -2.345 -16.037 0.417 1.000 -ATOM 705 H2 TIP3 1007 -6.158 -1.394 -17.122 0.417 1.000 -ATOM 706 OH2 TIP3 1011 -15.247 0.139 -14.525 -0.834 1.520 -ATOM 707 H1 TIP3 1011 -15.231 1.053 -14.154 0.417 1.000 -ATOM 708 H2 TIP3 1011 -14.337 0.031 -14.799 0.417 1.000 -ATOM 709 OH2 TIP3 1012 -10.750 2.403 8.404 -0.834 1.520 -ATOM 710 H1 TIP3 1012 -11.576 2.852 8.305 0.417 1.000 -ATOM 711 H2 TIP3 1012 -10.857 1.926 9.253 0.417 1.000 -ATOM 712 OH2 TIP3 1013 -18.385 -2.645 -5.645 -0.834 1.520 -ATOM 713 H1 TIP3 1013 -18.775 -3.520 -5.580 0.417 1.000 -ATOM 714 H2 TIP3 1013 -19.141 -2.016 -5.949 0.417 1.000 -ATOM 715 OH2 TIP3 1014 -8.913 -4.213 0.150 -0.834 1.520 -ATOM 716 H1 TIP3 1014 -8.779 -5.123 -0.302 0.417 1.000 -ATOM 717 H2 TIP3 1014 -8.064 -4.060 0.591 0.417 1.000 -ATOM 718 OH2 TIP3 1015 2.578 3.665 3.229 -0.834 1.520 -ATOM 719 H1 TIP3 1015 3.396 3.499 2.734 0.417 1.000 -ATOM 720 H2 TIP3 1015 1.920 3.775 2.561 0.417 1.000 -ATOM 721 OH2 TIP3 1017 -10.216 -1.940 -3.561 -0.834 1.520 -ATOM 722 H1 TIP3 1017 -9.424 -1.834 -4.078 0.417 1.000 -ATOM 723 H2 TIP3 1017 -10.059 -1.416 -2.766 0.417 1.000 -ATOM 724 OH2 TIP3 1018 -17.631 -0.380 -9.162 -0.834 1.520 -ATOM 725 H1 TIP3 1018 -17.949 -0.575 -8.299 0.417 1.000 -ATOM 726 H2 TIP3 1018 -16.653 -0.283 -9.077 0.417 1.000 -ATOM 727 OH2 TIP3 1020 -7.801 -8.646 11.965 -0.834 1.520 -ATOM 728 H1 TIP3 1020 -7.720 -7.730 12.149 0.417 1.000 -ATOM 729 H2 TIP3 1020 -8.615 -8.646 11.486 0.417 1.000 -ATOM 730 OH2 TIP3 1023 -13.013 5.343 12.803 -0.834 1.520 -ATOM 731 H1 TIP3 1023 -13.938 5.093 13.100 0.417 1.000 -ATOM 732 H2 TIP3 1023 -12.532 4.995 13.508 0.417 1.000 -ATOM 733 OH2 TIP3 1027 -4.842 -4.782 -18.547 -0.834 1.520 -ATOM 734 H1 TIP3 1027 -4.714 -3.877 -18.840 0.417 1.000 -ATOM 735 H2 TIP3 1027 -5.825 -4.781 -18.413 0.417 1.000 -ATOM 736 OH2 TIP3 1032 -12.071 -10.399 -15.678 -0.834 1.520 -ATOM 737 H1 TIP3 1032 -12.636 -9.660 -16.088 0.417 1.000 -ATOM 738 H2 TIP3 1032 -12.682 -10.989 -15.180 0.417 1.000 -ATOM 739 OH2 TIP3 1033 -9.791 6.935 -18.027 -0.834 1.520 -ATOM 740 H1 TIP3 1033 -10.603 7.288 -18.480 0.417 1.000 -ATOM 741 H2 TIP3 1033 -9.477 7.672 -17.376 0.417 1.000 -ATOM 742 OH2 TIP3 1039 -10.941 13.382 11.598 -0.834 1.520 -ATOM 743 H1 TIP3 1039 -10.702 12.548 11.121 0.417 1.000 -ATOM 744 H2 TIP3 1039 -10.814 13.114 12.523 0.417 1.000 -ATOM 745 OH2 TIP3 1040 -12.875 6.008 -3.795 -0.834 1.520 -ATOM 746 H1 TIP3 1040 -12.695 6.912 -4.006 0.417 1.000 -ATOM 747 H2 TIP3 1040 -13.715 5.889 -4.266 0.417 1.000 -ATOM 748 OH2 TIP3 1053 -8.415 3.121 -0.545 -0.834 1.520 -ATOM 749 H1 TIP3 1053 -7.587 3.205 -0.018 0.417 1.000 -ATOM 750 H2 TIP3 1053 -9.184 3.266 0.095 0.417 1.000 -ATOM 751 OH2 TIP3 1054 1.033 7.960 -2.407 -0.834 1.520 -ATOM 752 H1 TIP3 1054 1.033 8.956 -2.379 0.417 1.000 -ATOM 753 H2 TIP3 1054 1.925 7.777 -2.825 0.417 1.000 -ATOM 754 OH2 TIP3 1055 -11.543 11.011 -19.140 -0.834 1.520 -ATOM 755 H1 TIP3 1055 -11.756 11.664 -18.486 0.417 1.000 -ATOM 756 H2 TIP3 1055 -12.191 10.305 -18.933 0.417 1.000 -ATOM 757 OH2 TIP3 1056 -0.599 16.861 3.848 -0.834 1.520 -ATOM 758 H1 TIP3 1056 -0.612 17.833 3.651 0.417 1.000 -ATOM 759 H2 TIP3 1056 -1.025 16.454 3.026 0.417 1.000 -ATOM 760 OH2 TIP3 1057 -10.077 18.910 2.513 -0.834 1.520 -ATOM 761 H1 TIP3 1057 -10.245 18.506 3.457 0.417 1.000 -ATOM 762 H2 TIP3 1057 -10.853 18.717 1.948 0.417 1.000 -ATOM 763 OH2 TIP3 1058 -13.751 7.735 -6.332 -0.834 1.520 -ATOM 764 H1 TIP3 1058 -13.537 8.358 -7.002 0.417 1.000 -ATOM 765 H2 TIP3 1058 -12.910 7.243 -6.152 0.417 1.000 -ATOM 766 OH2 TIP3 1059 -6.245 5.794 -10.480 -0.834 1.520 -ATOM 767 H1 TIP3 1059 -7.174 5.669 -10.233 0.417 1.000 -ATOM 768 H2 TIP3 1059 -5.852 5.751 -9.626 0.417 1.000 -ATOM 769 OH2 TIP3 1060 -8.580 0.031 14.330 -0.834 1.520 -ATOM 770 H1 TIP3 1060 -9.257 0.735 14.495 0.417 1.000 -ATOM 771 H2 TIP3 1060 -8.817 -0.665 14.947 0.417 1.000 -ATOM 772 OH2 TIP3 1061 -16.604 -0.006 16.503 -0.834 1.520 -ATOM 773 H1 TIP3 1061 -16.646 -0.905 16.141 0.417 1.000 -ATOM 774 H2 TIP3 1061 -16.475 0.554 15.622 0.417 1.000 -ATOM 775 OH2 TIP3 1062 -4.502 6.311 17.716 -0.834 1.520 -ATOM 776 H1 TIP3 1062 -4.891 7.146 17.683 0.417 1.000 -ATOM 777 H2 TIP3 1062 -4.551 5.975 16.834 0.417 1.000 -ATOM 778 OH2 TIP3 1063 -6.374 10.844 16.012 -0.834 1.520 -ATOM 779 H1 TIP3 1063 -7.039 10.601 16.641 0.417 1.000 -ATOM 780 H2 TIP3 1063 -5.591 10.739 16.544 0.417 1.000 -ATOM 781 OH2 TIP3 1065 -3.665 18.240 18.854 -0.834 1.520 -ATOM 782 H1 TIP3 1065 -3.807 17.407 19.375 0.417 1.000 -ATOM 783 H2 TIP3 1065 -4.496 18.528 18.513 0.417 1.000 -ATOM 784 OH2 TIP3 1066 -16.259 13.268 11.520 -0.834 1.520 -ATOM 785 H1 TIP3 1066 -15.303 13.107 11.390 0.417 1.000 -ATOM 786 H2 TIP3 1066 -16.330 13.920 12.193 0.417 1.000 -ATOM 787 OH2 TIP3 1076 -17.480 10.670 -13.743 -0.834 1.520 -ATOM 788 H1 TIP3 1076 -17.328 9.751 -13.563 0.417 1.000 -ATOM 789 H2 TIP3 1076 -17.584 11.150 -12.855 0.417 1.000 -ATOM 790 OH2 TIP3 1079 3.653 5.472 10.275 -0.834 1.520 -ATOM 791 H1 TIP3 1079 2.816 5.942 10.562 0.417 1.000 -ATOM 792 H2 TIP3 1079 3.255 4.843 9.700 0.417 1.000 -ATOM 793 OH2 TIP3 1080 -14.020 7.548 3.471 -0.834 1.520 -ATOM 794 H1 TIP3 1080 -13.723 8.300 3.032 0.417 1.000 -ATOM 795 H2 TIP3 1080 -14.003 7.744 4.375 0.417 1.000 -ATOM 796 OH2 TIP3 1081 -12.309 14.925 7.136 -0.834 1.520 -ATOM 797 H1 TIP3 1081 -11.552 14.853 6.499 0.417 1.000 -ATOM 798 H2 TIP3 1081 -11.810 15.003 7.987 0.417 1.000 -ATOM 799 OH2 TIP3 1082 -0.176 3.862 17.888 -0.834 1.520 -ATOM 800 H1 TIP3 1082 0.398 3.217 17.384 0.417 1.000 -ATOM 801 H2 TIP3 1082 0.523 4.255 18.430 0.417 1.000 -ATOM 802 OH2 TIP3 1096 -0.168 9.792 -14.480 -0.834 1.520 -ATOM 803 H1 TIP3 1096 0.273 10.362 -13.807 0.417 1.000 -ATOM 804 H2 TIP3 1096 -0.633 9.183 -13.951 0.417 1.000 -ATOM 805 OH2 TIP3 1097 -10.265 12.833 14.356 -0.834 1.520 -ATOM 806 H1 TIP3 1097 -9.333 12.961 14.414 0.417 1.000 -ATOM 807 H2 TIP3 1097 -10.520 12.294 15.174 0.417 1.000 -ATOM 808 OH2 TIP3 1098 -16.741 9.755 -9.522 -0.834 1.520 -ATOM 809 H1 TIP3 1098 -16.623 10.314 -10.277 0.417 1.000 -ATOM 810 H2 TIP3 1098 -17.502 9.224 -9.857 0.417 1.000 -ATOM 811 OH2 TIP3 1099 -7.151 15.375 6.653 -0.834 1.520 -ATOM 812 H1 TIP3 1099 -6.424 14.867 6.350 0.417 1.000 -ATOM 813 H2 TIP3 1099 -7.757 14.708 7.004 0.417 1.000 -ATOM 814 OH2 TIP3 1100 -13.262 3.712 6.178 -0.834 1.520 -ATOM 815 H1 TIP3 1100 -12.917 4.220 5.441 0.417 1.000 -ATOM 816 H2 TIP3 1100 -14.093 3.381 5.843 0.417 1.000 -ATOM 817 OH2 TIP3 1101 -8.171 17.598 1.309 -0.834 1.520 -ATOM 818 H1 TIP3 1101 -8.803 17.629 2.074 0.417 1.000 -ATOM 819 H2 TIP3 1101 -8.386 18.399 0.840 0.417 1.000 -ATOM 820 OH2 TIP3 1104 -18.622 11.718 11.127 -0.834 1.520 -ATOM 821 H1 TIP3 1104 -17.850 12.172 11.554 0.417 1.000 -ATOM 822 H2 TIP3 1104 -18.943 11.061 11.774 0.417 1.000 -ATOM 823 OH2 TIP3 1105 -10.120 19.166 15.174 -0.834 1.520 -ATOM 824 H1 TIP3 1105 -10.720 18.846 15.891 0.417 1.000 -ATOM 825 H2 TIP3 1105 -9.266 19.097 15.577 0.417 1.000 -ATOM 826 OH2 TIP3 1107 -13.117 6.827 15.132 -0.834 1.520 -ATOM 827 H1 TIP3 1107 -13.335 6.501 14.198 0.417 1.000 -ATOM 828 H2 TIP3 1107 -13.990 6.720 15.589 0.417 1.000 -ATOM 829 OH2 TIP3 1112 -13.297 6.593 -15.152 -0.834 1.520 -ATOM 830 H1 TIP3 1112 -12.593 7.207 -15.239 0.417 1.000 -ATOM 831 H2 TIP3 1112 -13.284 6.068 -15.987 0.417 1.000 -ATOM 832 OH2 TIP3 1115 1.371 -2.115 -14.125 -0.834 1.520 -ATOM 833 H1 TIP3 1115 0.731 -2.810 -13.799 0.417 1.000 -ATOM 834 H2 TIP3 1115 2.157 -2.229 -13.621 0.417 1.000 -ATOM 835 OH2 TIP3 1117 1.052 -5.510 -15.708 -0.834 1.520 -ATOM 836 H1 TIP3 1117 0.664 -5.975 -14.991 0.417 1.000 -ATOM 837 H2 TIP3 1117 1.791 -4.994 -15.253 0.417 1.000 -ATOM 838 OH2 TIP3 1118 -8.935 8.816 4.528 -0.834 1.520 -ATOM 839 H1 TIP3 1118 -9.687 8.525 5.001 0.417 1.000 -ATOM 840 H2 TIP3 1118 -8.280 8.079 4.603 0.417 1.000 -ATOM 841 OH2 TIP3 1120 -11.893 9.357 5.179 -0.834 1.520 -ATOM 842 H1 TIP3 1120 -12.419 9.729 5.895 0.417 1.000 -ATOM 843 H2 TIP3 1120 -11.572 8.414 5.546 0.417 1.000 -ATOM 844 OH2 TIP3 1121 -8.926 17.222 7.267 -0.834 1.520 -ATOM 845 H1 TIP3 1121 -8.769 17.549 8.221 0.417 1.000 -ATOM 846 H2 TIP3 1121 -8.247 16.451 7.072 0.417 1.000 -ATOM 847 OH2 TIP3 1122 -18.269 11.479 1.005 -0.834 1.520 -ATOM 848 H1 TIP3 1122 -18.118 10.862 0.348 0.417 1.000 -ATOM 849 H2 TIP3 1122 -18.239 10.976 1.853 0.417 1.000 -ATOM 850 OH2 TIP3 1145 2.643 9.951 12.565 -0.834 1.520 -ATOM 851 H1 TIP3 1145 1.799 9.493 12.514 0.417 1.000 -ATOM 852 H2 TIP3 1145 3.225 9.166 12.828 0.417 1.000 -ATOM 853 OH2 TIP3 1147 -5.856 7.712 15.317 -0.834 1.520 -ATOM 854 H1 TIP3 1147 -6.487 7.643 16.062 0.417 1.000 -ATOM 855 H2 TIP3 1147 -6.061 7.011 14.727 0.417 1.000 -ATOM 856 OH2 TIP3 1148 -12.910 2.613 17.614 -0.834 1.520 -ATOM 857 H1 TIP3 1148 -13.894 2.435 17.632 0.417 1.000 -ATOM 858 H2 TIP3 1148 -12.600 1.991 18.307 0.417 1.000 -ATOM 859 OH2 TIP3 1158 -12.889 17.051 -3.520 -0.834 1.520 -ATOM 860 H1 TIP3 1158 -13.741 16.733 -3.249 0.417 1.000 -ATOM 861 H2 TIP3 1158 -12.803 17.960 -3.232 0.417 1.000 -ATOM 862 OH2 TIP3 1164 -4.220 1.074 14.906 -0.834 1.520 -ATOM 863 H1 TIP3 1164 -4.321 0.862 15.797 0.417 1.000 -ATOM 864 H2 TIP3 1164 -3.250 1.309 14.791 0.417 1.000 -ATOM 865 OH2 TIP3 1178 -11.767 18.772 -16.664 -0.834 1.520 -ATOM 866 H1 TIP3 1178 -11.201 18.275 -16.113 0.417 1.000 -ATOM 867 H2 TIP3 1178 -12.082 19.471 -16.044 0.417 1.000 -ATOM 868 OH2 TIP3 1182 -15.666 19.078 8.966 -0.834 1.520 -ATOM 869 H1 TIP3 1182 -14.895 19.164 8.467 0.417 1.000 -ATOM 870 H2 TIP3 1182 -16.080 18.301 8.580 0.417 1.000 -ATOM 871 OH2 TIP3 1183 -13.849 16.124 -8.843 -0.834 1.520 -ATOM 872 H1 TIP3 1183 -13.748 16.551 -7.967 0.417 1.000 -ATOM 873 H2 TIP3 1183 -13.363 16.696 -9.489 0.417 1.000 -ATOM 874 OH2 TIP3 1186 -14.056 10.005 17.555 -0.834 1.520 -ATOM 875 H1 TIP3 1186 -14.565 9.721 18.312 0.417 1.000 -ATOM 876 H2 TIP3 1186 -13.501 9.263 17.322 0.417 1.000 -ATOM 877 OH2 TIP3 1188 -10.497 19.714 8.657 -0.834 1.520 -ATOM 878 H1 TIP3 1188 -10.010 19.551 7.781 0.417 1.000 -ATOM 879 H2 TIP3 1188 -9.798 19.991 9.334 0.417 1.000 -ATOM 880 OH2 TIP3 1194 -15.074 18.691 17.583 -0.834 1.520 -ATOM 881 H1 TIP3 1194 -15.526 19.517 17.888 0.417 1.000 -ATOM 882 H2 TIP3 1194 -15.789 18.140 17.209 0.417 1.000 -ATOM 883 OH2 TIP3 1197 -8.107 13.506 -9.559 -0.834 1.520 -ATOM 884 H1 TIP3 1197 -8.901 13.627 -9.090 0.417 1.000 -ATOM 885 H2 TIP3 1197 -7.648 14.369 -9.549 0.417 1.000 -ATOM 886 OH2 TIP3 1200 -13.364 18.508 -10.693 -0.834 1.520 -ATOM 887 H1 TIP3 1200 -14.034 18.183 -11.177 0.417 1.000 -ATOM 888 H2 TIP3 1200 -13.662 19.353 -10.245 0.417 1.000 -ATOM 889 OH2 TIP3 1201 -14.659 9.958 -7.817 -0.834 1.520 -ATOM 890 H1 TIP3 1201 -15.489 9.806 -8.267 0.417 1.000 -ATOM 891 H2 TIP3 1201 -14.243 10.640 -8.384 0.417 1.000 -ATOM 892 OH2 TIP3 1202 -2.734 13.646 0.485 -0.834 1.520 -ATOM 893 H1 TIP3 1202 -2.323 12.967 1.063 0.417 1.000 -ATOM 894 H2 TIP3 1202 -2.479 14.453 0.986 0.417 1.000 -ATOM 895 OH2 TIP3 1272 -11.212 -16.706 4.627 -0.834 1.520 -ATOM 896 H1 TIP3 1272 -12.126 -16.430 4.750 0.417 1.000 -ATOM 897 H2 TIP3 1272 -10.829 -16.091 4.019 0.417 1.000 -ATOM 898 OH2 TIP3 1274 -12.561 -18.940 14.760 -0.834 1.520 -ATOM 899 H1 TIP3 1274 -12.143 -18.084 14.514 0.417 1.000 -ATOM 900 H2 TIP3 1274 -12.552 -19.454 13.976 0.417 1.000 -ATOM 901 OH2 TIP3 1298 -19.148 -15.823 17.753 -0.834 1.520 -ATOM 902 H1 TIP3 1298 -18.276 -16.222 17.993 0.417 1.000 -ATOM 903 H2 TIP3 1298 -19.768 -16.555 17.885 0.417 1.000 -ATOM 904 OH2 TIP3 1301 -16.680 -18.561 -16.307 -0.834 1.520 -ATOM 905 H1 TIP3 1301 -16.982 -18.737 -17.205 0.417 1.000 -ATOM 906 H2 TIP3 1301 -15.782 -18.263 -16.467 0.417 1.000 -ATOM 907 OH2 TIP3 1307 -3.904 -11.595 -9.372 -0.834 1.520 -ATOM 908 H1 TIP3 1307 -3.915 -10.610 -9.285 0.417 1.000 -ATOM 909 H2 TIP3 1307 -3.923 -11.652 -10.379 0.417 1.000 -ATOM 910 OH2 TIP3 1308 -11.622 2.836 -5.926 -0.834 1.520 -ATOM 911 H1 TIP3 1308 -10.873 3.085 -6.522 0.417 1.000 -ATOM 912 H2 TIP3 1308 -12.194 3.652 -5.888 0.417 1.000 -ATOM 913 OH2 TIP3 1309 4.434 -15.226 13.071 -0.834 1.520 -ATOM 914 H1 TIP3 1309 5.249 -15.245 12.565 0.417 1.000 -ATOM 915 H2 TIP3 1309 4.297 -16.185 13.213 0.417 1.000 -ATOM 916 OH2 TIP3 1311 -8.145 -15.478 9.839 -0.834 1.520 -ATOM 917 H1 TIP3 1311 -7.664 -16.276 9.523 0.417 1.000 -ATOM 918 H2 TIP3 1311 -8.668 -15.764 10.567 0.417 1.000 -ATOM 919 OH2 TIP3 1313 -9.574 -0.458 7.064 -0.834 1.520 -ATOM 920 H1 TIP3 1313 -10.532 -0.612 7.335 0.417 1.000 -ATOM 921 H2 TIP3 1313 -9.347 -1.197 6.429 0.417 1.000 -ATOM 922 OH2 TIP3 1326 -1.521 -16.911 -18.622 -0.834 1.520 -ATOM 923 H1 TIP3 1326 -2.464 -16.792 -18.426 0.417 1.000 -ATOM 924 H2 TIP3 1326 -1.398 -17.860 -18.803 0.417 1.000 -ATOM 925 OH2 TIP3 1327 -4.471 -14.018 -11.481 -0.834 1.520 -ATOM 926 H1 TIP3 1327 -3.602 -14.368 -11.188 0.417 1.000 -ATOM 927 H2 TIP3 1327 -4.777 -14.667 -12.133 0.417 1.000 -ATOM 928 OH2 TIP3 1328 -15.461 -17.395 -11.705 -0.834 1.520 -ATOM 929 H1 TIP3 1328 -14.540 -17.298 -11.877 0.417 1.000 -ATOM 930 H2 TIP3 1328 -15.566 -18.384 -11.637 0.417 1.000 -ATOM 931 OH2 TIP3 1329 0.028 -12.920 -10.978 -0.834 1.520 -ATOM 932 H1 TIP3 1329 0.675 -12.285 -10.918 0.417 1.000 -ATOM 933 H2 TIP3 1329 -0.615 -12.427 -11.473 0.417 1.000 -ATOM 934 OH2 TIP3 1330 2.010 -8.972 -1.553 -0.834 1.520 -ATOM 935 H1 TIP3 1330 2.719 -8.939 -2.299 0.417 1.000 -ATOM 936 H2 TIP3 1330 2.590 -8.860 -0.780 0.417 1.000 -ATOM 937 OH2 TIP3 1332 -5.323 -17.212 9.301 -0.834 1.520 -ATOM 938 H1 TIP3 1332 -5.340 -16.370 8.811 0.417 1.000 -ATOM 939 H2 TIP3 1332 -5.459 -17.798 8.553 0.417 1.000 -ATOM 940 OH2 TIP3 1333 -1.650 -13.022 -2.385 -0.834 1.520 -ATOM 941 H1 TIP3 1333 -1.585 -12.709 -3.298 0.417 1.000 -ATOM 942 H2 TIP3 1333 -2.602 -12.841 -2.216 0.417 1.000 -ATOM 943 OH2 TIP3 1344 -11.117 1.581 -14.240 -0.834 1.520 -ATOM 944 H1 TIP3 1344 -11.295 2.232 -13.554 0.417 1.000 -ATOM 945 H2 TIP3 1344 -10.643 2.008 -14.923 0.417 1.000 -ATOM 946 OH2 TIP3 1346 -0.601 -7.636 -18.020 -0.834 1.520 -ATOM 947 H1 TIP3 1346 -0.285 -8.501 -18.402 0.417 1.000 -ATOM 948 H2 TIP3 1346 -0.909 -7.941 -17.154 0.417 1.000 -ATOM 949 OH2 TIP3 1347 4.165 -13.181 -14.225 -0.834 1.520 -ATOM 950 H1 TIP3 1347 3.867 -13.390 -15.127 0.417 1.000 -ATOM 951 H2 TIP3 1347 3.362 -12.823 -13.749 0.417 1.000 -ATOM 952 OH2 TIP3 1349 -7.207 -6.636 -7.832 -0.834 1.520 -ATOM 953 H1 TIP3 1349 -7.213 -6.452 -8.777 0.417 1.000 -ATOM 954 H2 TIP3 1349 -8.005 -6.206 -7.601 0.417 1.000 -ATOM 955 OH2 TIP3 1352 -13.333 -12.453 -10.354 -0.834 1.520 -ATOM 956 H1 TIP3 1352 -13.897 -13.025 -9.704 0.417 1.000 -ATOM 957 H2 TIP3 1352 -12.442 -12.708 -9.954 0.417 1.000 -ATOM 958 OH2 TIP3 1354 -19.818 3.403 1.361 -0.834 1.520 -ATOM 959 H1 TIP3 1354 -19.699 3.585 2.346 0.417 1.000 -ATOM 960 H2 TIP3 1354 -18.999 2.867 1.220 0.417 1.000 -ATOM 961 OH2 TIP3 1355 -8.653 -3.993 3.148 -0.834 1.520 -ATOM 962 H1 TIP3 1355 -8.221 -4.874 3.087 0.417 1.000 -ATOM 963 H2 TIP3 1355 -9.414 -4.077 2.581 0.417 1.000 -ATOM 964 OH2 TIP3 1356 -14.219 -11.030 5.936 -0.834 1.520 -ATOM 965 H1 TIP3 1356 -13.821 -10.823 5.053 0.417 1.000 -ATOM 966 H2 TIP3 1356 -13.529 -11.567 6.363 0.417 1.000 -ATOM 967 OH2 TIP3 1361 -2.743 9.681 13.676 -0.834 1.520 -ATOM 968 H1 TIP3 1361 -2.802 10.631 13.366 0.417 1.000 -ATOM 969 H2 TIP3 1361 -3.648 9.417 13.384 0.417 1.000 -ATOM 970 OH2 TIP3 1367 -9.871 -2.515 -13.450 -0.834 1.520 -ATOM 971 H1 TIP3 1367 -10.769 -2.533 -13.080 0.417 1.000 -ATOM 972 H2 TIP3 1367 -9.892 -3.298 -14.015 0.417 1.000 -ATOM 973 OH2 TIP3 1368 2.412 -12.394 -7.335 -0.834 1.520 -ATOM 974 H1 TIP3 1368 1.852 -12.020 -6.612 0.417 1.000 -ATOM 975 H2 TIP3 1368 1.958 -13.231 -7.507 0.417 1.000 -ATOM 976 OH2 TIP3 1370 -15.346 -14.283 -14.977 -0.834 1.520 -ATOM 977 H1 TIP3 1370 -14.941 -14.874 -15.605 0.417 1.000 -ATOM 978 H2 TIP3 1370 -14.591 -14.215 -14.366 0.417 1.000 -ATOM 979 OH2 TIP3 1371 -7.664 -5.095 -10.650 -0.834 1.520 -ATOM 980 H1 TIP3 1371 -8.151 -4.412 -11.117 0.417 1.000 -ATOM 981 H2 TIP3 1371 -8.432 -5.625 -10.230 0.417 1.000 -ATOM 982 OH2 TIP3 1372 -14.813 -18.301 4.688 -0.834 1.520 -ATOM 983 H1 TIP3 1372 -14.504 -17.407 4.739 0.417 1.000 -ATOM 984 H2 TIP3 1372 -15.831 -18.127 4.767 0.417 1.000 -ATOM 985 OH2 TIP3 1374 -14.512 -5.745 -6.788 -0.834 1.520 -ATOM 986 H1 TIP3 1374 -13.721 -5.874 -6.291 0.417 1.000 -ATOM 987 H2 TIP3 1374 -15.136 -6.009 -6.122 0.417 1.000 -ATOM 988 OH2 TIP3 1376 -7.402 -6.842 3.181 -0.834 1.520 -ATOM 989 H1 TIP3 1376 -7.831 -6.794 4.069 0.417 1.000 -ATOM 990 H2 TIP3 1376 -6.484 -6.977 3.463 0.417 1.000 -ATOM 991 OH2 TIP3 1387 -16.314 -11.647 -16.599 -0.834 1.520 -ATOM 992 H1 TIP3 1387 -15.506 -12.070 -16.916 0.417 1.000 -ATOM 993 H2 TIP3 1387 -16.959 -12.273 -16.803 0.417 1.000 -ATOM 994 OH2 TIP3 1388 -4.995 -5.474 -0.867 -0.834 1.520 -ATOM 995 H1 TIP3 1388 -4.258 -6.059 -0.762 0.417 1.000 -ATOM 996 H2 TIP3 1388 -5.254 -5.547 -1.812 0.417 1.000 -ATOM 997 OH2 TIP3 1389 -4.573 -6.101 -6.582 -0.834 1.520 -ATOM 998 H1 TIP3 1389 -4.402 -5.297 -6.085 0.417 1.000 -ATOM 999 H2 TIP3 1389 -5.431 -5.968 -7.006 0.417 1.000 -ATOM 1000 OH2 TIP3 1392 -4.883 -3.658 -4.680 -0.834 1.520 -ATOM 1001 H1 TIP3 1392 -5.810 -3.342 -4.765 0.417 1.000 -ATOM 1002 H2 TIP3 1392 -4.275 -2.920 -5.050 0.417 1.000 -ATOM 1003 OH2 TIP3 1394 -6.035 -12.670 8.278 -0.834 1.520 -ATOM 1004 H1 TIP3 1394 -6.373 -11.798 8.654 0.417 1.000 -ATOM 1005 H2 TIP3 1394 -5.866 -13.292 9.029 0.417 1.000 -ATOM 1006 OH2 TIP3 1396 -11.536 0.926 10.643 -0.834 1.520 -ATOM 1007 H1 TIP3 1396 -11.281 1.313 11.498 0.417 1.000 -ATOM 1008 H2 TIP3 1396 -11.523 -0.038 10.810 0.417 1.000 -ATOM 1009 OH2 TIP3 1398 -4.372 -16.112 11.949 -0.834 1.520 -ATOM 1010 H1 TIP3 1398 -4.305 -16.597 11.167 0.417 1.000 -ATOM 1011 H2 TIP3 1398 -4.313 -16.773 12.622 0.417 1.000 -ATOM 1012 OH2 TIP3 1407 -6.737 3.513 -12.674 -0.834 1.520 -ATOM 1013 H1 TIP3 1407 -5.917 3.900 -12.311 0.417 1.000 -ATOM 1014 H2 TIP3 1407 -6.331 2.803 -13.261 0.417 1.000 -ATOM 1015 OH2 TIP3 1408 -15.711 5.675 -18.525 -0.834 1.520 -ATOM 1016 H1 TIP3 1408 -14.986 5.297 -18.091 0.417 1.000 -ATOM 1017 H2 TIP3 1408 -16.372 5.027 -18.487 0.417 1.000 -ATOM 1018 OH2 TIP3 1411 -9.970 -8.559 -16.566 -0.834 1.520 -ATOM 1019 H1 TIP3 1411 -10.726 -9.173 -16.578 0.417 1.000 -ATOM 1020 H2 TIP3 1411 -9.467 -8.638 -17.339 0.417 1.000 -ATOM 1021 OH2 TIP3 1412 -9.450 -10.456 -8.685 -0.834 1.520 -ATOM 1022 H1 TIP3 1412 -9.945 -9.657 -8.604 0.417 1.000 -ATOM 1023 H2 TIP3 1412 -8.540 -10.154 -8.663 0.417 1.000 -ATOM 1024 OH2 TIP3 1413 -2.804 -1.962 -6.223 -0.834 1.520 -ATOM 1025 H1 TIP3 1413 -2.508 -2.915 -6.250 0.417 1.000 -ATOM 1026 H2 TIP3 1413 -3.132 -1.918 -7.145 0.417 1.000 -ATOM 1027 OH2 TIP3 1414 -17.995 -2.204 1.122 -0.834 1.520 -ATOM 1028 H1 TIP3 1414 -17.227 -2.675 1.598 0.417 1.000 -ATOM 1029 H2 TIP3 1414 -17.827 -1.242 1.265 0.417 1.000 -ATOM 1030 OH2 TIP3 1415 -6.447 -4.760 1.435 -0.834 1.520 -ATOM 1031 H1 TIP3 1415 -5.897 -5.041 0.726 0.417 1.000 -ATOM 1032 H2 TIP3 1415 -6.578 -5.530 1.979 0.417 1.000 -ATOM 1033 OH2 TIP3 1416 -12.004 -3.094 8.597 -0.834 1.520 -ATOM 1034 H1 TIP3 1416 -12.612 -3.309 7.856 0.417 1.000 -ATOM 1035 H2 TIP3 1416 -11.729 -2.162 8.310 0.417 1.000 -ATOM 1036 OH2 TIP3 1417 -1.413 -4.224 6.957 -0.834 1.520 -ATOM 1037 H1 TIP3 1417 -2.159 -3.739 6.479 0.417 1.000 -ATOM 1038 H2 TIP3 1417 -1.428 -5.174 6.675 0.417 1.000 -ATOM 1039 OH2 TIP3 1418 -8.544 -17.650 -0.415 -0.834 1.520 -ATOM 1040 H1 TIP3 1418 -9.269 -17.069 -0.270 0.417 1.000 -ATOM 1041 H2 TIP3 1418 -8.454 -18.138 0.401 0.417 1.000 -ATOM 1042 OH2 TIP3 1420 1.969 2.337 11.122 -0.834 1.520 -ATOM 1043 H1 TIP3 1420 1.598 2.329 10.260 0.417 1.000 -ATOM 1044 H2 TIP3 1420 2.906 2.787 11.039 0.417 1.000 -ATOM 1045 OH2 TIP3 1421 -4.360 2.903 18.615 -0.834 1.520 -ATOM 1046 H1 TIP3 1421 -3.757 3.661 18.665 0.417 1.000 -ATOM 1047 H2 TIP3 1421 -3.746 2.148 18.657 0.417 1.000 -ATOM 1048 OH2 TIP3 1428 -6.932 -17.086 -9.851 -0.834 1.520 -ATOM 1049 H1 TIP3 1428 -7.197 -17.527 -10.705 0.417 1.000 -ATOM 1050 H2 TIP3 1428 -5.990 -17.151 -9.888 0.417 1.000 -ATOM 1051 OH2 TIP3 1429 -14.550 -10.933 -14.663 -0.834 1.520 -ATOM 1052 H1 TIP3 1429 -15.278 -11.160 -15.289 0.417 1.000 -ATOM 1053 H2 TIP3 1429 -15.061 -11.230 -13.883 0.417 1.000 -ATOM 1054 OH2 TIP3 1430 -10.187 5.619 -5.270 -0.834 1.520 -ATOM 1055 H1 TIP3 1430 -9.344 5.876 -4.836 0.417 1.000 -ATOM 1056 H2 TIP3 1430 -10.804 6.145 -4.725 0.417 1.000 -ATOM 1057 OH2 TIP3 1431 8.957 1.722 -14.497 -0.834 1.520 -ATOM 1058 H1 TIP3 1431 8.135 1.403 -14.937 0.417 1.000 -ATOM 1059 H2 TIP3 1431 8.661 2.493 -13.925 0.417 1.000 -ATOM 1060 OH2 TIP3 1433 -16.703 -1.229 -2.697 -0.834 1.520 -ATOM 1061 H1 TIP3 1433 -16.087 -0.728 -2.175 0.417 1.000 -ATOM 1062 H2 TIP3 1433 -16.384 -1.065 -3.592 0.417 1.000 -ATOM 1063 OH2 TIP3 1435 -13.403 -4.046 1.463 -0.834 1.520 -ATOM 1064 H1 TIP3 1435 -12.843 -4.840 1.200 0.417 1.000 -ATOM 1065 H2 TIP3 1435 -12.795 -3.549 2.021 0.417 1.000 -ATOM 1066 OH2 TIP3 1436 -15.616 6.376 16.209 -0.834 1.520 -ATOM 1067 H1 TIP3 1436 -15.490 5.829 17.007 0.417 1.000 -ATOM 1068 H2 TIP3 1436 -16.256 7.049 16.456 0.417 1.000 -ATOM 1069 OH2 TIP3 1437 -5.082 -14.990 7.460 -0.834 1.520 -ATOM 1070 H1 TIP3 1437 -5.408 -14.066 7.510 0.417 1.000 -ATOM 1071 H2 TIP3 1437 -4.171 -14.925 7.140 0.417 1.000 -ATOM 1072 OH2 TIP3 1439 -13.438 9.156 9.103 -0.834 1.520 -ATOM 1073 H1 TIP3 1439 -12.443 9.127 9.247 0.417 1.000 -ATOM 1074 H2 TIP3 1439 -13.493 9.741 8.296 0.417 1.000 -ATOM 1075 OH2 TIP3 1440 -18.557 -16.020 -1.373 -0.834 1.520 -ATOM 1076 H1 TIP3 1440 -18.464 -16.950 -1.753 0.417 1.000 -ATOM 1077 H2 TIP3 1440 -19.411 -15.718 -1.744 0.417 1.000 -ATOM 1078 OH2 TIP3 1442 -13.752 -6.495 4.232 -0.834 1.520 -ATOM 1079 H1 TIP3 1442 -12.943 -6.178 3.871 0.417 1.000 -ATOM 1080 H2 TIP3 1442 -13.749 -6.199 5.132 0.417 1.000 -ATOM 1081 OH2 TIP3 1450 0.255 5.983 -16.871 -0.834 1.520 -ATOM 1082 H1 TIP3 1450 0.472 6.411 -16.046 0.417 1.000 -ATOM 1083 H2 TIP3 1450 -0.132 5.098 -16.674 0.417 1.000 -ATOM 1084 OH2 TIP3 1451 -16.752 2.876 -16.299 -0.834 1.520 -ATOM 1085 H1 TIP3 1451 -17.338 2.334 -15.752 0.417 1.000 -ATOM 1086 H2 TIP3 1451 -15.894 2.410 -16.219 0.417 1.000 -ATOM 1087 OH2 TIP3 1453 -2.095 8.143 -13.552 -0.834 1.520 -ATOM 1088 H1 TIP3 1453 -2.826 8.506 -14.038 0.417 1.000 -ATOM 1089 H2 TIP3 1453 -2.526 7.472 -13.020 0.417 1.000 -ATOM 1090 OH2 TIP3 1454 -11.057 -0.393 -10.607 -0.834 1.520 -ATOM 1091 H1 TIP3 1454 -10.110 -0.334 -10.826 0.417 1.000 -ATOM 1092 H2 TIP3 1454 -11.449 -0.798 -11.414 0.417 1.000 -ATOM 1093 OH2 TIP3 1455 -12.466 3.313 2.010 -0.834 1.520 -ATOM 1094 H1 TIP3 1455 -12.691 2.777 2.738 0.417 1.000 -ATOM 1095 H2 TIP3 1455 -13.303 3.403 1.532 0.417 1.000 -ATOM 1096 OH2 TIP3 1457 -6.660 -6.440 -3.523 -0.834 1.520 -ATOM 1097 H1 TIP3 1457 -6.600 -6.432 -4.458 0.417 1.000 -ATOM 1098 H2 TIP3 1457 -7.148 -5.594 -3.367 0.417 1.000 -ATOM 1099 OH2 TIP3 1458 -11.656 -12.155 0.429 -0.834 1.520 -ATOM 1100 H1 TIP3 1458 -11.521 -11.708 1.236 0.417 1.000 -ATOM 1101 H2 TIP3 1458 -10.898 -11.941 -0.100 0.417 1.000 -ATOM 1102 OH2 TIP3 1459 -14.562 11.554 2.819 -0.834 1.520 -ATOM 1103 H1 TIP3 1459 -15.377 11.788 3.335 0.417 1.000 -ATOM 1104 H2 TIP3 1459 -14.989 10.914 2.179 0.417 1.000 -ATOM 1105 OH2 TIP3 1461 -7.688 -11.207 18.101 -0.834 1.520 -ATOM 1106 H1 TIP3 1461 -8.485 -10.954 17.539 0.417 1.000 -ATOM 1107 H2 TIP3 1461 -7.086 -11.483 17.387 0.417 1.000 -ATOM 1108 OH2 TIP3 1466 -16.118 13.117 -18.731 -0.834 1.520 -ATOM 1109 H1 TIP3 1466 -15.703 13.920 -18.369 0.417 1.000 -ATOM 1110 H2 TIP3 1466 -15.370 12.476 -18.741 0.417 1.000 -ATOM 1111 OH2 TIP3 1471 1.892 -10.510 -17.046 -0.834 1.520 -ATOM 1112 H1 TIP3 1471 2.662 -11.035 -16.993 0.417 1.000 -ATOM 1113 H2 TIP3 1471 1.279 -11.090 -17.442 0.417 1.000 -ATOM 1114 OH2 TIP3 1474 -13.099 1.557 -10.674 -0.834 1.520 -ATOM 1115 H1 TIP3 1474 -12.590 0.744 -10.616 0.417 1.000 -ATOM 1116 H2 TIP3 1474 -12.526 2.077 -11.241 0.417 1.000 -ATOM 1117 OH2 TIP3 1475 -3.739 1.789 2.152 -0.834 1.520 -ATOM 1118 H1 TIP3 1475 -3.316 0.873 1.878 0.417 1.000 -ATOM 1119 H2 TIP3 1475 -3.212 2.010 2.873 0.417 1.000 -ATOM 1120 OH2 TIP3 1476 -15.942 -1.794 8.885 -0.834 1.520 -ATOM 1121 H1 TIP3 1476 -16.725 -2.400 8.880 0.417 1.000 -ATOM 1122 H2 TIP3 1476 -15.164 -2.347 9.254 0.417 1.000 -ATOM 1123 OH2 TIP3 1477 -15.471 14.567 1.893 -0.834 1.520 -ATOM 1124 H1 TIP3 1477 -15.650 13.803 1.339 0.417 1.000 -ATOM 1125 H2 TIP3 1477 -15.992 15.319 1.446 0.417 1.000 -ATOM 1126 OH2 TIP3 1478 -3.922 8.219 -3.537 -0.834 1.520 -ATOM 1127 H1 TIP3 1478 -4.730 8.606 -3.810 0.417 1.000 -ATOM 1128 H2 TIP3 1478 -3.513 8.107 -4.419 0.417 1.000 -ATOM 1129 OH2 TIP3 1479 -9.939 5.226 16.361 -0.834 1.520 -ATOM 1130 H1 TIP3 1479 -9.809 6.085 15.854 0.417 1.000 -ATOM 1131 H2 TIP3 1479 -8.950 4.997 16.510 0.417 1.000 -ATOM 1132 OH2 TIP3 1480 -18.159 8.556 -0.519 -0.834 1.520 -ATOM 1133 H1 TIP3 1480 -17.414 8.152 -0.929 0.417 1.000 -ATOM 1134 H2 TIP3 1480 -18.762 8.723 -1.259 0.417 1.000 -ATOM 1135 OH2 TIP3 1481 0.228 4.555 13.339 -0.834 1.520 -ATOM 1136 H1 TIP3 1481 -0.232 3.920 12.719 0.417 1.000 -ATOM 1137 H2 TIP3 1481 -0.548 4.798 13.967 0.417 1.000 -ATOM 1138 OH2 TIP3 1493 -14.404 3.880 -1.238 -0.834 1.520 -ATOM 1139 H1 TIP3 1493 -14.273 4.762 -0.815 0.417 1.000 -ATOM 1140 H2 TIP3 1493 -13.496 3.604 -1.569 0.417 1.000 -ATOM 1141 OH2 TIP3 1494 -5.597 -12.185 -4.788 -0.834 1.520 -ATOM 1142 H1 TIP3 1494 -6.468 -11.794 -5.089 0.417 1.000 -ATOM 1143 H2 TIP3 1494 -5.115 -12.319 -5.627 0.417 1.000 -ATOM 1144 OH2 TIP3 1497 -13.143 -8.862 -13.171 -0.834 1.520 -ATOM 1145 H1 TIP3 1497 -13.893 -8.250 -13.200 0.417 1.000 -ATOM 1146 H2 TIP3 1497 -13.520 -9.613 -13.647 0.417 1.000 -ATOM 1147 OH2 TIP3 1499 -8.243 6.769 0.348 -0.834 1.520 -ATOM 1148 H1 TIP3 1499 -8.536 7.496 0.874 0.417 1.000 -ATOM 1149 H2 TIP3 1499 -9.014 6.221 0.287 0.417 1.000 -ATOM 1150 OH2 TIP3 1500 -3.797 13.061 16.285 -0.834 1.520 -ATOM 1151 H1 TIP3 1500 -4.660 12.808 16.599 0.417 1.000 -ATOM 1152 H2 TIP3 1500 -3.356 13.638 16.927 0.417 1.000 -ATOM 1153 OH2 TIP3 1501 -14.593 -6.037 14.866 -0.834 1.520 -ATOM 1154 H1 TIP3 1501 -14.345 -5.437 15.653 0.417 1.000 -ATOM 1155 H2 TIP3 1501 -14.797 -6.854 15.256 0.417 1.000 -ATOM 1156 OH2 TIP3 1504 -2.847 5.314 10.166 -0.834 1.520 -ATOM 1157 H1 TIP3 1504 -3.540 5.077 9.558 0.417 1.000 -ATOM 1158 H2 TIP3 1504 -3.248 5.889 10.826 0.417 1.000 -ATOM 1159 OH2 TIP3 1506 -2.533 13.017 18.975 -0.834 1.520 -ATOM 1160 H1 TIP3 1506 -2.452 12.147 18.669 0.417 1.000 -ATOM 1161 H2 TIP3 1506 -1.613 13.298 19.206 0.417 1.000 -ATOM 1162 OH2 TIP3 1512 -9.691 1.500 -8.519 -0.834 1.520 -ATOM 1163 H1 TIP3 1512 -8.986 0.928 -8.815 0.417 1.000 -ATOM 1164 H2 TIP3 1512 -10.405 0.961 -8.817 0.417 1.000 -ATOM 1165 OH2 TIP3 1514 -14.767 13.186 -7.181 -0.834 1.520 -ATOM 1166 H1 TIP3 1514 -13.894 13.436 -7.294 0.417 1.000 -ATOM 1167 H2 TIP3 1514 -15.217 13.261 -8.046 0.417 1.000 -ATOM 1168 OH2 TIP3 1515 -3.311 6.229 -11.711 -0.834 1.520 -ATOM 1169 H1 TIP3 1515 -2.808 5.791 -11.000 0.417 1.000 -ATOM 1170 H2 TIP3 1515 -3.998 6.674 -11.148 0.417 1.000 -ATOM 1171 OH2 TIP3 1518 -15.671 7.006 6.531 -0.834 1.520 -ATOM 1172 H1 TIP3 1518 -15.907 7.925 6.417 0.417 1.000 -ATOM 1173 H2 TIP3 1518 -15.237 7.043 7.393 0.417 1.000 -ATOM 1174 OH2 TIP3 1519 -7.629 9.653 -8.110 -0.834 1.520 -ATOM 1175 H1 TIP3 1519 -6.690 9.891 -8.015 0.417 1.000 -ATOM 1176 H2 TIP3 1519 -8.022 10.381 -7.593 0.417 1.000 -ATOM 1177 OH2 TIP3 1520 -9.511 9.412 16.667 -0.834 1.520 -ATOM 1178 H1 TIP3 1520 -9.677 10.348 16.799 0.417 1.000 -ATOM 1179 H2 TIP3 1520 -10.082 9.212 15.870 0.417 1.000 -ATOM 1180 OH2 TIP3 1522 -14.728 11.045 13.344 -0.834 1.520 -ATOM 1181 H1 TIP3 1522 -13.963 11.028 12.684 0.417 1.000 -ATOM 1182 H2 TIP3 1522 -15.335 10.381 12.941 0.417 1.000 -ATOM 1183 OH2 TIP3 1523 -2.958 9.632 9.680 -0.834 1.520 -ATOM 1184 H1 TIP3 1523 -3.300 10.443 10.183 0.417 1.000 -ATOM 1185 H2 TIP3 1523 -3.187 8.905 10.358 0.417 1.000 -ATOM 1186 OH2 TIP3 1531 -6.622 16.017 -9.909 -0.834 1.520 -ATOM 1187 H1 TIP3 1531 -6.156 16.623 -9.399 0.417 1.000 -ATOM 1188 H2 TIP3 1531 -7.042 16.567 -10.595 0.417 1.000 -ATOM 1189 OH2 TIP3 1532 -6.765 2.943 -4.367 -0.834 1.520 -ATOM 1190 H1 TIP3 1532 -7.387 2.525 -3.806 0.417 1.000 -ATOM 1191 H2 TIP3 1532 -5.973 2.981 -3.820 0.417 1.000 -ATOM 1192 OH2 TIP3 1534 -0.764 12.819 -10.109 -0.834 1.520 -ATOM 1193 H1 TIP3 1534 -0.893 12.085 -10.646 0.417 1.000 -ATOM 1194 H2 TIP3 1534 -0.913 12.479 -9.243 0.417 1.000 -ATOM 1195 OH2 TIP3 1537 -4.414 15.909 -7.076 -0.834 1.520 -ATOM 1196 H1 TIP3 1537 -4.308 16.788 -7.440 0.417 1.000 -ATOM 1197 H2 TIP3 1537 -4.326 15.267 -7.850 0.417 1.000 -ATOM 1198 OH2 TIP3 1538 -4.999 12.510 -6.474 -0.834 1.520 -ATOM 1199 H1 TIP3 1538 -4.923 13.137 -7.235 0.417 1.000 -ATOM 1200 H2 TIP3 1538 -4.144 12.607 -6.037 0.417 1.000 -ATOM 1201 OH2 TIP3 1540 -2.268 14.385 -2.122 -0.834 1.520 -ATOM 1202 H1 TIP3 1540 -2.152 15.369 -1.849 0.417 1.000 -ATOM 1203 H2 TIP3 1540 -2.436 13.930 -1.255 0.417 1.000 -ATOM 1204 OH2 TIP3 1542 -6.426 4.360 4.620 -0.834 1.520 -ATOM 1205 H1 TIP3 1542 -5.835 4.812 3.959 0.417 1.000 -ATOM 1206 H2 TIP3 1542 -6.198 3.408 4.433 0.417 1.000 -ATOM 1207 OH2 TIP3 1543 6.491 19.767 15.452 -0.834 1.520 -ATOM 1208 H1 TIP3 1543 7.199 19.779 16.123 0.417 1.000 -ATOM 1209 H2 TIP3 1543 5.683 19.538 15.992 0.417 1.000 -ATOM 1210 OH2 TIP3 1544 2.184 -12.187 18.081 -0.834 1.520 -ATOM 1211 H1 TIP3 1544 1.493 -12.247 17.334 0.417 1.000 -ATOM 1212 H2 TIP3 1544 2.880 -11.697 17.673 0.417 1.000 -ATOM 1213 OH2 TIP3 1545 -3.285 12.366 13.648 -0.834 1.520 -ATOM 1214 H1 TIP3 1545 -3.649 12.423 14.592 0.417 1.000 -ATOM 1215 H2 TIP3 1545 -3.620 13.270 13.287 0.417 1.000 -ATOM 1216 OH2 TIP3 1546 -18.333 14.715 9.782 -0.834 1.520 -ATOM 1217 H1 TIP3 1546 -18.821 13.940 9.481 0.417 1.000 -ATOM 1218 H2 TIP3 1546 -17.750 14.347 10.478 0.417 1.000 -ATOM 1219 OH2 TIP3 1552 -14.000 12.305 -12.945 -0.834 1.520 -ATOM 1220 H1 TIP3 1552 -14.577 12.996 -13.267 0.417 1.000 -ATOM 1221 H2 TIP3 1552 -13.194 12.807 -12.633 0.417 1.000 -ATOM 1222 OH2 TIP3 1557 -17.966 19.107 4.801 -0.834 1.520 -ATOM 1223 H1 TIP3 1557 -18.711 19.408 4.252 0.417 1.000 -ATOM 1224 H2 TIP3 1557 -17.691 19.946 5.280 0.417 1.000 -ATOM 1225 OH2 TIP3 1559 -13.182 0.066 0.150 -0.834 1.520 -ATOM 1226 H1 TIP3 1559 -12.314 0.067 0.626 0.417 1.000 -ATOM 1227 H2 TIP3 1559 -13.031 -0.131 -0.788 0.417 1.000 -ATOM 1228 OH2 TIP3 1560 2.934 18.275 1.316 -0.834 1.520 -ATOM 1229 H1 TIP3 1560 2.474 17.391 1.397 0.417 1.000 -ATOM 1230 H2 TIP3 1560 2.500 18.687 0.537 0.417 1.000 -ATOM 1231 OH2 TIP3 1582 -2.949 15.779 -4.414 -0.834 1.520 -ATOM 1232 H1 TIP3 1582 -3.828 15.409 -4.301 0.417 1.000 -ATOM 1233 H2 TIP3 1582 -2.402 15.311 -3.746 0.417 1.000 -ATOM 1234 OH2 TIP3 1583 7.440 14.981 -8.254 -0.834 1.520 -ATOM 1235 H1 TIP3 1583 6.738 15.624 -8.575 0.417 1.000 -ATOM 1236 H2 TIP3 1583 7.067 14.537 -7.494 0.417 1.000 -ATOM 1237 OH2 TIP3 1587 -7.464 9.439 9.422 -0.834 1.520 -ATOM 1238 H1 TIP3 1587 -7.753 8.800 8.719 0.417 1.000 -ATOM 1239 H2 TIP3 1587 -6.639 9.655 9.068 0.417 1.000 -ATOM 1240 OH2 TIP3 1589 -18.402 17.055 18.588 -0.834 1.520 -ATOM 1241 H1 TIP3 1589 -18.022 17.799 18.061 0.417 1.000 -ATOM 1242 H2 TIP3 1589 -17.666 16.867 19.246 0.417 1.000 -ATOM 1243 OH2 TIP3 1592 -18.836 2.897 10.118 -0.834 1.520 -ATOM 1244 H1 TIP3 1592 -18.008 2.391 9.989 0.417 1.000 -ATOM 1245 H2 TIP3 1592 -19.494 2.586 9.458 0.417 1.000 -ATOM 1246 OH2 TIP3 1601 -4.685 11.721 0.639 -0.834 1.520 -ATOM 1247 H1 TIP3 1601 -5.285 11.546 -0.089 0.417 1.000 -ATOM 1248 H2 TIP3 1601 -3.987 12.225 0.266 0.417 1.000 -ATOM 1249 OH2 TIP3 1603 -6.204 12.788 8.549 -0.834 1.520 -ATOM 1250 H1 TIP3 1603 -6.912 13.020 7.894 0.417 1.000 -ATOM 1251 H2 TIP3 1603 -5.789 11.989 8.184 0.417 1.000 -ATOM 1252 OH2 TIP3 1611 -12.025 0.030 2.745 -0.834 1.520 -ATOM 1253 H1 TIP3 1611 -11.368 0.654 2.435 0.417 1.000 -ATOM 1254 H2 TIP3 1611 -12.559 0.490 3.501 0.417 1.000 -ATOM 1255 OH2 TIP3 1612 -16.334 15.780 12.993 -0.834 1.520 -ATOM 1256 H1 TIP3 1612 -15.393 15.948 13.319 0.417 1.000 -ATOM 1257 H2 TIP3 1612 -16.525 16.536 12.413 0.417 1.000 -ATOM 1258 OH2 TIP3 1618 -16.156 11.380 -5.086 -0.834 1.520 -ATOM 1259 H1 TIP3 1618 -15.487 11.715 -5.699 0.417 1.000 -ATOM 1260 H2 TIP3 1618 -16.018 10.438 -5.108 0.417 1.000 -ATOM 1261 OH2 TIP3 1624 -16.708 19.264 -3.123 -0.834 1.520 -ATOM 1262 H1 TIP3 1624 -16.277 18.402 -3.057 0.417 1.000 -ATOM 1263 H2 TIP3 1624 -16.075 19.831 -2.724 0.417 1.000 -ATOM 1264 OH2 TIP3 1626 -12.675 17.867 16.364 -0.834 1.520 -ATOM 1265 H1 TIP3 1626 -13.504 18.257 16.693 0.417 1.000 -ATOM 1266 H2 TIP3 1626 -12.115 17.917 17.176 0.417 1.000 -ATOM 1267 OH2 TIP3 1629 -19.451 17.374 14.273 -0.834 1.520 -ATOM 1268 H1 TIP3 1629 -19.619 17.772 13.420 0.417 1.000 -ATOM 1269 H2 TIP3 1629 -19.365 16.466 14.117 0.417 1.000 -ATOM 1270 OH2 TIP3 1638 8.131 13.693 -14.588 -0.834 1.520 -ATOM 1271 H1 TIP3 1638 8.039 12.821 -14.245 0.417 1.000 -ATOM 1272 H2 TIP3 1638 7.481 13.666 -15.332 0.417 1.000 -ATOM 1273 OH2 TIP3 1642 -17.998 12.689 6.857 -0.834 1.520 -ATOM 1274 H1 TIP3 1642 -17.350 13.256 7.437 0.417 1.000 -ATOM 1275 H2 TIP3 1642 -18.216 13.292 6.148 0.417 1.000 -ATOM 1276 OH2 TIP3 1643 -14.426 13.132 -3.286 -0.834 1.520 -ATOM 1277 H1 TIP3 1643 -14.876 12.329 -2.987 0.417 1.000 -ATOM 1278 H2 TIP3 1643 -14.921 13.786 -2.794 0.417 1.000 -ATOM 1279 OH2 TIP3 1670 -9.083 -13.361 8.367 -0.834 1.520 -ATOM 1280 H1 TIP3 1670 -8.359 -13.525 7.708 0.417 1.000 -ATOM 1281 H2 TIP3 1670 -8.861 -13.984 9.056 0.417 1.000 -ATOM 1282 OH2 TIP3 1692 -7.307 -18.670 15.462 -0.834 1.520 -ATOM 1283 H1 TIP3 1692 -6.646 -18.123 15.015 0.417 1.000 -ATOM 1284 H2 TIP3 1692 -6.865 -18.925 16.317 0.417 1.000 -ATOM 1285 OH2 TIP3 1707 -7.887 -19.079 -15.058 -0.834 1.520 -ATOM 1286 H1 TIP3 1707 -7.181 -19.365 -14.438 0.417 1.000 -ATOM 1287 H2 TIP3 1707 -8.186 -18.104 -14.777 0.417 1.000 -ATOM 1288 OH2 TIP3 1718 -14.485 -15.471 12.470 -0.834 1.520 -ATOM 1289 H1 TIP3 1718 -15.397 -15.136 12.559 0.417 1.000 -ATOM 1290 H2 TIP3 1718 -14.518 -15.745 11.597 0.417 1.000 -ATOM 1291 OH2 TIP3 1723 -10.803 -15.625 -4.036 -0.834 1.520 -ATOM 1292 H1 TIP3 1723 -10.837 -16.410 -4.613 0.417 1.000 -ATOM 1293 H2 TIP3 1723 -11.484 -15.833 -3.396 0.417 1.000 -ATOM 1294 OH2 TIP3 1725 -17.579 -16.225 -14.942 -0.834 1.520 -ATOM 1295 H1 TIP3 1725 -17.316 -17.066 -15.348 0.417 1.000 -ATOM 1296 H2 TIP3 1725 -16.781 -15.660 -14.952 0.417 1.000 -ATOM 1297 OH2 TIP3 1727 -1.626 -13.429 4.304 -0.834 1.520 -ATOM 1298 H1 TIP3 1727 -2.370 -13.175 3.710 0.417 1.000 -ATOM 1299 H2 TIP3 1727 -2.027 -14.169 4.860 0.417 1.000 -ATOM 1300 OH2 TIP3 1729 -13.206 -13.125 2.997 -0.834 1.520 -ATOM 1301 H1 TIP3 1729 -12.834 -12.185 3.093 0.417 1.000 -ATOM 1302 H2 TIP3 1729 -14.166 -12.971 3.036 0.417 1.000 -ATOM 1303 OH2 TIP3 1730 -8.482 -17.859 -5.165 -0.834 1.520 -ATOM 1304 H1 TIP3 1730 -8.644 -17.231 -5.899 0.417 1.000 -ATOM 1305 H2 TIP3 1730 -7.655 -18.273 -5.417 0.417 1.000 -ATOM 1306 OH2 TIP3 1733 -16.826 -18.416 -3.024 -0.834 1.520 -ATOM 1307 H1 TIP3 1733 -17.630 -17.923 -3.190 0.417 1.000 -ATOM 1308 H2 TIP3 1733 -16.730 -19.039 -3.748 0.417 1.000 -ATOM 1309 OH2 TIP3 1735 3.583 -10.324 16.567 -0.834 1.520 -ATOM 1310 H1 TIP3 1735 3.123 -9.802 15.925 0.417 1.000 -ATOM 1311 H2 TIP3 1735 4.026 -10.951 16.040 0.417 1.000 -ATOM 1312 OH2 TIP3 1744 -0.181 -18.815 -13.579 -0.834 1.520 -ATOM 1313 H1 TIP3 1744 0.354 -18.357 -14.248 0.417 1.000 -ATOM 1314 H2 TIP3 1744 -0.233 -19.768 -13.901 0.417 1.000 -ATOM 1315 OH2 TIP3 1746 -9.152 -9.929 -1.369 -0.834 1.520 -ATOM 1316 H1 TIP3 1746 -9.655 -9.523 -2.093 0.417 1.000 -ATOM 1317 H2 TIP3 1746 -8.337 -9.449 -1.362 0.417 1.000 -ATOM 1318 OH2 TIP3 1750 -12.939 4.972 -17.457 -0.834 1.520 -ATOM 1319 H1 TIP3 1750 -12.015 5.260 -17.563 0.417 1.000 -ATOM 1320 H2 TIP3 1750 -12.849 4.003 -17.555 0.417 1.000 -ATOM 1321 OH2 TIP3 1752 -7.931 -11.234 3.082 -0.834 1.520 -ATOM 1322 H1 TIP3 1752 -7.977 -10.710 3.888 0.417 1.000 -ATOM 1323 H2 TIP3 1752 -8.410 -12.044 3.400 0.417 1.000 -ATOM 1324 OH2 TIP3 1755 1.084 -16.732 14.355 -0.834 1.520 -ATOM 1325 H1 TIP3 1755 0.432 -17.234 13.844 0.417 1.000 -ATOM 1326 H2 TIP3 1755 0.865 -16.909 15.225 0.417 1.000 -ATOM 1327 OH2 TIP3 1757 -11.286 -9.146 6.340 -0.834 1.520 -ATOM 1328 H1 TIP3 1757 -10.309 -9.440 6.364 0.417 1.000 -ATOM 1329 H2 TIP3 1757 -11.601 -9.189 7.287 0.417 1.000 -ATOM 1330 OH2 TIP3 1764 -14.859 -18.389 -19.501 -0.834 1.520 -ATOM 1331 H1 TIP3 1764 -15.303 -18.890 -18.766 0.417 1.000 -ATOM 1332 H2 TIP3 1764 -13.969 -18.698 -19.414 0.417 1.000 -ATOM 1333 OH2 TIP3 1766 -2.069 -5.628 -8.406 -0.834 1.520 -ATOM 1334 H1 TIP3 1766 -2.990 -5.576 -8.713 0.417 1.000 -ATOM 1335 H2 TIP3 1766 -2.074 -5.044 -7.601 0.417 1.000 -ATOM 1336 OH2 TIP3 1771 -17.491 -16.495 -7.090 -0.834 1.520 -ATOM 1337 H1 TIP3 1771 -17.886 -15.862 -7.685 0.417 1.000 -ATOM 1338 H2 TIP3 1771 -17.285 -17.288 -7.617 0.417 1.000 -ATOM 1339 OH2 TIP3 1772 -6.100 -18.734 11.625 -0.834 1.520 -ATOM 1340 H1 TIP3 1772 -5.368 -19.331 11.842 0.417 1.000 -ATOM 1341 H2 TIP3 1772 -5.733 -18.258 10.831 0.417 1.000 -ATOM 1342 OH2 TIP3 1773 -5.646 -18.648 -5.996 -0.834 1.520 -ATOM 1343 H1 TIP3 1773 -5.306 -19.377 -5.435 0.417 1.000 -ATOM 1344 H2 TIP3 1773 -5.427 -17.805 -5.574 0.417 1.000 -ATOM 1345 OH2 TIP3 1775 -18.087 -18.594 7.668 -0.834 1.520 -ATOM 1346 H1 TIP3 1775 -18.279 -18.573 8.637 0.417 1.000 -ATOM 1347 H2 TIP3 1775 -17.661 -17.701 7.574 0.417 1.000 -ATOM 1348 OH2 TIP3 1776 -12.992 -15.476 16.761 -0.834 1.520 -ATOM 1349 H1 TIP3 1776 -13.730 -14.940 17.088 0.417 1.000 -ATOM 1350 H2 TIP3 1776 -12.255 -14.989 17.135 0.417 1.000 -ATOM 1351 OH2 TIP3 1778 -17.562 -13.996 16.100 -0.834 1.520 -ATOM 1352 H1 TIP3 1778 -18.031 -14.475 16.753 0.417 1.000 -ATOM 1353 H2 TIP3 1778 -18.268 -13.982 15.391 0.417 1.000 -ATOM 1354 OH2 TIP3 1788 -5.422 3.489 -2.150 -0.834 1.520 -ATOM 1355 H1 TIP3 1788 -4.524 3.267 -2.139 0.417 1.000 -ATOM 1356 H2 TIP3 1788 -5.641 3.484 -1.229 0.417 1.000 -ATOM 1357 OH2 TIP3 1789 -14.539 -13.246 -18.057 -0.834 1.520 -ATOM 1358 H1 TIP3 1789 -13.588 -13.373 -17.982 0.417 1.000 -ATOM 1359 H2 TIP3 1789 -14.791 -14.044 -18.566 0.417 1.000 -ATOM 1360 OH2 TIP3 1790 -1.937 -5.563 -3.088 -0.834 1.520 -ATOM 1361 H1 TIP3 1790 -1.261 -6.112 -2.627 0.417 1.000 -ATOM 1362 H2 TIP3 1790 -2.816 -6.023 -3.042 0.417 1.000 -ATOM 1363 OH2 TIP3 1794 -4.701 -18.629 4.731 -0.834 1.520 -ATOM 1364 H1 TIP3 1794 -5.144 -18.285 3.949 0.417 1.000 -ATOM 1365 H2 TIP3 1794 -3.772 -18.473 4.527 0.417 1.000 -ATOM 1366 OH2 TIP3 1795 -5.899 -18.098 2.316 -0.834 1.520 -ATOM 1367 H1 TIP3 1795 -5.114 -17.602 2.002 0.417 1.000 -ATOM 1368 H2 TIP3 1795 -5.892 -18.959 1.813 0.417 1.000 -ATOM 1369 OH2 TIP3 1796 1.008 -14.939 -1.543 -0.834 1.520 -ATOM 1370 H1 TIP3 1796 0.384 -14.979 -0.793 0.417 1.000 -ATOM 1371 H2 TIP3 1796 1.508 -15.790 -1.373 0.417 1.000 -ATOM 1372 OH2 TIP3 1798 -5.880 -1.003 13.901 -0.834 1.520 -ATOM 1373 H1 TIP3 1798 -6.725 -0.812 14.327 0.417 1.000 -ATOM 1374 H2 TIP3 1798 -5.312 -0.203 14.158 0.417 1.000 -ATOM 1375 OH2 TIP3 1808 4.934 -9.881 3.588 -0.834 1.520 -ATOM 1376 H1 TIP3 1808 5.124 -10.621 4.125 0.417 1.000 -ATOM 1377 H2 TIP3 1808 4.257 -9.461 4.069 0.417 1.000 -ATOM 1378 OH2 TIP3 1810 10.667 1.477 -18.568 -0.834 1.520 -ATOM 1379 H1 TIP3 1810 10.600 2.083 -17.781 0.417 1.000 -ATOM 1380 H2 TIP3 1810 9.728 1.243 -18.726 0.417 1.000 -ATOM 1381 OH2 TIP3 1811 10.667 -14.998 -12.111 -0.834 1.520 -ATOM 1382 H1 TIP3 1811 10.007 -14.348 -12.442 0.417 1.000 -ATOM 1383 H2 TIP3 1811 11.404 -14.870 -12.754 0.417 1.000 -ATOM 1384 OH2 TIP3 1812 -14.557 -10.544 8.801 -0.834 1.520 -ATOM 1385 H1 TIP3 1812 -15.371 -10.057 8.641 0.417 1.000 -ATOM 1386 H2 TIP3 1812 -14.873 -11.287 9.296 0.417 1.000 -ATOM 1387 OH2 TIP3 1813 -13.858 -8.142 -3.948 -0.834 1.520 -ATOM 1388 H1 TIP3 1813 -14.238 -7.358 -4.325 0.417 1.000 -ATOM 1389 H2 TIP3 1813 -14.434 -8.854 -4.339 0.417 1.000 -ATOM 1390 OH2 TIP3 1814 -8.813 -0.896 -1.319 -0.834 1.520 -ATOM 1391 H1 TIP3 1814 -7.971 -1.434 -1.137 0.417 1.000 -ATOM 1392 H2 TIP3 1814 -9.426 -1.227 -0.636 0.417 1.000 -ATOM 1393 OH2 TIP3 1815 -12.069 -0.265 8.005 -0.834 1.520 -ATOM 1394 H1 TIP3 1815 -12.770 -0.043 7.391 0.417 1.000 -ATOM 1395 H2 TIP3 1815 -12.157 0.396 8.753 0.417 1.000 -ATOM 1396 OH2 TIP3 1816 -10.095 4.448 1.184 -0.834 1.520 -ATOM 1397 H1 TIP3 1816 -9.546 4.369 2.014 0.417 1.000 -ATOM 1398 H2 TIP3 1816 -10.904 3.987 1.368 0.417 1.000 -ATOM 1399 OH2 TIP3 1817 -0.849 -8.233 16.611 -0.834 1.520 -ATOM 1400 H1 TIP3 1817 -1.631 -8.413 17.199 0.417 1.000 -ATOM 1401 H2 TIP3 1817 -1.284 -8.226 15.731 0.417 1.000 -ATOM 1402 OH2 TIP3 1820 -11.199 -16.666 9.609 -0.834 1.520 -ATOM 1403 H1 TIP3 1820 -11.218 -17.615 9.788 0.417 1.000 -ATOM 1404 H2 TIP3 1820 -10.487 -16.583 8.993 0.417 1.000 -ATOM 1405 OH2 TIP3 1821 -4.060 -8.964 16.024 -0.834 1.520 -ATOM 1406 H1 TIP3 1821 -3.587 -9.337 15.247 0.417 1.000 -ATOM 1407 H2 TIP3 1821 -3.651 -9.497 16.672 0.417 1.000 -ATOM 1408 OH2 TIP3 1824 2.523 -17.842 -18.502 -0.834 1.520 -ATOM 1409 H1 TIP3 1824 2.432 -17.928 -19.454 0.417 1.000 -ATOM 1410 H2 TIP3 1824 2.118 -18.679 -18.139 0.417 1.000 -ATOM 1411 OH2 TIP3 1829 -8.220 -6.491 -19.017 -0.834 1.520 -ATOM 1412 H1 TIP3 1829 -7.689 -6.578 -18.206 0.417 1.000 -ATOM 1413 H2 TIP3 1829 -7.621 -6.184 -19.700 0.417 1.000 -ATOM 1414 OH2 TIP3 1830 -6.590 -6.204 -16.794 -0.834 1.520 -ATOM 1415 H1 TIP3 1830 -7.140 -6.658 -16.048 0.417 1.000 -ATOM 1416 H2 TIP3 1830 -5.622 -6.376 -16.514 0.417 1.000 -ATOM 1417 OH2 TIP3 1831 -12.686 -19.772 -10.848 -0.834 1.520 -ATOM 1418 H1 TIP3 1831 -12.553 -19.804 -11.843 0.417 1.000 -ATOM 1419 H2 TIP3 1831 -11.781 -19.664 -10.574 0.417 1.000 -ATOM 1420 OH2 TIP3 1832 -1.569 -10.142 1.140 -0.834 1.520 -ATOM 1421 H1 TIP3 1832 -1.780 -10.080 0.160 0.417 1.000 -ATOM 1422 H2 TIP3 1832 -0.997 -10.962 1.186 0.417 1.000 -ATOM 1423 OH2 TIP3 1833 -10.061 -9.807 17.050 -0.834 1.520 -ATOM 1424 H1 TIP3 1833 -9.895 -9.246 17.880 0.417 1.000 -ATOM 1425 H2 TIP3 1833 -9.832 -9.166 16.364 0.417 1.000 -ATOM 1426 OH2 TIP3 1835 -8.394 7.709 -2.393 -0.834 1.520 -ATOM 1427 H1 TIP3 1835 -8.304 6.784 -2.445 0.417 1.000 -ATOM 1428 H2 TIP3 1835 -8.154 7.850 -1.482 0.417 1.000 -ATOM 1429 OH2 TIP3 1836 -4.069 -9.860 2.479 -0.834 1.520 -ATOM 1430 H1 TIP3 1836 -3.196 -10.049 2.187 0.417 1.000 -ATOM 1431 H2 TIP3 1836 -4.547 -9.573 1.645 0.417 1.000 -ATOM 1432 OH2 TIP3 1837 -10.737 8.274 -7.577 -0.834 1.520 -ATOM 1433 H1 TIP3 1837 -11.054 8.886 -6.952 0.417 1.000 -ATOM 1434 H2 TIP3 1837 -11.203 8.532 -8.415 0.417 1.000 -ATOM 1435 OH2 TIP3 1838 1.198 -8.648 2.162 -0.834 1.520 -ATOM 1436 H1 TIP3 1838 1.433 -9.350 2.754 0.417 1.000 -ATOM 1437 H2 TIP3 1838 0.481 -8.941 1.590 0.417 1.000 -ATOM 1438 OH2 TIP3 1839 -5.597 -13.162 13.628 -0.834 1.520 -ATOM 1439 H1 TIP3 1839 -6.386 -13.482 13.273 0.417 1.000 -ATOM 1440 H2 TIP3 1839 -5.113 -13.994 13.778 0.417 1.000 -ATOM 1441 OH2 TIP3 1840 5.717 -2.953 11.584 -0.834 1.520 -ATOM 1442 H1 TIP3 1840 5.864 -2.065 11.383 0.417 1.000 -ATOM 1443 H2 TIP3 1840 6.567 -3.411 11.607 0.417 1.000 -ATOM 1444 OH2 TIP3 1841 -6.526 -5.814 18.781 -0.834 1.520 -ATOM 1445 H1 TIP3 1841 -7.234 -5.207 19.131 0.417 1.000 -ATOM 1446 H2 TIP3 1841 -6.012 -5.149 18.339 0.417 1.000 -ATOM 1447 OH2 TIP3 1847 -6.620 9.030 -17.190 -0.834 1.520 -ATOM 1448 H1 TIP3 1847 -7.330 9.133 -16.514 0.417 1.000 -ATOM 1449 H2 TIP3 1847 -6.806 9.795 -17.817 0.417 1.000 -ATOM 1450 OH2 TIP3 1850 -9.299 4.822 -12.461 -0.834 1.520 -ATOM 1451 H1 TIP3 1850 -8.375 4.508 -12.384 0.417 1.000 -ATOM 1452 H2 TIP3 1850 -9.623 4.718 -11.524 0.417 1.000 -ATOM 1453 OH2 TIP3 1851 0.846 0.362 -15.259 -0.834 1.520 -ATOM 1454 H1 TIP3 1851 0.810 0.846 -14.356 0.417 1.000 -ATOM 1455 H2 TIP3 1851 0.840 -0.611 -15.065 0.417 1.000 -ATOM 1456 OH2 TIP3 1852 -9.972 4.028 -9.993 -0.834 1.520 -ATOM 1457 H1 TIP3 1852 -9.925 3.132 -9.576 0.417 1.000 -ATOM 1458 H2 TIP3 1852 -9.960 4.627 -9.215 0.417 1.000 -ATOM 1459 OH2 TIP3 1853 -19.711 -9.462 -6.532 -0.834 1.520 -ATOM 1460 H1 TIP3 1853 -19.714 -9.063 -7.398 0.417 1.000 -ATOM 1461 H2 TIP3 1853 -18.738 -9.643 -6.331 0.417 1.000 -ATOM 1462 OH2 TIP3 1854 -3.786 -12.153 -15.234 -0.834 1.520 -ATOM 1463 H1 TIP3 1854 -4.746 -12.008 -14.839 0.417 1.000 -ATOM 1464 H2 TIP3 1854 -4.095 -12.608 -16.004 0.417 1.000 -ATOM 1465 OH2 TIP3 1856 -7.560 -7.593 -14.630 -0.834 1.520 -ATOM 1466 H1 TIP3 1856 -8.348 -8.113 -14.895 0.417 1.000 -ATOM 1467 H2 TIP3 1856 -7.107 -8.133 -14.023 0.417 1.000 -ATOM 1468 OH2 TIP3 1858 -16.664 -12.238 14.144 -0.834 1.520 -ATOM 1469 H1 TIP3 1858 -17.444 -12.364 13.586 0.417 1.000 -ATOM 1470 H2 TIP3 1858 -16.795 -12.882 14.833 0.417 1.000 -ATOM 1471 OH2 TIP3 1859 -15.649 -12.220 10.737 -0.834 1.520 -ATOM 1472 H1 TIP3 1859 -16.581 -12.269 11.041 0.417 1.000 -ATOM 1473 H2 TIP3 1859 -15.250 -12.906 11.271 0.417 1.000 -ATOM 1474 OH2 TIP3 1860 -8.664 -2.573 5.469 -0.834 1.520 -ATOM 1475 H1 TIP3 1860 -7.881 -2.952 5.850 0.417 1.000 -ATOM 1476 H2 TIP3 1860 -8.757 -3.114 4.615 0.417 1.000 -ATOM 1477 OH2 TIP3 1861 -1.303 -3.425 3.068 -0.834 1.520 -ATOM 1478 H1 TIP3 1861 -1.992 -3.221 3.727 0.417 1.000 -ATOM 1479 H2 TIP3 1861 -1.772 -4.017 2.454 0.417 1.000 -ATOM 1480 OH2 TIP3 1862 15.117 -15.618 13.692 -0.834 1.520 -ATOM 1481 H1 TIP3 1862 14.931 -16.509 13.482 0.417 1.000 -ATOM 1482 H2 TIP3 1862 15.883 -15.701 14.254 0.417 1.000 -ATOM 1483 OH2 TIP3 1866 -7.163 -4.566 9.756 -0.834 1.520 -ATOM 1484 H1 TIP3 1866 -7.336 -3.576 9.827 0.417 1.000 -ATOM 1485 H2 TIP3 1866 -8.058 -4.939 9.951 0.417 1.000 -ATOM 1486 OH2 TIP3 1870 -1.188 9.340 -17.251 -0.834 1.520 -ATOM 1487 H1 TIP3 1870 -1.117 9.394 -16.323 0.417 1.000 -ATOM 1488 H2 TIP3 1870 -2.069 8.859 -17.453 0.417 1.000 -ATOM 1489 OH2 TIP3 1871 -13.032 -8.371 -17.647 -0.834 1.520 -ATOM 1490 H1 TIP3 1871 -13.425 -9.104 -18.193 0.417 1.000 -ATOM 1491 H2 TIP3 1871 -12.917 -7.710 -18.410 0.417 1.000 -ATOM 1492 OH2 TIP3 1872 10.797 -4.682 -13.217 -0.834 1.520 -ATOM 1493 H1 TIP3 1872 11.156 -3.952 -12.761 0.417 1.000 -ATOM 1494 H2 TIP3 1872 10.134 -4.353 -13.790 0.417 1.000 -ATOM 1495 OH2 TIP3 1873 -6.467 -9.450 -12.840 -0.834 1.520 -ATOM 1496 H1 TIP3 1873 -7.392 -9.691 -12.510 0.417 1.000 -ATOM 1497 H2 TIP3 1873 -5.992 -9.060 -12.075 0.417 1.000 -ATOM 1498 OH2 TIP3 1874 -6.957 -1.169 2.933 -0.834 1.520 -ATOM 1499 H1 TIP3 1874 -6.561 -2.064 2.986 0.417 1.000 -ATOM 1500 H2 TIP3 1874 -7.861 -1.236 3.145 0.417 1.000 -ATOM 1501 OH2 TIP3 1875 -7.132 4.879 -15.674 -0.834 1.520 -ATOM 1502 H1 TIP3 1875 -6.822 5.390 -14.883 0.417 1.000 -ATOM 1503 H2 TIP3 1875 -6.811 4.009 -15.497 0.417 1.000 -ATOM 1504 OH2 TIP3 1876 -9.869 8.853 1.944 -0.834 1.520 -ATOM 1505 H1 TIP3 1876 -10.567 9.536 2.151 0.417 1.000 -ATOM 1506 H2 TIP3 1876 -9.650 8.482 2.801 0.417 1.000 -ATOM 1507 OH2 TIP3 1877 2.780 12.600 -3.433 -0.834 1.520 -ATOM 1508 H1 TIP3 1877 2.151 12.517 -2.703 0.417 1.000 -ATOM 1509 H2 TIP3 1877 3.032 11.657 -3.633 0.417 1.000 -ATOM 1510 OH2 TIP3 1878 3.306 -12.189 2.076 -0.834 1.520 -ATOM 1511 H1 TIP3 1878 2.635 -12.114 2.789 0.417 1.000 -ATOM 1512 H2 TIP3 1878 3.960 -12.834 2.410 0.417 1.000 -ATOM 1513 OH2 TIP3 1880 -19.664 -6.521 13.304 -0.834 1.520 -ATOM 1514 H1 TIP3 1880 -19.936 -6.277 12.406 0.417 1.000 -ATOM 1515 H2 TIP3 1880 -18.688 -6.483 13.284 0.417 1.000 -ATOM 1516 OH2 TIP3 1881 -2.292 0.770 -7.131 -0.834 1.520 -ATOM 1517 H1 TIP3 1881 -3.296 0.781 -7.220 0.417 1.000 -ATOM 1518 H2 TIP3 1881 -2.106 -0.052 -6.677 0.417 1.000 -ATOM 1519 OH2 TIP3 1883 -12.137 3.614 15.172 -0.834 1.520 -ATOM 1520 H1 TIP3 1883 -12.664 3.211 15.892 0.417 1.000 -ATOM 1521 H2 TIP3 1883 -11.620 4.370 15.576 0.417 1.000 -ATOM 1522 OH2 TIP3 1885 4.964 -6.124 -17.131 -0.834 1.520 -ATOM 1523 H1 TIP3 1885 4.211 -6.801 -17.127 0.417 1.000 -ATOM 1524 H2 TIP3 1885 5.157 -5.944 -18.090 0.417 1.000 -ATOM 1525 OH2 TIP3 1891 -8.938 9.274 -15.814 -0.834 1.520 -ATOM 1526 H1 TIP3 1891 -9.767 9.104 -15.328 0.417 1.000 -ATOM 1527 H2 TIP3 1891 -8.264 9.011 -15.161 0.417 1.000 -ATOM 1528 OH2 TIP3 1892 -15.121 14.045 -10.003 -0.834 1.520 -ATOM 1529 H1 TIP3 1892 -14.817 14.410 -10.863 0.417 1.000 -ATOM 1530 H2 TIP3 1892 -14.645 14.696 -9.366 0.417 1.000 -ATOM 1531 OH2 TIP3 1894 -8.294 -4.189 -3.171 -0.834 1.520 -ATOM 1532 H1 TIP3 1894 -9.108 -3.653 -3.410 0.417 1.000 -ATOM 1533 H2 TIP3 1894 -7.656 -3.534 -2.838 0.417 1.000 -ATOM 1534 OH2 TIP3 1895 6.537 -6.096 -4.508 -0.834 1.520 -ATOM 1535 H1 TIP3 1895 6.365 -5.498 -3.823 0.417 1.000 -ATOM 1536 H2 TIP3 1895 7.409 -6.518 -4.307 0.417 1.000 -ATOM 1537 OH2 TIP3 1896 3.194 0.211 -9.587 -0.834 1.520 -ATOM 1538 H1 TIP3 1896 3.287 -0.138 -8.660 0.417 1.000 -ATOM 1539 H2 TIP3 1896 3.903 0.869 -9.727 0.417 1.000 -ATOM 1540 OH2 TIP3 1897 -17.001 3.837 0.047 -0.834 1.520 -ATOM 1541 H1 TIP3 1897 -17.415 4.567 -0.381 0.417 1.000 -ATOM 1542 H2 TIP3 1897 -16.033 3.961 -0.137 0.417 1.000 -ATOM 1543 OH2 TIP3 1898 -16.276 5.584 3.543 -0.834 1.520 -ATOM 1544 H1 TIP3 1898 -16.065 6.464 3.222 0.417 1.000 -ATOM 1545 H2 TIP3 1898 -15.690 5.508 4.314 0.417 1.000 -ATOM 1546 OH2 TIP3 1899 -3.739 -2.221 15.664 -0.834 1.520 -ATOM 1547 H1 TIP3 1899 -2.936 -2.009 15.207 0.417 1.000 -ATOM 1548 H2 TIP3 1899 -4.393 -1.736 15.157 0.417 1.000 -ATOM 1549 OH2 TIP3 1900 -5.479 -3.404 4.056 -0.834 1.520 -ATOM 1550 H1 TIP3 1900 -5.626 -4.000 4.808 0.417 1.000 -ATOM 1551 H2 TIP3 1900 -5.945 -3.868 3.347 0.417 1.000 -ATOM 1552 OH2 TIP3 1901 -8.459 -3.672 14.335 -0.834 1.520 -ATOM 1553 H1 TIP3 1901 -8.693 -3.158 15.143 0.417 1.000 -ATOM 1554 H2 TIP3 1901 -7.488 -3.790 14.437 0.417 1.000 -ATOM 1555 OH2 TIP3 1902 -10.571 1.891 13.233 -0.834 1.520 -ATOM 1556 H1 TIP3 1902 -10.952 2.477 13.914 0.417 1.000 -ATOM 1557 H2 TIP3 1902 -10.056 2.530 12.713 0.417 1.000 -ATOM 1558 OH2 TIP3 1907 0.732 -4.433 17.945 -0.834 1.520 -ATOM 1559 H1 TIP3 1907 0.341 -4.361 17.048 0.417 1.000 -ATOM 1560 H2 TIP3 1907 1.017 -5.336 17.919 0.417 1.000 -ATOM 1561 OH2 TIP3 1911 -8.358 -0.970 -15.134 -0.834 1.520 -ATOM 1562 H1 TIP3 1911 -9.248 -1.214 -14.791 0.417 1.000 -ATOM 1563 H2 TIP3 1911 -8.466 -0.853 -16.103 0.417 1.000 -ATOM 1564 OH2 TIP3 1912 -6.450 1.522 -10.435 -0.834 1.520 -ATOM 1565 H1 TIP3 1912 -6.721 1.744 -11.345 0.417 1.000 -ATOM 1566 H2 TIP3 1912 -6.141 2.419 -10.086 0.417 1.000 -ATOM 1567 OH2 TIP3 1913 1.097 12.860 -15.300 -0.834 1.520 -ATOM 1568 H1 TIP3 1913 0.853 13.778 -15.395 0.417 1.000 -ATOM 1569 H2 TIP3 1913 0.276 12.355 -15.391 0.417 1.000 -ATOM 1570 OH2 TIP3 1914 -7.999 0.877 -5.892 -0.834 1.520 -ATOM 1571 H1 TIP3 1914 -7.940 1.566 -5.226 0.417 1.000 -ATOM 1572 H2 TIP3 1914 -8.814 1.104 -6.371 0.417 1.000 -ATOM 1573 OH2 TIP3 1915 -7.186 -2.094 -12.617 -0.834 1.520 -ATOM 1574 H1 TIP3 1915 -6.621 -2.590 -13.312 0.417 1.000 -ATOM 1575 H2 TIP3 1915 -8.037 -2.006 -13.046 0.417 1.000 -ATOM 1576 OH2 TIP3 1916 -10.837 14.477 4.848 -0.834 1.520 -ATOM 1577 H1 TIP3 1916 -10.206 13.719 4.654 0.417 1.000 -ATOM 1578 H2 TIP3 1916 -11.499 14.351 4.107 0.417 1.000 -ATOM 1579 OH2 TIP3 1918 -18.636 14.101 -10.624 -0.834 1.520 -ATOM 1580 H1 TIP3 1918 -19.578 14.237 -10.695 0.417 1.000 -ATOM 1581 H2 TIP3 1918 -18.247 14.697 -11.307 0.417 1.000 -ATOM 1582 OH2 TIP3 1919 -5.991 5.677 1.729 -0.834 1.520 -ATOM 1583 H1 TIP3 1919 -5.731 4.939 1.201 0.417 1.000 -ATOM 1584 H2 TIP3 1919 -6.828 5.892 1.272 0.417 1.000 -ATOM 1585 OH2 TIP3 1920 -9.504 -1.732 16.274 -0.834 1.520 -ATOM 1586 H1 TIP3 1920 -9.534 -1.267 17.138 0.417 1.000 -ATOM 1587 H2 TIP3 1920 -10.283 -2.299 16.279 0.417 1.000 -ATOM 1588 OH2 TIP3 1922 2.183 -6.931 10.851 -0.834 1.520 -ATOM 1589 H1 TIP3 1922 2.615 -6.077 10.919 0.417 1.000 -ATOM 1590 H2 TIP3 1922 2.806 -7.386 10.265 0.417 1.000 -ATOM 1591 OH2 TIP3 1923 -11.890 10.743 2.992 -0.834 1.520 -ATOM 1592 H1 TIP3 1923 -12.832 10.903 2.969 0.417 1.000 -ATOM 1593 H2 TIP3 1923 -11.794 10.251 3.816 0.417 1.000 -ATOM 1594 OH2 TIP3 1924 -2.643 12.575 5.351 -0.834 1.520 -ATOM 1595 H1 TIP3 1924 -3.299 13.201 4.994 0.417 1.000 -ATOM 1596 H2 TIP3 1924 -1.975 13.149 5.772 0.417 1.000 -ATOM 1597 OH2 TIP3 1925 -15.575 1.890 18.126 -0.834 1.520 -ATOM 1598 H1 TIP3 1925 -15.751 1.639 19.106 0.417 1.000 -ATOM 1599 H2 TIP3 1925 -16.079 1.119 17.675 0.417 1.000 -ATOM 1600 OH2 TIP3 1934 -2.567 14.841 -15.855 -0.834 1.520 -ATOM 1601 H1 TIP3 1934 -3.249 15.502 -15.543 0.417 1.000 -ATOM 1602 H2 TIP3 1934 -3.028 14.395 -16.596 0.417 1.000 -ATOM 1603 OH2 TIP3 1935 -2.005 5.202 -9.577 -0.834 1.520 -ATOM 1604 H1 TIP3 1935 -1.147 5.548 -9.739 0.417 1.000 -ATOM 1605 H2 TIP3 1935 -1.842 4.442 -8.926 0.417 1.000 -ATOM 1606 OH2 TIP3 1936 -4.312 5.619 -4.974 -0.834 1.520 -ATOM 1607 H1 TIP3 1936 -5.292 5.775 -5.087 0.417 1.000 -ATOM 1608 H2 TIP3 1936 -4.274 4.688 -5.303 0.417 1.000 -ATOM 1609 OH2 TIP3 1937 -8.556 9.458 -4.532 -0.834 1.520 -ATOM 1610 H1 TIP3 1937 -8.311 9.004 -3.728 0.417 1.000 -ATOM 1611 H2 TIP3 1937 -9.486 9.271 -4.551 0.417 1.000 -ATOM 1612 OH2 TIP3 1938 -3.989 -14.895 1.062 -0.834 1.520 -ATOM 1613 H1 TIP3 1938 -3.911 -15.833 1.099 0.417 1.000 -ATOM 1614 H2 TIP3 1938 -4.866 -14.848 0.694 0.417 1.000 -ATOM 1615 OH2 TIP3 1939 -17.322 11.993 3.775 -0.834 1.520 -ATOM 1616 H1 TIP3 1939 -17.819 11.299 4.246 0.417 1.000 -ATOM 1617 H2 TIP3 1939 -18.064 12.527 3.342 0.417 1.000 -ATOM 1618 OH2 TIP3 1940 -0.923 -3.763 11.800 -0.834 1.520 -ATOM 1619 H1 TIP3 1940 -1.492 -3.933 10.961 0.417 1.000 -ATOM 1620 H2 TIP3 1940 -0.095 -3.448 11.352 0.417 1.000 -ATOM 1621 OH2 TIP3 1941 -3.741 -1.558 8.650 -0.834 1.520 -ATOM 1622 H1 TIP3 1941 -3.953 -1.183 9.527 0.417 1.000 -ATOM 1623 H2 TIP3 1941 -3.478 -0.771 8.190 0.417 1.000 -ATOM 1624 OH2 TIP3 1942 -2.708 16.170 16.891 -0.834 1.520 -ATOM 1625 H1 TIP3 1942 -2.724 16.320 17.868 0.417 1.000 -ATOM 1626 H2 TIP3 1942 -3.571 16.626 16.655 0.417 1.000 -ATOM 1627 OH2 TIP3 1943 -0.442 8.328 18.936 -0.834 1.520 -ATOM 1628 H1 TIP3 1943 -0.864 8.281 18.086 0.417 1.000 -ATOM 1629 H2 TIP3 1943 -1.186 8.573 19.541 0.417 1.000 -ATOM 1630 OH2 TIP3 1946 -11.257 18.619 12.721 -0.834 1.520 -ATOM 1631 H1 TIP3 1946 -11.058 18.923 13.577 0.417 1.000 -ATOM 1632 H2 TIP3 1946 -11.002 17.661 12.717 0.417 1.000 -ATOM 1633 OH2 TIP3 1948 -8.810 -7.634 19.187 -0.834 1.520 -ATOM 1634 H1 TIP3 1948 -8.799 -8.186 19.956 0.417 1.000 -ATOM 1635 H2 TIP3 1948 -7.880 -7.309 19.132 0.417 1.000 -ATOM 1636 OH2 TIP3 1949 -17.129 0.653 9.415 -0.834 1.520 -ATOM 1637 H1 TIP3 1949 -16.885 -0.221 9.135 0.417 1.000 -ATOM 1638 H2 TIP3 1949 -17.883 0.410 9.894 0.417 1.000 -ATOM 1639 OH2 TIP3 1950 -4.268 8.840 -15.046 -0.834 1.520 -ATOM 1640 H1 TIP3 1950 -5.208 9.023 -15.188 0.417 1.000 -ATOM 1641 H2 TIP3 1950 -4.095 8.211 -15.757 0.417 1.000 -ATOM 1642 OH2 TIP3 1952 -4.011 -0.249 -15.138 -0.834 1.520 -ATOM 1643 H1 TIP3 1952 -4.048 0.632 -15.540 0.417 1.000 -ATOM 1644 H2 TIP3 1952 -4.443 -0.790 -15.812 0.417 1.000 -ATOM 1645 OH2 TIP3 1953 -8.866 12.630 -16.006 -0.834 1.520 -ATOM 1646 H1 TIP3 1953 -9.542 12.295 -15.277 0.417 1.000 -ATOM 1647 H2 TIP3 1953 -8.833 13.577 -15.879 0.417 1.000 -ATOM 1648 OH2 TIP3 1954 -9.795 10.663 -11.399 -0.834 1.520 -ATOM 1649 H1 TIP3 1954 -9.771 10.950 -10.452 0.417 1.000 -ATOM 1650 H2 TIP3 1954 -9.056 10.051 -11.491 0.417 1.000 -ATOM 1651 OH2 TIP3 1955 -13.615 5.655 -12.517 -0.834 1.520 -ATOM 1652 H1 TIP3 1955 -13.415 5.839 -13.461 0.417 1.000 -ATOM 1653 H2 TIP3 1955 -14.275 6.337 -12.270 0.417 1.000 -ATOM 1654 OH2 TIP3 1961 -8.983 3.800 3.596 -0.834 1.520 -ATOM 1655 H1 TIP3 1961 -9.236 3.363 4.471 0.417 1.000 -ATOM 1656 H2 TIP3 1961 -8.032 4.032 3.763 0.417 1.000 -ATOM 1657 OH2 TIP3 1962 -3.147 9.921 4.396 -0.834 1.520 -ATOM 1658 H1 TIP3 1962 -3.759 10.299 3.746 0.417 1.000 -ATOM 1659 H2 TIP3 1962 -2.915 10.590 5.060 0.417 1.000 -ATOM 1660 OH2 TIP3 1963 1.960 13.969 13.910 -0.834 1.520 -ATOM 1661 H1 TIP3 1963 2.544 13.341 14.372 0.417 1.000 -ATOM 1662 H2 TIP3 1963 1.055 13.872 14.298 0.417 1.000 -ATOM 1663 OH2 TIP3 1965 -17.882 -7.577 15.784 -0.834 1.520 -ATOM 1664 H1 TIP3 1965 -18.643 -8.169 15.813 0.417 1.000 -ATOM 1665 H2 TIP3 1965 -17.560 -7.729 14.837 0.417 1.000 -ATOM 1666 OH2 TIP3 1967 -14.082 -4.166 9.930 -0.834 1.520 -ATOM 1667 H1 TIP3 1967 -13.393 -3.443 9.684 0.417 1.000 -ATOM 1668 H2 TIP3 1967 -14.172 -4.191 10.917 0.417 1.000 -ATOM 1669 OH2 TIP3 1976 0.293 14.856 -18.461 -0.834 1.520 -ATOM 1670 H1 TIP3 1976 0.002 14.771 -19.393 0.417 1.000 -ATOM 1671 H2 TIP3 1976 -0.071 14.068 -18.034 0.417 1.000 -ATOM 1672 OH2 TIP3 1977 3.688 3.202 -15.897 -0.834 1.520 -ATOM 1673 H1 TIP3 1977 3.403 2.394 -16.449 0.417 1.000 -ATOM 1674 H2 TIP3 1977 3.793 3.867 -16.621 0.417 1.000 -ATOM 1675 OH2 TIP3 1979 0.290 19.044 -4.402 -0.834 1.520 -ATOM 1676 H1 TIP3 1979 -0.666 19.056 -4.347 0.417 1.000 -ATOM 1677 H2 TIP3 1979 0.536 19.607 -5.161 0.417 1.000 -ATOM 1678 OH2 TIP3 1980 -7.219 12.593 11.693 -0.834 1.520 -ATOM 1679 H1 TIP3 1980 -8.070 12.353 11.168 0.417 1.000 -ATOM 1680 H2 TIP3 1980 -6.924 13.438 11.352 0.417 1.000 -ATOM 1681 OH2 TIP3 1982 -1.033 6.471 16.810 -0.834 1.520 -ATOM 1682 H1 TIP3 1982 -0.864 5.649 17.228 0.417 1.000 -ATOM 1683 H2 TIP3 1982 -1.290 6.229 15.951 0.417 1.000 -ATOM 1684 OH2 TIP3 1984 -10.044 11.919 17.094 -0.834 1.520 -ATOM 1685 H1 TIP3 1984 -9.839 12.883 17.257 0.417 1.000 -ATOM 1686 H2 TIP3 1984 -10.116 11.612 18.042 0.417 1.000 -ATOM 1687 OH2 TIP3 1986 -12.087 17.648 9.840 -0.834 1.520 -ATOM 1688 H1 TIP3 1986 -11.545 18.374 9.431 0.417 1.000 -ATOM 1689 H2 TIP3 1986 -12.019 17.883 10.756 0.417 1.000 -ATOM 1690 OH2 TIP3 1987 -5.591 -0.672 5.695 -0.834 1.520 -ATOM 1691 H1 TIP3 1987 -5.747 -0.940 6.626 0.417 1.000 -ATOM 1692 H2 TIP3 1987 -6.207 -1.191 5.183 0.417 1.000 -ATOM 1693 OH2 TIP3 1988 2.230 8.195 19.629 -0.834 1.520 -ATOM 1694 H1 TIP3 1988 2.614 7.339 19.356 0.417 1.000 -ATOM 1695 H2 TIP3 1988 1.337 8.266 19.164 0.417 1.000 -ATOM 1696 OH2 TIP3 1989 -0.265 17.590 15.776 -0.834 1.520 -ATOM 1697 H1 TIP3 1989 -0.976 17.031 15.347 0.417 1.000 -ATOM 1698 H2 TIP3 1989 -0.736 18.245 16.281 0.417 1.000 -ATOM 1699 OH2 TIP3 1993 2.691 9.073 -13.850 -0.834 1.520 -ATOM 1700 H1 TIP3 1993 3.249 8.638 -14.462 0.417 1.000 -ATOM 1701 H2 TIP3 1993 2.694 8.441 -13.081 0.417 1.000 -ATOM 1702 OH2 TIP3 1998 -10.258 15.426 -11.763 -0.834 1.520 -ATOM 1703 H1 TIP3 1998 -9.767 15.615 -10.952 0.417 1.000 -ATOM 1704 H2 TIP3 1998 -9.577 15.170 -12.483 0.417 1.000 -ATOM 1705 OH2 TIP3 1999 -10.521 13.182 1.768 -0.834 1.520 -ATOM 1706 H1 TIP3 1999 -11.307 13.725 1.761 0.417 1.000 -ATOM 1707 H2 TIP3 1999 -10.814 12.339 2.131 0.417 1.000 -ATOM 1708 OH2 TIP3 2002 -4.653 10.170 -7.971 -0.834 1.520 -ATOM 1709 H1 TIP3 2002 -4.265 9.648 -8.701 0.417 1.000 -ATOM 1710 H2 TIP3 2002 -3.918 10.398 -7.418 0.417 1.000 -ATOM 1711 OH2 TIP3 2003 -10.261 11.436 6.578 -0.834 1.520 -ATOM 1712 H1 TIP3 2003 -10.819 10.653 6.654 0.417 1.000 -ATOM 1713 H2 TIP3 2003 -9.862 11.376 5.663 0.417 1.000 -ATOM 1714 OH2 TIP3 2009 0.569 -0.349 18.788 -0.834 1.520 -ATOM 1715 H1 TIP3 2009 0.947 -1.166 19.205 0.417 1.000 -ATOM 1716 H2 TIP3 2009 0.693 -0.485 17.847 0.417 1.000 -ATOM 1717 OH2 TIP3 2014 -3.319 13.631 -18.200 -0.834 1.520 -ATOM 1718 H1 TIP3 2014 -3.374 13.886 -19.115 0.417 1.000 -ATOM 1719 H2 TIP3 2014 -4.118 13.213 -17.996 0.417 1.000 -ATOM 1720 OH2 TIP3 2018 -6.159 19.123 -9.510 -0.834 1.520 -ATOM 1721 H1 TIP3 2018 -5.738 19.328 -10.337 0.417 1.000 -ATOM 1722 H2 TIP3 2018 -6.643 19.915 -9.274 0.417 1.000 -ATOM 1723 OH2 TIP3 2020 0.221 11.597 7.386 -0.834 1.520 -ATOM 1724 H1 TIP3 2020 0.133 11.804 8.277 0.417 1.000 -ATOM 1725 H2 TIP3 2020 0.202 10.634 7.321 0.417 1.000 -ATOM 1726 OH2 TIP3 2021 -6.150 11.054 -4.066 -0.834 1.520 -ATOM 1727 H1 TIP3 2021 -5.824 11.533 -4.844 0.417 1.000 -ATOM 1728 H2 TIP3 2021 -6.692 10.414 -4.550 0.417 1.000 -ATOM 1729 OH2 TIP3 2022 -16.341 16.945 -6.365 -0.834 1.520 -ATOM 1730 H1 TIP3 2022 -16.631 16.694 -7.252 0.417 1.000 -ATOM 1731 H2 TIP3 2022 -15.389 16.868 -6.432 0.417 1.000 -ATOM 1732 OH2 TIP3 2025 -16.274 14.553 4.475 -0.834 1.520 -ATOM 1733 H1 TIP3 2025 -15.892 14.814 3.599 0.417 1.000 -ATOM 1734 H2 TIP3 2025 -16.633 13.696 4.203 0.417 1.000 -ATOM 1735 OH2 TIP3 2026 5.565 12.679 17.388 -0.834 1.520 -ATOM 1736 H1 TIP3 2026 6.267 12.035 17.075 0.417 1.000 -ATOM 1737 H2 TIP3 2026 5.491 13.252 16.591 0.417 1.000 -ATOM 1738 OH2 TIP3 2031 9.438 16.373 18.993 -0.834 1.520 -ATOM 1739 H1 TIP3 2031 9.976 16.804 18.343 0.417 1.000 -ATOM 1740 H2 TIP3 2031 10.075 16.399 19.741 0.417 1.000 -ATOM 1741 OH2 TIP3 2037 -7.470 17.675 -12.217 -0.834 1.520 -ATOM 1742 H1 TIP3 2037 -6.758 18.363 -12.110 0.417 1.000 -ATOM 1743 H2 TIP3 2037 -8.324 18.280 -12.242 0.417 1.000 -ATOM 1744 OH2 TIP3 2039 2.501 18.806 -19.404 -0.834 1.520 -ATOM 1745 H1 TIP3 2039 1.645 18.424 -19.104 0.417 1.000 -ATOM 1746 H2 TIP3 2039 2.458 19.666 -18.894 0.417 1.000 -ATOM 1747 OH2 TIP3 2040 -7.838 17.850 -16.009 -0.834 1.520 -ATOM 1748 H1 TIP3 2040 -7.166 18.534 -15.664 0.417 1.000 -ATOM 1749 H2 TIP3 2040 -8.684 18.141 -15.559 0.417 1.000 -ATOM 1750 OH2 TIP3 2042 1.676 16.469 -4.678 -0.834 1.520 -ATOM 1751 H1 TIP3 2042 1.602 16.118 -3.791 0.417 1.000 -ATOM 1752 H2 TIP3 2042 1.363 17.388 -4.652 0.417 1.000 -ATOM 1753 OH2 TIP3 2043 15.399 18.905 -8.489 -0.834 1.520 -ATOM 1754 H1 TIP3 2043 15.834 18.074 -8.723 0.417 1.000 -ATOM 1755 H2 TIP3 2043 15.700 19.072 -7.575 0.417 1.000 -ATOM 1756 OH2 TIP3 2044 -2.679 19.308 0.360 -0.834 1.520 -ATOM 1757 H1 TIP3 2044 -3.518 19.745 0.448 0.417 1.000 -ATOM 1758 H2 TIP3 2044 -2.015 19.946 0.715 0.417 1.000 -ATOM 1759 OH2 TIP3 2061 -2.461 18.628 -4.607 -0.834 1.520 -ATOM 1760 H1 TIP3 2061 -2.718 18.910 -5.451 0.417 1.000 -ATOM 1761 H2 TIP3 2061 -2.514 17.693 -4.700 0.417 1.000 -ATOM 1762 OH2 TIP3 2070 -11.282 15.755 13.150 -0.834 1.520 -ATOM 1763 H1 TIP3 2070 -11.730 15.309 13.875 0.417 1.000 -ATOM 1764 H2 TIP3 2070 -11.419 15.078 12.442 0.417 1.000 -ATOM 1765 OH2 TIP3 2079 -4.571 17.194 -16.923 -0.834 1.520 -ATOM 1766 H1 TIP3 2079 -5.173 16.701 -17.396 0.417 1.000 -ATOM 1767 H2 TIP3 2079 -4.744 17.007 -15.937 0.417 1.000 -ATOM 1768 OH2 TIP3 2082 2.263 18.788 -16.029 -0.834 1.520 -ATOM 1769 H1 TIP3 2082 3.127 19.127 -16.167 0.417 1.000 -ATOM 1770 H2 TIP3 2082 1.659 19.087 -16.835 0.417 1.000 -ATOM 1771 OH2 TIP3 2083 -18.479 17.571 -4.668 -0.834 1.520 -ATOM 1772 H1 TIP3 2083 -17.758 17.486 -5.349 0.417 1.000 -ATOM 1773 H2 TIP3 2083 -18.060 18.181 -3.995 0.417 1.000 -ATOM 1774 OH2 TIP3 2086 3.402 17.593 4.419 -0.834 1.520 -ATOM 1775 H1 TIP3 2086 3.148 16.633 4.549 0.417 1.000 -ATOM 1776 H2 TIP3 2086 3.908 17.810 5.218 0.417 1.000 -ATOM 1777 OH2 TIP3 2105 -11.927 8.386 -4.115 -0.834 1.520 -ATOM 1778 H1 TIP3 2105 -12.129 8.913 -4.903 0.417 1.000 -ATOM 1779 H2 TIP3 2105 -11.792 9.108 -3.427 0.417 1.000 -ATOM 1780 OH2 TIP3 2123 -9.037 -18.263 -8.210 -0.834 1.520 -ATOM 1781 H1 TIP3 2123 -9.681 -17.760 -8.666 0.417 1.000 -ATOM 1782 H2 TIP3 2123 -8.291 -17.833 -8.790 0.417 1.000 -ATOM 1783 OH2 TIP3 2127 -19.018 -12.588 5.939 -0.834 1.520 -ATOM 1784 H1 TIP3 2127 -18.758 -11.970 5.208 0.417 1.000 -ATOM 1785 H2 TIP3 2127 -19.040 -13.477 5.504 0.417 1.000 -ATOM 1786 OH2 TIP3 2133 -5.207 -15.408 18.528 -0.834 1.520 -ATOM 1787 H1 TIP3 2133 -5.550 -14.893 17.758 0.417 1.000 -ATOM 1788 H2 TIP3 2133 -5.166 -14.771 19.194 0.417 1.000 -ATOM 1789 OH2 TIP3 2147 -11.718 -12.192 7.208 -0.834 1.520 -ATOM 1790 H1 TIP3 2147 -10.787 -11.843 7.568 0.417 1.000 -ATOM 1791 H2 TIP3 2147 -12.108 -12.539 8.013 0.417 1.000 -ATOM 1792 OH2 TIP3 2151 -1.294 -18.993 18.225 -0.834 1.520 -ATOM 1793 H1 TIP3 2151 -2.025 -19.609 18.331 0.417 1.000 -ATOM 1794 H2 TIP3 2151 -1.579 -18.233 18.756 0.417 1.000 -ATOM 1795 OH2 TIP3 2155 8.045 -11.616 11.621 -0.834 1.520 -ATOM 1796 H1 TIP3 2155 7.356 -11.039 11.192 0.417 1.000 -ATOM 1797 H2 TIP3 2155 7.459 -12.073 12.301 0.417 1.000 -ATOM 1798 OH2 TIP3 2163 -14.474 -11.631 -5.142 -0.834 1.520 -ATOM 1799 H1 TIP3 2163 -15.050 -11.782 -5.928 0.417 1.000 -ATOM 1800 H2 TIP3 2163 -15.055 -11.081 -4.637 0.417 1.000 -ATOM 1801 OH2 TIP3 2165 -5.224 -15.061 -7.557 -0.834 1.520 -ATOM 1802 H1 TIP3 2165 -5.364 -14.048 -7.748 0.417 1.000 -ATOM 1803 H2 TIP3 2165 -6.135 -15.288 -7.396 0.417 1.000 -ATOM 1804 OH2 TIP3 2167 -12.471 -15.492 -18.604 -0.834 1.520 -ATOM 1805 H1 TIP3 2167 -11.687 -15.418 -19.143 0.417 1.000 -ATOM 1806 H2 TIP3 2167 -13.217 -15.489 -19.232 0.417 1.000 -ATOM 1807 OH2 TIP3 2172 -8.565 -19.164 2.059 -0.834 1.520 -ATOM 1808 H1 TIP3 2172 -8.142 -19.897 1.657 0.417 1.000 -ATOM 1809 H2 TIP3 2172 -7.781 -18.719 2.508 0.417 1.000 -ATOM 1810 OH2 TIP3 2185 -0.992 -17.803 -0.139 -0.834 1.520 -ATOM 1811 H1 TIP3 2185 -1.064 -16.914 -0.575 0.417 1.000 -ATOM 1812 H2 TIP3 2185 -0.468 -18.289 -0.839 0.417 1.000 -ATOM 1813 OH2 TIP3 2186 4.048 -14.612 -3.267 -0.834 1.520 -ATOM 1814 H1 TIP3 2186 4.171 -14.139 -2.391 0.417 1.000 -ATOM 1815 H2 TIP3 2186 3.125 -14.629 -3.401 0.417 1.000 -ATOM 1816 OH2 TIP3 2187 4.212 -18.286 -7.867 -0.834 1.520 -ATOM 1817 H1 TIP3 2187 3.582 -18.639 -7.201 0.417 1.000 -ATOM 1818 H2 TIP3 2187 4.341 -19.001 -8.475 0.417 1.000 -ATOM 1819 OH2 TIP3 2195 10.295 -12.380 9.842 -0.834 1.520 -ATOM 1820 H1 TIP3 2195 9.590 -12.662 9.214 0.417 1.000 -ATOM 1821 H2 TIP3 2195 9.871 -12.139 10.617 0.417 1.000 -ATOM 1822 OH2 TIP3 2208 12.275 -3.562 -9.308 -0.834 1.520 -ATOM 1823 H1 TIP3 2208 12.945 -4.242 -9.368 0.417 1.000 -ATOM 1824 H2 TIP3 2208 12.204 -3.287 -10.258 0.417 1.000 -ATOM 1825 OH2 TIP3 2211 -2.076 -15.320 6.419 -0.834 1.520 -ATOM 1826 H1 TIP3 2211 -1.138 -15.470 6.316 0.417 1.000 -ATOM 1827 H2 TIP3 2211 -2.169 -15.289 7.395 0.417 1.000 -ATOM 1828 OH2 TIP3 2212 1.339 -2.977 10.377 -0.834 1.520 -ATOM 1829 H1 TIP3 2212 1.748 -3.374 9.690 0.417 1.000 -ATOM 1830 H2 TIP3 2212 1.134 -2.070 10.068 0.417 1.000 -ATOM 1831 OH2 TIP3 2213 14.913 -4.945 5.651 -0.834 1.520 -ATOM 1832 H1 TIP3 2213 14.238 -4.945 6.364 0.417 1.000 -ATOM 1833 H2 TIP3 2213 15.296 -4.025 5.770 0.417 1.000 -ATOM 1834 OH2 TIP3 2217 -3.525 -10.834 13.855 -0.834 1.520 -ATOM 1835 H1 TIP3 2217 -4.559 -10.784 13.831 0.417 1.000 -ATOM 1836 H2 TIP3 2217 -3.275 -10.906 12.897 0.417 1.000 -ATOM 1837 OH2 TIP3 2219 -6.451 -13.680 16.634 -0.834 1.520 -ATOM 1838 H1 TIP3 2219 -5.971 -13.032 16.104 0.417 1.000 -ATOM 1839 H2 TIP3 2219 -6.985 -14.124 15.911 0.417 1.000 -ATOM 1840 OH2 TIP3 2227 -8.800 -15.849 -16.529 -0.834 1.520 -ATOM 1841 H1 TIP3 2227 -7.947 -15.640 -16.072 0.417 1.000 -ATOM 1842 H2 TIP3 2227 -9.428 -15.574 -15.862 0.417 1.000 -ATOM 1843 OH2 TIP3 2229 0.914 -1.712 -10.772 -0.834 1.520 -ATOM 1844 H1 TIP3 2229 1.719 -1.532 -10.181 0.417 1.000 -ATOM 1845 H2 TIP3 2229 1.059 -1.125 -11.484 0.417 1.000 -ATOM 1846 OH2 TIP3 2231 -15.116 -15.919 -6.287 -0.834 1.520 -ATOM 1847 H1 TIP3 2231 -15.030 -15.254 -5.627 0.417 1.000 -ATOM 1848 H2 TIP3 2231 -16.068 -16.025 -6.407 0.417 1.000 -ATOM 1849 OH2 TIP3 2232 -0.433 -6.220 -0.713 -0.834 1.520 -ATOM 1850 H1 TIP3 2232 0.031 -5.318 -0.607 0.417 1.000 -ATOM 1851 H2 TIP3 2232 0.202 -6.764 -1.255 0.417 1.000 -ATOM 1852 OH2 TIP3 2234 1.592 -11.839 6.970 -0.834 1.520 -ATOM 1853 H1 TIP3 2234 1.978 -12.733 7.048 0.417 1.000 -ATOM 1854 H2 TIP3 2234 1.533 -11.492 7.881 0.417 1.000 -ATOM 1855 OH2 TIP3 2235 10.123 -12.130 17.078 -0.834 1.520 -ATOM 1856 H1 TIP3 2235 10.906 -11.757 16.625 0.417 1.000 -ATOM 1857 H2 TIP3 2235 10.369 -12.269 17.997 0.417 1.000 -ATOM 1858 OH2 TIP3 2236 -18.204 -3.353 6.522 -0.834 1.520 -ATOM 1859 H1 TIP3 2236 -17.562 -2.620 6.694 0.417 1.000 -ATOM 1860 H2 TIP3 2236 -18.069 -3.974 7.267 0.417 1.000 -ATOM 1861 OH2 TIP3 2240 -3.666 -17.737 13.909 -0.834 1.520 -ATOM 1862 H1 TIP3 2240 -3.853 -18.542 14.509 0.417 1.000 -ATOM 1863 H2 TIP3 2240 -2.748 -17.919 13.641 0.417 1.000 -ATOM 1864 OH2 TIP3 2244 -6.133 -15.376 -16.046 -0.834 1.520 -ATOM 1865 H1 TIP3 2244 -5.933 -15.359 -15.096 0.417 1.000 -ATOM 1866 H2 TIP3 2244 -5.878 -14.506 -16.352 0.417 1.000 -ATOM 1867 OH2 TIP3 2250 -2.578 -16.600 -15.798 -0.834 1.520 -ATOM 1868 H1 TIP3 2250 -1.805 -16.566 -16.402 0.417 1.000 -ATOM 1869 H2 TIP3 2250 -2.603 -17.575 -15.593 0.417 1.000 -ATOM 1870 OH2 TIP3 2251 -3.309 -2.084 -13.241 -0.834 1.520 -ATOM 1871 H1 TIP3 2251 -3.594 -1.447 -13.908 0.417 1.000 -ATOM 1872 H2 TIP3 2251 -3.185 -1.474 -12.418 0.417 1.000 -ATOM 1873 OH2 TIP3 2253 -1.807 -2.030 -10.250 -0.834 1.520 -ATOM 1874 H1 TIP3 2253 -2.042 -1.089 -10.167 0.417 1.000 -ATOM 1875 H2 TIP3 2253 -0.849 -2.010 -10.353 0.417 1.000 -ATOM 1876 OH2 TIP3 2254 -2.573 -11.540 -4.938 -0.834 1.520 -ATOM 1877 H1 TIP3 2254 -3.541 -11.477 -4.957 0.417 1.000 -ATOM 1878 H2 TIP3 2254 -2.363 -12.231 -5.612 0.417 1.000 -ATOM 1879 OH2 TIP3 2256 -4.655 -9.948 7.391 -0.834 1.520 -ATOM 1880 H1 TIP3 2256 -3.854 -10.164 7.773 0.417 1.000 -ATOM 1881 H2 TIP3 2256 -5.349 -10.127 8.112 0.417 1.000 -ATOM 1882 OH2 TIP3 2257 -10.328 -19.412 4.858 -0.834 1.520 -ATOM 1883 H1 TIP3 2257 -11.052 -19.706 5.377 0.417 1.000 -ATOM 1884 H2 TIP3 2257 -10.659 -18.594 4.518 0.417 1.000 -ATOM 1885 OH2 TIP3 2258 2.420 -13.866 14.132 -0.834 1.520 -ATOM 1886 H1 TIP3 2258 1.893 -14.665 14.236 0.417 1.000 -ATOM 1887 H2 TIP3 2258 3.154 -14.232 13.532 0.417 1.000 -ATOM 1888 OH2 TIP3 2269 0.640 -12.012 0.638 -0.834 1.520 -ATOM 1889 H1 TIP3 2269 0.659 -12.056 -0.305 0.417 1.000 -ATOM 1890 H2 TIP3 2269 1.535 -11.696 0.911 0.417 1.000 -ATOM 1891 OH2 TIP3 2270 -16.826 -8.841 -14.046 -0.834 1.520 -ATOM 1892 H1 TIP3 2270 -16.096 -8.927 -14.648 0.417 1.000 -ATOM 1893 H2 TIP3 2270 -16.796 -7.896 -13.871 0.417 1.000 -ATOM 1894 OH2 TIP3 2271 4.035 -8.563 -9.058 -0.834 1.520 -ATOM 1895 H1 TIP3 2271 4.407 -7.653 -9.161 0.417 1.000 -ATOM 1896 H2 TIP3 2271 3.483 -8.658 -9.848 0.417 1.000 -ATOM 1897 OH2 TIP3 2272 -7.078 -17.089 -2.588 -0.834 1.520 -ATOM 1898 H1 TIP3 2272 -7.579 -17.569 -1.911 0.417 1.000 -ATOM 1899 H2 TIP3 2272 -7.760 -17.004 -3.299 0.417 1.000 -ATOM 1900 OH2 TIP3 2273 9.572 4.909 -1.184 -0.834 1.520 -ATOM 1901 H1 TIP3 2273 10.207 5.395 -0.688 0.417 1.000 -ATOM 1902 H2 TIP3 2273 10.024 4.065 -1.256 0.417 1.000 -ATOM 1903 OH2 TIP3 2274 -6.245 10.376 -1.340 -0.834 1.520 -ATOM 1904 H1 TIP3 2274 -7.199 10.330 -1.190 0.417 1.000 -ATOM 1905 H2 TIP3 2274 -6.116 10.626 -2.222 0.417 1.000 -ATOM 1906 OH2 TIP3 2275 0.843 -4.997 -11.408 -0.834 1.520 -ATOM 1907 H1 TIP3 2275 1.616 -4.345 -11.476 0.417 1.000 -ATOM 1908 H2 TIP3 2275 0.048 -4.481 -11.445 0.417 1.000 -ATOM 1909 OH2 TIP3 2276 2.830 14.458 0.419 -0.834 1.520 -ATOM 1910 H1 TIP3 2276 3.519 14.206 1.114 0.417 1.000 -ATOM 1911 H2 TIP3 2276 2.353 15.136 0.871 0.417 1.000 -ATOM 1912 OH2 TIP3 2277 -6.356 -12.039 0.946 -0.834 1.520 -ATOM 1913 H1 TIP3 2277 -6.817 -12.842 0.680 0.417 1.000 -ATOM 1914 H2 TIP3 2277 -6.982 -11.685 1.687 0.417 1.000 -ATOM 1915 OH2 TIP3 2278 2.665 -14.370 6.951 -0.834 1.520 -ATOM 1916 H1 TIP3 2278 2.656 -15.139 7.490 0.417 1.000 -ATOM 1917 H2 TIP3 2278 3.484 -14.508 6.420 0.417 1.000 -ATOM 1918 OH2 TIP3 2280 -13.388 -16.604 -2.958 -0.834 1.520 -ATOM 1919 H1 TIP3 2280 -13.862 -17.013 -2.170 0.417 1.000 -ATOM 1920 H2 TIP3 2280 -13.752 -17.117 -3.694 0.417 1.000 -ATOM 1921 OH2 TIP3 2281 -10.082 -8.222 10.774 -0.834 1.520 -ATOM 1922 H1 TIP3 2281 -10.248 -7.298 10.633 0.417 1.000 -ATOM 1923 H2 TIP3 2281 -10.696 -8.689 10.145 0.417 1.000 -ATOM 1924 OH2 TIP3 2283 -14.205 -4.682 17.290 -0.834 1.520 -ATOM 1925 H1 TIP3 2283 -15.161 -4.549 17.478 0.417 1.000 -ATOM 1926 H2 TIP3 2283 -13.947 -5.411 17.884 0.417 1.000 -ATOM 1927 OH2 TIP3 2284 -5.706 -3.601 13.982 -0.834 1.520 -ATOM 1928 H1 TIP3 2284 -5.784 -2.691 13.609 0.417 1.000 -ATOM 1929 H2 TIP3 2284 -4.729 -3.777 13.919 0.417 1.000 -ATOM 1930 OH2 TIP3 2286 -11.658 -3.462 17.080 -0.834 1.520 -ATOM 1931 H1 TIP3 2286 -11.133 -4.147 17.501 0.417 1.000 -ATOM 1932 H2 TIP3 2286 -12.579 -3.840 16.954 0.417 1.000 -ATOM 1933 OH2 TIP3 2288 -16.372 -4.547 -10.316 -0.834 1.520 -ATOM 1934 H1 TIP3 2288 -16.396 -3.632 -10.635 0.417 1.000 -ATOM 1935 H2 TIP3 2288 -16.734 -4.522 -9.408 0.417 1.000 -ATOM 1936 OH2 TIP3 2290 -18.388 12.495 -15.466 -0.834 1.520 -ATOM 1937 H1 TIP3 2290 -18.076 11.828 -14.819 0.417 1.000 -ATOM 1938 H2 TIP3 2290 -19.322 12.557 -15.269 0.417 1.000 -ATOM 1939 OH2 TIP3 2292 -0.540 -14.409 -5.555 -0.834 1.520 -ATOM 1940 H1 TIP3 2292 0.196 -13.750 -5.355 0.417 1.000 -ATOM 1941 H2 TIP3 2292 -0.906 -14.125 -6.419 0.417 1.000 -ATOM 1942 OH2 TIP3 2293 -18.359 -1.736 -11.864 -0.834 1.520 -ATOM 1943 H1 TIP3 2293 -19.245 -1.510 -11.992 0.417 1.000 -ATOM 1944 H2 TIP3 2293 -18.019 -0.997 -11.335 0.417 1.000 -ATOM 1945 OH2 TIP3 2294 9.495 3.138 -4.110 -0.834 1.520 -ATOM 1946 H1 TIP3 2294 9.139 2.254 -3.841 0.417 1.000 -ATOM 1947 H2 TIP3 2294 10.438 2.912 -4.208 0.417 1.000 -ATOM 1948 OH2 TIP3 2295 -11.284 -19.181 1.571 -0.834 1.520 -ATOM 1949 H1 TIP3 2295 -11.641 -19.601 2.460 0.417 1.000 -ATOM 1950 H2 TIP3 2295 -10.378 -18.954 1.690 0.417 1.000 -ATOM 1951 OH2 TIP3 2296 7.308 -9.359 -7.457 -0.834 1.520 -ATOM 1952 H1 TIP3 2296 7.329 -9.716 -8.400 0.417 1.000 -ATOM 1953 H2 TIP3 2296 7.336 -8.403 -7.626 0.417 1.000 -ATOM 1954 OH2 TIP3 2297 3.117 -0.907 8.405 -0.834 1.520 -ATOM 1955 H1 TIP3 2297 2.229 -0.819 8.079 0.417 1.000 -ATOM 1956 H2 TIP3 2297 3.353 -0.032 8.715 0.417 1.000 -ATOM 1957 OH2 TIP3 2298 3.212 -14.197 10.846 -0.834 1.520 -ATOM 1958 H1 TIP3 2298 3.803 -14.486 11.557 0.417 1.000 -ATOM 1959 H2 TIP3 2298 3.808 -13.865 10.158 0.417 1.000 -ATOM 1960 OH2 TIP3 2299 -6.566 5.337 13.390 -0.834 1.520 -ATOM 1961 H1 TIP3 2299 -6.418 4.364 13.530 0.417 1.000 -ATOM 1962 H2 TIP3 2299 -7.137 5.449 12.588 0.417 1.000 -ATOM 1963 OH2 TIP3 2300 -5.531 1.877 4.235 -0.834 1.520 -ATOM 1964 H1 TIP3 2300 -4.676 1.872 3.803 0.417 1.000 -ATOM 1965 H2 TIP3 2300 -5.575 0.993 4.640 0.417 1.000 -ATOM 1966 OH2 TIP3 2301 -9.635 -10.289 13.459 -0.834 1.520 -ATOM 1967 H1 TIP3 2301 -9.266 -10.294 12.552 0.417 1.000 -ATOM 1968 H2 TIP3 2301 -9.163 -9.574 13.909 0.417 1.000 -ATOM 1969 OH2 TIP3 2302 -4.891 -6.546 4.094 -0.834 1.520 -ATOM 1970 H1 TIP3 2302 -4.467 -7.374 4.413 0.417 1.000 -ATOM 1971 H2 TIP3 2302 -4.218 -6.101 3.586 0.417 1.000 -ATOM 1972 OH2 TIP3 2309 -5.731 -9.999 -15.631 -0.834 1.520 -ATOM 1973 H1 TIP3 2309 -5.027 -9.472 -15.248 0.417 1.000 -ATOM 1974 H2 TIP3 2309 -6.310 -10.141 -14.908 0.417 1.000 -ATOM 1975 OH2 TIP3 2311 -5.309 -6.183 -10.950 -0.834 1.520 -ATOM 1976 H1 TIP3 2311 -4.838 -5.628 -11.615 0.417 1.000 -ATOM 1977 H2 TIP3 2311 -6.179 -5.750 -10.887 0.417 1.000 -ATOM 1978 OH2 TIP3 2313 8.308 -12.249 -8.799 -0.834 1.520 -ATOM 1979 H1 TIP3 2313 8.564 -13.175 -9.084 0.417 1.000 -ATOM 1980 H2 TIP3 2313 8.125 -12.349 -7.860 0.417 1.000 -ATOM 1981 OH2 TIP3 2315 -0.749 4.031 -4.981 -0.834 1.520 -ATOM 1982 H1 TIP3 2315 -0.584 4.218 -4.033 0.417 1.000 -ATOM 1983 H2 TIP3 2315 0.120 3.940 -5.437 0.417 1.000 -ATOM 1984 OH2 TIP3 2316 -7.727 -14.576 -9.596 -0.834 1.520 -ATOM 1985 H1 TIP3 2316 -7.616 -15.528 -9.790 0.417 1.000 -ATOM 1986 H2 TIP3 2316 -6.847 -14.286 -9.499 0.417 1.000 -ATOM 1987 OH2 TIP3 2317 -16.241 -6.747 -4.857 -0.834 1.520 -ATOM 1988 H1 TIP3 2317 -16.448 -6.454 -3.941 0.417 1.000 -ATOM 1989 H2 TIP3 2317 -17.138 -6.679 -5.260 0.417 1.000 -ATOM 1990 OH2 TIP3 2318 -9.711 4.036 -17.707 -0.834 1.520 -ATOM 1991 H1 TIP3 2318 -9.653 4.942 -17.982 0.417 1.000 -ATOM 1992 H2 TIP3 2318 -8.811 3.864 -17.445 0.417 1.000 -ATOM 1993 OH2 TIP3 2319 -1.292 0.702 -3.058 -0.834 1.520 -ATOM 1994 H1 TIP3 2319 -1.015 1.641 -2.839 0.417 1.000 -ATOM 1995 H2 TIP3 2319 -1.005 0.185 -2.291 0.417 1.000 -ATOM 1996 OH2 TIP3 2320 -1.861 5.548 2.658 -0.834 1.520 -ATOM 1997 H1 TIP3 2320 -2.466 6.233 2.529 0.417 1.000 -ATOM 1998 H2 TIP3 2320 -1.908 5.149 1.779 0.417 1.000 -ATOM 1999 OH2 TIP3 2321 -11.333 5.901 10.752 -0.834 1.520 -ATOM 2000 H1 TIP3 2321 -11.686 5.203 10.087 0.417 1.000 -ATOM 2001 H2 TIP3 2321 -12.053 5.888 11.430 0.417 1.000 -ATOM 2002 OH2 TIP3 2322 5.181 -6.033 8.608 -0.834 1.520 -ATOM 2003 H1 TIP3 2322 5.211 -6.094 9.597 0.417 1.000 -ATOM 2004 H2 TIP3 2322 4.539 -6.789 8.454 0.417 1.000 -ATOM 2005 OH2 TIP3 2326 -6.455 -7.376 16.168 -0.834 1.520 -ATOM 2006 H1 TIP3 2326 -6.485 -6.980 17.055 0.417 1.000 -ATOM 2007 H2 TIP3 2326 -5.799 -8.127 16.247 0.417 1.000 -ATOM 2008 OH2 TIP3 2327 -15.918 4.655 18.495 -0.834 1.520 -ATOM 2009 H1 TIP3 2327 -15.637 3.688 18.391 0.417 1.000 -ATOM 2010 H2 TIP3 2327 -16.860 4.570 18.697 0.417 1.000 -ATOM 2011 OH2 TIP3 2329 5.575 -3.241 -18.058 -0.834 1.520 -ATOM 2012 H1 TIP3 2329 5.444 -3.693 -17.180 0.417 1.000 -ATOM 2013 H2 TIP3 2329 5.764 -4.038 -18.645 0.417 1.000 -ATOM 2014 OH2 TIP3 2331 7.117 -6.596 -12.875 -0.834 1.520 -ATOM 2015 H1 TIP3 2331 7.014 -6.658 -11.921 0.417 1.000 -ATOM 2016 H2 TIP3 2331 7.894 -7.127 -13.063 0.417 1.000 -ATOM 2017 OH2 TIP3 2332 6.050 -1.247 -9.554 -0.834 1.520 -ATOM 2018 H1 TIP3 2332 5.900 -0.327 -9.635 0.417 1.000 -ATOM 2019 H2 TIP3 2332 6.455 -1.484 -10.453 0.417 1.000 -ATOM 2020 OH2 TIP3 2333 -6.898 9.392 -13.686 -0.834 1.520 -ATOM 2021 H1 TIP3 2333 -6.796 10.236 -14.050 0.417 1.000 -ATOM 2022 H2 TIP3 2333 -6.727 9.565 -12.739 0.417 1.000 -ATOM 2023 OH2 TIP3 2335 -12.681 -5.568 -4.985 -0.834 1.520 -ATOM 2024 H1 TIP3 2335 -12.367 -4.681 -5.258 0.417 1.000 -ATOM 2025 H2 TIP3 2335 -12.298 -5.697 -4.067 0.417 1.000 -ATOM 2026 OH2 TIP3 2336 3.587 13.492 -14.424 -0.834 1.520 -ATOM 2027 H1 TIP3 2336 2.950 13.226 -15.085 0.417 1.000 -ATOM 2028 H2 TIP3 2336 3.460 14.481 -14.329 0.417 1.000 -ATOM 2029 OH2 TIP3 2337 -0.839 15.629 -6.246 -0.834 1.520 -ATOM 2030 H1 TIP3 2337 -1.488 15.731 -5.545 0.417 1.000 -ATOM 2031 H2 TIP3 2337 0.026 15.799 -5.787 0.417 1.000 -ATOM 2032 OH2 TIP3 2338 -1.195 12.960 -7.480 -0.834 1.520 -ATOM 2033 H1 TIP3 2338 -0.703 12.167 -7.218 0.417 1.000 -ATOM 2034 H2 TIP3 2338 -0.445 13.610 -7.281 0.417 1.000 -ATOM 2035 OH2 TIP3 2339 -2.997 2.235 -0.803 -0.834 1.520 -ATOM 2036 H1 TIP3 2339 -2.606 1.585 -1.428 0.417 1.000 -ATOM 2037 H2 TIP3 2339 -3.371 1.813 -0.013 0.417 1.000 -ATOM 2038 OH2 TIP3 2340 -8.728 3.285 10.928 -0.834 1.520 -ATOM 2039 H1 TIP3 2340 -8.630 4.190 11.223 0.417 1.000 -ATOM 2040 H2 TIP3 2340 -8.844 3.343 9.964 0.417 1.000 -ATOM 2041 OH2 TIP3 2342 -4.171 -0.461 11.081 -0.834 1.520 -ATOM 2042 H1 TIP3 2342 -4.438 0.513 11.007 0.417 1.000 -ATOM 2043 H2 TIP3 2342 -4.592 -0.785 11.931 0.417 1.000 -ATOM 2044 OH2 TIP3 2345 -6.539 -4.232 6.741 -0.834 1.520 -ATOM 2045 H1 TIP3 2345 -6.391 -3.634 7.510 0.417 1.000 -ATOM 2046 H2 TIP3 2345 -6.600 -5.129 7.165 0.417 1.000 -ATOM 2047 OH2 TIP3 2346 4.597 -9.421 13.207 -0.834 1.520 -ATOM 2048 H1 TIP3 2346 4.222 -8.579 13.469 0.417 1.000 -ATOM 2049 H2 TIP3 2346 5.117 -9.691 13.974 0.417 1.000 -ATOM 2050 OH2 TIP3 2351 -2.710 -0.708 -17.641 -0.834 1.520 -ATOM 2051 H1 TIP3 2351 -2.429 -1.587 -17.928 0.417 1.000 -ATOM 2052 H2 TIP3 2351 -2.752 -0.755 -16.654 0.417 1.000 -ATOM 2053 OH2 TIP3 2352 -1.234 3.787 -16.016 -0.834 1.520 -ATOM 2054 H1 TIP3 2352 -1.015 3.007 -16.543 0.417 1.000 -ATOM 2055 H2 TIP3 2352 -1.564 3.402 -15.218 0.417 1.000 -ATOM 2056 OH2 TIP3 2354 -3.137 11.310 -12.657 -0.834 1.520 -ATOM 2057 H1 TIP3 2354 -2.921 12.272 -12.729 0.417 1.000 -ATOM 2058 H2 TIP3 2354 -2.289 10.861 -12.781 0.417 1.000 -ATOM 2059 OH2 TIP3 2355 -0.934 -3.532 -13.203 -0.834 1.520 -ATOM 2060 H1 TIP3 2355 -1.700 -3.070 -12.811 0.417 1.000 -ATOM 2061 H2 TIP3 2355 -1.256 -3.708 -14.117 0.417 1.000 -ATOM 2062 OH2 TIP3 2357 -16.883 -8.181 -9.930 -0.834 1.520 -ATOM 2063 H1 TIP3 2357 -16.510 -7.504 -10.477 0.417 1.000 -ATOM 2064 H2 TIP3 2357 -16.063 -8.417 -9.461 0.417 1.000 -ATOM 2065 OH2 TIP3 2358 -19.451 -3.607 -9.634 -0.834 1.520 -ATOM 2066 H1 TIP3 2358 -18.708 -3.678 -8.984 0.417 1.000 -ATOM 2067 H2 TIP3 2358 -19.335 -2.717 -10.028 0.417 1.000 -ATOM 2068 OH2 TIP3 2359 1.404 3.372 -6.577 -0.834 1.520 -ATOM 2069 H1 TIP3 2359 2.157 3.832 -6.909 0.417 1.000 -ATOM 2070 H2 TIP3 2359 1.702 2.597 -6.064 0.417 1.000 -ATOM 2071 OH2 TIP3 2360 -9.507 4.964 7.613 -0.834 1.520 -ATOM 2072 H1 TIP3 2360 -8.860 4.305 7.322 0.417 1.000 -ATOM 2073 H2 TIP3 2360 -10.284 4.459 7.898 0.417 1.000 -ATOM 2074 OH2 TIP3 2361 -8.898 7.719 13.804 -0.834 1.520 -ATOM 2075 H1 TIP3 2361 -8.363 8.501 13.492 0.417 1.000 -ATOM 2076 H2 TIP3 2361 -9.724 8.173 14.077 0.417 1.000 -ATOM 2077 OH2 TIP3 2362 -2.377 -15.037 9.019 -0.834 1.520 -ATOM 2078 H1 TIP3 2362 -1.536 -15.413 9.324 0.417 1.000 -ATOM 2079 H2 TIP3 2362 -2.782 -14.477 9.781 0.417 1.000 -ATOM 2080 OH2 TIP3 2363 6.706 -6.590 17.116 -0.834 1.520 -ATOM 2081 H1 TIP3 2363 7.228 -6.121 16.472 0.417 1.000 -ATOM 2082 H2 TIP3 2363 7.053 -7.484 17.045 0.417 1.000 -ATOM 2083 OH2 TIP3 2364 0.166 13.918 15.942 -0.834 1.520 -ATOM 2084 H1 TIP3 2364 1.019 13.915 16.533 0.417 1.000 -ATOM 2085 H2 TIP3 2364 -0.376 14.719 16.250 0.417 1.000 -ATOM 2086 OH2 TIP3 2365 10.249 -3.744 9.525 -0.834 1.520 -ATOM 2087 H1 TIP3 2365 9.874 -2.993 9.132 0.417 1.000 -ATOM 2088 H2 TIP3 2365 9.562 -4.176 10.012 0.417 1.000 -ATOM 2089 OH2 TIP3 2367 -2.385 10.502 16.418 -0.834 1.520 -ATOM 2090 H1 TIP3 2367 -2.516 10.146 15.556 0.417 1.000 -ATOM 2091 H2 TIP3 2367 -2.164 11.456 16.298 0.417 1.000 -ATOM 2092 OH2 TIP3 2375 8.380 1.948 3.685 -0.834 1.520 -ATOM 2093 H1 TIP3 2375 7.883 1.107 3.699 0.417 1.000 -ATOM 2094 H2 TIP3 2375 9.311 1.736 3.879 0.417 1.000 -ATOM 2095 OH2 TIP3 2376 -3.064 6.039 -16.049 -0.834 1.520 -ATOM 2096 H1 TIP3 2376 -3.448 5.515 -15.384 0.417 1.000 -ATOM 2097 H2 TIP3 2376 -2.269 5.524 -16.316 0.417 1.000 -ATOM 2098 OH2 TIP3 2377 -2.653 -13.106 -7.290 -0.834 1.520 -ATOM 2099 H1 TIP3 2377 -2.965 -12.719 -8.069 0.417 1.000 -ATOM 2100 H2 TIP3 2377 -2.312 -13.953 -7.614 0.417 1.000 -ATOM 2101 OH2 TIP3 2379 -0.703 7.146 9.355 -0.834 1.520 -ATOM 2102 H1 TIP3 2379 -0.088 6.961 10.059 0.417 1.000 -ATOM 2103 H2 TIP3 2379 -1.415 6.521 9.489 0.417 1.000 -ATOM 2104 OH2 TIP3 2380 -4.189 -4.711 -12.800 -0.834 1.520 -ATOM 2105 H1 TIP3 2380 -4.386 -5.031 -13.691 0.417 1.000 -ATOM 2106 H2 TIP3 2380 -3.976 -3.802 -13.013 0.417 1.000 -ATOM 2107 OH2 TIP3 2381 -1.066 0.840 13.368 -0.834 1.520 -ATOM 2108 H1 TIP3 2381 -1.229 -0.094 13.498 0.417 1.000 -ATOM 2109 H2 TIP3 2381 -1.088 1.268 14.242 0.417 1.000 -ATOM 2110 OH2 TIP3 2382 5.578 17.279 2.344 -0.834 1.520 -ATOM 2111 H1 TIP3 2382 4.837 17.870 2.407 0.417 1.000 -ATOM 2112 H2 TIP3 2382 5.510 16.800 3.195 0.417 1.000 -ATOM 2113 OH2 TIP3 2383 -9.446 11.776 9.968 -0.834 1.520 -ATOM 2114 H1 TIP3 2383 -9.269 10.864 9.643 0.417 1.000 -ATOM 2115 H2 TIP3 2383 -9.022 12.349 9.323 0.417 1.000 -ATOM 2116 OH2 TIP3 2385 -6.807 14.917 10.198 -0.834 1.520 -ATOM 2117 H1 TIP3 2385 -6.788 14.153 9.673 0.417 1.000 -ATOM 2118 H2 TIP3 2385 -6.598 15.582 9.559 0.417 1.000 -ATOM 2119 OH2 TIP3 2388 5.526 10.079 11.561 -0.834 1.520 -ATOM 2120 H1 TIP3 2388 4.871 10.095 12.202 0.417 1.000 -ATOM 2121 H2 TIP3 2388 6.295 9.737 12.042 0.417 1.000 -ATOM 2122 OH2 TIP3 2397 -12.706 10.336 -15.568 -0.834 1.520 -ATOM 2123 H1 TIP3 2397 -12.458 11.062 -15.086 0.417 1.000 -ATOM 2124 H2 TIP3 2397 -11.880 9.814 -15.585 0.417 1.000 -ATOM 2125 OH2 TIP3 2398 1.177 10.370 -0.880 -0.834 1.520 -ATOM 2126 H1 TIP3 2398 1.205 11.325 -0.802 0.417 1.000 -ATOM 2127 H2 TIP3 2398 0.266 10.095 -0.620 0.417 1.000 -ATOM 2128 OH2 TIP3 2399 -8.446 18.325 -3.695 -0.834 1.520 -ATOM 2129 H1 TIP3 2399 -8.052 17.932 -2.845 0.417 1.000 -ATOM 2130 H2 TIP3 2399 -7.608 18.669 -4.118 0.417 1.000 -ATOM 2131 OH2 TIP3 2400 -5.634 18.228 -4.039 -0.834 1.520 -ATOM 2132 H1 TIP3 2400 -4.768 18.021 -4.330 0.417 1.000 -ATOM 2133 H2 TIP3 2400 -5.924 17.386 -3.652 0.417 1.000 -ATOM 2134 OH2 TIP3 2402 -9.382 2.201 6.019 -0.834 1.520 -ATOM 2135 H1 TIP3 2402 -10.051 2.230 6.749 0.417 1.000 -ATOM 2136 H2 TIP3 2402 -9.057 1.315 6.136 0.417 1.000 -ATOM 2137 OH2 TIP3 2404 -1.613 15.661 14.268 -0.834 1.520 -ATOM 2138 H1 TIP3 2404 -2.181 14.999 14.712 0.417 1.000 -ATOM 2139 H2 TIP3 2404 -1.772 15.487 13.351 0.417 1.000 -ATOM 2140 OH2 TIP3 2405 -15.263 6.898 9.253 -0.834 1.520 -ATOM 2141 H1 TIP3 2405 -16.010 7.512 9.251 0.417 1.000 -ATOM 2142 H2 TIP3 2405 -14.483 7.467 9.109 0.417 1.000 -ATOM 2143 OH2 TIP3 2406 -1.501 -2.004 14.059 -0.834 1.520 -ATOM 2144 H1 TIP3 2406 -0.959 -2.471 14.748 0.417 1.000 -ATOM 2145 H2 TIP3 2406 -1.464 -2.611 13.319 0.417 1.000 -ATOM 2146 OH2 TIP3 2407 8.179 -0.534 16.622 -0.834 1.520 -ATOM 2147 H1 TIP3 2407 7.417 -0.869 16.267 0.417 1.000 -ATOM 2148 H2 TIP3 2407 8.469 0.165 15.942 0.417 1.000 -ATOM 2149 OH2 TIP3 2416 12.086 16.644 -8.961 -0.834 1.520 -ATOM 2150 H1 TIP3 2416 11.700 15.888 -8.421 0.417 1.000 -ATOM 2151 H2 TIP3 2416 11.393 16.767 -9.661 0.417 1.000 -ATOM 2152 OH2 TIP3 2418 4.789 2.892 1.785 -0.834 1.520 -ATOM 2153 H1 TIP3 2418 4.614 1.960 1.659 0.417 1.000 -ATOM 2154 H2 TIP3 2418 4.930 3.181 0.799 0.417 1.000 -ATOM 2155 OH2 TIP3 2419 -0.855 12.320 -17.951 -0.834 1.520 -ATOM 2156 H1 TIP3 2419 -1.012 11.387 -18.018 0.417 1.000 -ATOM 2157 H2 TIP3 2419 -1.748 12.669 -17.667 0.417 1.000 -ATOM 2158 OH2 TIP3 2420 9.550 15.456 2.808 -0.834 1.520 -ATOM 2159 H1 TIP3 2420 8.745 15.698 2.368 0.417 1.000 -ATOM 2160 H2 TIP3 2420 9.944 16.350 3.078 0.417 1.000 -ATOM 2161 OH2 TIP3 2421 -10.363 11.703 -7.639 -0.834 1.520 -ATOM 2162 H1 TIP3 2421 -10.449 12.630 -7.969 0.417 1.000 -ATOM 2163 H2 TIP3 2421 -9.623 11.806 -6.973 0.417 1.000 -ATOM 2164 OH2 TIP3 2422 -4.878 14.283 4.320 -0.834 1.520 -ATOM 2165 H1 TIP3 2422 -5.722 14.109 3.835 0.417 1.000 -ATOM 2166 H2 TIP3 2422 -4.936 15.157 4.611 0.417 1.000 -ATOM 2167 OH2 TIP3 2424 7.445 16.533 16.119 -0.834 1.520 -ATOM 2168 H1 TIP3 2424 7.227 17.325 16.603 0.417 1.000 -ATOM 2169 H2 TIP3 2424 6.724 15.919 16.445 0.417 1.000 -ATOM 2170 OH2 TIP3 2427 11.792 5.068 17.401 -0.834 1.520 -ATOM 2171 H1 TIP3 2427 12.217 5.675 17.997 0.417 1.000 -ATOM 2172 H2 TIP3 2427 12.136 4.216 17.746 0.417 1.000 -ATOM 2173 OH2 TIP3 2436 -3.581 11.379 -15.573 -0.834 1.520 -ATOM 2174 H1 TIP3 2436 -3.497 11.761 -14.716 0.417 1.000 -ATOM 2175 H2 TIP3 2436 -3.663 10.424 -15.426 0.417 1.000 -ATOM 2176 OH2 TIP3 2439 1.444 13.518 3.608 -0.834 1.520 -ATOM 2177 H1 TIP3 2439 2.227 13.781 4.139 0.417 1.000 -ATOM 2178 H2 TIP3 2439 1.497 12.499 3.687 0.417 1.000 -ATOM 2179 OH2 TIP3 2442 1.058 18.464 -1.607 -0.834 1.520 -ATOM 2180 H1 TIP3 2442 0.985 19.446 -1.444 0.417 1.000 -ATOM 2181 H2 TIP3 2442 0.680 18.330 -2.499 0.417 1.000 -ATOM 2182 OH2 TIP3 2443 -5.271 16.895 5.412 -0.834 1.520 -ATOM 2183 H1 TIP3 2443 -5.222 17.735 4.944 0.417 1.000 -ATOM 2184 H2 TIP3 2443 -6.171 16.879 5.716 0.417 1.000 -ATOM 2185 OH2 TIP3 2444 -0.416 8.718 2.611 -0.834 1.520 -ATOM 2186 H1 TIP3 2444 -0.112 8.010 3.173 0.417 1.000 -ATOM 2187 H2 TIP3 2444 -1.398 8.710 2.688 0.417 1.000 -ATOM 2188 OH2 TIP3 2445 4.514 8.408 8.576 -0.834 1.520 -ATOM 2189 H1 TIP3 2445 4.242 9.169 8.106 0.417 1.000 -ATOM 2190 H2 TIP3 2445 4.628 8.696 9.512 0.417 1.000 -ATOM 2191 OH2 TIP3 2449 -3.618 -0.083 17.413 -0.834 1.520 -ATOM 2192 H1 TIP3 2449 -3.813 -0.936 16.955 0.417 1.000 -ATOM 2193 H2 TIP3 2449 -3.551 -0.321 18.329 0.417 1.000 -ATOM 2194 OH2 TIP3 2450 0.487 16.609 18.307 -0.834 1.520 -ATOM 2195 H1 TIP3 2450 0.542 16.359 17.338 0.417 1.000 -ATOM 2196 H2 TIP3 2450 -0.079 17.406 18.228 0.417 1.000 -ATOM 2197 OH2 TIP3 2458 4.953 17.068 -17.085 -0.834 1.520 -ATOM 2198 H1 TIP3 2458 5.615 16.967 -17.798 0.417 1.000 -ATOM 2199 H2 TIP3 2458 4.145 16.516 -17.433 0.417 1.000 -ATOM 2200 OH2 TIP3 2460 3.392 16.149 -14.679 -0.834 1.520 -ATOM 2201 H1 TIP3 2460 2.454 16.253 -14.966 0.417 1.000 -ATOM 2202 H2 TIP3 2460 3.773 16.596 -15.443 0.417 1.000 -ATOM 2203 OH2 TIP3 2463 -10.363 16.331 -0.396 -0.834 1.520 -ATOM 2204 H1 TIP3 2463 -9.532 16.186 -0.017 0.417 1.000 -ATOM 2205 H2 TIP3 2463 -10.348 15.680 -1.118 0.417 1.000 -ATOM 2206 OH2 TIP3 2464 -6.426 11.494 5.789 -0.834 1.520 -ATOM 2207 H1 TIP3 2464 -5.944 11.618 5.000 0.417 1.000 -ATOM 2208 H2 TIP3 2464 -5.751 11.043 6.314 0.417 1.000 -ATOM 2209 OH2 TIP3 2465 5.035 18.136 -0.832 -0.834 1.520 -ATOM 2210 H1 TIP3 2465 4.860 17.789 0.025 0.417 1.000 -ATOM 2211 H2 TIP3 2465 4.744 19.054 -0.665 0.417 1.000 -ATOM 2212 OH2 TIP3 2466 3.435 16.999 18.783 -0.834 1.520 -ATOM 2213 H1 TIP3 2466 2.571 16.794 18.441 0.417 1.000 -ATOM 2214 H2 TIP3 2466 3.944 16.799 18.018 0.417 1.000 -ATOM 2215 OH2 TIP3 2467 -4.399 17.916 13.849 -0.834 1.520 -ATOM 2216 H1 TIP3 2467 -4.353 17.865 12.892 0.417 1.000 -ATOM 2217 H2 TIP3 2467 -4.037 18.810 13.994 0.417 1.000 -ATOM 2218 OH2 TIP3 2469 0.483 8.826 7.557 -0.834 1.520 -ATOM 2219 H1 TIP3 2469 -0.078 8.497 8.339 0.417 1.000 -ATOM 2220 H2 TIP3 2469 -0.208 8.611 6.826 0.417 1.000 -ATOM 2221 OH2 TIP3 2479 -7.319 13.694 3.012 -0.834 1.520 -ATOM 2222 H1 TIP3 2479 -7.486 13.491 2.077 0.417 1.000 -ATOM 2223 H2 TIP3 2479 -7.963 13.127 3.442 0.417 1.000 -ATOM 2224 OH2 TIP3 2482 -12.027 17.457 -19.162 -0.834 1.520 -ATOM 2225 H1 TIP3 2482 -12.045 17.961 -18.300 0.417 1.000 -ATOM 2226 H2 TIP3 2482 -12.865 17.732 -19.609 0.417 1.000 -ATOM 2227 OH2 TIP3 2488 -7.116 19.132 13.204 -0.834 1.520 -ATOM 2228 H1 TIP3 2488 -7.614 18.406 12.723 0.417 1.000 -ATOM 2229 H2 TIP3 2488 -6.371 18.775 13.657 0.417 1.000 -ATOM 2230 OH2 TIP3 2492 -1.234 19.076 17.778 -0.834 1.520 -ATOM 2231 H1 TIP3 2492 -2.182 18.887 17.981 0.417 1.000 -ATOM 2232 H2 TIP3 2492 -1.042 19.797 18.353 0.417 1.000 -ATOM 2233 OH2 TIP3 2501 14.741 18.679 2.991 -0.834 1.520 -ATOM 2234 H1 TIP3 2501 14.837 18.816 2.050 0.417 1.000 -ATOM 2235 H2 TIP3 2501 13.848 18.992 3.178 0.417 1.000 -ATOM 2236 OH2 TIP3 2507 9.142 13.772 11.652 -0.834 1.520 -ATOM 2237 H1 TIP3 2507 8.872 13.113 12.275 0.417 1.000 -ATOM 2238 H2 TIP3 2507 8.448 13.766 10.998 0.417 1.000 -ATOM 2239 OH2 TIP3 2508 -8.796 10.133 -0.556 -0.834 1.520 -ATOM 2240 H1 TIP3 2508 -8.778 11.077 -0.267 0.417 1.000 -ATOM 2241 H2 TIP3 2508 -8.773 9.668 0.308 0.417 1.000 -ATOM 2242 OH2 TIP3 2541 -11.704 14.793 -14.192 -0.834 1.520 -ATOM 2243 H1 TIP3 2541 -12.372 14.702 -14.886 0.417 1.000 -ATOM 2244 H2 TIP3 2541 -11.088 15.487 -14.513 0.417 1.000 -ATOM 2245 OH2 TIP3 2582 -6.695 16.968 -19.228 -0.834 1.520 -ATOM 2246 H1 TIP3 2582 -7.651 17.077 -19.405 0.417 1.000 -ATOM 2247 H2 TIP3 2582 -6.267 17.791 -19.457 0.417 1.000 -ATOM 2248 OH2 TIP3 2587 5.100 -14.257 1.879 -0.834 1.520 -ATOM 2249 H1 TIP3 2587 5.444 -14.912 1.185 0.417 1.000 -ATOM 2250 H2 TIP3 2587 5.721 -14.424 2.596 0.417 1.000 -ATOM 2251 OH2 TIP3 2591 -10.485 -19.389 10.327 -0.834 1.520 -ATOM 2252 H1 TIP3 2591 -9.993 -19.757 9.596 0.417 1.000 -ATOM 2253 H2 TIP3 2591 -9.690 -18.964 10.864 0.417 1.000 -ATOM 2254 OH2 TIP3 2606 -1.673 -19.625 -8.542 -0.834 1.520 -ATOM 2255 H1 TIP3 2606 -1.175 -19.859 -7.706 0.417 1.000 -ATOM 2256 H2 TIP3 2606 -1.597 -18.634 -8.620 0.417 1.000 -ATOM 2257 OH2 TIP3 2607 -9.950 -14.395 -14.242 -0.834 1.520 -ATOM 2258 H1 TIP3 2607 -9.845 -13.446 -14.444 0.417 1.000 -ATOM 2259 H2 TIP3 2607 -9.203 -14.611 -13.691 0.417 1.000 -ATOM 2260 OH2 TIP3 2608 -12.119 -16.482 -14.300 -0.834 1.520 -ATOM 2261 H1 TIP3 2608 -11.450 -15.775 -14.188 0.417 1.000 -ATOM 2262 H2 TIP3 2608 -12.930 -16.166 -13.831 0.417 1.000 -ATOM 2263 OH2 TIP3 2610 5.589 -14.730 -7.463 -0.834 1.520 -ATOM 2264 H1 TIP3 2610 5.815 -15.522 -7.882 0.417 1.000 -ATOM 2265 H2 TIP3 2610 6.224 -14.566 -6.743 0.417 1.000 -ATOM 2266 OH2 TIP3 2616 -5.672 -6.663 10.714 -0.834 1.520 -ATOM 2267 H1 TIP3 2616 -5.988 -5.859 10.228 0.417 1.000 -ATOM 2268 H2 TIP3 2616 -5.774 -6.445 11.617 0.417 1.000 -ATOM 2269 OH2 TIP3 2617 -1.197 -14.024 11.699 -0.834 1.520 -ATOM 2270 H1 TIP3 2617 -0.751 -14.772 12.081 0.417 1.000 -ATOM 2271 H2 TIP3 2617 -0.382 -13.434 11.513 0.417 1.000 -ATOM 2272 OH2 TIP3 2628 6.162 -10.473 -9.944 -0.834 1.520 -ATOM 2273 H1 TIP3 2628 5.979 -11.367 -9.666 0.417 1.000 -ATOM 2274 H2 TIP3 2628 5.294 -9.977 -9.718 0.417 1.000 -ATOM 2275 OH2 TIP3 2632 5.214 -0.932 -4.568 -0.834 1.520 -ATOM 2276 H1 TIP3 2632 4.652 -1.270 -3.860 0.417 1.000 -ATOM 2277 H2 TIP3 2632 4.602 -0.856 -5.342 0.417 1.000 -ATOM 2278 OH2 TIP3 2633 3.139 -3.798 8.164 -0.834 1.520 -ATOM 2279 H1 TIP3 2633 3.293 -2.858 8.197 0.417 1.000 -ATOM 2280 H2 TIP3 2633 3.953 -4.145 8.642 0.417 1.000 -ATOM 2281 OH2 TIP3 2634 -11.441 -16.485 -8.465 -0.834 1.520 -ATOM 2282 H1 TIP3 2634 -11.565 -15.702 -7.845 0.417 1.000 -ATOM 2283 H2 TIP3 2634 -12.045 -17.101 -8.048 0.417 1.000 -ATOM 2284 OH2 TIP3 2635 13.234 -18.643 1.754 -0.834 1.520 -ATOM 2285 H1 TIP3 2635 13.961 -18.998 1.291 0.417 1.000 -ATOM 2286 H2 TIP3 2635 12.849 -18.048 1.080 0.417 1.000 -ATOM 2287 OH2 TIP3 2649 9.773 -10.375 -10.236 -0.834 1.520 -ATOM 2288 H1 TIP3 2649 9.262 -10.746 -9.526 0.417 1.000 -ATOM 2289 H2 TIP3 2649 9.260 -9.559 -10.423 0.417 1.000 -ATOM 2290 OH2 TIP3 2650 5.669 -16.299 -10.966 -0.834 1.520 -ATOM 2291 H1 TIP3 2650 5.837 -17.235 -11.111 0.417 1.000 -ATOM 2292 H2 TIP3 2650 6.139 -16.085 -10.145 0.417 1.000 -ATOM 2293 OH2 TIP3 2654 7.204 -10.323 -12.424 -0.834 1.520 -ATOM 2294 H1 TIP3 2654 7.643 -9.604 -11.980 0.417 1.000 -ATOM 2295 H2 TIP3 2654 6.766 -10.747 -11.674 0.417 1.000 -ATOM 2296 OH2 TIP3 2656 -13.968 -3.657 6.922 -0.834 1.520 -ATOM 2297 H1 TIP3 2656 -14.881 -3.831 6.946 0.417 1.000 -ATOM 2298 H2 TIP3 2656 -13.889 -3.435 5.983 0.417 1.000 -ATOM 2299 OH2 TIP3 2657 -3.286 -14.989 14.329 -0.834 1.520 -ATOM 2300 H1 TIP3 2657 -3.307 -15.911 14.500 0.417 1.000 -ATOM 2301 H2 TIP3 2657 -2.869 -15.000 13.463 0.417 1.000 -ATOM 2302 OH2 TIP3 2659 -3.076 -11.014 17.568 -0.834 1.520 -ATOM 2303 H1 TIP3 2659 -2.482 -11.367 18.338 0.417 1.000 -ATOM 2304 H2 TIP3 2659 -3.165 -11.780 16.959 0.417 1.000 -ATOM 2305 OH2 TIP3 2662 0.109 -14.403 19.779 -0.834 1.520 -ATOM 2306 H1 TIP3 2662 1.070 -14.633 19.700 0.417 1.000 -ATOM 2307 H2 TIP3 2662 -0.245 -14.861 19.051 0.417 1.000 -ATOM 2308 OH2 TIP3 2667 12.951 -14.346 -0.591 -0.834 1.520 -ATOM 2309 H1 TIP3 2667 12.204 -14.063 -0.012 0.417 1.000 -ATOM 2310 H2 TIP3 2667 12.732 -14.152 -1.551 0.417 1.000 -ATOM 2311 OH2 TIP3 2669 -6.961 -9.489 -8.223 -0.834 1.520 -ATOM 2312 H1 TIP3 2669 -6.175 -9.411 -8.718 0.417 1.000 -ATOM 2313 H2 TIP3 2669 -7.117 -8.527 -8.084 0.417 1.000 -ATOM 2314 OH2 TIP3 2670 7.684 -10.298 -3.912 -0.834 1.520 -ATOM 2315 H1 TIP3 2670 7.282 -11.211 -3.787 0.417 1.000 -ATOM 2316 H2 TIP3 2670 7.247 -9.756 -3.229 0.417 1.000 -ATOM 2317 OH2 TIP3 2672 15.298 -9.010 -3.999 -0.834 1.520 -ATOM 2318 H1 TIP3 2672 15.295 -8.277 -4.546 0.417 1.000 -ATOM 2319 H2 TIP3 2672 14.284 -9.261 -3.912 0.417 1.000 -ATOM 2320 OH2 TIP3 2673 -1.811 -15.418 -1.151 -0.834 1.520 -ATOM 2321 H1 TIP3 2673 -2.408 -15.228 -0.409 0.417 1.000 -ATOM 2322 H2 TIP3 2673 -1.538 -14.571 -1.482 0.417 1.000 -ATOM 2323 OH2 TIP3 2674 13.936 -18.170 -2.122 -0.834 1.520 -ATOM 2324 H1 TIP3 2674 13.988 -17.572 -2.901 0.417 1.000 -ATOM 2325 H2 TIP3 2674 13.180 -18.802 -2.269 0.417 1.000 -ATOM 2326 OH2 TIP3 2675 -6.413 -18.148 6.990 -0.834 1.520 -ATOM 2327 H1 TIP3 2675 -5.889 -18.229 6.142 0.417 1.000 -ATOM 2328 H2 TIP3 2675 -6.304 -19.035 7.380 0.417 1.000 -ATOM 2329 OH2 TIP3 2676 5.774 -16.116 -0.004 -0.834 1.520 -ATOM 2330 H1 TIP3 2676 5.595 -17.004 0.380 0.417 1.000 -ATOM 2331 H2 TIP3 2676 5.873 -16.363 -0.998 0.417 1.000 -ATOM 2332 OH2 TIP3 2677 -8.740 -6.761 5.511 -0.834 1.520 -ATOM 2333 H1 TIP3 2677 -8.935 -5.999 5.990 0.417 1.000 -ATOM 2334 H2 TIP3 2677 -8.347 -7.410 6.175 0.417 1.000 -ATOM 2335 OH2 TIP3 2678 8.025 -6.221 9.088 -0.834 1.520 -ATOM 2336 H1 TIP3 2678 8.704 -5.819 8.609 0.417 1.000 -ATOM 2337 H2 TIP3 2678 7.189 -5.812 8.743 0.417 1.000 -ATOM 2338 OH2 TIP3 2680 0.331 -12.429 15.970 -0.834 1.520 -ATOM 2339 H1 TIP3 2680 -0.596 -12.261 15.737 0.417 1.000 -ATOM 2340 H2 TIP3 2680 0.797 -12.749 15.171 0.417 1.000 -ATOM 2341 OH2 TIP3 2683 0.059 -19.029 15.754 -0.834 1.520 -ATOM 2342 H1 TIP3 2683 -0.305 -19.160 16.633 0.417 1.000 -ATOM 2343 H2 TIP3 2683 -0.545 -19.575 15.252 0.417 1.000 -ATOM 2344 OH2 TIP3 2689 1.509 -15.070 -13.679 -0.834 1.520 -ATOM 2345 H1 TIP3 2689 1.670 -14.168 -13.722 0.417 1.000 -ATOM 2346 H2 TIP3 2689 2.198 -15.413 -13.036 0.417 1.000 -ATOM 2347 OH2 TIP3 2690 3.213 -14.759 -11.172 -0.834 1.520 -ATOM 2348 H1 TIP3 2690 4.050 -15.326 -10.885 0.417 1.000 -ATOM 2349 H2 TIP3 2690 3.460 -13.914 -10.826 0.417 1.000 -ATOM 2350 OH2 TIP3 2691 -4.684 -16.024 -4.967 -0.834 1.520 -ATOM 2351 H1 TIP3 2691 -4.647 -15.735 -5.935 0.417 1.000 -ATOM 2352 H2 TIP3 2691 -5.415 -15.467 -4.540 0.417 1.000 -ATOM 2353 OH2 TIP3 2692 5.596 -13.267 -9.669 -0.834 1.520 -ATOM 2354 H1 TIP3 2692 6.356 -13.859 -9.906 0.417 1.000 -ATOM 2355 H2 TIP3 2692 5.494 -13.449 -8.709 0.417 1.000 -ATOM 2356 OH2 TIP3 2693 -2.949 -18.510 10.533 -0.834 1.520 -ATOM 2357 H1 TIP3 2693 -2.514 -18.280 9.668 0.417 1.000 -ATOM 2358 H2 TIP3 2693 -3.722 -19.073 10.237 0.417 1.000 -ATOM 2359 OH2 TIP3 2694 -11.600 -14.448 -6.443 -0.834 1.520 -ATOM 2360 H1 TIP3 2694 -10.930 -14.760 -5.815 0.417 1.000 -ATOM 2361 H2 TIP3 2694 -12.261 -14.055 -5.837 0.417 1.000 -ATOM 2362 OH2 TIP3 2695 13.084 -11.238 -5.690 -0.834 1.520 -ATOM 2363 H1 TIP3 2695 12.733 -10.456 -5.249 0.417 1.000 -ATOM 2364 H2 TIP3 2695 12.272 -11.743 -5.877 0.417 1.000 -ATOM 2365 OH2 TIP3 2696 12.654 -16.309 4.596 -0.834 1.520 -ATOM 2366 H1 TIP3 2696 12.880 -16.116 5.513 0.417 1.000 -ATOM 2367 H2 TIP3 2696 12.744 -17.242 4.501 0.417 1.000 -ATOM 2368 OH2 TIP3 2697 3.742 -4.291 -1.904 -0.834 1.520 -ATOM 2369 H1 TIP3 2697 4.551 -3.894 -2.179 0.417 1.000 -ATOM 2370 H2 TIP3 2697 3.413 -4.712 -2.769 0.417 1.000 -ATOM 2371 OH2 TIP3 2699 8.004 -2.354 8.912 -0.834 1.520 -ATOM 2372 H1 TIP3 2699 7.434 -1.589 9.281 0.417 1.000 -ATOM 2373 H2 TIP3 2699 7.354 -2.956 8.559 0.417 1.000 -ATOM 2374 OH2 TIP3 2701 -8.206 5.052 -2.354 -0.834 1.520 -ATOM 2375 H1 TIP3 2701 -7.333 4.804 -2.716 0.417 1.000 -ATOM 2376 H2 TIP3 2701 -8.394 4.326 -1.718 0.417 1.000 -ATOM 2377 OH2 TIP3 2703 4.549 -12.992 15.738 -0.834 1.520 -ATOM 2378 H1 TIP3 2703 3.797 -13.555 15.329 0.417 1.000 -ATOM 2379 H2 TIP3 2703 4.671 -13.424 16.621 0.417 1.000 -ATOM 2380 OH2 TIP3 2709 -0.746 1.282 -17.342 -0.834 1.520 -ATOM 2381 H1 TIP3 2709 -0.081 0.761 -16.859 0.417 1.000 -ATOM 2382 H2 TIP3 2709 -1.319 0.629 -17.676 0.417 1.000 -ATOM 2383 OH2 TIP3 2710 11.648 -3.762 -18.762 -0.834 1.520 -ATOM 2384 H1 TIP3 2710 11.394 -2.870 -18.371 0.417 1.000 -ATOM 2385 H2 TIP3 2710 10.936 -4.357 -18.482 0.417 1.000 -ATOM 2386 OH2 TIP3 2713 -3.886 0.023 -11.152 -0.834 1.520 -ATOM 2387 H1 TIP3 2713 -3.768 0.963 -11.391 0.417 1.000 -ATOM 2388 H2 TIP3 2713 -4.743 -0.085 -10.700 0.417 1.000 -ATOM 2389 OH2 TIP3 2714 -15.719 1.161 -0.934 -0.834 1.520 -ATOM 2390 H1 TIP3 2714 -14.843 1.058 -0.619 0.417 1.000 -ATOM 2391 H2 TIP3 2714 -15.831 2.110 -1.096 0.417 1.000 -ATOM 2392 OH2 TIP3 2715 1.505 -11.802 -13.855 -0.834 1.520 -ATOM 2393 H1 TIP3 2715 1.809 -10.929 -13.681 0.417 1.000 -ATOM 2394 H2 TIP3 2715 1.328 -11.751 -14.803 0.417 1.000 -ATOM 2395 OH2 TIP3 2717 11.568 1.320 1.163 -0.834 1.520 -ATOM 2396 H1 TIP3 2717 10.799 0.711 1.305 0.417 1.000 -ATOM 2397 H2 TIP3 2717 11.323 1.603 0.269 0.417 1.000 -ATOM 2398 OH2 TIP3 2718 8.597 2.409 18.875 -0.834 1.520 -ATOM 2399 H1 TIP3 2718 8.089 2.419 19.687 0.417 1.000 -ATOM 2400 H2 TIP3 2718 8.701 1.435 18.799 0.417 1.000 -ATOM 2401 OH2 TIP3 2719 5.995 -7.637 5.902 -0.834 1.520 -ATOM 2402 H1 TIP3 2719 5.653 -6.793 5.530 0.417 1.000 -ATOM 2403 H2 TIP3 2719 5.203 -8.194 5.809 0.417 1.000 -ATOM 2404 OH2 TIP3 2720 -2.456 -12.747 15.428 -0.834 1.520 -ATOM 2405 H1 TIP3 2720 -2.917 -12.083 14.937 0.417 1.000 -ATOM 2406 H2 TIP3 2720 -2.819 -13.576 15.037 0.417 1.000 -ATOM 2407 OH2 TIP3 2721 8.586 -8.743 16.679 -0.834 1.520 -ATOM 2408 H1 TIP3 2721 9.542 -8.629 16.997 0.417 1.000 -ATOM 2409 H2 TIP3 2721 8.692 -9.379 15.967 0.417 1.000 -ATOM 2410 OH2 TIP3 2732 -6.130 -12.526 -7.813 -0.834 1.520 -ATOM 2411 H1 TIP3 2732 -6.791 -11.927 -7.367 0.417 1.000 -ATOM 2412 H2 TIP3 2732 -5.543 -11.971 -8.341 0.417 1.000 -ATOM 2413 OH2 TIP3 2734 0.488 -6.827 -13.356 -0.834 1.520 -ATOM 2414 H1 TIP3 2734 -0.366 -7.303 -13.069 0.417 1.000 -ATOM 2415 H2 TIP3 2734 0.688 -6.266 -12.550 0.417 1.000 -ATOM 2416 OH2 TIP3 2735 -6.400 -2.753 -10.002 -0.834 1.520 -ATOM 2417 H1 TIP3 2735 -6.744 -3.615 -9.893 0.417 1.000 -ATOM 2418 H2 TIP3 2735 -6.384 -2.663 -10.953 0.417 1.000 -ATOM 2419 OH2 TIP3 2736 9.201 -8.366 -12.246 -0.834 1.520 -ATOM 2420 H1 TIP3 2736 9.874 -7.686 -12.123 0.417 1.000 -ATOM 2421 H2 TIP3 2736 9.387 -8.653 -13.190 0.417 1.000 -ATOM 2422 OH2 TIP3 2737 3.968 -5.752 5.301 -0.834 1.520 -ATOM 2423 H1 TIP3 2737 3.469 -5.336 6.014 0.417 1.000 -ATOM 2424 H2 TIP3 2737 3.898 -5.141 4.541 0.417 1.000 -ATOM 2425 OH2 TIP3 2738 -10.766 6.832 5.736 -0.834 1.520 -ATOM 2426 H1 TIP3 2738 -10.254 6.180 6.234 0.417 1.000 -ATOM 2427 H2 TIP3 2738 -11.116 6.235 5.066 0.417 1.000 -ATOM 2428 OH2 TIP3 2739 14.024 7.737 5.007 -0.834 1.520 -ATOM 2429 H1 TIP3 2739 14.615 7.021 5.086 0.417 1.000 -ATOM 2430 H2 TIP3 2739 14.589 8.553 4.850 0.417 1.000 -ATOM 2431 OH2 TIP3 2740 7.087 -0.388 3.133 -0.834 1.520 -ATOM 2432 H1 TIP3 2740 7.094 -1.103 3.801 0.417 1.000 -ATOM 2433 H2 TIP3 2740 6.150 -0.210 3.002 0.417 1.000 -ATOM 2434 OH2 TIP3 2741 -3.495 2.219 11.618 -0.834 1.520 -ATOM 2435 H1 TIP3 2741 -2.750 1.631 11.854 0.417 1.000 -ATOM 2436 H2 TIP3 2741 -2.987 2.977 11.275 0.417 1.000 -ATOM 2437 OH2 TIP3 2743 -1.524 -6.983 6.155 -0.834 1.520 -ATOM 2438 H1 TIP3 2743 -2.124 -7.442 5.566 0.417 1.000 -ATOM 2439 H2 TIP3 2743 -1.643 -7.392 7.053 0.417 1.000 -ATOM 2440 OH2 TIP3 2753 0.306 6.975 -13.863 -0.834 1.520 -ATOM 2441 H1 TIP3 2753 -0.571 7.310 -13.743 0.417 1.000 -ATOM 2442 H2 TIP3 2753 0.838 7.794 -13.981 0.417 1.000 -ATOM 2443 OH2 TIP3 2754 4.900 -9.096 -6.137 -0.834 1.520 -ATOM 2444 H1 TIP3 2754 4.395 -8.989 -6.964 0.417 1.000 -ATOM 2445 H2 TIP3 2754 5.838 -9.213 -6.379 0.417 1.000 -ATOM 2446 OH2 TIP3 2755 -13.352 6.409 -0.992 -0.834 1.520 -ATOM 2447 H1 TIP3 2755 -12.956 7.167 -0.499 0.417 1.000 -ATOM 2448 H2 TIP3 2755 -13.010 6.530 -1.849 0.417 1.000 -ATOM 2449 OH2 TIP3 2756 8.512 -8.004 6.333 -0.834 1.520 -ATOM 2450 H1 TIP3 2756 9.099 -7.178 6.113 0.417 1.000 -ATOM 2451 H2 TIP3 2756 7.537 -7.755 6.168 0.417 1.000 -ATOM 2452 OH2 TIP3 2757 -3.154 5.884 -2.277 -0.834 1.520 -ATOM 2453 H1 TIP3 2757 -3.457 5.668 -3.194 0.417 1.000 -ATOM 2454 H2 TIP3 2757 -3.531 6.717 -2.238 0.417 1.000 -ATOM 2455 OH2 TIP3 2758 -9.901 -1.917 1.099 -0.834 1.520 -ATOM 2456 H1 TIP3 2758 -9.547 -2.742 0.699 0.417 1.000 -ATOM 2457 H2 TIP3 2758 -10.602 -2.254 1.690 0.417 1.000 -ATOM 2458 OH2 TIP3 2760 -6.517 -7.344 7.905 -0.834 1.520 -ATOM 2459 H1 TIP3 2760 -6.435 -7.079 8.822 0.417 1.000 -ATOM 2460 H2 TIP3 2760 -6.042 -8.201 7.830 0.417 1.000 -ATOM 2461 OH2 TIP3 2761 16.470 -11.691 14.969 -0.834 1.520 -ATOM 2462 H1 TIP3 2761 16.184 -11.645 13.997 0.417 1.000 -ATOM 2463 H2 TIP3 2761 17.427 -11.531 14.971 0.417 1.000 -ATOM 2464 OH2 TIP3 2767 -13.647 12.350 19.261 -0.834 1.520 -ATOM 2465 H1 TIP3 2767 -13.550 11.938 18.415 0.417 1.000 -ATOM 2466 H2 TIP3 2767 -14.608 12.146 19.419 0.417 1.000 -ATOM 2467 OH2 TIP3 2771 3.915 -3.797 -15.779 -0.834 1.520 -ATOM 2468 H1 TIP3 2771 4.358 -4.064 -14.935 0.417 1.000 -ATOM 2469 H2 TIP3 2771 3.944 -4.654 -16.232 0.417 1.000 -ATOM 2470 OH2 TIP3 2774 13.812 9.049 -8.862 -0.834 1.520 -ATOM 2471 H1 TIP3 2774 13.368 8.234 -9.056 0.417 1.000 -ATOM 2472 H2 TIP3 2774 14.731 8.861 -9.092 0.417 1.000 -ATOM 2473 OH2 TIP3 2775 9.677 -11.246 -15.552 -0.834 1.520 -ATOM 2474 H1 TIP3 2775 9.019 -10.574 -15.342 0.417 1.000 -ATOM 2475 H2 TIP3 2775 9.888 -11.607 -14.699 0.417 1.000 -ATOM 2476 OH2 TIP3 2776 -2.398 -0.378 1.532 -0.834 1.520 -ATOM 2477 H1 TIP3 2776 -1.724 -0.621 2.185 0.417 1.000 -ATOM 2478 H2 TIP3 2776 -2.876 -1.189 1.522 0.417 1.000 -ATOM 2479 OH2 TIP3 2777 6.417 0.249 -12.088 -0.834 1.520 -ATOM 2480 H1 TIP3 2777 5.862 0.922 -12.459 0.417 1.000 -ATOM 2481 H2 TIP3 2777 7.149 0.907 -11.751 0.417 1.000 -ATOM 2482 OH2 TIP3 2778 -4.535 -12.045 -2.186 -0.834 1.520 -ATOM 2483 H1 TIP3 2778 -4.850 -12.021 -3.068 0.417 1.000 -ATOM 2484 H2 TIP3 2778 -5.294 -12.437 -1.694 0.417 1.000 -ATOM 2485 OH2 TIP3 2779 -10.844 -7.686 3.966 -0.834 1.520 -ATOM 2486 H1 TIP3 2779 -11.134 -8.115 4.871 0.417 1.000 -ATOM 2487 H2 TIP3 2779 -9.914 -7.519 4.093 0.417 1.000 -ATOM 2488 OH2 TIP3 2780 -15.853 4.095 8.652 -0.834 1.520 -ATOM 2489 H1 TIP3 2780 -15.475 4.949 8.960 0.417 1.000 -ATOM 2490 H2 TIP3 2780 -16.667 4.040 9.113 0.417 1.000 -ATOM 2491 OH2 TIP3 2781 -18.093 18.378 -9.838 -0.834 1.520 -ATOM 2492 H1 TIP3 2781 -17.693 17.490 -9.732 0.417 1.000 -ATOM 2493 H2 TIP3 2781 -18.252 18.649 -8.926 0.417 1.000 -ATOM 2494 OH2 TIP3 2782 12.884 8.064 10.649 -0.834 1.520 -ATOM 2495 H1 TIP3 2782 13.631 8.473 11.131 0.417 1.000 -ATOM 2496 H2 TIP3 2782 13.301 7.781 9.866 0.417 1.000 -ATOM 2497 OH2 TIP3 2783 9.419 6.542 19.110 -0.834 1.520 -ATOM 2498 H1 TIP3 2783 8.963 6.568 18.230 0.417 1.000 -ATOM 2499 H2 TIP3 2783 10.285 6.854 18.907 0.417 1.000 -ATOM 2500 OH2 TIP3 2784 -7.728 9.826 12.189 -0.834 1.520 -ATOM 2501 H1 TIP3 2784 -7.844 10.869 12.133 0.417 1.000 -ATOM 2502 H2 TIP3 2784 -7.894 9.537 11.318 0.417 1.000 -ATOM 2503 OH2 TIP3 2794 2.042 -9.231 -13.524 -0.834 1.520 -ATOM 2504 H1 TIP3 2794 2.762 -8.834 -12.936 0.417 1.000 -ATOM 2505 H2 TIP3 2794 1.379 -8.499 -13.654 0.417 1.000 -ATOM 2506 OH2 TIP3 2795 -4.419 8.901 -11.059 -0.834 1.520 -ATOM 2507 H1 TIP3 2795 -4.125 9.699 -11.454 0.417 1.000 -ATOM 2508 H2 TIP3 2795 -3.623 8.333 -11.092 0.417 1.000 -ATOM 2509 OH2 TIP3 2797 3.031 9.489 -4.238 -0.834 1.520 -ATOM 2510 H1 TIP3 2797 3.931 9.176 -4.113 0.417 1.000 -ATOM 2511 H2 TIP3 2797 2.945 9.581 -5.203 0.417 1.000 -ATOM 2512 OH2 TIP3 2799 4.053 5.323 16.555 -0.834 1.520 -ATOM 2513 H1 TIP3 2799 3.778 4.765 17.255 0.417 1.000 -ATOM 2514 H2 TIP3 2799 3.538 5.083 15.793 0.417 1.000 -ATOM 2515 OH2 TIP3 2800 -0.963 -0.357 10.882 -0.834 1.520 -ATOM 2516 H1 TIP3 2800 -1.558 -1.117 11.027 0.417 1.000 -ATOM 2517 H2 TIP3 2800 -0.818 0.037 11.784 0.417 1.000 -ATOM 2518 OH2 TIP3 2801 -3.207 -9.793 9.783 -0.834 1.520 -ATOM 2519 H1 TIP3 2801 -3.388 -10.456 10.483 0.417 1.000 -ATOM 2520 H2 TIP3 2801 -2.292 -10.035 9.460 0.417 1.000 -ATOM 2521 OH2 TIP3 2802 -17.239 14.861 -2.664 -0.834 1.520 -ATOM 2522 H1 TIP3 2802 -17.849 14.338 -2.118 0.417 1.000 -ATOM 2523 H2 TIP3 2802 -17.352 14.491 -3.501 0.417 1.000 -ATOM 2524 OH2 TIP3 2803 5.886 15.235 18.227 -0.834 1.520 -ATOM 2525 H1 TIP3 2803 5.644 14.327 18.100 0.417 1.000 -ATOM 2526 H2 TIP3 2803 6.487 15.306 19.006 0.417 1.000 -ATOM 2527 OH2 TIP3 2806 -8.534 7.575 7.795 -0.834 1.520 -ATOM 2528 H1 TIP3 2806 -8.324 7.642 6.825 0.417 1.000 -ATOM 2529 H2 TIP3 2806 -8.909 6.734 7.835 0.417 1.000 -ATOM 2530 OH2 TIP3 2815 0.395 -10.430 -8.366 -0.834 1.520 -ATOM 2531 H1 TIP3 2815 1.018 -11.111 -8.144 0.417 1.000 -ATOM 2532 H2 TIP3 2815 0.725 -9.687 -7.898 0.417 1.000 -ATOM 2533 OH2 TIP3 2817 -0.108 3.014 -1.949 -0.834 1.520 -ATOM 2534 H1 TIP3 2817 0.854 3.005 -1.812 0.417 1.000 -ATOM 2535 H2 TIP3 2817 -0.299 4.011 -2.047 0.417 1.000 -ATOM 2536 OH2 TIP3 2818 4.927 4.245 -4.003 -0.834 1.520 -ATOM 2537 H1 TIP3 2818 5.786 4.617 -4.065 0.417 1.000 -ATOM 2538 H2 TIP3 2818 4.853 4.047 -3.021 0.417 1.000 -ATOM 2539 OH2 TIP3 2819 4.700 13.170 -9.255 -0.834 1.520 -ATOM 2540 H1 TIP3 2819 5.184 12.434 -9.631 0.417 1.000 -ATOM 2541 H2 TIP3 2819 5.355 13.588 -8.658 0.417 1.000 -ATOM 2542 OH2 TIP3 2821 7.254 1.261 0.770 -0.834 1.520 -ATOM 2543 H1 TIP3 2821 7.904 1.713 1.261 0.417 1.000 -ATOM 2544 H2 TIP3 2821 6.810 0.778 1.494 0.417 1.000 -ATOM 2545 OH2 TIP3 2823 17.156 18.784 0.387 -0.834 1.520 -ATOM 2546 H1 TIP3 2823 16.616 18.131 -0.043 0.417 1.000 -ATOM 2547 H2 TIP3 2823 17.603 19.169 -0.403 0.417 1.000 -ATOM 2548 OH2 TIP3 2824 -11.747 -5.917 14.818 -0.834 1.520 -ATOM 2549 H1 TIP3 2824 -12.671 -6.137 14.718 0.417 1.000 -ATOM 2550 H2 TIP3 2824 -11.714 -5.329 15.651 0.417 1.000 -ATOM 2551 OH2 TIP3 2825 9.678 10.880 14.427 -0.834 1.520 -ATOM 2552 H1 TIP3 2825 10.466 10.742 13.888 0.417 1.000 -ATOM 2553 H2 TIP3 2825 10.062 11.228 15.205 0.417 1.000 -ATOM 2554 OH2 TIP3 2827 -6.023 2.652 13.422 -0.834 1.520 -ATOM 2555 H1 TIP3 2827 -5.241 2.740 12.797 0.417 1.000 -ATOM 2556 H2 TIP3 2827 -5.648 2.123 14.190 0.417 1.000 -ATOM 2557 OH2 TIP3 2832 -0.083 6.551 -10.960 -0.834 1.520 -ATOM 2558 H1 TIP3 2832 0.120 6.190 -11.860 0.417 1.000 -ATOM 2559 H2 TIP3 2832 -0.194 7.508 -11.129 0.417 1.000 -ATOM 2560 OH2 TIP3 2839 5.461 17.158 -4.472 -0.834 1.520 -ATOM 2561 H1 TIP3 2839 4.943 16.639 -5.094 0.417 1.000 -ATOM 2562 H2 TIP3 2839 4.876 17.217 -3.746 0.417 1.000 -ATOM 2563 OH2 TIP3 2840 -2.107 17.193 -1.716 -0.834 1.520 -ATOM 2564 H1 TIP3 2840 -2.302 17.733 -2.532 0.417 1.000 -ATOM 2565 H2 TIP3 2840 -1.831 17.859 -1.108 0.417 1.000 -ATOM 2566 OH2 TIP3 2841 1.057 13.054 -1.300 -0.834 1.520 -ATOM 2567 H1 TIP3 2841 1.397 13.374 -0.462 0.417 1.000 -ATOM 2568 H2 TIP3 2841 1.324 13.836 -1.915 0.417 1.000 -ATOM 2569 OH2 TIP3 2842 0.002 10.235 -5.227 -0.834 1.520 -ATOM 2570 H1 TIP3 2842 -0.320 10.758 -4.422 0.417 1.000 -ATOM 2571 H2 TIP3 2842 0.498 9.580 -4.815 0.417 1.000 -ATOM 2572 OH2 TIP3 2843 10.918 6.815 -3.533 -0.834 1.520 -ATOM 2573 H1 TIP3 2843 11.359 6.038 -3.268 0.417 1.000 -ATOM 2574 H2 TIP3 2843 10.366 7.062 -2.724 0.417 1.000 -ATOM 2575 OH2 TIP3 2844 -12.052 8.004 17.445 -0.834 1.520 -ATOM 2576 H1 TIP3 2844 -12.114 7.389 16.693 0.417 1.000 -ATOM 2577 H2 TIP3 2844 -11.385 8.635 17.269 0.417 1.000 -ATOM 2578 OH2 TIP3 2845 -5.998 2.548 7.246 -0.834 1.520 -ATOM 2579 H1 TIP3 2845 -6.001 2.223 6.330 0.417 1.000 -ATOM 2580 H2 TIP3 2845 -6.753 1.983 7.672 0.417 1.000 -ATOM 2581 OH2 TIP3 2848 2.534 18.000 15.364 -0.834 1.520 -ATOM 2582 H1 TIP3 2848 1.544 17.950 15.278 0.417 1.000 -ATOM 2583 H2 TIP3 2848 2.680 18.710 16.030 0.417 1.000 -ATOM 2584 OH2 TIP3 2857 -4.273 6.799 -8.529 -0.834 1.520 -ATOM 2585 H1 TIP3 2857 -3.553 6.161 -8.206 0.417 1.000 -ATOM 2586 H2 TIP3 2857 -4.332 7.359 -7.784 0.417 1.000 -ATOM 2587 OH2 TIP3 2859 -6.476 11.510 -15.250 -0.834 1.520 -ATOM 2588 H1 TIP3 2859 -5.698 12.013 -15.570 0.417 1.000 -ATOM 2589 H2 TIP3 2859 -7.210 11.810 -15.738 0.417 1.000 -ATOM 2590 OH2 TIP3 2860 1.077 14.629 7.395 -0.834 1.520 -ATOM 2591 H1 TIP3 2860 1.048 15.379 6.771 0.417 1.000 -ATOM 2592 H2 TIP3 2860 0.459 13.944 6.930 0.417 1.000 -ATOM 2593 OH2 TIP3 2862 -1.571 10.247 -0.425 -0.834 1.520 -ATOM 2594 H1 TIP3 2862 -2.321 9.554 -0.532 0.417 1.000 -ATOM 2595 H2 TIP3 2862 -2.021 10.898 0.090 0.417 1.000 -ATOM 2596 OH2 TIP3 2863 -5.861 14.491 -0.746 -0.834 1.520 -ATOM 2597 H1 TIP3 2863 -6.746 14.086 -0.607 0.417 1.000 -ATOM 2598 H2 TIP3 2863 -5.344 13.811 -1.252 0.417 1.000 -ATOM 2599 OH2 TIP3 2865 -5.011 10.052 7.685 -0.834 1.520 -ATOM 2600 H1 TIP3 2865 -4.914 9.323 7.155 0.417 1.000 -ATOM 2601 H2 TIP3 2865 -4.434 9.840 8.381 0.417 1.000 -ATOM 2602 OH2 TIP3 2866 -2.693 1.454 4.794 -0.834 1.520 -ATOM 2603 H1 TIP3 2866 -2.006 0.811 4.602 0.417 1.000 -ATOM 2604 H2 TIP3 2866 -2.220 2.132 5.344 0.417 1.000 -ATOM 2605 OH2 TIP3 2867 1.674 15.212 10.136 -0.834 1.520 -ATOM 2606 H1 TIP3 2867 1.346 14.932 9.292 0.417 1.000 -ATOM 2607 H2 TIP3 2867 1.751 14.443 10.663 0.417 1.000 -ATOM 2608 OH2 TIP3 2877 4.857 8.631 -18.261 -0.834 1.520 -ATOM 2609 H1 TIP3 2877 3.986 8.916 -18.688 0.417 1.000 -ATOM 2610 H2 TIP3 2877 5.159 9.541 -17.886 0.417 1.000 -ATOM 2611 OH2 TIP3 2878 1.862 7.684 -18.306 -0.834 1.520 -ATOM 2612 H1 TIP3 2878 1.911 8.691 -18.287 0.417 1.000 -ATOM 2613 H2 TIP3 2878 0.977 7.455 -18.015 0.417 1.000 -ATOM 2614 OH2 TIP3 2882 10.376 16.016 -1.679 -0.834 1.520 -ATOM 2615 H1 TIP3 2882 10.542 15.187 -2.116 0.417 1.000 -ATOM 2616 H2 TIP3 2882 9.490 16.074 -1.908 0.417 1.000 -ATOM 2617 OH2 TIP3 2884 -2.186 16.110 -9.299 -0.834 1.520 -ATOM 2618 H1 TIP3 2884 -1.712 15.457 -8.770 0.417 1.000 -ATOM 2619 H2 TIP3 2884 -2.657 16.669 -8.647 0.417 1.000 -ATOM 2620 OH2 TIP3 2885 1.319 1.993 16.278 -0.834 1.520 -ATOM 2621 H1 TIP3 2885 1.626 1.109 15.812 0.417 1.000 -ATOM 2622 H2 TIP3 2885 2.130 2.551 16.370 0.417 1.000 -ATOM 2623 OH2 TIP3 2886 0.382 18.751 8.484 -0.834 1.520 -ATOM 2624 H1 TIP3 2886 0.560 18.177 7.677 0.417 1.000 -ATOM 2625 H2 TIP3 2886 1.200 19.321 8.548 0.417 1.000 -ATOM 2626 OH2 TIP3 2893 5.029 19.028 17.694 -0.834 1.520 -ATOM 2627 H1 TIP3 2893 5.498 18.942 18.542 0.417 1.000 -ATOM 2628 H2 TIP3 2893 4.146 18.871 17.933 0.417 1.000 -ATOM 2629 OH2 TIP3 2903 -14.445 11.449 -17.376 -0.834 1.520 -ATOM 2630 H1 TIP3 2903 -14.042 12.299 -17.283 0.417 1.000 -ATOM 2631 H2 TIP3 2903 -13.964 10.896 -16.785 0.417 1.000 -ATOM 2632 OH2 TIP3 2904 -1.957 16.132 1.546 -0.834 1.520 -ATOM 2633 H1 TIP3 2904 -1.744 16.487 0.682 0.417 1.000 -ATOM 2634 H2 TIP3 2904 -2.887 16.377 1.741 0.417 1.000 -ATOM 2635 OH2 TIP3 2906 -15.967 18.122 11.647 -0.834 1.520 -ATOM 2636 H1 TIP3 2906 -16.211 19.030 11.681 0.417 1.000 -ATOM 2637 H2 TIP3 2906 -15.388 18.170 10.894 0.417 1.000 -ATOM 2638 OH2 TIP3 2909 -5.592 18.995 16.722 -0.834 1.520 -ATOM 2639 H1 TIP3 2909 -6.204 19.707 16.506 0.417 1.000 -ATOM 2640 H2 TIP3 2909 -6.168 18.231 16.698 0.417 1.000 -ATOM 2641 OH2 TIP3 2918 -7.468 15.205 -16.074 -0.834 1.520 -ATOM 2642 H1 TIP3 2918 -6.681 15.020 -16.587 0.417 1.000 -ATOM 2643 H2 TIP3 2918 -7.436 16.141 -15.888 0.417 1.000 -ATOM 2644 OH2 TIP3 2919 3.513 12.168 -18.444 -0.834 1.520 -ATOM 2645 H1 TIP3 2919 2.857 11.774 -19.120 0.417 1.000 -ATOM 2646 H2 TIP3 2919 4.399 11.777 -18.696 0.417 1.000 -ATOM 2647 OH2 TIP3 2922 -8.486 12.235 -3.257 -0.834 1.520 -ATOM 2648 H1 TIP3 2922 -9.093 11.695 -3.750 0.417 1.000 -ATOM 2649 H2 TIP3 2922 -7.613 11.824 -3.274 0.417 1.000 -ATOM 2650 OH2 TIP3 2923 10.302 14.690 -7.785 -0.834 1.520 -ATOM 2651 H1 TIP3 2923 10.568 13.747 -7.852 0.417 1.000 -ATOM 2652 H2 TIP3 2923 9.350 14.665 -8.018 0.417 1.000 -ATOM 2653 OH2 TIP3 2925 -3.754 18.545 -8.100 -0.834 1.520 -ATOM 2654 H1 TIP3 2925 -4.529 18.979 -8.513 0.417 1.000 -ATOM 2655 H2 TIP3 2925 -3.381 19.257 -7.562 0.417 1.000 -ATOM 2656 OH2 TIP3 2926 -7.176 6.812 5.474 -0.834 1.520 -ATOM 2657 H1 TIP3 2926 -6.305 7.072 5.817 0.417 1.000 -ATOM 2658 H2 TIP3 2926 -7.100 5.883 5.335 0.417 1.000 -ATOM 2659 OH2 TIP3 2927 0.360 18.907 -10.832 -0.834 1.520 -ATOM 2660 H1 TIP3 2927 -0.330 18.507 -11.359 0.417 1.000 -ATOM 2661 H2 TIP3 2927 1.196 18.705 -11.355 0.417 1.000 -ATOM 2662 OH2 TIP3 2930 3.339 19.789 13.361 -0.834 1.520 -ATOM 2663 H1 TIP3 2930 4.082 19.549 12.752 0.417 1.000 -ATOM 2664 H2 TIP3 2930 3.115 18.890 13.780 0.417 1.000 -ATOM 2665 OH2 TIP3 2941 12.723 18.488 -6.535 -0.834 1.520 -ATOM 2666 H1 TIP3 2941 11.976 18.590 -7.127 0.417 1.000 -ATOM 2667 H2 TIP3 2941 13.229 17.813 -6.991 0.417 1.000 -ATOM 2668 OH2 TIP3 2944 5.815 10.983 -10.743 -0.834 1.520 -ATOM 2669 H1 TIP3 2944 6.628 11.032 -11.271 0.417 1.000 -ATOM 2670 H2 TIP3 2944 5.220 10.934 -11.527 0.417 1.000 -ATOM 2671 OH2 TIP3 2963 1.379 19.620 -13.468 -0.834 1.520 -ATOM 2672 H1 TIP3 2963 0.426 19.562 -13.395 0.417 1.000 -ATOM 2673 H2 TIP3 2963 1.498 19.479 -14.385 0.417 1.000 -ATOM 2674 OH2 TIP3 2968 6.037 16.386 4.824 -0.834 1.520 -ATOM 2675 H1 TIP3 2968 6.954 16.405 5.261 0.417 1.000 -ATOM 2676 H2 TIP3 2968 5.427 16.257 5.519 0.417 1.000 -ATOM 2677 OH2 TIP3 3010 -10.984 -15.914 -11.186 -0.834 1.520 -ATOM 2678 H1 TIP3 3010 -10.623 -14.999 -11.187 0.417 1.000 -ATOM 2679 H2 TIP3 3010 -11.274 -16.259 -10.339 0.417 1.000 -ATOM 2680 OH2 TIP3 3012 -0.545 -18.744 -3.183 -0.834 1.520 -ATOM 2681 H1 TIP3 3012 -0.024 -18.253 -3.745 0.417 1.000 -ATOM 2682 H2 TIP3 3012 -1.430 -18.359 -3.281 0.417 1.000 -ATOM 2683 OH2 TIP3 3016 -7.535 -15.131 6.264 -0.834 1.520 -ATOM 2684 H1 TIP3 3016 -7.270 -15.211 5.350 0.417 1.000 -ATOM 2685 H2 TIP3 3016 -6.778 -15.426 6.728 0.417 1.000 -ATOM 2686 OH2 TIP3 3027 -3.797 -17.798 0.733 -0.834 1.520 -ATOM 2687 H1 TIP3 3027 -4.277 -18.100 -0.057 0.417 1.000 -ATOM 2688 H2 TIP3 3027 -2.853 -17.956 0.493 0.417 1.000 -ATOM 2689 OH2 TIP3 3030 8.773 -10.723 3.205 -0.834 1.520 -ATOM 2690 H1 TIP3 3030 9.544 -11.354 3.079 0.417 1.000 -ATOM 2691 H2 TIP3 3030 9.043 -9.975 2.616 0.417 1.000 -ATOM 2692 OH2 TIP3 3033 2.922 -14.831 19.096 -0.834 1.520 -ATOM 2693 H1 TIP3 3033 3.219 -15.339 18.284 0.417 1.000 -ATOM 2694 H2 TIP3 3033 2.564 -14.047 18.614 0.417 1.000 -ATOM 2695 OH2 TIP3 3037 -1.660 -8.616 13.995 -0.834 1.520 -ATOM 2696 H1 TIP3 3037 -2.470 -8.801 13.453 0.417 1.000 -ATOM 2697 H2 TIP3 3037 -0.929 -9.112 13.559 0.417 1.000 -ATOM 2698 OH2 TIP3 3046 12.383 -11.977 -2.609 -0.834 1.520 -ATOM 2699 H1 TIP3 3046 11.933 -12.490 -3.377 0.417 1.000 -ATOM 2700 H2 TIP3 3046 11.666 -11.638 -2.081 0.417 1.000 -ATOM 2701 OH2 TIP3 3049 -1.047 -17.050 -6.856 -0.834 1.520 -ATOM 2702 H1 TIP3 3049 -1.091 -16.614 -5.981 0.417 1.000 -ATOM 2703 H2 TIP3 3049 -0.364 -17.660 -6.658 0.417 1.000 -ATOM 2704 OH2 TIP3 3050 10.894 -17.039 -4.656 -0.834 1.520 -ATOM 2705 H1 TIP3 3050 10.707 -17.698 -4.003 0.417 1.000 -ATOM 2706 H2 TIP3 3050 10.648 -17.474 -5.511 0.417 1.000 -ATOM 2707 OH2 TIP3 3053 -2.258 -18.096 7.902 -0.834 1.520 -ATOM 2708 H1 TIP3 3053 -1.627 -18.150 7.152 0.417 1.000 -ATOM 2709 H2 TIP3 3053 -3.002 -17.601 7.553 0.417 1.000 -ATOM 2710 OH2 TIP3 3070 -0.838 6.826 -6.278 -0.834 1.520 -ATOM 2711 H1 TIP3 3070 0.048 6.911 -6.581 0.417 1.000 -ATOM 2712 H2 TIP3 3070 -0.828 6.129 -5.645 0.417 1.000 -ATOM 2713 OH2 TIP3 3071 -3.247 -12.027 11.480 -0.834 1.520 -ATOM 2714 H1 TIP3 3071 -2.615 -12.719 11.626 0.417 1.000 -ATOM 2715 H2 TIP3 3071 -4.101 -12.443 11.384 0.417 1.000 -ATOM 2716 OH2 TIP3 3072 -13.561 -14.856 -12.545 -0.834 1.520 -ATOM 2717 H1 TIP3 3072 -12.690 -15.164 -12.163 0.417 1.000 -ATOM 2718 H2 TIP3 3072 -13.879 -14.181 -11.884 0.417 1.000 -ATOM 2719 OH2 TIP3 3073 -1.349 -15.351 -11.579 -0.834 1.520 -ATOM 2720 H1 TIP3 3073 -0.674 -14.678 -11.432 0.417 1.000 -ATOM 2721 H2 TIP3 3073 -1.637 -15.256 -12.507 0.417 1.000 -ATOM 2722 OH2 TIP3 3075 5.503 -17.577 9.355 -0.834 1.520 -ATOM 2723 H1 TIP3 3075 5.815 -17.477 10.265 0.417 1.000 -ATOM 2724 H2 TIP3 3075 5.270 -16.658 9.168 0.417 1.000 -ATOM 2725 OH2 TIP3 3080 -0.560 -7.155 8.739 -0.834 1.520 -ATOM 2726 H1 TIP3 3080 -0.005 -6.889 9.548 0.417 1.000 -ATOM 2727 H2 TIP3 3080 -1.381 -7.120 9.211 0.417 1.000 -ATOM 2728 OH2 TIP3 3085 4.148 -15.531 -18.486 -0.834 1.520 -ATOM 2729 H1 TIP3 3085 3.319 -16.059 -18.560 0.417 1.000 -ATOM 2730 H2 TIP3 3085 4.739 -16.145 -18.019 0.417 1.000 -ATOM 2731 OH2 TIP3 3086 -0.607 -14.241 -18.315 -0.834 1.520 -ATOM 2732 H1 TIP3 3086 -0.998 -15.112 -18.282 0.417 1.000 -ATOM 2733 H2 TIP3 3086 -0.684 -13.918 -17.414 0.417 1.000 -ATOM 2734 OH2 TIP3 3091 -1.363 -11.010 -15.384 -0.834 1.520 -ATOM 2735 H1 TIP3 3091 -2.214 -11.379 -15.487 0.417 1.000 -ATOM 2736 H2 TIP3 3091 -1.406 -10.067 -15.375 0.417 1.000 -ATOM 2737 OH2 TIP3 3092 11.077 -6.160 1.323 -0.834 1.520 -ATOM 2738 H1 TIP3 3092 11.122 -6.696 2.148 0.417 1.000 -ATOM 2739 H2 TIP3 3092 11.515 -5.357 1.528 0.417 1.000 -ATOM 2740 OH2 TIP3 3095 5.917 -11.103 1.213 -0.834 1.520 -ATOM 2741 H1 TIP3 3095 5.210 -11.664 1.602 0.417 1.000 -ATOM 2742 H2 TIP3 3095 5.993 -10.348 1.819 0.417 1.000 -ATOM 2743 OH2 TIP3 3096 -6.669 -15.437 3.416 -0.834 1.520 -ATOM 2744 H1 TIP3 3096 -5.685 -15.228 3.360 0.417 1.000 -ATOM 2745 H2 TIP3 3096 -6.785 -16.322 3.134 0.417 1.000 -ATOM 2746 OH2 TIP3 3097 8.116 -17.558 1.242 -0.834 1.520 -ATOM 2747 H1 TIP3 3097 9.109 -17.560 0.963 0.417 1.000 -ATOM 2748 H2 TIP3 3097 7.651 -17.370 0.470 0.417 1.000 -ATOM 2749 OH2 TIP3 3108 -1.590 -18.027 -11.420 -0.834 1.520 -ATOM 2750 H1 TIP3 3108 -1.342 -17.085 -11.477 0.417 1.000 -ATOM 2751 H2 TIP3 3108 -1.212 -18.433 -12.250 0.417 1.000 -ATOM 2752 OH2 TIP3 3109 2.635 1.010 -17.098 -0.834 1.520 -ATOM 2753 H1 TIP3 3109 2.191 1.343 -17.926 0.417 1.000 -ATOM 2754 H2 TIP3 3109 1.968 0.900 -16.447 0.417 1.000 -ATOM 2755 OH2 TIP3 3111 5.022 -4.978 -13.649 -0.834 1.520 -ATOM 2756 H1 TIP3 3111 5.811 -5.292 -13.043 0.417 1.000 -ATOM 2757 H2 TIP3 3111 4.417 -5.728 -13.596 0.417 1.000 -ATOM 2758 OH2 TIP3 3112 7.034 -6.430 -7.429 -0.834 1.520 -ATOM 2759 H1 TIP3 3112 6.603 -6.608 -6.549 0.417 1.000 -ATOM 2760 H2 TIP3 3112 7.165 -5.453 -7.443 0.417 1.000 -ATOM 2761 OH2 TIP3 3113 2.270 -6.168 2.593 -0.834 1.520 -ATOM 2762 H1 TIP3 3113 1.856 -7.023 2.328 0.417 1.000 -ATOM 2763 H2 TIP3 3113 1.777 -5.963 3.436 0.417 1.000 -ATOM 2764 OH2 TIP3 3114 7.885 -12.638 -6.088 -0.834 1.520 -ATOM 2765 H1 TIP3 3114 7.855 -11.652 -5.985 0.417 1.000 -ATOM 2766 H2 TIP3 3114 7.734 -12.961 -5.175 0.417 1.000 -ATOM 2767 OH2 TIP3 3115 1.606 -9.701 -10.636 -0.834 1.520 -ATOM 2768 H1 TIP3 3115 2.239 -10.380 -10.471 0.417 1.000 -ATOM 2769 H2 TIP3 3115 0.962 -9.778 -9.901 0.417 1.000 -ATOM 2770 OH2 TIP3 3116 9.353 -2.993 -3.791 -0.834 1.520 -ATOM 2771 H1 TIP3 3116 9.824 -2.142 -3.986 0.417 1.000 -ATOM 2772 H2 TIP3 3116 8.983 -2.876 -2.909 0.417 1.000 -ATOM 2773 OH2 TIP3 3119 9.131 -17.734 5.022 -0.834 1.520 -ATOM 2774 H1 TIP3 3119 8.503 -17.550 5.750 0.417 1.000 -ATOM 2775 H2 TIP3 3119 8.526 -18.082 4.334 0.417 1.000 -ATOM 2776 OH2 TIP3 3121 -10.163 -14.878 17.608 -0.834 1.520 -ATOM 2777 H1 TIP3 3121 -10.365 -13.977 17.219 0.417 1.000 -ATOM 2778 H2 TIP3 3121 -9.288 -15.023 17.286 0.417 1.000 -ATOM 2779 OH2 TIP3 3129 4.355 -11.463 -17.874 -0.834 1.520 -ATOM 2780 H1 TIP3 3129 4.816 -11.037 -18.577 0.417 1.000 -ATOM 2781 H2 TIP3 3129 4.086 -12.364 -18.172 0.417 1.000 -ATOM 2782 OH2 TIP3 3131 2.645 -7.781 -16.872 -0.834 1.520 -ATOM 2783 H1 TIP3 3131 1.963 -7.185 -16.501 0.417 1.000 -ATOM 2784 H2 TIP3 3131 2.260 -8.726 -16.685 0.417 1.000 -ATOM 2785 OH2 TIP3 3134 -8.599 1.480 -2.864 -0.834 1.520 -ATOM 2786 H1 TIP3 3134 -8.478 2.112 -2.144 0.417 1.000 -ATOM 2787 H2 TIP3 3134 -8.745 0.672 -2.364 0.417 1.000 -ATOM 2788 OH2 TIP3 3136 -8.713 -18.565 12.202 -0.834 1.520 -ATOM 2789 H1 TIP3 3136 -8.892 -19.166 12.927 0.417 1.000 -ATOM 2790 H2 TIP3 3136 -7.696 -18.588 12.059 0.417 1.000 -ATOM 2791 OH2 TIP3 3138 18.246 -6.323 3.324 -0.834 1.520 -ATOM 2792 H1 TIP3 3138 19.156 -6.048 3.010 0.417 1.000 -ATOM 2793 H2 TIP3 3138 17.828 -6.631 2.503 0.417 1.000 -ATOM 2794 OH2 TIP3 3139 -0.094 -17.234 9.558 -0.834 1.520 -ATOM 2795 H1 TIP3 3139 -0.018 -17.998 10.079 0.417 1.000 -ATOM 2796 H2 TIP3 3139 -0.835 -17.441 8.924 0.417 1.000 -ATOM 2797 OH2 TIP3 3140 4.170 -18.321 1.197 -0.834 1.520 -ATOM 2798 H1 TIP3 3140 4.257 -18.009 2.097 0.417 1.000 -ATOM 2799 H2 TIP3 3140 4.268 -19.244 1.263 0.417 1.000 -ATOM 2800 OH2 TIP3 3142 6.496 -13.441 13.805 -0.834 1.520 -ATOM 2801 H1 TIP3 3142 5.805 -13.694 14.480 0.417 1.000 -ATOM 2802 H2 TIP3 3142 7.375 -13.567 14.338 0.417 1.000 -ATOM 2803 OH2 TIP3 3143 -2.406 -16.456 19.059 -0.834 1.520 -ATOM 2804 H1 TIP3 3143 -3.370 -16.417 18.930 0.417 1.000 -ATOM 2805 H2 TIP3 3143 -2.110 -15.759 18.477 0.417 1.000 -ATOM 2806 OH2 TIP3 3150 -2.209 -7.740 -15.255 -0.834 1.520 -ATOM 2807 H1 TIP3 3150 -2.671 -6.905 -15.387 0.417 1.000 -ATOM 2808 H2 TIP3 3150 -1.996 -7.698 -14.372 0.417 1.000 -ATOM 2809 OH2 TIP3 3152 2.125 -16.538 -9.547 -0.834 1.520 -ATOM 2810 H1 TIP3 3152 1.341 -16.035 -9.153 0.417 1.000 -ATOM 2811 H2 TIP3 3152 2.548 -15.773 -9.979 0.417 1.000 -ATOM 2812 OH2 TIP3 3154 4.178 -8.790 -3.421 -0.834 1.520 -ATOM 2813 H1 TIP3 3154 5.024 -8.602 -2.974 0.417 1.000 -ATOM 2814 H2 TIP3 3154 4.455 -8.963 -4.352 0.417 1.000 -ATOM 2815 OH2 TIP3 3155 5.254 6.275 2.147 -0.834 1.520 -ATOM 2816 H1 TIP3 3155 5.872 6.369 1.396 0.417 1.000 -ATOM 2817 H2 TIP3 3155 5.551 5.476 2.594 0.417 1.000 -ATOM 2818 OH2 TIP3 3156 8.890 2.243 7.795 -0.834 1.520 -ATOM 2819 H1 TIP3 3156 9.114 2.850 7.064 0.417 1.000 -ATOM 2820 H2 TIP3 3156 9.516 1.585 7.824 0.417 1.000 -ATOM 2821 OH2 TIP3 3157 2.023 7.254 -6.788 -0.834 1.520 -ATOM 2822 H1 TIP3 3157 2.008 7.284 -7.723 0.417 1.000 -ATOM 2823 H2 TIP3 3157 2.707 7.959 -6.570 0.417 1.000 -ATOM 2824 OH2 TIP3 3158 -2.116 -3.737 9.508 -0.834 1.520 -ATOM 2825 H1 TIP3 3158 -2.851 -3.277 9.070 0.417 1.000 -ATOM 2826 H2 TIP3 3158 -1.683 -4.042 8.695 0.417 1.000 -ATOM 2827 OH2 TIP3 3160 8.983 -4.584 15.557 -0.834 1.520 -ATOM 2828 H1 TIP3 3160 9.732 -4.083 15.260 0.417 1.000 -ATOM 2829 H2 TIP3 3160 8.272 -3.946 15.423 0.417 1.000 -ATOM 2830 OH2 TIP3 3161 -0.931 -11.228 8.945 -0.834 1.520 -ATOM 2831 H1 TIP3 3161 -0.314 -11.632 9.594 0.417 1.000 -ATOM 2832 H2 TIP3 3161 -1.601 -11.866 8.762 0.417 1.000 -ATOM 2833 OH2 TIP3 3173 -7.924 -15.355 -6.434 -0.834 1.520 -ATOM 2834 H1 TIP3 3173 -8.000 -14.478 -6.852 0.417 1.000 -ATOM 2835 H2 TIP3 3173 -8.173 -15.165 -5.557 0.417 1.000 -ATOM 2836 OH2 TIP3 3174 9.320 -5.897 -3.171 -0.834 1.520 -ATOM 2837 H1 TIP3 3174 9.585 -5.816 -2.215 0.417 1.000 -ATOM 2838 H2 TIP3 3174 9.594 -5.005 -3.568 0.417 1.000 -ATOM 2839 OH2 TIP3 3175 10.419 -2.121 16.837 -0.834 1.520 -ATOM 2840 H1 TIP3 3175 10.268 -2.517 17.712 0.417 1.000 -ATOM 2841 H2 TIP3 3175 9.631 -1.552 16.760 0.417 1.000 -ATOM 2842 OH2 TIP3 3176 16.521 -1.853 -18.889 -0.834 1.520 -ATOM 2843 H1 TIP3 3176 16.496 -0.915 -18.899 0.417 1.000 -ATOM 2844 H2 TIP3 3176 15.815 -2.083 -18.333 0.417 1.000 -ATOM 2845 OH2 TIP3 3177 -10.869 -18.925 -4.159 -0.834 1.520 -ATOM 2846 H1 TIP3 3177 -10.052 -18.537 -4.588 0.417 1.000 -ATOM 2847 H2 TIP3 3177 -10.887 -19.839 -4.536 0.417 1.000 -ATOM 2848 OH2 TIP3 3178 9.503 7.905 4.858 -0.834 1.520 -ATOM 2849 H1 TIP3 3178 9.654 8.084 5.814 0.417 1.000 -ATOM 2850 H2 TIP3 3178 8.893 7.106 4.845 0.417 1.000 -ATOM 2851 OH2 TIP3 3179 -1.752 4.644 0.171 -0.834 1.520 -ATOM 2852 H1 TIP3 3179 -2.174 5.152 -0.539 0.417 1.000 -ATOM 2853 H2 TIP3 3179 -1.836 3.727 -0.164 0.417 1.000 -ATOM 2854 OH2 TIP3 3180 4.663 -1.034 -0.928 -0.834 1.520 -ATOM 2855 H1 TIP3 3180 4.078 -0.751 -1.619 0.417 1.000 -ATOM 2856 H2 TIP3 3180 4.908 -1.975 -1.190 0.417 1.000 -ATOM 2857 OH2 TIP3 3181 -3.661 -8.738 5.272 -0.834 1.520 -ATOM 2858 H1 TIP3 3181 -3.701 -9.359 4.513 0.417 1.000 -ATOM 2859 H2 TIP3 3181 -3.936 -9.341 5.958 0.417 1.000 -ATOM 2860 OH2 TIP3 3182 10.866 4.333 11.715 -0.834 1.520 -ATOM 2861 H1 TIP3 3182 10.291 4.860 11.204 0.417 1.000 -ATOM 2862 H2 TIP3 3182 10.943 3.530 11.132 0.417 1.000 -ATOM 2863 OH2 TIP3 3183 2.338 -11.596 12.676 -0.834 1.520 -ATOM 2864 H1 TIP3 3183 2.496 -12.455 13.182 0.417 1.000 -ATOM 2865 H2 TIP3 3183 3.035 -11.030 12.963 0.417 1.000 -ATOM 2866 OH2 TIP3 3184 -14.095 -4.067 12.791 -0.834 1.520 -ATOM 2867 H1 TIP3 3184 -14.027 -3.328 13.406 0.417 1.000 -ATOM 2868 H2 TIP3 3184 -14.321 -4.839 13.336 0.417 1.000 -ATOM 2869 OH2 TIP3 3187 11.175 -13.295 -7.411 -0.834 1.520 -ATOM 2870 H1 TIP3 3187 11.233 -12.872 -8.324 0.417 1.000 -ATOM 2871 H2 TIP3 3187 10.501 -14.026 -7.611 0.417 1.000 -ATOM 2872 OH2 TIP3 3189 -3.439 -5.988 14.908 -0.834 1.520 -ATOM 2873 H1 TIP3 3189 -4.198 -5.655 15.417 0.417 1.000 -ATOM 2874 H2 TIP3 3189 -3.485 -6.910 14.965 0.417 1.000 -ATOM 2875 OH2 TIP3 3192 3.294 -3.286 -11.647 -0.834 1.520 -ATOM 2876 H1 TIP3 3192 3.759 -2.525 -11.329 0.417 1.000 -ATOM 2877 H2 TIP3 3192 4.011 -3.670 -12.048 0.417 1.000 -ATOM 2878 OH2 TIP3 3193 19.192 7.065 -5.877 -0.834 1.520 -ATOM 2879 H1 TIP3 3193 19.122 6.450 -6.610 0.417 1.000 -ATOM 2880 H2 TIP3 3193 19.538 6.461 -5.188 0.417 1.000 -ATOM 2881 OH2 TIP3 3195 2.513 4.059 -1.016 -0.834 1.520 -ATOM 2882 H1 TIP3 3195 3.107 4.881 -1.044 0.417 1.000 -ATOM 2883 H2 TIP3 3195 1.878 4.220 -0.286 0.417 1.000 -ATOM 2884 OH2 TIP3 3196 -12.306 -11.662 -3.313 -0.834 1.520 -ATOM 2885 H1 TIP3 3196 -12.677 -11.919 -2.492 0.417 1.000 -ATOM 2886 H2 TIP3 3196 -13.009 -11.524 -3.928 0.417 1.000 -ATOM 2887 OH2 TIP3 3197 -4.443 12.531 -2.210 -0.834 1.520 -ATOM 2888 H1 TIP3 3197 -3.542 12.883 -2.545 0.417 1.000 -ATOM 2889 H2 TIP3 3197 -4.760 11.941 -2.968 0.417 1.000 -ATOM 2890 OH2 TIP3 3198 -2.945 -7.061 -0.247 -0.834 1.520 -ATOM 2891 H1 TIP3 3198 -2.961 -8.039 -0.450 0.417 1.000 -ATOM 2892 H2 TIP3 3198 -1.990 -6.871 -0.456 0.417 1.000 -ATOM 2893 OH2 TIP3 3199 11.147 15.582 7.692 -0.834 1.520 -ATOM 2894 H1 TIP3 3199 11.959 16.047 7.697 0.417 1.000 -ATOM 2895 H2 TIP3 3199 11.357 14.665 7.740 0.417 1.000 -ATOM 2896 OH2 TIP3 3200 15.853 4.245 -5.160 -0.834 1.520 -ATOM 2897 H1 TIP3 3200 15.833 3.388 -4.720 0.417 1.000 -ATOM 2898 H2 TIP3 3200 15.889 3.988 -6.115 0.417 1.000 -ATOM 2899 OH2 TIP3 3201 5.032 3.820 12.217 -0.834 1.520 -ATOM 2900 H1 TIP3 3201 4.738 4.411 11.470 0.417 1.000 -ATOM 2901 H2 TIP3 3201 5.931 4.128 12.387 0.417 1.000 -ATOM 2902 OH2 TIP3 3202 5.872 2.902 -1.402 -0.834 1.520 -ATOM 2903 H1 TIP3 3202 6.770 2.404 -1.282 0.417 1.000 -ATOM 2904 H2 TIP3 3202 5.176 2.248 -1.501 0.417 1.000 -ATOM 2905 OH2 TIP3 3203 11.371 0.493 12.276 -0.834 1.520 -ATOM 2906 H1 TIP3 3203 10.719 0.309 11.600 0.417 1.000 -ATOM 2907 H2 TIP3 3203 12.011 1.039 11.867 0.417 1.000 -ATOM 2908 OH2 TIP3 3204 -0.008 9.459 13.269 -0.834 1.520 -ATOM 2909 H1 TIP3 3204 -0.942 9.216 13.497 0.417 1.000 -ATOM 2910 H2 TIP3 3204 0.183 10.155 13.886 0.417 1.000 -ATOM 2911 OH2 TIP3 3205 7.205 -2.704 14.051 -0.834 1.520 -ATOM 2912 H1 TIP3 3205 6.828 -1.978 14.599 0.417 1.000 -ATOM 2913 H2 TIP3 3205 6.431 -2.967 13.469 0.417 1.000 -ATOM 2914 OH2 TIP3 3210 1.944 -9.429 19.387 -0.834 1.520 -ATOM 2915 H1 TIP3 3210 1.370 -9.907 19.974 0.417 1.000 -ATOM 2916 H2 TIP3 3210 2.066 -10.048 18.625 0.417 1.000 -ATOM 2917 OH2 TIP3 3214 4.647 -7.840 -13.525 -0.834 1.520 -ATOM 2918 H1 TIP3 3214 4.753 -8.240 -14.361 0.417 1.000 -ATOM 2919 H2 TIP3 3214 5.517 -7.507 -13.337 0.417 1.000 -ATOM 2920 OH2 TIP3 3215 -0.013 -0.926 -5.059 -0.834 1.520 -ATOM 2921 H1 TIP3 3215 -0.831 -0.652 -4.691 0.417 1.000 -ATOM 2922 H2 TIP3 3215 0.655 -0.477 -4.533 0.417 1.000 -ATOM 2923 OH2 TIP3 3216 4.248 8.156 4.606 -0.834 1.520 -ATOM 2924 H1 TIP3 3216 3.326 8.246 4.557 0.417 1.000 -ATOM 2925 H2 TIP3 3216 4.522 8.264 3.722 0.417 1.000 -ATOM 2926 OH2 TIP3 3218 -8.088 -6.788 -0.274 -0.834 1.520 -ATOM 2927 H1 TIP3 3218 -7.146 -6.775 -0.119 0.417 1.000 -ATOM 2928 H2 TIP3 3218 -8.496 -7.236 0.555 0.417 1.000 -ATOM 2929 OH2 TIP3 3219 1.300 -2.592 3.235 -0.834 1.520 -ATOM 2930 H1 TIP3 3219 0.535 -2.924 2.776 0.417 1.000 -ATOM 2931 H2 TIP3 3219 1.183 -3.037 4.104 0.417 1.000 -ATOM 2932 OH2 TIP3 3220 2.705 14.717 -10.818 -0.834 1.520 -ATOM 2933 H1 TIP3 3220 3.278 15.331 -11.298 0.417 1.000 -ATOM 2934 H2 TIP3 3220 3.304 14.311 -10.142 0.417 1.000 -ATOM 2935 OH2 TIP3 3221 -1.733 1.738 19.016 -0.834 1.520 -ATOM 2936 H1 TIP3 3221 -1.397 2.610 18.851 0.417 1.000 -ATOM 2937 H2 TIP3 3221 -0.911 1.151 18.956 0.417 1.000 -ATOM 2938 OH2 TIP3 3222 6.607 3.205 9.543 -0.834 1.520 -ATOM 2939 H1 TIP3 3222 6.786 4.139 9.271 0.417 1.000 -ATOM 2940 H2 TIP3 3222 7.353 2.697 9.149 0.417 1.000 -ATOM 2941 OH2 TIP3 3223 -14.885 -0.180 2.632 -0.834 1.520 -ATOM 2942 H1 TIP3 3223 -15.730 -0.248 2.092 0.417 1.000 -ATOM 2943 H2 TIP3 3223 -14.200 -0.415 1.996 0.417 1.000 -ATOM 2944 OH2 TIP3 3224 3.721 -1.117 13.019 -0.834 1.520 -ATOM 2945 H1 TIP3 3224 2.924 -0.628 13.254 0.417 1.000 -ATOM 2946 H2 TIP3 3224 4.318 -0.492 12.617 0.417 1.000 -ATOM 2947 OH2 TIP3 3225 17.593 -3.159 17.197 -0.834 1.520 -ATOM 2948 H1 TIP3 3225 16.996 -2.815 17.832 0.417 1.000 -ATOM 2949 H2 TIP3 3225 18.385 -2.745 17.381 0.417 1.000 -ATOM 2950 OH2 TIP3 3226 -7.307 12.804 14.562 -0.834 1.520 -ATOM 2951 H1 TIP3 3226 -7.284 12.558 13.617 0.417 1.000 -ATOM 2952 H2 TIP3 3226 -6.855 12.069 15.024 0.417 1.000 -ATOM 2953 OH2 TIP3 3227 -6.440 -2.066 8.175 -0.834 1.520 -ATOM 2954 H1 TIP3 3227 -6.613 -1.137 8.340 0.417 1.000 -ATOM 2955 H2 TIP3 3227 -5.578 -2.096 8.682 0.417 1.000 -ATOM 2956 OH2 TIP3 3229 6.458 4.748 15.379 -0.834 1.520 -ATOM 2957 H1 TIP3 3229 7.244 4.814 15.919 0.417 1.000 -ATOM 2958 H2 TIP3 3229 5.726 5.082 15.994 0.417 1.000 -ATOM 2959 OH2 TIP3 3233 8.583 10.824 -16.317 -0.834 1.520 -ATOM 2960 H1 TIP3 3233 8.557 10.908 -15.305 0.417 1.000 -ATOM 2961 H2 TIP3 3233 9.160 10.067 -16.388 0.417 1.000 -ATOM 2962 OH2 TIP3 3234 -3.682 2.811 -11.445 -0.834 1.520 -ATOM 2963 H1 TIP3 3234 -3.968 3.275 -10.656 0.417 1.000 -ATOM 2964 H2 TIP3 3234 -2.714 2.916 -11.418 0.417 1.000 -ATOM 2965 OH2 TIP3 3236 -7.386 7.273 -6.304 -0.834 1.520 -ATOM 2966 H1 TIP3 3236 -6.876 7.950 -6.693 0.417 1.000 -ATOM 2967 H2 TIP3 3236 -7.932 7.765 -5.707 0.417 1.000 -ATOM 2968 OH2 TIP3 3237 1.939 1.100 -4.672 -0.834 1.520 -ATOM 2969 H1 TIP3 3237 2.635 0.640 -5.179 0.417 1.000 -ATOM 2970 H2 TIP3 3237 2.375 1.374 -3.820 0.417 1.000 -ATOM 2971 OH2 TIP3 3238 7.007 5.179 -0.237 -0.834 1.520 -ATOM 2972 H1 TIP3 3238 6.673 4.409 -0.768 0.417 1.000 -ATOM 2973 H2 TIP3 3238 7.930 5.173 -0.543 0.417 1.000 -ATOM 2974 OH2 TIP3 3239 8.419 15.932 -3.784 -0.834 1.520 -ATOM 2975 H1 TIP3 3239 9.084 16.176 -4.443 0.417 1.000 -ATOM 2976 H2 TIP3 3239 7.622 16.176 -4.151 0.417 1.000 -ATOM 2977 OH2 TIP3 3240 -4.214 8.405 -0.705 -0.834 1.520 -ATOM 2978 H1 TIP3 3240 -4.857 9.196 -0.625 0.417 1.000 -ATOM 2979 H2 TIP3 3240 -4.275 8.200 -1.660 0.417 1.000 -ATOM 2980 OH2 TIP3 3241 0.882 11.566 -12.500 -0.834 1.520 -ATOM 2981 H1 TIP3 3241 1.771 11.259 -12.636 0.417 1.000 -ATOM 2982 H2 TIP3 3241 1.048 12.516 -12.610 0.417 1.000 -ATOM 2983 OH2 TIP3 3242 -1.210 -0.672 -0.896 -0.834 1.520 -ATOM 2984 H1 TIP3 3242 -1.736 -0.728 -0.114 0.417 1.000 -ATOM 2985 H2 TIP3 3242 -1.414 -1.472 -1.402 0.417 1.000 -ATOM 2986 OH2 TIP3 3243 9.487 11.469 -5.683 -0.834 1.520 -ATOM 2987 H1 TIP3 3243 8.967 12.221 -5.467 0.417 1.000 -ATOM 2988 H2 TIP3 3243 9.536 10.898 -4.878 0.417 1.000 -ATOM 2989 OH2 TIP3 3244 -0.713 2.590 -11.270 -0.834 1.520 -ATOM 2990 H1 TIP3 3244 -0.232 2.291 -11.966 0.417 1.000 -ATOM 2991 H2 TIP3 3244 -0.677 1.826 -10.633 0.417 1.000 -ATOM 2992 OH2 TIP3 3245 -10.000 -5.207 9.822 -0.834 1.520 -ATOM 2993 H1 TIP3 3245 -10.878 -5.274 9.406 0.417 1.000 -ATOM 2994 H2 TIP3 3245 -10.180 -4.696 10.640 0.417 1.000 -ATOM 2995 OH2 TIP3 3246 -0.780 -4.326 15.479 -0.834 1.520 -ATOM 2996 H1 TIP3 3246 -0.321 -4.929 14.897 0.417 1.000 -ATOM 2997 H2 TIP3 3246 -1.641 -4.608 15.439 0.417 1.000 -ATOM 2998 OH2 TIP3 3247 -4.823 7.294 6.773 -0.834 1.520 -ATOM 2999 H1 TIP3 3247 -4.781 6.636 7.565 0.417 1.000 -ATOM 3000 H2 TIP3 3247 -3.965 7.115 6.274 0.417 1.000 -ATOM 3001 OH2 TIP3 3257 6.173 6.160 -17.953 -0.834 1.520 -ATOM 3002 H1 TIP3 3257 5.814 7.030 -18.388 0.417 1.000 -ATOM 3003 H2 TIP3 3257 7.180 6.313 -18.001 0.417 1.000 -ATOM 3004 OH2 TIP3 3258 4.149 -1.112 -13.467 -0.834 1.520 -ATOM 3005 H1 TIP3 3258 4.021 -0.834 -14.399 0.417 1.000 -ATOM 3006 H2 TIP3 3258 5.032 -0.767 -13.278 0.417 1.000 -ATOM 3007 OH2 TIP3 3261 2.392 6.765 7.367 -0.834 1.520 -ATOM 3008 H1 TIP3 3261 1.649 7.484 7.268 0.417 1.000 -ATOM 3009 H2 TIP3 3261 2.874 7.108 8.071 0.417 1.000 -ATOM 3010 OH2 TIP3 3262 -4.796 3.340 -8.871 -0.834 1.520 -ATOM 3011 H1 TIP3 3262 -5.433 3.666 -8.159 0.417 1.000 -ATOM 3012 H2 TIP3 3262 -3.964 3.766 -8.618 0.417 1.000 -ATOM 3013 OH2 TIP3 3263 2.974 -8.613 5.453 -0.834 1.520 -ATOM 3014 H1 TIP3 3263 2.750 -7.707 5.160 0.417 1.000 -ATOM 3015 H2 TIP3 3263 2.131 -8.896 5.792 0.417 1.000 -ATOM 3016 OH2 TIP3 3264 -3.114 16.905 7.161 -0.834 1.520 -ATOM 3017 H1 TIP3 3264 -3.594 16.962 6.323 0.417 1.000 -ATOM 3018 H2 TIP3 3264 -3.702 17.368 7.757 0.417 1.000 -ATOM 3019 OH2 TIP3 3265 3.208 14.407 5.395 -0.834 1.520 -ATOM 3020 H1 TIP3 3265 4.083 13.970 5.343 0.417 1.000 -ATOM 3021 H2 TIP3 3265 2.947 14.231 6.346 0.417 1.000 -ATOM 3022 OH2 TIP3 3266 12.701 2.303 18.307 -0.834 1.520 -ATOM 3023 H1 TIP3 3266 12.114 1.754 18.844 0.417 1.000 -ATOM 3024 H2 TIP3 3266 13.510 1.724 18.221 0.417 1.000 -ATOM 3025 OH2 TIP3 3274 6.353 1.381 -15.560 -0.834 1.520 -ATOM 3026 H1 TIP3 3274 5.914 0.546 -15.729 0.417 1.000 -ATOM 3027 H2 TIP3 3274 5.689 1.985 -15.148 0.417 1.000 -ATOM 3028 OH2 TIP3 3280 5.090 2.311 -9.209 -0.834 1.520 -ATOM 3029 H1 TIP3 3280 5.958 2.594 -9.665 0.417 1.000 -ATOM 3030 H2 TIP3 3280 5.437 1.952 -8.332 0.417 1.000 -ATOM 3031 OH2 TIP3 3282 9.435 8.189 -8.513 -0.834 1.520 -ATOM 3032 H1 TIP3 3282 9.147 9.086 -8.564 0.417 1.000 -ATOM 3033 H2 TIP3 3282 9.190 7.885 -7.613 0.417 1.000 -ATOM 3034 OH2 TIP3 3283 3.782 19.218 -6.907 -0.834 1.520 -ATOM 3035 H1 TIP3 3283 3.139 19.036 -7.637 0.417 1.000 -ATOM 3036 H2 TIP3 3283 4.011 18.329 -6.606 0.417 1.000 -ATOM 3037 OH2 TIP3 3284 5.829 15.646 -1.832 -0.834 1.520 -ATOM 3038 H1 TIP3 3284 6.530 15.401 -1.148 0.417 1.000 -ATOM 3039 H2 TIP3 3284 5.718 16.638 -1.656 0.417 1.000 -ATOM 3040 OH2 TIP3 3285 15.307 15.122 2.062 -0.834 1.520 -ATOM 3041 H1 TIP3 3285 14.845 14.314 1.710 0.417 1.000 -ATOM 3042 H2 TIP3 3285 14.612 15.547 2.606 0.417 1.000 -ATOM 3043 OH2 TIP3 3286 15.633 2.799 8.763 -0.834 1.520 -ATOM 3044 H1 TIP3 3286 15.279 3.676 8.900 0.417 1.000 -ATOM 3045 H2 TIP3 3286 15.497 2.405 9.622 0.417 1.000 -ATOM 3046 OH2 TIP3 3287 -17.255 8.967 9.795 -0.834 1.520 -ATOM 3047 H1 TIP3 3287 -18.187 8.948 10.040 0.417 1.000 -ATOM 3048 H2 TIP3 3287 -16.968 9.865 10.120 0.417 1.000 -ATOM 3049 OH2 TIP3 3291 5.296 2.140 18.214 -0.834 1.520 -ATOM 3050 H1 TIP3 3291 5.098 2.097 17.242 0.417 1.000 -ATOM 3051 H2 TIP3 3291 6.213 2.144 18.202 0.417 1.000 -ATOM 3052 OH2 TIP3 3296 12.370 -0.997 -18.176 -0.834 1.520 -ATOM 3053 H1 TIP3 3296 12.660 -1.227 -19.123 0.417 1.000 -ATOM 3054 H2 TIP3 3296 11.974 -0.091 -18.275 0.417 1.000 -ATOM 3055 OH2 TIP3 3298 7.743 17.380 -14.522 -0.834 1.520 -ATOM 3056 H1 TIP3 3298 8.278 18.222 -14.380 0.417 1.000 -ATOM 3057 H2 TIP3 3298 7.645 17.266 -15.494 0.417 1.000 -ATOM 3058 OH2 TIP3 3301 12.733 10.590 -10.624 -0.834 1.520 -ATOM 3059 H1 TIP3 3301 12.538 10.142 -11.436 0.417 1.000 -ATOM 3060 H2 TIP3 3301 13.111 9.846 -10.097 0.417 1.000 -ATOM 3061 OH2 TIP3 3302 4.767 7.580 -15.480 -0.834 1.520 -ATOM 3062 H1 TIP3 3302 4.390 6.725 -15.689 0.417 1.000 -ATOM 3063 H2 TIP3 3302 4.787 7.986 -16.355 0.417 1.000 -ATOM 3064 OH2 TIP3 3303 -5.830 3.047 0.478 -0.834 1.520 -ATOM 3065 H1 TIP3 3303 -4.985 2.883 0.902 0.417 1.000 -ATOM 3066 H2 TIP3 3303 -6.243 2.177 0.579 0.417 1.000 -ATOM 3067 OH2 TIP3 3304 -6.837 0.489 0.636 -0.834 1.520 -ATOM 3068 H1 TIP3 3304 -7.550 0.171 0.104 0.417 1.000 -ATOM 3069 H2 TIP3 3304 -6.780 -0.125 1.393 0.417 1.000 -ATOM 3070 OH2 TIP3 3305 -3.720 1.031 7.412 -0.834 1.520 -ATOM 3071 H1 TIP3 3305 -4.659 1.271 7.560 0.417 1.000 -ATOM 3072 H2 TIP3 3305 -3.720 1.124 6.419 0.417 1.000 -ATOM 3073 OH2 TIP3 3306 6.330 6.152 9.299 -0.834 1.520 -ATOM 3074 H1 TIP3 3306 5.913 6.992 9.061 0.417 1.000 -ATOM 3075 H2 TIP3 3306 5.617 5.760 9.754 0.417 1.000 -ATOM 3076 OH2 TIP3 3307 8.097 9.556 12.589 -0.834 1.520 -ATOM 3077 H1 TIP3 3307 8.754 9.669 11.895 0.417 1.000 -ATOM 3078 H2 TIP3 3307 8.513 9.950 13.310 0.417 1.000 -ATOM 3079 OH2 TIP3 3308 9.510 18.708 -0.676 -0.834 1.520 -ATOM 3080 H1 TIP3 3308 10.347 19.166 -0.983 0.417 1.000 -ATOM 3081 H2 TIP3 3308 9.207 18.357 -1.520 0.417 1.000 -ATOM 3082 OH2 TIP3 3310 -6.944 11.407 18.941 -0.834 1.520 -ATOM 3083 H1 TIP3 3310 -7.190 11.307 19.873 0.417 1.000 -ATOM 3084 H2 TIP3 3310 -6.290 10.737 18.787 0.417 1.000 -ATOM 3085 OH2 TIP3 3317 12.713 6.595 -17.591 -0.834 1.520 -ATOM 3086 H1 TIP3 3317 13.443 6.598 -18.204 0.417 1.000 -ATOM 3087 H2 TIP3 3317 12.159 5.868 -17.831 0.417 1.000 -ATOM 3088 OH2 TIP3 3319 2.940 14.912 -17.316 -0.834 1.520 -ATOM 3089 H1 TIP3 3319 3.335 14.036 -17.466 0.417 1.000 -ATOM 3090 H2 TIP3 3319 2.084 14.834 -17.682 0.417 1.000 -ATOM 3091 OH2 TIP3 3321 2.821 14.248 -5.771 -0.834 1.520 -ATOM 3092 H1 TIP3 3321 2.847 13.705 -4.945 0.417 1.000 -ATOM 3093 H2 TIP3 3321 2.283 15.020 -5.359 0.417 1.000 -ATOM 3094 OH2 TIP3 3322 0.476 15.705 -15.355 -0.834 1.520 -ATOM 3095 H1 TIP3 3322 -0.320 15.570 -15.913 0.417 1.000 -ATOM 3096 H2 TIP3 3322 0.828 16.523 -15.698 0.417 1.000 -ATOM 3097 OH2 TIP3 3325 14.105 16.903 7.844 -0.834 1.520 -ATOM 3098 H1 TIP3 3325 14.244 17.892 7.722 0.417 1.000 -ATOM 3099 H2 TIP3 3325 14.912 16.594 7.383 0.417 1.000 -ATOM 3100 OH2 TIP3 3326 1.948 15.554 -2.109 -0.834 1.520 -ATOM 3101 H1 TIP3 3326 2.717 15.377 -1.590 0.417 1.000 -ATOM 3102 H2 TIP3 3326 1.530 16.190 -1.504 0.417 1.000 -ATOM 3103 OH2 TIP3 3327 -8.740 17.650 9.834 -0.834 1.520 -ATOM 3104 H1 TIP3 3327 -8.171 18.387 9.997 0.417 1.000 -ATOM 3105 H2 TIP3 3327 -8.734 17.189 10.668 0.417 1.000 -ATOM 3106 OH2 TIP3 3331 2.641 3.390 8.573 -0.834 1.520 -ATOM 3107 H1 TIP3 3331 1.932 3.613 7.913 0.417 1.000 -ATOM 3108 H2 TIP3 3331 3.462 3.561 8.011 0.417 1.000 -ATOM 3109 OH2 TIP3 3341 0.039 14.865 -11.770 -0.834 1.520 -ATOM 3110 H1 TIP3 3341 0.969 14.652 -11.619 0.417 1.000 -ATOM 3111 H2 TIP3 3341 -0.410 14.352 -11.049 0.417 1.000 -ATOM 3112 OH2 TIP3 3342 -6.120 12.413 -10.947 -0.834 1.520 -ATOM 3113 H1 TIP3 3342 -6.887 12.809 -10.546 0.417 1.000 -ATOM 3114 H2 TIP3 3342 -6.460 11.667 -11.547 0.417 1.000 -ATOM 3115 OH2 TIP3 3344 3.196 18.709 -11.576 -0.834 1.520 -ATOM 3116 H1 TIP3 3344 3.539 17.839 -11.882 0.417 1.000 -ATOM 3117 H2 TIP3 3344 2.601 19.066 -12.325 0.417 1.000 -ATOM 3118 OH2 TIP3 3346 11.502 13.556 9.930 -0.834 1.520 -ATOM 3119 H1 TIP3 3346 10.719 13.799 10.505 0.417 1.000 -ATOM 3120 H2 TIP3 3346 12.094 14.329 9.973 0.417 1.000 -ATOM 3121 OH2 TIP3 3347 3.824 8.288 1.326 -0.834 1.520 -ATOM 3122 H1 TIP3 3347 3.081 7.755 1.061 0.417 1.000 -ATOM 3123 H2 TIP3 3347 4.386 7.611 1.752 0.417 1.000 -ATOM 3124 OH2 TIP3 3348 11.386 9.854 0.289 -0.834 1.520 -ATOM 3125 H1 TIP3 3348 11.241 9.291 1.089 0.417 1.000 -ATOM 3126 H2 TIP3 3348 10.965 10.697 0.583 0.417 1.000 -ATOM 3127 OH2 TIP3 3349 -4.743 15.885 1.557 -0.834 1.520 -ATOM 3128 H1 TIP3 3349 -5.635 16.151 1.787 0.417 1.000 -ATOM 3129 H2 TIP3 3349 -4.867 15.206 0.896 0.417 1.000 -ATOM 3130 OH2 TIP3 3354 8.719 3.045 14.191 -0.834 1.520 -ATOM 3131 H1 TIP3 3354 9.021 3.376 15.032 0.417 1.000 -ATOM 3132 H2 TIP3 3354 8.093 3.809 13.941 0.417 1.000 -ATOM 3133 OH2 TIP3 3355 7.584 18.273 13.328 -0.834 1.520 -ATOM 3134 H1 TIP3 3355 8.182 17.595 13.635 0.417 1.000 -ATOM 3135 H2 TIP3 3355 7.542 18.939 14.090 0.417 1.000 -ATOM 3136 OH2 TIP3 3360 -6.296 14.221 -18.664 -0.834 1.520 -ATOM 3137 H1 TIP3 3360 -7.201 13.899 -18.594 0.417 1.000 -ATOM 3138 H2 TIP3 3360 -6.435 15.045 -19.002 0.417 1.000 -ATOM 3139 OH2 TIP3 3361 16.938 12.388 -12.789 -0.834 1.520 -ATOM 3140 H1 TIP3 3361 16.351 12.372 -13.508 0.417 1.000 -ATOM 3141 H2 TIP3 3361 16.380 11.959 -12.054 0.417 1.000 -ATOM 3142 OH2 TIP3 3362 15.592 19.396 -5.750 -0.834 1.520 -ATOM 3143 H1 TIP3 3362 15.721 18.731 -5.066 0.417 1.000 -ATOM 3144 H2 TIP3 3362 14.608 19.476 -5.822 0.417 1.000 -ATOM 3145 OH2 TIP3 3364 4.484 16.412 -7.049 -0.834 1.520 -ATOM 3146 H1 TIP3 3364 4.485 16.471 -8.026 0.417 1.000 -ATOM 3147 H2 TIP3 3364 4.158 15.531 -6.932 0.417 1.000 -ATOM 3148 OH2 TIP3 3365 -5.278 11.521 3.300 -0.834 1.520 -ATOM 3149 H1 TIP3 3365 -5.073 11.386 2.378 0.417 1.000 -ATOM 3150 H2 TIP3 3365 -5.063 12.455 3.478 0.417 1.000 -ATOM 3151 OH2 TIP3 3367 1.063 7.441 0.605 -0.834 1.520 -ATOM 3152 H1 TIP3 3367 0.963 7.681 -0.336 0.417 1.000 -ATOM 3153 H2 TIP3 3367 0.342 7.928 0.966 0.417 1.000 -ATOM 3154 OH2 TIP3 3369 11.035 9.187 18.107 -0.834 1.520 -ATOM 3155 H1 TIP3 3369 11.918 8.994 17.751 0.417 1.000 -ATOM 3156 H2 TIP3 3369 10.832 9.960 17.584 0.417 1.000 -ATOM 3157 OH2 TIP3 3381 -3.343 18.461 -13.027 -0.834 1.520 -ATOM 3158 H1 TIP3 3381 -2.652 17.883 -12.653 0.417 1.000 -ATOM 3159 H2 TIP3 3381 -2.867 19.239 -13.300 0.417 1.000 -ATOM 3160 OH2 TIP3 3382 -3.963 10.640 -18.572 -0.834 1.520 -ATOM 3161 H1 TIP3 3382 -3.743 9.742 -18.476 0.417 1.000 -ATOM 3162 H2 TIP3 3382 -4.109 10.862 -17.613 0.417 1.000 -ATOM 3163 OH2 TIP3 3386 -7.440 16.914 -1.482 -0.834 1.520 -ATOM 3164 H1 TIP3 3386 -7.689 16.841 -0.540 0.417 1.000 -ATOM 3165 H2 TIP3 3386 -6.828 16.216 -1.656 0.417 1.000 -ATOM 3166 OH2 TIP3 3390 3.102 17.270 9.478 -0.834 1.520 -ATOM 3167 H1 TIP3 3390 2.345 16.778 9.860 0.417 1.000 -ATOM 3168 H2 TIP3 3390 3.430 17.711 10.304 0.417 1.000 -ATOM 3169 OH2 TIP3 3402 9.449 12.516 -18.554 -0.834 1.520 -ATOM 3170 H1 TIP3 3402 8.981 11.946 -17.918 0.417 1.000 -ATOM 3171 H2 TIP3 3402 9.079 12.287 -19.363 0.417 1.000 -ATOM 3172 OH2 TIP3 3407 12.538 16.315 -13.204 -0.834 1.520 -ATOM 3173 H1 TIP3 3407 11.589 16.133 -13.445 0.417 1.000 -ATOM 3174 H2 TIP3 3407 12.745 16.978 -13.943 0.417 1.000 -ATOM 3175 OH2 TIP3 3408 5.857 9.295 -8.119 -0.834 1.520 -ATOM 3176 H1 TIP3 3408 5.568 9.647 -8.984 0.417 1.000 -ATOM 3177 H2 TIP3 3408 6.103 8.399 -8.327 0.417 1.000 -ATOM 3178 OH2 TIP3 3426 -4.258 -18.175 -10.226 -0.834 1.520 -ATOM 3179 H1 TIP3 3426 -3.301 -18.446 -10.271 0.417 1.000 -ATOM 3180 H2 TIP3 3426 -4.751 -18.826 -9.629 0.417 1.000 -ATOM 3181 OH2 TIP3 3429 12.174 18.309 -15.121 -0.834 1.520 -ATOM 3182 H1 TIP3 3429 11.952 19.107 -15.632 0.417 1.000 -ATOM 3183 H2 TIP3 3429 12.026 18.641 -14.203 0.417 1.000 -ATOM 3184 OH2 TIP3 3434 3.636 -17.881 13.250 -0.834 1.520 -ATOM 3185 H1 TIP3 3434 3.720 -18.455 14.027 0.417 1.000 -ATOM 3186 H2 TIP3 3434 2.745 -17.597 13.252 0.417 1.000 -ATOM 3187 OH2 TIP3 3442 -3.430 -6.877 -18.044 -0.834 1.520 -ATOM 3188 H1 TIP3 3442 -2.520 -6.979 -18.452 0.417 1.000 -ATOM 3189 H2 TIP3 3442 -3.718 -5.904 -18.338 0.417 1.000 -ATOM 3190 OH2 TIP3 3447 -8.684 -17.727 -12.044 -0.834 1.520 -ATOM 3191 H1 TIP3 3447 -8.609 -18.642 -11.849 0.417 1.000 -ATOM 3192 H2 TIP3 3447 -9.577 -17.521 -11.819 0.417 1.000 -ATOM 3193 OH2 TIP3 3474 7.662 -18.594 11.356 -0.834 1.520 -ATOM 3194 H1 TIP3 3474 8.156 -18.449 10.505 0.417 1.000 -ATOM 3195 H2 TIP3 3474 8.399 -18.468 12.020 0.417 1.000 -ATOM 3196 OH2 TIP3 3476 10.937 -19.461 3.258 -0.834 1.520 -ATOM 3197 H1 TIP3 3476 11.561 -18.920 2.840 0.417 1.000 -ATOM 3198 H2 TIP3 3476 10.746 -19.011 4.107 0.417 1.000 -ATOM 3199 OH2 TIP3 3484 6.929 -17.058 -8.449 -0.834 1.520 -ATOM 3200 H1 TIP3 3484 7.470 -17.669 -8.955 0.417 1.000 -ATOM 3201 H2 TIP3 3484 6.250 -17.632 -8.048 0.417 1.000 -ATOM 3202 OH2 TIP3 3496 -1.365 -14.560 17.484 -0.834 1.520 -ATOM 3203 H1 TIP3 3496 -0.699 -13.859 17.377 0.417 1.000 -ATOM 3204 H2 TIP3 3496 -2.066 -14.222 16.946 0.417 1.000 -ATOM 3205 OH2 TIP3 3511 15.030 -9.953 -19.026 -0.834 1.520 -ATOM 3206 H1 TIP3 3511 15.212 -9.882 -18.080 0.417 1.000 -ATOM 3207 H2 TIP3 3511 14.099 -10.210 -19.053 0.417 1.000 -ATOM 3208 OH2 TIP3 3513 11.120 -7.431 -0.992 -0.834 1.520 -ATOM 3209 H1 TIP3 3513 11.055 -6.939 -0.104 0.417 1.000 -ATOM 3210 H2 TIP3 3513 11.846 -7.013 -1.468 0.417 1.000 -ATOM 3211 OH2 TIP3 3526 0.597 -5.368 -18.938 -0.834 1.520 -ATOM 3212 H1 TIP3 3526 1.521 -5.203 -18.586 0.417 1.000 -ATOM 3213 H2 TIP3 3526 0.147 -5.910 -18.280 0.417 1.000 -ATOM 3214 OH2 TIP3 3527 -1.662 -9.030 -9.881 -0.834 1.520 -ATOM 3215 H1 TIP3 3527 -0.912 -9.437 -9.468 0.417 1.000 -ATOM 3216 H2 TIP3 3527 -1.689 -9.409 -10.783 0.417 1.000 -ATOM 3217 OH2 TIP3 3533 16.855 -16.550 -15.932 -0.834 1.520 -ATOM 3218 H1 TIP3 3533 16.377 -17.127 -16.496 0.417 1.000 -ATOM 3219 H2 TIP3 3533 17.457 -16.152 -16.610 0.417 1.000 -ATOM 3220 OH2 TIP3 3534 1.664 -8.200 -7.213 -0.834 1.520 -ATOM 3221 H1 TIP3 3534 1.444 -7.476 -7.781 0.417 1.000 -ATOM 3222 H2 TIP3 3534 2.536 -8.468 -7.528 0.417 1.000 -ATOM 3223 OH2 TIP3 3537 -6.172 -9.878 13.931 -0.834 1.520 -ATOM 3224 H1 TIP3 3537 -6.340 -9.113 14.448 0.417 1.000 -ATOM 3225 H2 TIP3 3537 -6.555 -9.618 13.104 0.417 1.000 -ATOM 3226 OH2 TIP3 3545 -9.593 -13.351 -11.112 -0.834 1.520 -ATOM 3227 H1 TIP3 3545 -10.190 -12.785 -10.614 0.417 1.000 -ATOM 3228 H2 TIP3 3545 -8.923 -13.583 -10.453 0.417 1.000 -ATOM 3229 OH2 TIP3 3548 -2.183 -7.240 -12.578 -0.834 1.520 -ATOM 3230 H1 TIP3 3548 -1.894 -7.340 -11.612 0.417 1.000 -ATOM 3231 H2 TIP3 3548 -2.840 -6.517 -12.553 0.417 1.000 -ATOM 3232 OH2 TIP3 3554 -0.662 -10.156 -12.476 -0.834 1.520 -ATOM 3233 H1 TIP3 3554 -0.464 -10.789 -13.212 0.417 1.000 -ATOM 3234 H2 TIP3 3554 0.226 -9.867 -12.171 0.417 1.000 -ATOM 3235 OH2 TIP3 3555 8.615 -15.272 -3.578 -0.834 1.520 -ATOM 3236 H1 TIP3 3555 8.225 -16.019 -4.153 0.417 1.000 -ATOM 3237 H2 TIP3 3555 9.456 -15.164 -4.049 0.417 1.000 -ATOM 3238 OH2 TIP3 3556 1.245 -11.884 3.968 -0.834 1.520 -ATOM 3239 H1 TIP3 3556 1.257 -11.460 4.803 0.417 1.000 -ATOM 3240 H2 TIP3 3556 0.394 -12.328 3.868 0.417 1.000 -ATOM 3241 OH2 TIP3 3557 1.166 -4.178 6.322 -0.834 1.520 -ATOM 3242 H1 TIP3 3557 0.234 -3.995 6.686 0.417 1.000 -ATOM 3243 H2 TIP3 3557 1.754 -3.895 7.059 0.417 1.000 -ATOM 3244 OH2 TIP3 3558 9.568 -9.476 11.315 -0.834 1.520 -ATOM 3245 H1 TIP3 3558 9.760 -9.233 10.405 0.417 1.000 -ATOM 3246 H2 TIP3 3558 9.048 -10.308 11.270 0.417 1.000 -ATOM 3247 OH2 TIP3 3561 12.369 -14.725 10.147 -0.834 1.520 -ATOM 3248 H1 TIP3 3561 11.932 -13.978 9.735 0.417 1.000 -ATOM 3249 H2 TIP3 3561 13.298 -14.623 9.839 0.417 1.000 -ATOM 3250 OH2 TIP3 3563 14.432 -13.795 16.075 -0.834 1.520 -ATOM 3251 H1 TIP3 3563 15.229 -13.972 15.624 0.417 1.000 -ATOM 3252 H2 TIP3 3563 14.534 -12.793 16.324 0.417 1.000 -ATOM 3253 OH2 TIP3 3569 8.012 -14.434 -10.411 -0.834 1.520 -ATOM 3254 H1 TIP3 3569 8.394 -15.312 -10.312 0.417 1.000 -ATOM 3255 H2 TIP3 3569 8.330 -14.152 -11.287 0.417 1.000 -ATOM 3256 OH2 TIP3 3573 5.331 -10.120 -15.621 -0.834 1.520 -ATOM 3257 H1 TIP3 3573 5.003 -10.588 -16.448 0.417 1.000 -ATOM 3258 H2 TIP3 3573 5.326 -10.861 -14.956 0.417 1.000 -ATOM 3259 OH2 TIP3 3575 0.692 -1.258 -7.867 -0.834 1.520 -ATOM 3260 H1 TIP3 3575 0.174 -1.419 -7.053 0.417 1.000 -ATOM 3261 H2 TIP3 3575 0.895 -2.180 -8.145 0.417 1.000 -ATOM 3262 OH2 TIP3 3576 8.824 -10.422 14.277 -0.834 1.520 -ATOM 3263 H1 TIP3 3576 9.395 -11.161 14.092 0.417 1.000 -ATOM 3264 H2 TIP3 3576 8.903 -9.892 13.539 0.417 1.000 -ATOM 3265 OH2 TIP3 3579 12.304 -14.975 12.794 -0.834 1.520 -ATOM 3266 H1 TIP3 3579 13.262 -14.898 13.108 0.417 1.000 -ATOM 3267 H2 TIP3 3579 12.441 -15.135 11.819 0.417 1.000 -ATOM 3268 OH2 TIP3 3580 3.911 -3.110 16.592 -0.834 1.520 -ATOM 3269 H1 TIP3 3580 4.082 -3.804 15.963 0.417 1.000 -ATOM 3270 H2 TIP3 3580 3.767 -3.685 17.335 0.417 1.000 -ATOM 3271 OH2 TIP3 3582 12.381 -6.189 13.041 -0.834 1.520 -ATOM 3272 H1 TIP3 3582 12.766 -5.332 13.086 0.417 1.000 -ATOM 3273 H2 TIP3 3582 12.213 -6.361 13.965 0.417 1.000 -ATOM 3274 OH2 TIP3 3586 1.378 -6.976 18.454 -0.834 1.520 -ATOM 3275 H1 TIP3 3586 0.547 -7.171 17.981 0.417 1.000 -ATOM 3276 H2 TIP3 3586 1.598 -7.782 18.914 0.417 1.000 -ATOM 3277 OH2 TIP3 3592 -1.489 17.143 -11.665 -0.834 1.520 -ATOM 3278 H1 TIP3 3592 -0.930 16.307 -11.849 0.417 1.000 -ATOM 3279 H2 TIP3 3592 -1.793 16.991 -10.695 0.417 1.000 -ATOM 3280 OH2 TIP3 3593 12.013 -7.181 -18.277 -0.834 1.520 -ATOM 3281 H1 TIP3 3593 12.460 -6.480 -17.745 0.417 1.000 -ATOM 3282 H2 TIP3 3593 11.701 -7.823 -17.646 0.417 1.000 -ATOM 3283 OH2 TIP3 3595 3.999 -5.659 -8.781 -0.834 1.520 -ATOM 3284 H1 TIP3 3595 3.278 -5.411 -9.279 0.417 1.000 -ATOM 3285 H2 TIP3 3595 4.589 -4.919 -8.951 0.417 1.000 -ATOM 3286 OH2 TIP3 3596 -12.426 -0.580 -15.283 -0.834 1.520 -ATOM 3287 H1 TIP3 3596 -12.296 -0.665 -16.321 0.417 1.000 -ATOM 3288 H2 TIP3 3596 -12.030 0.255 -15.043 0.417 1.000 -ATOM 3289 OH2 TIP3 3597 -0.426 0.666 -9.283 -0.834 1.520 -ATOM 3290 H1 TIP3 3597 0.069 -0.098 -8.966 0.417 1.000 -ATOM 3291 H2 TIP3 3597 -1.173 0.684 -8.672 0.417 1.000 -ATOM 3292 OH2 TIP3 3599 6.427 -13.259 -0.696 -0.834 1.520 -ATOM 3293 H1 TIP3 3599 5.883 -13.835 -0.134 0.417 1.000 -ATOM 3294 H2 TIP3 3599 6.265 -12.402 -0.281 0.417 1.000 -ATOM 3295 OH2 TIP3 3600 3.864 0.095 5.624 -0.834 1.520 -ATOM 3296 H1 TIP3 3600 3.843 -0.333 6.488 0.417 1.000 -ATOM 3297 H2 TIP3 3600 4.751 0.351 5.601 0.417 1.000 -ATOM 3298 OH2 TIP3 3601 6.333 -0.644 10.407 -0.834 1.520 -ATOM 3299 H1 TIP3 3601 5.560 -0.189 9.912 0.417 1.000 -ATOM 3300 H2 TIP3 3601 6.320 -0.091 11.252 0.417 1.000 -ATOM 3301 OH2 TIP3 3603 0.844 -9.177 7.657 -0.834 1.520 -ATOM 3302 H1 TIP3 3603 0.261 -9.923 7.795 0.417 1.000 -ATOM 3303 H2 TIP3 3603 0.406 -8.447 8.084 0.417 1.000 -ATOM 3304 OH2 TIP3 3604 10.960 -5.317 17.453 -0.834 1.520 -ATOM 3305 H1 TIP3 3604 11.745 -5.605 16.912 0.417 1.000 -ATOM 3306 H2 TIP3 3604 10.257 -5.140 16.781 0.417 1.000 -ATOM 3307 OH2 TIP3 3612 7.212 -14.449 -18.038 -0.834 1.520 -ATOM 3308 H1 TIP3 3612 6.802 -14.880 -17.376 0.417 1.000 -ATOM 3309 H2 TIP3 3612 7.823 -13.884 -17.577 0.417 1.000 -ATOM 3310 OH2 TIP3 3614 3.131 -1.015 -6.319 -0.834 1.520 -ATOM 3311 H1 TIP3 3614 2.287 -1.216 -6.795 0.417 1.000 -ATOM 3312 H2 TIP3 3614 3.593 -1.855 -6.348 0.417 1.000 -ATOM 3313 OH2 TIP3 3615 4.227 -3.502 -6.350 -0.834 1.520 -ATOM 3314 H1 TIP3 3615 4.060 -4.209 -5.784 0.417 1.000 -ATOM 3315 H2 TIP3 3615 4.818 -3.853 -7.021 0.417 1.000 -ATOM 3316 OH2 TIP3 3617 9.059 10.470 6.160 -0.834 1.520 -ATOM 3317 H1 TIP3 3617 9.043 10.109 7.068 0.417 1.000 -ATOM 3318 H2 TIP3 3617 8.226 10.093 5.792 0.417 1.000 -ATOM 3319 OH2 TIP3 3618 -9.550 -4.558 7.143 -0.834 1.520 -ATOM 3320 H1 TIP3 3618 -9.362 -4.757 8.031 0.417 1.000 -ATOM 3321 H2 TIP3 3618 -9.376 -3.591 7.099 0.417 1.000 -ATOM 3322 OH2 TIP3 3619 -2.063 -15.343 -8.797 -0.834 1.520 -ATOM 3323 H1 TIP3 3619 -2.082 -16.078 -8.121 0.417 1.000 -ATOM 3324 H2 TIP3 3619 -2.296 -15.827 -9.585 0.417 1.000 -ATOM 3325 OH2 TIP3 3620 3.458 -8.491 8.295 -0.834 1.520 -ATOM 3326 H1 TIP3 3620 3.834 -9.124 7.676 0.417 1.000 -ATOM 3327 H2 TIP3 3620 2.483 -8.681 8.283 0.417 1.000 -ATOM 3328 OH2 TIP3 3621 12.515 -3.794 6.473 -0.834 1.520 -ATOM 3329 H1 TIP3 3621 12.822 -4.094 7.292 0.417 1.000 -ATOM 3330 H2 TIP3 3621 12.601 -2.845 6.532 0.417 1.000 -ATOM 3331 OH2 TIP3 3622 11.843 -19.549 11.115 -0.834 1.520 -ATOM 3332 H1 TIP3 3622 12.030 -19.834 11.998 0.417 1.000 -ATOM 3333 H2 TIP3 3622 12.739 -19.295 10.767 0.417 1.000 -ATOM 3334 OH2 TIP3 3623 11.529 -13.787 -4.755 -0.834 1.520 -ATOM 3335 H1 TIP3 3623 11.986 -14.649 -4.637 0.417 1.000 -ATOM 3336 H2 TIP3 3623 11.168 -13.887 -5.657 0.417 1.000 -ATOM 3337 OH2 TIP3 3625 -0.068 10.597 10.791 -0.834 1.520 -ATOM 3338 H1 TIP3 3625 -0.133 10.286 11.647 0.417 1.000 -ATOM 3339 H2 TIP3 3625 -0.870 10.352 10.345 0.417 1.000 -ATOM 3340 OH2 TIP3 3626 0.151 -10.032 12.291 -0.834 1.520 -ATOM 3341 H1 TIP3 3626 0.891 -10.666 12.484 0.417 1.000 -ATOM 3342 H2 TIP3 3626 0.624 -9.166 12.268 0.417 1.000 -ATOM 3343 OH2 TIP3 3627 -2.624 -8.100 18.779 -0.834 1.520 -ATOM 3344 H1 TIP3 3627 -1.963 -8.189 19.498 0.417 1.000 -ATOM 3345 H2 TIP3 3627 -3.193 -8.844 18.913 0.417 1.000 -ATOM 3346 OH2 TIP3 3628 1.703 -2.991 14.150 -0.834 1.520 -ATOM 3347 H1 TIP3 3628 2.047 -3.918 14.071 0.417 1.000 -ATOM 3348 H2 TIP3 3628 2.343 -2.490 13.690 0.417 1.000 -ATOM 3349 OH2 TIP3 3633 7.510 2.709 -10.593 -0.834 1.520 -ATOM 3350 H1 TIP3 3633 8.180 2.143 -10.210 0.417 1.000 -ATOM 3351 H2 TIP3 3633 8.048 3.575 -10.668 0.417 1.000 -ATOM 3352 OH2 TIP3 3634 8.834 9.646 -3.470 -0.834 1.520 -ATOM 3353 H1 TIP3 3634 8.945 9.168 -2.616 0.417 1.000 -ATOM 3354 H2 TIP3 3634 7.869 9.694 -3.620 0.417 1.000 -ATOM 3355 OH2 TIP3 3636 10.680 3.011 -16.453 -0.834 1.520 -ATOM 3356 H1 TIP3 3636 10.863 3.667 -15.780 0.417 1.000 -ATOM 3357 H2 TIP3 3636 10.122 2.449 -15.860 0.417 1.000 -ATOM 3358 OH2 TIP3 3638 9.991 8.121 -12.768 -0.834 1.520 -ATOM 3359 H1 TIP3 3638 9.530 8.721 -12.161 0.417 1.000 -ATOM 3360 H2 TIP3 3638 10.596 7.688 -12.130 0.417 1.000 -ATOM 3361 OH2 TIP3 3639 9.518 -0.807 1.553 -0.834 1.520 -ATOM 3362 H1 TIP3 3639 8.577 -0.843 1.744 0.417 1.000 -ATOM 3363 H2 TIP3 3639 9.949 -1.501 2.148 0.417 1.000 -ATOM 3364 OH2 TIP3 3640 -1.059 3.457 10.901 -0.834 1.520 -ATOM 3365 H1 TIP3 3640 -1.658 4.220 10.616 0.417 1.000 -ATOM 3366 H2 TIP3 3640 -0.697 3.144 10.063 0.417 1.000 -ATOM 3367 OH2 TIP3 3641 -1.605 -4.534 -5.785 -0.834 1.520 -ATOM 3368 H1 TIP3 3641 -0.751 -5.012 -5.934 0.417 1.000 -ATOM 3369 H2 TIP3 3641 -1.957 -4.900 -4.975 0.417 1.000 -ATOM 3370 OH2 TIP3 3642 6.227 -9.871 7.843 -0.834 1.520 -ATOM 3371 H1 TIP3 3642 6.036 -8.980 7.661 0.417 1.000 -ATOM 3372 H2 TIP3 3642 7.022 -10.012 7.355 0.417 1.000 -ATOM 3373 OH2 TIP3 3643 5.868 -10.137 11.056 -0.834 1.520 -ATOM 3374 H1 TIP3 3643 5.641 -9.497 10.437 0.417 1.000 -ATOM 3375 H2 TIP3 3643 5.435 -9.850 11.915 0.417 1.000 -ATOM 3376 OH2 TIP3 3650 -7.746 -0.324 -17.771 -0.834 1.520 -ATOM 3377 H1 TIP3 3650 -7.322 0.538 -17.642 0.417 1.000 -ATOM 3378 H2 TIP3 3650 -7.885 -0.465 -18.750 0.417 1.000 -ATOM 3379 OH2 TIP3 3651 -3.114 3.849 -18.438 -0.834 1.520 -ATOM 3380 H1 TIP3 3651 -2.274 4.125 -18.958 0.417 1.000 -ATOM 3381 H2 TIP3 3651 -3.749 4.508 -18.750 0.417 1.000 -ATOM 3382 OH2 TIP3 3653 0.421 -11.489 -5.429 -0.834 1.520 -ATOM 3383 H1 TIP3 3653 0.722 -11.750 -4.559 0.417 1.000 -ATOM 3384 H2 TIP3 3653 -0.085 -10.715 -5.240 0.417 1.000 -ATOM 3385 OH2 TIP3 3657 13.560 -4.859 2.959 -0.834 1.520 -ATOM 3386 H1 TIP3 3657 13.604 -3.944 3.209 0.417 1.000 -ATOM 3387 H2 TIP3 3657 13.626 -5.397 3.811 0.417 1.000 -ATOM 3388 OH2 TIP3 3658 13.349 -2.064 3.595 -0.834 1.520 -ATOM 3389 H1 TIP3 3658 13.408 -1.620 4.471 0.417 1.000 -ATOM 3390 H2 TIP3 3658 14.053 -1.597 3.056 0.417 1.000 -ATOM 3391 OH2 TIP3 3659 -2.799 12.642 -4.810 -0.834 1.520 -ATOM 3392 H1 TIP3 3659 -2.209 13.341 -5.189 0.417 1.000 -ATOM 3393 H2 TIP3 3659 -2.245 12.224 -4.113 0.417 1.000 -ATOM 3394 OH2 TIP3 3660 -5.964 -12.270 -13.356 -0.834 1.520 -ATOM 3395 H1 TIP3 3660 -5.642 -12.862 -12.654 0.417 1.000 -ATOM 3396 H2 TIP3 3660 -6.114 -11.411 -12.877 0.417 1.000 -ATOM 3397 OH2 TIP3 3661 -11.976 3.598 -2.565 -0.834 1.520 -ATOM 3398 H1 TIP3 3661 -11.098 3.477 -2.956 0.417 1.000 -ATOM 3399 H2 TIP3 3661 -12.350 4.418 -2.883 0.417 1.000 -ATOM 3400 OH2 TIP3 3662 -1.094 -9.315 -4.907 -0.834 1.520 -ATOM 3401 H1 TIP3 3662 -1.480 -8.805 -5.617 0.417 1.000 -ATOM 3402 H2 TIP3 3662 -1.727 -10.004 -4.728 0.417 1.000 -ATOM 3403 OH2 TIP3 3663 15.988 -1.510 15.037 -0.834 1.520 -ATOM 3404 H1 TIP3 3663 15.252 -1.110 15.531 0.417 1.000 -ATOM 3405 H2 TIP3 3663 16.749 -1.311 15.667 0.417 1.000 -ATOM 3406 OH2 TIP3 3664 16.697 11.319 7.188 -0.834 1.520 -ATOM 3407 H1 TIP3 3664 17.468 11.942 6.968 0.417 1.000 -ATOM 3408 H2 TIP3 3664 16.113 11.982 7.478 0.417 1.000 -ATOM 3409 OH2 TIP3 3665 -16.498 -1.262 6.015 -0.834 1.520 -ATOM 3410 H1 TIP3 3665 -15.958 -0.566 6.414 0.417 1.000 -ATOM 3411 H2 TIP3 3665 -16.785 -0.812 5.221 0.417 1.000 -ATOM 3412 OH2 TIP3 3674 10.470 -1.289 -16.235 -0.834 1.520 -ATOM 3413 H1 TIP3 3674 11.181 -1.546 -16.789 0.417 1.000 -ATOM 3414 H2 TIP3 3674 9.687 -1.279 -16.766 0.417 1.000 -ATOM 3415 OH2 TIP3 3675 5.926 9.198 -3.389 -0.834 1.520 -ATOM 3416 H1 TIP3 3675 5.471 8.950 -2.552 0.417 1.000 -ATOM 3417 H2 TIP3 3675 6.067 8.349 -3.828 0.417 1.000 -ATOM 3418 OH2 TIP3 3677 -1.703 13.419 -13.656 -0.834 1.520 -ATOM 3419 H1 TIP3 3677 -1.947 14.034 -14.380 0.417 1.000 -ATOM 3420 H2 TIP3 3677 -0.938 13.788 -13.230 0.417 1.000 -ATOM 3421 OH2 TIP3 3678 14.802 2.107 6.297 -0.834 1.520 -ATOM 3422 H1 TIP3 3678 13.985 2.571 6.115 0.417 1.000 -ATOM 3423 H2 TIP3 3678 15.066 2.359 7.253 0.417 1.000 -ATOM 3424 OH2 TIP3 3680 10.034 -5.650 5.943 -0.834 1.520 -ATOM 3425 H1 TIP3 3680 9.652 -4.714 6.018 0.417 1.000 -ATOM 3426 H2 TIP3 3680 10.910 -5.497 6.214 0.417 1.000 -ATOM 3427 OH2 TIP3 3681 12.093 18.549 -19.160 -0.834 1.520 -ATOM 3428 H1 TIP3 3681 12.906 18.958 -18.839 0.417 1.000 -ATOM 3429 H2 TIP3 3681 11.546 18.598 -18.361 0.417 1.000 -ATOM 3430 OH2 TIP3 3682 8.651 -7.404 2.449 -0.834 1.520 -ATOM 3431 H1 TIP3 3682 9.290 -7.786 3.072 0.417 1.000 -ATOM 3432 H2 TIP3 3682 7.869 -7.890 2.508 0.417 1.000 -ATOM 3433 OH2 TIP3 3683 -8.822 16.778 18.226 -0.834 1.520 -ATOM 3434 H1 TIP3 3683 -8.780 15.842 18.508 0.417 1.000 -ATOM 3435 H2 TIP3 3683 -7.966 17.155 18.555 0.417 1.000 -ATOM 3436 OH2 TIP3 3684 6.505 0.722 6.381 -0.834 1.520 -ATOM 3437 H1 TIP3 3684 7.423 0.915 6.251 0.417 1.000 -ATOM 3438 H2 TIP3 3684 6.508 0.422 7.279 0.417 1.000 -ATOM 3439 OH2 TIP3 3685 -2.028 6.015 14.219 -0.834 1.520 -ATOM 3440 H1 TIP3 3685 -2.554 5.249 14.270 0.417 1.000 -ATOM 3441 H2 TIP3 3685 -2.631 6.802 13.987 0.417 1.000 -ATOM 3442 OH2 TIP3 3686 18.803 0.448 19.090 -0.834 1.520 -ATOM 3443 H1 TIP3 3686 17.883 0.432 19.103 0.417 1.000 -ATOM 3444 H2 TIP3 3686 19.035 -0.371 19.547 0.417 1.000 -ATOM 3445 OH2 TIP3 3687 -14.094 12.297 15.892 -0.834 1.520 -ATOM 3446 H1 TIP3 3687 -14.111 11.416 16.358 0.417 1.000 -ATOM 3447 H2 TIP3 3687 -14.296 12.007 14.983 0.417 1.000 -ATOM 3448 OH2 TIP3 3688 4.952 6.251 6.578 -0.834 1.520 -ATOM 3449 H1 TIP3 3688 4.751 7.051 6.086 0.417 1.000 -ATOM 3450 H2 TIP3 3688 4.062 6.040 6.932 0.417 1.000 -ATOM 3451 OH2 TIP3 3693 8.780 6.524 -17.444 -0.834 1.520 -ATOM 3452 H1 TIP3 3693 9.484 7.192 -17.481 0.417 1.000 -ATOM 3453 H2 TIP3 3693 8.952 6.125 -16.582 0.417 1.000 -ATOM 3454 OH2 TIP3 3697 0.584 9.083 -10.742 -0.834 1.520 -ATOM 3455 H1 TIP3 3697 0.206 9.670 -9.996 0.417 1.000 -ATOM 3456 H2 TIP3 3697 1.495 9.378 -10.905 0.417 1.000 -ATOM 3457 OH2 TIP3 3698 4.169 11.178 -12.907 -0.834 1.520 -ATOM 3458 H1 TIP3 3698 4.122 11.962 -13.524 0.417 1.000 -ATOM 3459 H2 TIP3 3698 3.761 10.528 -13.519 0.417 1.000 -ATOM 3460 OH2 TIP3 3700 13.724 6.470 -8.627 -0.834 1.520 -ATOM 3461 H1 TIP3 3700 13.880 5.569 -8.976 0.417 1.000 -ATOM 3462 H2 TIP3 3700 13.190 6.279 -7.832 0.417 1.000 -ATOM 3463 OH2 TIP3 3701 15.573 0.568 -7.601 -0.834 1.520 -ATOM 3464 H1 TIP3 3701 15.495 -0.091 -8.311 0.417 1.000 -ATOM 3465 H2 TIP3 3701 16.536 0.645 -7.501 0.417 1.000 -ATOM 3466 OH2 TIP3 3702 -10.840 15.087 -2.911 -0.834 1.520 -ATOM 3467 H1 TIP3 3702 -11.107 14.303 -3.482 0.417 1.000 -ATOM 3468 H2 TIP3 3702 -11.489 15.788 -3.081 0.417 1.000 -ATOM 3469 OH2 TIP3 3703 0.942 4.743 1.022 -0.834 1.520 -ATOM 3470 H1 TIP3 3703 0.045 4.484 0.827 0.417 1.000 -ATOM 3471 H2 TIP3 3703 0.951 5.726 0.788 0.417 1.000 -ATOM 3472 OH2 TIP3 3704 -7.979 -2.156 11.021 -0.834 1.520 -ATOM 3473 H1 TIP3 3704 -7.608 -1.226 11.010 0.417 1.000 -ATOM 3474 H2 TIP3 3704 -8.319 -2.211 11.918 0.417 1.000 -ATOM 3475 OH2 TIP3 3705 13.481 13.909 0.236 -0.834 1.520 -ATOM 3476 H1 TIP3 3705 13.407 13.374 1.086 0.417 1.000 -ATOM 3477 H2 TIP3 3705 13.571 13.236 -0.419 0.417 1.000 -ATOM 3478 OH2 TIP3 3706 -2.728 13.927 9.206 -0.834 1.520 -ATOM 3479 H1 TIP3 3706 -2.543 13.467 8.331 0.417 1.000 -ATOM 3480 H2 TIP3 3706 -3.644 13.784 9.311 0.417 1.000 -ATOM 3481 OH2 TIP3 3707 7.535 5.870 5.374 -0.834 1.520 -ATOM 3482 H1 TIP3 3707 7.116 5.050 5.042 0.417 1.000 -ATOM 3483 H2 TIP3 3707 6.762 6.449 5.486 0.417 1.000 -ATOM 3484 OH2 TIP3 3708 -3.740 7.219 1.916 -0.834 1.520 -ATOM 3485 H1 TIP3 3708 -4.489 6.653 1.903 0.417 1.000 -ATOM 3486 H2 TIP3 3708 -3.649 7.594 0.992 0.417 1.000 -ATOM 3487 OH2 TIP3 3709 16.983 10.438 17.869 -0.834 1.520 -ATOM 3488 H1 TIP3 3709 16.826 9.559 18.168 0.417 1.000 -ATOM 3489 H2 TIP3 3709 16.427 10.984 18.393 0.417 1.000 -ATOM 3490 OH2 TIP3 3710 19.749 3.431 12.417 -0.834 1.520 -ATOM 3491 H1 TIP3 3710 19.132 2.941 12.963 0.417 1.000 -ATOM 3492 H2 TIP3 3710 19.514 3.210 11.550 0.417 1.000 -ATOM 3493 OH2 TIP3 3718 -0.356 4.996 -19.477 -0.834 1.520 -ATOM 3494 H1 TIP3 3718 -0.243 5.535 -18.635 0.417 1.000 -ATOM 3495 H2 TIP3 3718 0.557 4.741 -19.711 0.417 1.000 -ATOM 3496 OH2 TIP3 3719 12.066 13.024 -17.447 -0.834 1.520 -ATOM 3497 H1 TIP3 3719 11.853 13.167 -16.490 0.417 1.000 -ATOM 3498 H2 TIP3 3719 11.146 12.995 -17.901 0.417 1.000 -ATOM 3499 OH2 TIP3 3720 3.390 9.506 -6.870 -0.834 1.520 -ATOM 3500 H1 TIP3 3720 4.282 9.326 -7.288 0.417 1.000 -ATOM 3501 H2 TIP3 3720 2.986 10.210 -7.391 0.417 1.000 -ATOM 3502 OH2 TIP3 3722 8.287 9.686 -11.030 -0.834 1.520 -ATOM 3503 H1 TIP3 3722 8.048 9.997 -10.130 0.417 1.000 -ATOM 3504 H2 TIP3 3722 7.596 8.964 -11.101 0.417 1.000 -ATOM 3505 OH2 TIP3 3723 -8.666 6.903 -8.696 -0.834 1.520 -ATOM 3506 H1 TIP3 3723 -9.233 7.696 -8.424 0.417 1.000 -ATOM 3507 H2 TIP3 3723 -8.209 6.796 -7.911 0.417 1.000 -ATOM 3508 OH2 TIP3 3724 5.139 10.800 2.203 -0.834 1.520 -ATOM 3509 H1 TIP3 3724 5.778 10.185 2.537 0.417 1.000 -ATOM 3510 H2 TIP3 3724 4.555 10.169 1.700 0.417 1.000 -ATOM 3511 OH2 TIP3 3725 5.658 11.400 7.140 -0.834 1.520 -ATOM 3512 H1 TIP3 3725 4.862 11.443 7.677 0.417 1.000 -ATOM 3513 H2 TIP3 3725 6.368 11.246 7.826 0.417 1.000 -ATOM 3514 OH2 TIP3 3727 17.428 1.222 -1.442 -0.834 1.520 -ATOM 3515 H1 TIP3 3727 17.988 1.972 -1.282 0.417 1.000 -ATOM 3516 H2 TIP3 3727 16.732 1.392 -0.820 0.417 1.000 -ATOM 3517 OH2 TIP3 3728 -12.129 5.057 4.016 -0.834 1.520 -ATOM 3518 H1 TIP3 3728 -12.639 5.718 3.480 0.417 1.000 -ATOM 3519 H2 TIP3 3728 -11.901 4.344 3.402 0.417 1.000 -ATOM 3520 OH2 TIP3 3729 8.465 -0.262 19.336 -0.834 1.520 -ATOM 3521 H1 TIP3 3729 7.950 -0.884 19.864 0.417 1.000 -ATOM 3522 H2 TIP3 3729 8.248 -0.539 18.432 0.417 1.000 -ATOM 3523 OH2 TIP3 3730 14.434 16.027 18.498 -0.834 1.520 -ATOM 3524 H1 TIP3 3730 15.301 15.898 18.847 0.417 1.000 -ATOM 3525 H2 TIP3 3730 14.103 16.711 19.082 0.417 1.000 -ATOM 3526 OH2 TIP3 3731 0.523 11.177 15.364 -0.834 1.520 -ATOM 3527 H1 TIP3 3731 0.219 12.049 15.727 0.417 1.000 -ATOM 3528 H2 TIP3 3731 1.480 11.276 15.419 0.417 1.000 -ATOM 3529 OH2 TIP3 3736 -4.840 -3.683 17.828 -0.834 1.520 -ATOM 3530 H1 TIP3 3736 -4.151 -4.249 18.258 0.417 1.000 -ATOM 3531 H2 TIP3 3736 -4.328 -3.179 17.194 0.417 1.000 -ATOM 3532 OH2 TIP3 3737 -2.150 18.594 -16.699 -0.834 1.520 -ATOM 3533 H1 TIP3 3737 -2.657 19.365 -17.033 0.417 1.000 -ATOM 3534 H2 TIP3 3737 -2.801 17.884 -16.797 0.417 1.000 -ATOM 3535 OH2 TIP3 3740 3.323 9.785 -10.197 -0.834 1.520 -ATOM 3536 H1 TIP3 3740 4.151 10.268 -10.381 0.417 1.000 -ATOM 3537 H2 TIP3 3740 3.301 9.193 -10.864 0.417 1.000 -ATOM 3538 OH2 TIP3 3743 6.993 15.288 0.879 -0.834 1.520 -ATOM 3539 H1 TIP3 3743 6.493 16.117 1.214 0.417 1.000 -ATOM 3540 H2 TIP3 3743 6.584 14.547 1.322 0.417 1.000 -ATOM 3541 OH2 TIP3 3745 -2.593 5.737 5.400 -0.834 1.520 -ATOM 3542 H1 TIP3 3745 -2.392 5.784 4.485 0.417 1.000 -ATOM 3543 H2 TIP3 3745 -1.997 5.061 5.697 0.417 1.000 -ATOM 3544 OH2 TIP3 3746 -1.845 16.925 9.762 -0.834 1.520 -ATOM 3545 H1 TIP3 3746 -2.238 16.448 9.069 0.417 1.000 -ATOM 3546 H2 TIP3 3746 -1.293 17.585 9.292 0.417 1.000 -ATOM 3547 OH2 TIP3 3747 11.049 14.599 4.966 -0.834 1.520 -ATOM 3548 H1 TIP3 3747 10.611 15.284 5.511 0.417 1.000 -ATOM 3549 H2 TIP3 3747 10.546 14.658 4.099 0.417 1.000 -ATOM 3550 OH2 TIP3 3749 7.095 13.829 9.788 -0.834 1.520 -ATOM 3551 H1 TIP3 3749 6.154 14.022 9.709 0.417 1.000 -ATOM 3552 H2 TIP3 3749 7.132 12.848 9.690 0.417 1.000 -ATOM 3553 OH2 TIP3 3751 16.188 -1.598 19.026 -0.834 1.520 -ATOM 3554 H1 TIP3 3751 16.729 -1.821 19.805 0.417 1.000 -ATOM 3555 H2 TIP3 3751 15.286 -1.683 19.326 0.417 1.000 -ATOM 3556 OH2 TIP3 3753 -4.888 9.781 18.252 -0.834 1.520 -ATOM 3557 H1 TIP3 3753 -4.108 9.858 17.589 0.417 1.000 -ATOM 3558 H2 TIP3 3753 -4.441 9.570 19.142 0.417 1.000 -ATOM 3559 OH2 TIP3 3757 13.974 2.808 -17.829 -0.834 1.520 -ATOM 3560 H1 TIP3 3757 14.889 3.172 -17.879 0.417 1.000 -ATOM 3561 H2 TIP3 3757 13.813 2.805 -16.890 0.417 1.000 -ATOM 3562 OH2 TIP3 3761 -0.892 11.667 -2.919 -0.834 1.520 -ATOM 3563 H1 TIP3 3761 -1.396 11.241 -2.230 0.417 1.000 -ATOM 3564 H2 TIP3 3761 -0.380 12.420 -2.436 0.417 1.000 -ATOM 3565 OH2 TIP3 3762 12.961 16.077 -17.240 -0.834 1.520 -ATOM 3566 H1 TIP3 3762 13.235 15.952 -16.317 0.417 1.000 -ATOM 3567 H2 TIP3 3762 11.991 15.792 -17.268 0.417 1.000 -ATOM 3568 OH2 TIP3 3764 -8.006 15.054 -13.253 -0.834 1.520 -ATOM 3569 H1 TIP3 3764 -7.587 15.009 -14.151 0.417 1.000 -ATOM 3570 H2 TIP3 3764 -7.656 15.913 -12.919 0.417 1.000 -ATOM 3571 OH2 TIP3 3766 6.321 12.780 12.842 -0.834 1.520 -ATOM 3572 H1 TIP3 3766 5.775 12.338 12.142 0.417 1.000 -ATOM 3573 H2 TIP3 3766 6.386 13.680 12.475 0.417 1.000 -ATOM 3574 OH2 TIP3 3767 5.196 17.913 11.742 -0.834 1.520 -ATOM 3575 H1 TIP3 3767 6.056 18.105 12.100 0.417 1.000 -ATOM 3576 H2 TIP3 3767 4.976 17.080 12.265 0.417 1.000 -ATOM 3577 OH2 TIP3 3770 10.039 12.865 1.378 -0.834 1.520 -ATOM 3578 H1 TIP3 3770 9.710 12.646 0.494 0.417 1.000 -ATOM 3579 H2 TIP3 3770 9.669 13.778 1.524 0.417 1.000 -ATOM 3580 OH2 TIP3 3771 10.814 15.270 15.396 -0.834 1.520 -ATOM 3581 H1 TIP3 3771 10.991 15.798 14.658 0.417 1.000 -ATOM 3582 H2 TIP3 3771 11.342 15.731 16.033 0.417 1.000 -ATOM 3583 OH2 TIP3 3776 0.228 17.963 -18.198 -0.834 1.520 -ATOM 3584 H1 TIP3 3776 -0.629 18.319 -17.904 0.417 1.000 -ATOM 3585 H2 TIP3 3776 0.139 17.007 -18.337 0.417 1.000 -ATOM 3586 OH2 TIP3 3779 6.637 16.087 -18.996 -0.834 1.520 -ATOM 3587 H1 TIP3 3779 7.498 16.252 -19.407 0.417 1.000 -ATOM 3588 H2 TIP3 3779 6.017 16.028 -19.745 0.417 1.000 -ATOM 3589 OH2 TIP3 3782 8.481 11.362 3.178 -0.834 1.520 -ATOM 3590 H1 TIP3 3782 9.115 11.898 2.672 0.417 1.000 -ATOM 3591 H2 TIP3 3782 8.051 12.015 3.779 0.417 1.000 -ATOM 3592 OH2 TIP3 3786 18.592 18.819 -4.876 -0.834 1.520 -ATOM 3593 H1 TIP3 3786 18.085 18.482 -4.102 0.417 1.000 -ATOM 3594 H2 TIP3 3786 19.458 18.516 -4.519 0.417 1.000 -ATOM 3595 OH2 TIP3 3787 1.899 1.156 4.376 -0.834 1.520 -ATOM 3596 H1 TIP3 3787 2.735 0.786 4.748 0.417 1.000 -ATOM 3597 H2 TIP3 3787 2.058 2.130 4.308 0.417 1.000 -ATOM 3598 OH2 TIP3 3788 -4.347 11.558 10.925 -0.834 1.520 -ATOM 3599 H1 TIP3 3788 -4.052 11.753 11.873 0.417 1.000 -ATOM 3600 H2 TIP3 3788 -5.113 12.079 10.837 0.417 1.000 -ATOM 3601 OH2 TIP3 3789 8.509 15.644 13.685 -0.834 1.520 -ATOM 3602 H1 TIP3 3789 9.225 15.098 13.985 0.417 1.000 -ATOM 3603 H2 TIP3 3789 7.910 15.868 14.500 0.417 1.000 -ATOM 3604 OH2 TIP3 3790 1.536 16.060 2.084 -0.834 1.520 -ATOM 3605 H1 TIP3 3790 0.892 16.677 2.538 0.417 1.000 -ATOM 3606 H2 TIP3 3790 1.559 15.350 2.741 0.417 1.000 -ATOM 3607 OH2 TIP3 3792 6.590 9.316 5.618 -0.834 1.520 -ATOM 3608 H1 TIP3 3792 6.197 10.093 6.064 0.417 1.000 -ATOM 3609 H2 TIP3 3792 5.854 8.815 5.258 0.417 1.000 -ATOM 3610 OH2 TIP3 3793 13.738 15.564 15.836 -0.834 1.520 -ATOM 3611 H1 TIP3 3793 13.875 15.700 16.760 0.417 1.000 -ATOM 3612 H2 TIP3 3793 14.687 15.318 15.462 0.417 1.000 -ATOM 3613 OH2 TIP3 3796 0.923 17.067 12.534 -0.834 1.520 -ATOM 3614 H1 TIP3 3796 0.951 16.521 11.751 0.417 1.000 -ATOM 3615 H2 TIP3 3796 0.543 16.553 13.240 0.417 1.000 -ATOM 3616 OH2 TIP3 3801 14.969 16.609 -19.485 -0.834 1.520 -ATOM 3617 H1 TIP3 3801 14.822 17.562 -19.310 0.417 1.000 -ATOM 3618 H2 TIP3 3801 14.532 16.181 -18.769 0.417 1.000 -ATOM 3619 OH2 TIP3 3814 3.934 16.036 13.741 -0.834 1.520 -ATOM 3620 H1 TIP3 3814 3.190 15.530 13.372 0.417 1.000 -ATOM 3621 H2 TIP3 3814 3.532 16.661 14.417 0.417 1.000 -ATOM 3622 OH2 TIP3 3821 13.010 6.672 -12.664 -0.834 1.520 -ATOM 3623 H1 TIP3 3821 12.982 7.638 -12.578 0.417 1.000 -ATOM 3624 H2 TIP3 3821 12.347 6.374 -12.045 0.417 1.000 -ATOM 3625 OH2 TIP3 3829 12.231 10.996 -6.292 -0.834 1.520 -ATOM 3626 H1 TIP3 3829 11.331 11.344 -6.120 0.417 1.000 -ATOM 3627 H2 TIP3 3829 12.051 10.275 -6.944 0.417 1.000 -ATOM 3628 OH2 TIP3 3833 6.348 18.122 9.123 -0.834 1.520 -ATOM 3629 H1 TIP3 3833 7.110 17.449 9.118 0.417 1.000 -ATOM 3630 H2 TIP3 3833 5.977 17.917 9.990 0.417 1.000 -ATOM 3631 OH2 TIP3 3834 2.904 3.633 14.112 -0.834 1.520 -ATOM 3632 H1 TIP3 3834 1.945 3.842 13.956 0.417 1.000 -ATOM 3633 H2 TIP3 3834 3.299 3.749 13.233 0.417 1.000 -ATOM 3634 OH2 TIP3 3872 4.418 13.938 10.661 -0.834 1.520 -ATOM 3635 H1 TIP3 3872 3.952 14.846 10.630 0.417 1.000 -ATOM 3636 H2 TIP3 3872 3.716 13.327 11.027 0.417 1.000 -ATOM 3637 OH2 TIP3 3892 11.246 13.527 -2.479 -0.834 1.520 -ATOM 3638 H1 TIP3 3892 11.898 12.901 -2.121 0.417 1.000 -ATOM 3639 H2 TIP3 3892 10.392 13.003 -2.459 0.417 1.000 -ATOM 3640 OH2 TIP3 3924 2.436 -6.837 13.707 -0.834 1.520 -ATOM 3641 H1 TIP3 3924 2.654 -7.154 12.787 0.417 1.000 -ATOM 3642 H2 TIP3 3924 1.437 -6.628 13.598 0.417 1.000 -ATOM 3643 OH2 TIP3 3925 2.567 -19.240 -4.911 -0.834 1.520 -ATOM 3644 H1 TIP3 3925 3.323 -19.105 -4.332 0.417 1.000 -ATOM 3645 H2 TIP3 3925 2.175 -18.298 -4.915 0.417 1.000 -ATOM 3646 OH2 TIP3 3931 10.847 -10.906 -13.051 -0.834 1.520 -ATOM 3647 H1 TIP3 3931 10.536 -10.501 -12.215 0.417 1.000 -ATOM 3648 H2 TIP3 3931 11.760 -11.088 -12.731 0.417 1.000 -ATOM 3649 OH2 TIP3 3933 0.520 -14.297 -8.575 -0.834 1.520 -ATOM 3650 H1 TIP3 3933 -0.250 -14.841 -8.280 0.417 1.000 -ATOM 3651 H2 TIP3 3933 0.178 -13.791 -9.402 0.417 1.000 -ATOM 3652 OH2 TIP3 3935 -2.154 -10.960 5.906 -0.834 1.520 -ATOM 3653 H1 TIP3 3935 -2.245 -11.755 5.370 0.417 1.000 -ATOM 3654 H2 TIP3 3935 -1.296 -10.640 5.724 0.417 1.000 -ATOM 3655 OH2 TIP3 3938 8.079 -10.311 19.229 -0.834 1.520 -ATOM 3656 H1 TIP3 3938 7.342 -9.777 18.926 0.417 1.000 -ATOM 3657 H2 TIP3 3938 8.575 -10.398 18.386 0.417 1.000 -ATOM 3658 OH2 TIP3 3951 0.969 -18.875 -10.175 -0.834 1.520 -ATOM 3659 H1 TIP3 3951 1.514 -18.160 -9.758 0.417 1.000 -ATOM 3660 H2 TIP3 3951 0.448 -18.367 -10.822 0.417 1.000 -ATOM 3661 OH2 TIP3 3957 17.252 -4.235 12.061 -0.834 1.520 -ATOM 3662 H1 TIP3 3957 17.786 -5.004 11.783 0.417 1.000 -ATOM 3663 H2 TIP3 3957 17.778 -3.936 12.830 0.417 1.000 -ATOM 3664 OH2 TIP3 3974 8.638 -14.902 -0.868 -0.834 1.520 -ATOM 3665 H1 TIP3 3974 8.603 -15.162 -1.789 0.417 1.000 -ATOM 3666 H2 TIP3 3974 7.854 -14.352 -0.783 0.417 1.000 -ATOM 3667 OH2 TIP3 3975 11.657 -12.587 -10.331 -0.834 1.520 -ATOM 3668 H1 TIP3 3975 11.102 -13.101 -10.955 0.417 1.000 -ATOM 3669 H2 TIP3 3975 11.276 -11.690 -10.218 0.417 1.000 -ATOM 3670 OH2 TIP3 3976 -2.483 -8.142 -6.990 -0.834 1.520 -ATOM 3671 H1 TIP3 3976 -2.360 -8.227 -7.961 0.417 1.000 -ATOM 3672 H2 TIP3 3976 -2.711 -7.219 -6.870 0.417 1.000 -ATOM 3673 OH2 TIP3 3977 -11.100 -12.690 -8.710 -0.834 1.520 -ATOM 3674 H1 TIP3 3977 -11.261 -13.294 -7.922 0.417 1.000 -ATOM 3675 H2 TIP3 3977 -10.445 -11.997 -8.469 0.417 1.000 -ATOM 3676 OH2 TIP3 3982 6.085 -17.763 16.922 -0.834 1.520 -ATOM 3677 H1 TIP3 3982 6.912 -17.705 16.416 0.417 1.000 -ATOM 3678 H2 TIP3 3982 5.808 -18.656 16.647 0.417 1.000 -ATOM 3679 OH2 TIP3 3986 7.820 -17.527 -19.066 -0.834 1.520 -ATOM 3680 H1 TIP3 3986 8.525 -16.831 -19.113 0.417 1.000 -ATOM 3681 H2 TIP3 3986 7.193 -17.001 -18.501 0.417 1.000 -ATOM 3682 OH2 TIP3 3991 -2.790 -16.954 -3.228 -0.834 1.520 -ATOM 3683 H1 TIP3 3991 -3.225 -16.377 -3.908 0.417 1.000 -ATOM 3684 H2 TIP3 3991 -2.319 -16.271 -2.745 0.417 1.000 -ATOM 3685 OH2 TIP3 3992 8.814 -13.094 -12.626 -0.834 1.520 -ATOM 3686 H1 TIP3 3992 8.585 -12.163 -12.441 0.417 1.000 -ATOM 3687 H2 TIP3 3992 7.928 -13.425 -12.813 0.417 1.000 -ATOM 3688 OH2 TIP3 3995 0.736 -3.581 -1.447 -0.834 1.520 -ATOM 3689 H1 TIP3 3995 0.764 -3.671 -2.443 0.417 1.000 -ATOM 3690 H2 TIP3 3995 1.696 -3.517 -1.213 0.417 1.000 -ATOM 3691 OH2 TIP3 3996 -0.049 -13.567 -15.694 -0.834 1.520 -ATOM 3692 H1 TIP3 3996 -0.404 -12.598 -15.541 0.417 1.000 -ATOM 3693 H2 TIP3 3996 -0.446 -14.069 -14.972 0.417 1.000 -ATOM 3694 OH2 TIP3 3997 12.718 -14.652 7.053 -0.834 1.520 -ATOM 3695 H1 TIP3 3997 13.603 -14.981 6.921 0.417 1.000 -ATOM 3696 H2 TIP3 3997 12.922 -13.638 6.971 0.417 1.000 -ATOM 3697 OH2 TIP3 3998 15.440 -7.081 9.100 -0.834 1.520 -ATOM 3698 H1 TIP3 3998 14.838 -7.743 8.881 0.417 1.000 -ATOM 3699 H2 TIP3 3998 14.992 -6.594 9.885 0.417 1.000 -ATOM 3700 OH2 TIP3 3999 9.861 -16.864 18.399 -0.834 1.520 -ATOM 3701 H1 TIP3 3999 9.833 -17.832 18.395 0.417 1.000 -ATOM 3702 H2 TIP3 3999 10.588 -16.686 17.801 0.417 1.000 -ATOM 3703 OH2 TIP3 4000 13.135 -3.562 9.141 -0.834 1.520 -ATOM 3704 H1 TIP3 4000 13.619 -4.080 9.751 0.417 1.000 -ATOM 3705 H2 TIP3 4000 12.247 -3.589 9.491 0.417 1.000 -ATOM 3706 OH2 TIP3 4002 16.528 -13.601 18.790 -0.834 1.520 -ATOM 3707 H1 TIP3 4002 16.534 -14.037 17.936 0.417 1.000 -ATOM 3708 H2 TIP3 4002 17.180 -12.868 18.599 0.417 1.000 -ATOM 3709 OH2 TIP3 4008 12.422 -6.895 15.788 -0.834 1.520 -ATOM 3710 H1 TIP3 4008 11.988 -7.688 16.179 0.417 1.000 -ATOM 3711 H2 TIP3 4008 13.416 -7.040 15.895 0.417 1.000 -ATOM 3712 OH2 TIP3 4009 1.334 -12.778 -3.130 -0.834 1.520 -ATOM 3713 H1 TIP3 4009 1.033 -13.557 -2.561 0.417 1.000 -ATOM 3714 H2 TIP3 4009 2.137 -12.517 -2.756 0.417 1.000 -ATOM 3715 OH2 TIP3 4010 13.590 4.057 -9.656 -0.834 1.520 -ATOM 3716 H1 TIP3 4010 14.102 3.354 -10.072 0.417 1.000 -ATOM 3717 H2 TIP3 4010 12.721 3.865 -10.077 0.417 1.000 -ATOM 3718 OH2 TIP3 4012 -10.505 -5.584 -18.021 -0.834 1.520 -ATOM 3719 H1 TIP3 4012 -9.646 -5.797 -18.452 0.417 1.000 -ATOM 3720 H2 TIP3 4012 -10.835 -6.434 -17.901 0.417 1.000 -ATOM 3721 OH2 TIP3 4014 10.874 -18.934 -9.095 -0.834 1.520 -ATOM 3722 H1 TIP3 4014 10.395 -19.783 -8.954 0.417 1.000 -ATOM 3723 H2 TIP3 4014 10.290 -18.455 -9.664 0.417 1.000 -ATOM 3724 OH2 TIP3 4015 5.364 -18.735 -12.866 -0.834 1.520 -ATOM 3725 H1 TIP3 4015 4.665 -19.036 -12.210 0.417 1.000 -ATOM 3726 H2 TIP3 4015 5.826 -19.522 -12.955 0.417 1.000 -ATOM 3727 OH2 TIP3 4016 8.064 -3.052 -11.241 -0.834 1.520 -ATOM 3728 H1 TIP3 4016 8.687 -3.318 -10.573 0.417 1.000 -ATOM 3729 H2 TIP3 4016 8.126 -3.743 -11.911 0.417 1.000 -ATOM 3730 OH2 TIP3 4017 3.065 -15.697 -6.374 -0.834 1.520 -ATOM 3731 H1 TIP3 4017 3.694 -14.912 -6.437 0.417 1.000 -ATOM 3732 H2 TIP3 4017 3.274 -16.119 -7.215 0.417 1.000 -ATOM 3733 OH2 TIP3 4018 10.995 -8.500 3.703 -0.834 1.520 -ATOM 3734 H1 TIP3 4018 10.653 -9.321 4.022 0.417 1.000 -ATOM 3735 H2 TIP3 4018 11.942 -8.744 3.491 0.417 1.000 -ATOM 3736 OH2 TIP3 4019 1.576 -8.932 15.249 -0.834 1.520 -ATOM 3737 H1 TIP3 4019 1.856 -8.125 14.811 0.417 1.000 -ATOM 3738 H2 TIP3 4019 0.857 -8.663 15.816 0.417 1.000 -ATOM 3739 OH2 TIP3 4020 -1.606 2.097 15.921 -0.834 1.520 -ATOM 3740 H1 TIP3 4020 -1.872 1.729 16.726 0.417 1.000 -ATOM 3741 H2 TIP3 4020 -0.753 2.630 16.127 0.417 1.000 -ATOM 3742 OH2 TIP3 4021 10.622 -13.934 0.635 -0.834 1.520 -ATOM 3743 H1 TIP3 4021 10.281 -13.753 1.496 0.417 1.000 -ATOM 3744 H2 TIP3 4021 9.861 -14.147 0.054 0.417 1.000 -ATOM 3745 OH2 TIP3 4022 14.702 -11.815 -0.918 -0.834 1.520 -ATOM 3746 H1 TIP3 4022 14.386 -12.520 -0.405 0.417 1.000 -ATOM 3747 H2 TIP3 4022 14.028 -11.782 -1.689 0.417 1.000 -ATOM 3748 OH2 TIP3 4033 -4.631 16.264 -14.389 -0.834 1.520 -ATOM 3749 H1 TIP3 4033 -4.414 16.956 -13.783 0.417 1.000 -ATOM 3750 H2 TIP3 4033 -4.630 15.505 -13.834 0.417 1.000 -ATOM 3751 OH2 TIP3 4035 6.318 -13.975 -12.652 -0.834 1.520 -ATOM 3752 H1 TIP3 4035 6.091 -14.638 -12.062 0.417 1.000 -ATOM 3753 H2 TIP3 4035 5.538 -13.834 -13.227 0.417 1.000 -ATOM 3754 OH2 TIP3 4036 -6.395 -14.647 -0.720 -0.834 1.520 -ATOM 3755 H1 TIP3 4036 -6.342 -15.473 -1.188 0.417 1.000 -ATOM 3756 H2 TIP3 4036 -7.312 -14.633 -0.484 0.417 1.000 -ATOM 3757 OH2 TIP3 4037 -0.057 -11.459 -18.909 -0.834 1.520 -ATOM 3758 H1 TIP3 4037 -0.292 -12.409 -18.731 0.417 1.000 -ATOM 3759 H2 TIP3 4037 -0.863 -10.967 -18.795 0.417 1.000 -ATOM 3760 OH2 TIP3 4038 3.521 11.765 8.560 -0.834 1.520 -ATOM 3761 H1 TIP3 4038 3.477 11.852 9.555 0.417 1.000 -ATOM 3762 H2 TIP3 4038 2.667 12.153 8.282 0.417 1.000 -ATOM 3763 OH2 TIP3 4039 -0.516 -14.181 1.991 -0.834 1.520 -ATOM 3764 H1 TIP3 4039 -0.814 -13.826 2.828 0.417 1.000 -ATOM 3765 H2 TIP3 4039 -0.266 -13.368 1.445 0.417 1.000 -ATOM 3766 OH2 TIP3 4041 5.896 -14.636 8.742 -0.834 1.520 -ATOM 3767 H1 TIP3 4041 6.865 -14.591 8.639 0.417 1.000 -ATOM 3768 H2 TIP3 4041 5.662 -13.782 9.195 0.417 1.000 -ATOM 3769 OH2 TIP3 4046 5.468 -9.041 18.390 -0.834 1.520 -ATOM 3770 H1 TIP3 4046 5.292 -8.146 18.137 0.417 1.000 -ATOM 3771 H2 TIP3 4046 4.747 -9.595 18.029 0.417 1.000 -ATOM 3772 OH2 TIP3 4047 4.494 -5.204 14.953 -0.834 1.520 -ATOM 3773 H1 TIP3 4047 5.297 -5.596 14.521 0.417 1.000 -ATOM 3774 H2 TIP3 4047 3.764 -5.588 14.441 0.417 1.000 -ATOM 3775 OH2 TIP3 4053 17.225 -10.527 -13.145 -0.834 1.520 -ATOM 3776 H1 TIP3 4053 16.967 -11.229 -13.761 0.417 1.000 -ATOM 3777 H2 TIP3 4053 16.399 -10.177 -12.786 0.417 1.000 -ATOM 3778 OH2 TIP3 4054 12.874 5.033 -3.059 -0.834 1.520 -ATOM 3779 H1 TIP3 4054 13.783 4.696 -3.140 0.417 1.000 -ATOM 3780 H2 TIP3 4054 12.868 5.147 -2.082 0.417 1.000 -ATOM 3781 OH2 TIP3 4055 7.765 0.981 -19.146 -0.834 1.520 -ATOM 3782 H1 TIP3 4055 7.191 0.959 -19.961 0.417 1.000 -ATOM 3783 H2 TIP3 4055 7.432 1.832 -18.752 0.417 1.000 -ATOM 3784 OH2 TIP3 4056 10.722 -0.680 -4.476 -0.834 1.520 -ATOM 3785 H1 TIP3 4056 11.315 -0.019 -4.094 0.417 1.000 -ATOM 3786 H2 TIP3 4056 11.095 -0.738 -5.376 0.417 1.000 -ATOM 3787 OH2 TIP3 4057 14.612 2.300 -12.985 -0.834 1.520 -ATOM 3788 H1 TIP3 4057 14.494 1.817 -13.831 0.417 1.000 -ATOM 3789 H2 TIP3 4057 14.500 3.235 -13.236 0.417 1.000 -ATOM 3790 OH2 TIP3 4059 3.112 6.630 -4.085 -0.834 1.520 -ATOM 3791 H1 TIP3 4059 2.633 6.888 -4.904 0.417 1.000 -ATOM 3792 H2 TIP3 4059 3.826 6.040 -4.348 0.417 1.000 -ATOM 3793 OH2 TIP3 4060 15.161 -2.571 -6.877 -0.834 1.520 -ATOM 3794 H1 TIP3 4060 15.258 -3.527 -6.987 0.417 1.000 -ATOM 3795 H2 TIP3 4060 15.162 -2.327 -7.852 0.417 1.000 -ATOM 3796 OH2 TIP3 4062 8.951 -18.557 8.480 -0.834 1.520 -ATOM 3797 H1 TIP3 4062 9.851 -18.163 8.465 0.417 1.000 -ATOM 3798 H2 TIP3 4062 8.799 -18.820 7.540 0.417 1.000 -ATOM 3799 OH2 TIP3 4064 18.327 5.035 -1.685 -0.834 1.520 -ATOM 3800 H1 TIP3 4064 18.846 5.491 -1.050 0.417 1.000 -ATOM 3801 H2 TIP3 4064 18.154 4.160 -1.397 0.417 1.000 -ATOM 3802 OH2 TIP3 4065 -0.212 -6.172 13.553 -0.834 1.520 -ATOM 3803 H1 TIP3 4065 -0.433 -5.383 12.946 0.417 1.000 -ATOM 3804 H2 TIP3 4065 -0.946 -6.745 13.502 0.417 1.000 -ATOM 3805 OH2 TIP3 4066 5.637 8.363 17.002 -0.834 1.520 -ATOM 3806 H1 TIP3 4066 5.026 8.071 17.718 0.417 1.000 -ATOM 3807 H2 TIP3 4066 6.414 8.745 17.464 0.417 1.000 -ATOM 3808 OH2 TIP3 4074 -12.666 -2.027 -12.910 -0.834 1.520 -ATOM 3809 H1 TIP3 4074 -12.429 -1.610 -13.800 0.417 1.000 -ATOM 3810 H2 TIP3 4074 -13.467 -2.556 -13.115 0.417 1.000 -ATOM 3811 OH2 TIP3 4076 6.108 -3.939 -8.361 -0.834 1.520 -ATOM 3812 H1 TIP3 4076 6.183 -3.416 -9.193 0.417 1.000 -ATOM 3813 H2 TIP3 4076 6.317 -3.316 -7.699 0.417 1.000 -ATOM 3814 OH2 TIP3 4077 -6.088 -8.960 -2.617 -0.834 1.520 -ATOM 3815 H1 TIP3 4077 -6.087 -9.068 -3.577 0.417 1.000 -ATOM 3816 H2 TIP3 4077 -6.388 -8.065 -2.482 0.417 1.000 -ATOM 3817 OH2 TIP3 4079 -3.025 -2.427 5.147 -0.834 1.520 -ATOM 3818 H1 TIP3 4079 -3.222 -1.571 5.632 0.417 1.000 -ATOM 3819 H2 TIP3 4079 -3.822 -2.680 4.650 0.417 1.000 -ATOM 3820 OH2 TIP3 4080 8.662 7.102 13.839 -0.834 1.520 -ATOM 3821 H1 TIP3 4080 8.504 8.001 13.610 0.417 1.000 -ATOM 3822 H2 TIP3 4080 9.019 6.810 13.024 0.417 1.000 -ATOM 3823 OH2 TIP3 4081 1.807 -0.308 1.956 -0.834 1.520 -ATOM 3824 H1 TIP3 4081 1.892 -1.071 2.570 0.417 1.000 -ATOM 3825 H2 TIP3 4081 1.560 0.390 2.634 0.417 1.000 -ATOM 3826 OH2 TIP3 4082 6.226 -10.810 14.878 -0.834 1.520 -ATOM 3827 H1 TIP3 4082 6.258 -11.728 14.962 0.417 1.000 -ATOM 3828 H2 TIP3 4082 7.135 -10.576 14.667 0.417 1.000 -ATOM 3829 OH2 TIP3 4083 4.469 5.918 -1.441 -0.834 1.520 -ATOM 3830 H1 TIP3 4083 4.369 6.179 -2.406 0.417 1.000 -ATOM 3831 H2 TIP3 4083 5.495 6.011 -1.365 0.417 1.000 -ATOM 3832 OH2 TIP3 4084 11.780 -11.246 5.299 -0.834 1.520 -ATOM 3833 H1 TIP3 4084 12.565 -11.144 4.723 0.417 1.000 -ATOM 3834 H2 TIP3 4084 12.088 -11.048 6.204 0.417 1.000 -ATOM 3835 OH2 TIP3 4085 2.776 3.126 18.490 -0.834 1.520 -ATOM 3836 H1 TIP3 4085 2.530 3.297 19.414 0.417 1.000 -ATOM 3837 H2 TIP3 4085 3.724 2.831 18.576 0.417 1.000 -ATOM 3838 OH2 TIP3 4093 12.300 10.502 -14.924 -0.834 1.520 -ATOM 3839 H1 TIP3 4093 12.005 10.159 -15.743 0.417 1.000 -ATOM 3840 H2 TIP3 4093 11.914 11.375 -14.817 0.417 1.000 -ATOM 3841 OH2 TIP3 4096 13.515 -0.385 5.948 -0.834 1.520 -ATOM 3842 H1 TIP3 4096 13.676 -0.628 6.851 0.417 1.000 -ATOM 3843 H2 TIP3 4096 14.031 0.424 5.802 0.417 1.000 -ATOM 3844 OH2 TIP3 4097 1.975 10.136 -16.634 -0.834 1.520 -ATOM 3845 H1 TIP3 4097 1.739 9.870 -15.758 0.417 1.000 -ATOM 3846 H2 TIP3 4097 1.767 11.134 -16.723 0.417 1.000 -ATOM 3847 OH2 TIP3 4098 13.985 -7.680 -11.033 -0.834 1.520 -ATOM 3848 H1 TIP3 4098 13.589 -7.939 -10.182 0.417 1.000 -ATOM 3849 H2 TIP3 4098 14.317 -8.492 -11.470 0.417 1.000 -ATOM 3850 OH2 TIP3 4099 10.533 -10.235 -1.252 -0.834 1.520 -ATOM 3851 H1 TIP3 4099 10.567 -9.300 -1.058 0.417 1.000 -ATOM 3852 H2 TIP3 4099 9.591 -10.461 -1.351 0.417 1.000 -ATOM 3853 OH2 TIP3 4102 -4.275 4.795 7.901 -0.834 1.520 -ATOM 3854 H1 TIP3 4102 -4.818 4.055 7.722 0.417 1.000 -ATOM 3855 H2 TIP3 4102 -3.748 4.835 7.062 0.417 1.000 -ATOM 3856 OH2 TIP3 4103 12.539 -3.322 12.531 -0.834 1.520 -ATOM 3857 H1 TIP3 4103 11.809 -2.734 12.809 0.417 1.000 -ATOM 3858 H2 TIP3 4103 13.199 -3.256 13.220 0.417 1.000 -ATOM 3859 OH2 TIP3 4104 -2.720 -5.813 2.328 -0.834 1.520 -ATOM 3860 H1 TIP3 4104 -3.074 -6.151 1.493 0.417 1.000 -ATOM 3861 H2 TIP3 4104 -1.809 -6.180 2.308 0.417 1.000 -ATOM 3862 OH2 TIP3 4105 7.964 9.704 18.059 -0.834 1.520 -ATOM 3863 H1 TIP3 4105 8.117 10.373 18.705 0.417 1.000 -ATOM 3864 H2 TIP3 4105 8.792 9.595 17.687 0.417 1.000 -ATOM 3865 OH2 TIP3 4111 5.610 -0.911 15.594 -0.834 1.520 -ATOM 3866 H1 TIP3 4111 4.892 -0.302 15.373 0.417 1.000 -ATOM 3867 H2 TIP3 4111 5.107 -1.675 15.959 0.417 1.000 -ATOM 3868 OH2 TIP3 4116 8.314 11.034 -13.488 -0.834 1.520 -ATOM 3869 H1 TIP3 4116 8.977 10.813 -12.830 0.417 1.000 -ATOM 3870 H2 TIP3 4116 7.711 10.233 -13.413 0.417 1.000 -ATOM 3871 OH2 TIP3 4120 18.872 10.165 -7.349 -0.834 1.520 -ATOM 3872 H1 TIP3 4120 19.333 9.322 -7.181 0.417 1.000 -ATOM 3873 H2 TIP3 4120 19.365 10.598 -8.107 0.417 1.000 -ATOM 3874 OH2 TIP3 4121 8.897 -1.486 -8.849 -0.834 1.520 -ATOM 3875 H1 TIP3 4121 8.880 -1.932 -8.002 0.417 1.000 -ATOM 3876 H2 TIP3 4121 7.887 -1.323 -8.982 0.417 1.000 -ATOM 3877 OH2 TIP3 4122 12.032 2.534 9.832 -0.834 1.520 -ATOM 3878 H1 TIP3 4122 12.926 2.262 9.985 0.417 1.000 -ATOM 3879 H2 TIP3 4122 11.952 2.477 8.841 0.417 1.000 -ATOM 3880 OH2 TIP3 4123 18.641 8.747 -3.397 -0.834 1.520 -ATOM 3881 H1 TIP3 4123 17.669 8.714 -3.558 0.417 1.000 -ATOM 3882 H2 TIP3 4123 18.986 8.413 -4.231 0.417 1.000 -ATOM 3883 OH2 TIP3 4127 8.501 2.159 11.404 -0.834 1.520 -ATOM 3884 H1 TIP3 4127 8.956 2.452 12.204 0.417 1.000 -ATOM 3885 H2 TIP3 4127 7.774 2.841 11.233 0.417 1.000 -ATOM 3886 OH2 TIP3 4138 8.044 -1.600 -17.478 -0.834 1.520 -ATOM 3887 H1 TIP3 4138 7.927 -0.870 -18.225 0.417 1.000 -ATOM 3888 H2 TIP3 4138 7.159 -1.823 -17.185 0.417 1.000 -ATOM 3889 OH2 TIP3 4139 6.481 7.553 -10.971 -0.834 1.520 -ATOM 3890 H1 TIP3 4139 6.004 7.381 -10.096 0.417 1.000 -ATOM 3891 H2 TIP3 4139 5.929 7.078 -11.618 0.417 1.000 -ATOM 3892 OH2 TIP3 4140 8.903 12.212 -1.010 -0.834 1.520 -ATOM 3893 H1 TIP3 4140 8.815 11.966 -1.916 0.417 1.000 -ATOM 3894 H2 TIP3 4140 8.006 12.124 -0.704 0.417 1.000 -ATOM 3895 OH2 TIP3 4141 1.720 0.988 -11.947 -0.834 1.520 -ATOM 3896 H1 TIP3 4141 2.147 0.491 -11.220 0.417 1.000 -ATOM 3897 H2 TIP3 4141 2.486 1.373 -12.378 0.417 1.000 -ATOM 3898 OH2 TIP3 4142 19.270 5.575 -17.443 -0.834 1.520 -ATOM 3899 H1 TIP3 4142 18.738 4.855 -17.786 0.417 1.000 -ATOM 3900 H2 TIP3 4142 18.629 6.323 -17.615 0.417 1.000 -ATOM 3901 OH2 TIP3 4143 6.601 1.149 -7.345 -0.834 1.520 -ATOM 3902 H1 TIP3 4143 7.129 1.882 -7.020 0.417 1.000 -ATOM 3903 H2 TIP3 4143 6.906 0.393 -6.862 0.417 1.000 -ATOM 3904 OH2 TIP3 4144 11.096 -13.224 3.657 -0.834 1.520 -ATOM 3905 H1 TIP3 4144 11.988 -13.476 3.265 0.417 1.000 -ATOM 3906 H2 TIP3 4144 11.323 -12.607 4.336 0.417 1.000 -ATOM 3907 OH2 TIP3 4146 12.044 8.291 6.730 -0.834 1.520 -ATOM 3908 H1 TIP3 4146 12.897 8.113 6.127 0.417 1.000 -ATOM 3909 H2 TIP3 4146 11.822 9.248 6.625 0.417 1.000 -ATOM 3910 OH2 TIP3 4147 4.689 17.948 7.004 -0.834 1.520 -ATOM 3911 H1 TIP3 4147 5.333 17.874 7.739 0.417 1.000 -ATOM 3912 H2 TIP3 4147 3.892 17.654 7.383 0.417 1.000 -ATOM 3913 OH2 TIP3 4148 10.853 11.643 16.882 -0.834 1.520 -ATOM 3914 H1 TIP3 4148 10.367 12.511 16.824 0.417 1.000 -ATOM 3915 H2 TIP3 4148 11.707 11.950 17.265 0.417 1.000 -ATOM 3916 OH2 TIP3 4150 3.171 11.918 15.414 -0.834 1.520 -ATOM 3917 H1 TIP3 4150 3.217 11.076 14.972 0.417 1.000 -ATOM 3918 H2 TIP3 4150 4.123 12.244 15.353 0.417 1.000 -ATOM 3919 OH2 TIP3 4151 14.251 2.876 14.281 -0.834 1.520 -ATOM 3920 H1 TIP3 4151 14.147 1.926 14.259 0.417 1.000 -ATOM 3921 H2 TIP3 4151 13.377 3.250 14.123 0.417 1.000 -ATOM 3922 OH2 TIP3 4157 7.107 8.478 -14.016 -0.834 1.520 -ATOM 3923 H1 TIP3 4157 7.630 7.674 -14.261 0.417 1.000 -ATOM 3924 H2 TIP3 4157 6.224 8.217 -14.144 0.417 1.000 -ATOM 3925 OH2 TIP3 4158 4.943 19.812 -16.720 -0.834 1.520 -ATOM 3926 H1 TIP3 4158 4.840 18.876 -16.851 0.417 1.000 -ATOM 3927 H2 TIP3 4158 5.901 19.929 -16.832 0.417 1.000 -ATOM 3928 OH2 TIP3 4161 11.156 4.433 -18.883 -0.834 1.520 -ATOM 3929 H1 TIP3 4161 10.846 4.181 -17.998 0.417 1.000 -ATOM 3930 H2 TIP3 4161 11.896 3.831 -18.923 0.417 1.000 -ATOM 3931 OH2 TIP3 4162 0.504 11.104 3.859 -0.834 1.520 -ATOM 3932 H1 TIP3 4162 0.195 11.056 4.816 0.417 1.000 -ATOM 3933 H2 TIP3 4162 0.136 10.246 3.526 0.417 1.000 -ATOM 3934 OH2 TIP3 4163 0.735 -0.181 7.128 -0.834 1.520 -ATOM 3935 H1 TIP3 4163 -0.115 -0.007 7.429 0.417 1.000 -ATOM 3936 H2 TIP3 4163 0.766 0.363 6.302 0.417 1.000 -ATOM 3937 OH2 TIP3 4165 9.874 8.123 -1.393 -0.834 1.520 -ATOM 3938 H1 TIP3 4165 9.015 8.213 -0.949 0.417 1.000 -ATOM 3939 H2 TIP3 4165 10.498 8.465 -0.767 0.417 1.000 -ATOM 3940 OH2 TIP3 4166 15.533 4.218 16.427 -0.834 1.520 -ATOM 3941 H1 TIP3 4166 14.911 4.824 15.962 0.417 1.000 -ATOM 3942 H2 TIP3 4166 15.288 3.372 16.001 0.417 1.000 -ATOM 3943 OH2 TIP3 4167 5.634 13.114 5.143 -0.834 1.520 -ATOM 3944 H1 TIP3 4167 6.549 13.396 5.248 0.417 1.000 -ATOM 3945 H2 TIP3 4167 5.585 12.459 5.932 0.417 1.000 -ATOM 3946 OH2 TIP3 4168 15.325 19.232 14.039 -0.834 1.520 -ATOM 3947 H1 TIP3 4168 16.210 18.867 14.030 0.417 1.000 -ATOM 3948 H2 TIP3 4168 15.402 19.820 14.803 0.417 1.000 -ATOM 3949 OH2 TIP3 4179 6.844 3.498 -18.022 -0.834 1.520 -ATOM 3950 H1 TIP3 4179 6.643 4.419 -17.863 0.417 1.000 -ATOM 3951 H2 TIP3 4179 6.537 3.018 -17.213 0.417 1.000 -ATOM 3952 OH2 TIP3 4181 5.540 10.998 -16.668 -0.834 1.520 -ATOM 3953 H1 TIP3 4181 5.672 11.950 -16.477 0.417 1.000 -ATOM 3954 H2 TIP3 4181 6.411 10.658 -16.461 0.417 1.000 -ATOM 3955 OH2 TIP3 4184 3.350 5.426 -17.351 -0.834 1.520 -ATOM 3956 H1 TIP3 4184 4.136 5.667 -17.925 0.417 1.000 -ATOM 3957 H2 TIP3 4184 2.685 6.158 -17.650 0.417 1.000 -ATOM 3958 OH2 TIP3 4185 1.361 6.625 11.578 -0.834 1.520 -ATOM 3959 H1 TIP3 4185 1.071 5.884 12.149 0.417 1.000 -ATOM 3960 H2 TIP3 4185 0.794 7.382 11.851 0.417 1.000 -ATOM 3961 OH2 TIP3 4186 8.010 3.657 -6.705 -0.834 1.520 -ATOM 3962 H1 TIP3 4186 8.334 3.472 -5.800 0.417 1.000 -ATOM 3963 H2 TIP3 4186 8.782 3.742 -7.168 0.417 1.000 -ATOM 3964 OH2 TIP3 4188 0.036 13.982 19.637 -0.834 1.520 -ATOM 3965 H1 TIP3 4188 0.203 14.913 19.756 0.417 1.000 -ATOM 3966 H2 TIP3 4188 0.714 13.737 18.982 0.417 1.000 -ATOM 3967 OH2 TIP3 4191 17.828 8.861 1.960 -0.834 1.520 -ATOM 3968 H1 TIP3 4191 17.815 9.267 1.103 0.417 1.000 -ATOM 3969 H2 TIP3 4191 17.384 9.537 2.444 0.417 1.000 -ATOM 3970 OH2 TIP3 4198 14.961 18.217 -15.090 -0.834 1.520 -ATOM 3971 H1 TIP3 4198 15.628 18.919 -15.326 0.417 1.000 -ATOM 3972 H2 TIP3 4198 14.123 18.595 -15.436 0.417 1.000 -ATOM 3973 OH2 TIP3 4201 16.903 3.552 -16.985 -0.834 1.520 -ATOM 3974 H1 TIP3 4201 17.054 3.149 -16.144 0.417 1.000 -ATOM 3975 H2 TIP3 4201 16.843 4.518 -16.796 0.417 1.000 -ATOM 3976 OH2 TIP3 4202 4.020 3.447 -11.354 -0.834 1.520 -ATOM 3977 H1 TIP3 4202 4.595 3.186 -10.658 0.417 1.000 -ATOM 3978 H2 TIP3 4202 3.148 3.534 -10.859 0.417 1.000 -ATOM 3979 OH2 TIP3 4208 16.040 18.645 10.137 -0.834 1.520 -ATOM 3980 H1 TIP3 4208 15.818 18.251 9.289 0.417 1.000 -ATOM 3981 H2 TIP3 4208 16.743 18.081 10.424 0.417 1.000 -ATOM 3982 OH2 TIP3 4209 17.866 16.382 10.694 -0.834 1.520 -ATOM 3983 H1 TIP3 4209 16.987 16.068 10.527 0.417 1.000 -ATOM 3984 H2 TIP3 4209 18.004 16.114 11.611 0.417 1.000 -ATOM 3985 OH2 TIP3 4211 13.191 19.588 12.121 -0.834 1.520 -ATOM 3986 H1 TIP3 4211 13.688 19.512 11.276 0.417 1.000 -ATOM 3987 H2 TIP3 4211 13.852 19.654 12.886 0.417 1.000 -ATOM 3988 OH2 TIP3 4215 5.341 14.047 15.175 -0.834 1.520 -ATOM 3989 H1 TIP3 4215 5.027 14.819 14.579 0.417 1.000 -ATOM 3990 H2 TIP3 4215 5.786 13.510 14.502 0.417 1.000 -ATOM 3991 OH2 TIP3 4219 -4.887 14.268 -12.565 -0.834 1.520 -ATOM 3992 H1 TIP3 4219 -5.450 13.507 -12.345 0.417 1.000 -ATOM 3993 H2 TIP3 4219 -4.811 14.702 -11.685 0.417 1.000 -ATOM 3994 OH2 TIP3 4225 10.575 16.188 -5.603 -0.834 1.520 -ATOM 3995 H1 TIP3 4225 10.493 15.571 -6.392 0.417 1.000 -ATOM 3996 H2 TIP3 4225 10.725 17.080 -6.020 0.417 1.000 -ATOM 3997 OH2 TIP3 4231 9.922 16.955 11.148 -0.834 1.520 -ATOM 3998 H1 TIP3 4231 10.733 16.825 11.611 0.417 1.000 -ATOM 3999 H2 TIP3 4231 9.251 16.787 11.827 0.417 1.000 -ATOM 4000 OH2 TIP3 4235 15.712 12.959 18.833 -0.834 1.520 -ATOM 4001 H1 TIP3 4235 16.574 13.215 19.229 0.417 1.000 -ATOM 4002 H2 TIP3 4235 15.344 13.862 18.696 0.417 1.000 -ATOM 4003 OH2 TIP3 4243 -2.746 8.667 -5.944 -0.834 1.520 -ATOM 4004 H1 TIP3 4243 -2.138 9.322 -5.840 0.417 1.000 -ATOM 4005 H2 TIP3 4243 -2.223 7.880 -6.124 0.417 1.000 -ATOM 4006 OH2 TIP3 4247 7.357 16.032 -11.843 -0.834 1.520 -ATOM 4007 H1 TIP3 4247 7.873 15.271 -11.480 0.417 1.000 -ATOM 4008 H2 TIP3 4247 7.529 15.967 -12.836 0.417 1.000 -ATOM 4009 OH2 TIP3 4251 17.050 15.793 0.041 -0.834 1.520 -ATOM 4010 H1 TIP3 4251 16.956 14.986 -0.518 0.417 1.000 -ATOM 4011 H2 TIP3 4251 16.506 15.560 0.846 0.417 1.000 -ATOM 4012 OH2 TIP3 4266 11.616 19.099 -12.332 -0.834 1.520 -ATOM 4013 H1 TIP3 4266 10.929 18.497 -12.078 0.417 1.000 -ATOM 4014 H2 TIP3 4266 11.948 19.297 -11.435 0.417 1.000 -ATOM 4015 OH2 TIP3 4273 4.693 13.537 2.244 -0.834 1.520 -ATOM 4016 H1 TIP3 4273 4.931 12.583 2.306 0.417 1.000 -ATOM 4017 H2 TIP3 4273 4.874 13.826 3.118 0.417 1.000 -ATOM 4018 OH2 TIP3 4287 -7.859 12.047 -6.794 -0.834 1.520 -ATOM 4019 H1 TIP3 4287 -7.801 12.594 -7.663 0.417 1.000 -ATOM 4020 H2 TIP3 4287 -6.883 12.148 -6.520 0.417 1.000 -ATOM 4021 OH2 TIP3 4304 17.274 16.637 -13.285 -0.834 1.520 -ATOM 4022 H1 TIP3 4304 16.350 17.009 -13.199 0.417 1.000 -ATOM 4023 H2 TIP3 4304 17.787 17.175 -12.693 0.417 1.000 -ATOM 4024 OH2 TIP3 4307 14.858 15.098 -14.371 -0.834 1.520 -ATOM 4025 H1 TIP3 4307 14.077 15.462 -14.005 0.417 1.000 -ATOM 4026 H2 TIP3 4307 15.510 15.851 -14.611 0.417 1.000 -ATOM 4027 OH2 TIP3 4315 2.279 12.287 11.129 -0.834 1.520 -ATOM 4028 H1 TIP3 4315 1.427 12.216 10.699 0.417 1.000 -ATOM 4029 H2 TIP3 4315 2.341 11.392 11.600 0.417 1.000 -ATOM 4030 OH2 TIP3 4356 3.384 -13.603 -0.594 -0.834 1.520 -ATOM 4031 H1 TIP3 4356 3.481 -13.468 0.329 0.417 1.000 -ATOM 4032 H2 TIP3 4356 2.511 -14.056 -0.582 0.417 1.000 -ATOM 4033 OH2 TIP3 4380 -1.964 -18.062 4.191 -0.834 1.520 -ATOM 4034 H1 TIP3 4380 -1.228 -18.081 4.829 0.417 1.000 -ATOM 4035 H2 TIP3 4380 -1.577 -18.545 3.463 0.417 1.000 -ATOM 4036 OH2 TIP3 4394 3.400 -11.608 -9.697 -0.834 1.520 -ATOM 4037 H1 TIP3 4394 4.178 -12.174 -9.711 0.417 1.000 -ATOM 4038 H2 TIP3 4394 3.008 -11.779 -8.782 0.417 1.000 -ATOM 4039 OH2 TIP3 4396 5.172 -12.191 9.494 -0.834 1.520 -ATOM 4040 H1 TIP3 4396 5.176 -11.534 10.186 0.417 1.000 -ATOM 4041 H2 TIP3 4396 5.535 -11.703 8.743 0.417 1.000 -ATOM 4042 OH2 TIP3 4414 10.332 -15.308 -15.952 -0.834 1.520 -ATOM 4043 H1 TIP3 4414 10.893 -16.060 -15.604 0.417 1.000 -ATOM 4044 H2 TIP3 4414 9.553 -15.176 -15.369 0.417 1.000 -ATOM 4045 OH2 TIP3 4417 5.132 -6.845 -1.162 -0.834 1.520 -ATOM 4046 H1 TIP3 4417 4.699 -5.934 -1.280 0.417 1.000 -ATOM 4047 H2 TIP3 4417 4.810 -7.123 -0.285 0.417 1.000 -ATOM 4048 OH2 TIP3 4419 5.503 -17.247 -3.035 -0.834 1.520 -ATOM 4049 H1 TIP3 4419 5.005 -16.406 -3.081 0.417 1.000 -ATOM 4050 H2 TIP3 4419 5.901 -17.218 -3.914 0.417 1.000 -ATOM 4051 OH2 TIP3 4421 9.489 -15.226 11.331 -0.834 1.520 -ATOM 4052 H1 TIP3 4421 10.368 -15.260 11.733 0.417 1.000 -ATOM 4053 H2 TIP3 4421 9.461 -14.616 10.529 0.417 1.000 -ATOM 4054 OH2 TIP3 4422 18.173 -16.870 12.614 -0.834 1.520 -ATOM 4055 H1 TIP3 4422 18.948 -16.846 13.185 0.417 1.000 -ATOM 4056 H2 TIP3 4422 17.924 -15.926 12.518 0.417 1.000 -ATOM 4057 OH2 TIP3 4432 15.217 -1.522 -9.399 -0.834 1.520 -ATOM 4058 H1 TIP3 4432 14.477 -0.993 -9.739 0.417 1.000 -ATOM 4059 H2 TIP3 4432 15.647 -1.909 -10.229 0.417 1.000 -ATOM 4060 OH2 TIP3 4434 16.697 -14.491 -12.843 -0.834 1.520 -ATOM 4061 H1 TIP3 4434 16.091 -15.196 -12.606 0.417 1.000 -ATOM 4062 H2 TIP3 4434 16.834 -14.033 -12.010 0.417 1.000 -ATOM 4063 OH2 TIP3 4437 9.655 -11.328 -18.476 -0.834 1.520 -ATOM 4064 H1 TIP3 4437 9.762 -11.373 -17.509 0.417 1.000 -ATOM 4065 H2 TIP3 4437 9.214 -10.489 -18.681 0.417 1.000 -ATOM 4066 OH2 TIP3 4438 13.579 -1.716 -0.439 -0.834 1.520 -ATOM 4067 H1 TIP3 4438 14.100 -0.964 -0.016 0.417 1.000 -ATOM 4068 H2 TIP3 4438 14.046 -2.482 -0.164 0.417 1.000 -ATOM 4069 OH2 TIP3 4441 16.930 -17.526 10.084 -0.834 1.520 -ATOM 4070 H1 TIP3 4441 17.319 -17.311 10.943 0.417 1.000 -ATOM 4071 H2 TIP3 4441 17.488 -18.263 9.698 0.417 1.000 -ATOM 4072 OH2 TIP3 4442 12.062 -10.642 8.946 -0.834 1.520 -ATOM 4073 H1 TIP3 4442 11.398 -11.189 9.447 0.417 1.000 -ATOM 4074 H2 TIP3 4442 12.665 -10.420 9.672 0.417 1.000 -ATOM 4075 OH2 TIP3 4443 15.166 -7.503 16.394 -0.834 1.520 -ATOM 4076 H1 TIP3 4443 15.812 -6.773 16.164 0.417 1.000 -ATOM 4077 H2 TIP3 4443 14.925 -7.382 17.288 0.417 1.000 -ATOM 4078 OH2 TIP3 4455 7.445 -15.199 -14.707 -0.834 1.520 -ATOM 4079 H1 TIP3 4455 7.476 -16.017 -14.163 0.417 1.000 -ATOM 4080 H2 TIP3 4455 7.046 -14.540 -14.139 0.417 1.000 -ATOM 4081 OH2 TIP3 4456 9.751 -8.283 8.837 -0.834 1.520 -ATOM 4082 H1 TIP3 4456 9.421 -8.425 7.903 0.417 1.000 -ATOM 4083 H2 TIP3 4456 9.205 -7.506 9.067 0.417 1.000 -ATOM 4084 OH2 TIP3 4457 16.162 7.874 -7.021 -0.834 1.520 -ATOM 4085 H1 TIP3 4457 17.054 7.642 -6.800 0.417 1.000 -ATOM 4086 H2 TIP3 4457 15.784 7.060 -7.081 0.417 1.000 -ATOM 4087 OH2 TIP3 4461 11.618 -16.667 0.526 -0.834 1.520 -ATOM 4088 H1 TIP3 4461 11.142 -15.894 0.926 0.417 1.000 -ATOM 4089 H2 TIP3 4461 12.225 -16.274 -0.122 0.417 1.000 -ATOM 4090 OH2 TIP3 4462 14.034 -9.533 10.525 -0.834 1.520 -ATOM 4091 H1 TIP3 4462 14.991 -9.644 10.300 0.417 1.000 -ATOM 4092 H2 TIP3 4462 14.089 -8.835 11.275 0.417 1.000 -ATOM 4093 OH2 TIP3 4465 17.907 -12.350 10.036 -0.834 1.520 -ATOM 4094 H1 TIP3 4465 17.462 -11.513 10.175 0.417 1.000 -ATOM 4095 H2 TIP3 4465 17.511 -12.533 9.159 0.417 1.000 -ATOM 4096 OH2 TIP3 4466 18.553 -13.311 5.369 -0.834 1.520 -ATOM 4097 H1 TIP3 4466 18.108 -13.949 4.739 0.417 1.000 -ATOM 4098 H2 TIP3 4466 19.112 -13.875 5.953 0.417 1.000 -ATOM 4099 OH2 TIP3 4473 17.331 -7.317 -18.582 -0.834 1.520 -ATOM 4100 H1 TIP3 4473 16.873 -7.395 -19.420 0.417 1.000 -ATOM 4101 H2 TIP3 4473 17.504 -6.322 -18.536 0.417 1.000 -ATOM 4102 OH2 TIP3 4474 13.250 12.565 -12.865 -0.834 1.520 -ATOM 4103 H1 TIP3 4474 13.340 11.623 -12.647 0.417 1.000 -ATOM 4104 H2 TIP3 4474 12.707 12.922 -12.188 0.417 1.000 -ATOM 4105 OH2 TIP3 4477 13.966 -14.428 -15.275 -0.834 1.520 -ATOM 4106 H1 TIP3 4477 14.760 -14.591 -15.796 0.417 1.000 -ATOM 4107 H2 TIP3 4477 13.593 -15.326 -14.961 0.417 1.000 -ATOM 4108 OH2 TIP3 4479 12.349 -7.984 -8.548 -0.834 1.520 -ATOM 4109 H1 TIP3 4479 11.652 -8.383 -7.971 0.417 1.000 -ATOM 4110 H2 TIP3 4479 13.149 -8.074 -7.996 0.417 1.000 -ATOM 4111 OH2 TIP3 4480 1.457 -0.096 -1.151 -0.834 1.520 -ATOM 4112 H1 TIP3 4480 0.517 -0.113 -1.045 0.417 1.000 -ATOM 4113 H2 TIP3 4480 1.748 0.201 -0.225 0.417 1.000 -ATOM 4114 OH2 TIP3 4483 18.557 0.554 15.616 -0.834 1.520 -ATOM 4115 H1 TIP3 4483 17.932 0.767 14.896 0.417 1.000 -ATOM 4116 H2 TIP3 4483 18.884 1.395 15.886 0.417 1.000 -ATOM 4117 OH2 TIP3 4484 1.289 4.440 6.231 -0.834 1.520 -ATOM 4118 H1 TIP3 4484 1.646 4.235 5.374 0.417 1.000 -ATOM 4119 H2 TIP3 4484 1.743 5.233 6.585 0.417 1.000 -ATOM 4120 OH2 TIP3 4485 -0.996 -18.120 12.785 -0.834 1.520 -ATOM 4121 H1 TIP3 4485 -1.571 -18.243 11.981 0.417 1.000 -ATOM 4122 H2 TIP3 4485 -0.699 -19.007 13.010 0.417 1.000 -ATOM 4123 OH2 TIP3 4496 13.027 2.407 -7.441 -0.834 1.520 -ATOM 4124 H1 TIP3 4496 12.840 1.573 -7.933 0.417 1.000 -ATOM 4125 H2 TIP3 4496 13.395 2.972 -8.121 0.417 1.000 -ATOM 4126 OH2 TIP3 4497 1.477 18.729 -8.303 -0.834 1.520 -ATOM 4127 H1 TIP3 4497 1.458 18.840 -9.294 0.417 1.000 -ATOM 4128 H2 TIP3 4497 0.942 17.904 -8.111 0.417 1.000 -ATOM 4129 OH2 TIP3 4498 3.539 -4.333 11.422 -0.834 1.520 -ATOM 4130 H1 TIP3 4498 4.312 -3.756 11.445 0.417 1.000 -ATOM 4131 H2 TIP3 4498 2.967 -3.738 10.954 0.417 1.000 -ATOM 4132 OH2 TIP3 4499 17.198 -5.556 -4.175 -0.834 1.520 -ATOM 4133 H1 TIP3 4499 16.753 -5.273 -3.323 0.417 1.000 -ATOM 4134 H2 TIP3 4499 18.019 -5.096 -4.196 0.417 1.000 -ATOM 4135 OH2 TIP3 4500 18.648 -9.065 -16.791 -0.834 1.520 -ATOM 4136 H1 TIP3 4500 18.213 -8.491 -17.462 0.417 1.000 -ATOM 4137 H2 TIP3 4500 18.113 -9.113 -15.992 0.417 1.000 -ATOM 4138 OH2 TIP3 4501 -5.318 -8.666 -5.612 -0.834 1.520 -ATOM 4139 H1 TIP3 4501 -4.764 -8.059 -6.124 0.417 1.000 -ATOM 4140 H2 TIP3 4501 -5.734 -9.317 -6.237 0.417 1.000 -ATOM 4141 OH2 TIP3 4503 4.235 8.471 14.535 -0.834 1.520 -ATOM 4142 H1 TIP3 4503 3.499 8.104 14.977 0.417 1.000 -ATOM 4143 H2 TIP3 4503 4.770 8.494 15.356 0.417 1.000 -ATOM 4144 OH2 TIP3 4509 8.680 -13.583 15.453 -0.834 1.520 -ATOM 4145 H1 TIP3 4509 9.288 -12.944 15.767 0.417 1.000 -ATOM 4146 H2 TIP3 4509 8.525 -14.153 16.240 0.417 1.000 -ATOM 4147 OH2 TIP3 4513 16.686 -4.537 -14.481 -0.834 1.520 -ATOM 4148 H1 TIP3 4513 15.907 -5.023 -14.424 0.417 1.000 -ATOM 4149 H2 TIP3 4513 17.050 -4.941 -15.339 0.417 1.000 -ATOM 4150 OH2 TIP3 4515 -7.586 -10.996 -6.091 -0.834 1.520 -ATOM 4151 H1 TIP3 4515 -8.477 -11.069 -5.816 0.417 1.000 -ATOM 4152 H2 TIP3 4515 -7.625 -10.234 -6.714 0.417 1.000 -ATOM 4153 OH2 TIP3 4516 5.948 5.182 -12.605 -0.834 1.520 -ATOM 4154 H1 TIP3 4516 5.997 4.870 -13.514 0.417 1.000 -ATOM 4155 H2 TIP3 4516 5.233 4.634 -12.130 0.417 1.000 -ATOM 4156 OH2 TIP3 4518 18.146 8.444 -12.676 -0.834 1.520 -ATOM 4157 H1 TIP3 4518 18.822 8.278 -13.319 0.417 1.000 -ATOM 4158 H2 TIP3 4518 18.298 9.354 -12.307 0.417 1.000 -ATOM 4159 OH2 TIP3 4519 -0.929 -2.722 -18.619 -0.834 1.520 -ATOM 4160 H1 TIP3 4519 -1.109 -2.940 -19.564 0.417 1.000 -ATOM 4161 H2 TIP3 4519 -0.115 -3.219 -18.491 0.417 1.000 -ATOM 4162 OH2 TIP3 4520 15.355 2.251 2.902 -0.834 1.520 -ATOM 4163 H1 TIP3 4520 15.943 1.654 3.397 0.417 1.000 -ATOM 4164 H2 TIP3 4520 15.163 3.005 3.523 0.417 1.000 -ATOM 4165 OH2 TIP3 4523 3.954 -7.885 1.190 -0.834 1.520 -ATOM 4166 H1 TIP3 4523 4.341 -8.397 1.865 0.417 1.000 -ATOM 4167 H2 TIP3 4523 3.309 -7.316 1.623 0.417 1.000 -ATOM 4168 OH2 TIP3 4524 10.071 -8.509 -4.229 -0.834 1.520 -ATOM 4169 H1 TIP3 4524 9.660 -7.590 -4.115 0.417 1.000 -ATOM 4170 H2 TIP3 4524 9.290 -9.095 -4.125 0.417 1.000 -ATOM 4171 OH2 TIP3 4536 11.495 0.117 -11.470 -0.834 1.520 -ATOM 4172 H1 TIP3 4536 11.284 0.364 -12.364 0.417 1.000 -ATOM 4173 H2 TIP3 4536 12.453 0.257 -11.456 0.417 1.000 -ATOM 4174 OH2 TIP3 4537 1.619 3.461 -9.753 -0.834 1.520 -ATOM 4175 H1 TIP3 4537 1.079 3.002 -10.402 0.417 1.000 -ATOM 4176 H2 TIP3 4537 1.571 2.891 -8.929 0.417 1.000 -ATOM 4177 OH2 TIP3 4538 10.990 4.095 -13.875 -0.834 1.520 -ATOM 4178 H1 TIP3 4538 10.920 3.621 -12.993 0.417 1.000 -ATOM 4179 H2 TIP3 4538 11.910 3.868 -14.115 0.417 1.000 -ATOM 4180 OH2 TIP3 4539 11.215 2.123 4.084 -0.834 1.520 -ATOM 4181 H1 TIP3 4539 11.124 2.307 3.136 0.417 1.000 -ATOM 4182 H2 TIP3 4539 11.570 2.978 4.423 0.417 1.000 -ATOM 4183 OH2 TIP3 4540 1.263 16.061 -8.655 -0.834 1.520 -ATOM 4184 H1 TIP3 4540 1.685 16.021 -9.517 0.417 1.000 -ATOM 4185 H2 TIP3 4540 0.886 15.164 -8.555 0.417 1.000 -ATOM 4186 OH2 TIP3 4541 13.538 0.062 14.310 -0.834 1.520 -ATOM 4187 H1 TIP3 4541 12.714 -0.002 13.872 0.417 1.000 -ATOM 4188 H2 TIP3 4541 13.228 -0.287 15.171 0.417 1.000 -ATOM 4189 OH2 TIP3 4543 1.784 -1.228 16.445 -0.834 1.520 -ATOM 4190 H1 TIP3 4543 2.589 -1.711 16.608 0.417 1.000 -ATOM 4191 H2 TIP3 4543 1.535 -1.595 15.600 0.417 1.000 -ATOM 4192 OH2 TIP3 4545 16.643 16.724 7.014 -0.834 1.520 -ATOM 4193 H1 TIP3 4545 16.487 16.247 6.224 0.417 1.000 -ATOM 4194 H2 TIP3 4545 17.378 17.320 6.753 0.417 1.000 -ATOM 4195 OH2 TIP3 4549 18.869 -4.390 14.321 -0.834 1.520 -ATOM 4196 H1 TIP3 4549 18.991 -3.706 15.026 0.417 1.000 -ATOM 4197 H2 TIP3 4549 19.652 -4.905 14.400 0.417 1.000 -ATOM 4198 OH2 TIP3 4551 10.956 17.978 16.943 -0.834 1.520 -ATOM 4199 H1 TIP3 4551 11.185 18.227 16.008 0.417 1.000 -ATOM 4200 H2 TIP3 4551 11.668 18.417 17.549 0.417 1.000 -ATOM 4201 OH2 TIP3 4553 2.736 5.421 -14.182 -0.834 1.520 -ATOM 4202 H1 TIP3 4553 2.831 4.722 -14.918 0.417 1.000 -ATOM 4203 H2 TIP3 4553 1.816 5.685 -14.148 0.417 1.000 -ATOM 4204 OH2 TIP3 4558 17.616 2.220 -14.417 -0.834 1.520 -ATOM 4205 H1 TIP3 4558 18.165 1.700 -14.918 0.417 1.000 -ATOM 4206 H2 TIP3 4558 16.925 1.607 -14.167 0.417 1.000 -ATOM 4207 OH2 TIP3 4559 -3.681 4.159 -13.925 -0.834 1.520 -ATOM 4208 H1 TIP3 4559 -3.767 3.434 -13.225 0.417 1.000 -ATOM 4209 H2 TIP3 4559 -3.686 4.950 -13.338 0.417 1.000 -ATOM 4210 OH2 TIP3 4560 15.504 5.791 -0.107 -0.834 1.520 -ATOM 4211 H1 TIP3 4560 15.552 5.869 -1.034 0.417 1.000 -ATOM 4212 H2 TIP3 4560 15.133 6.668 0.099 0.417 1.000 -ATOM 4213 OH2 TIP3 4561 14.553 -1.863 -16.906 -0.834 1.520 -ATOM 4214 H1 TIP3 4561 13.885 -1.466 -17.499 0.417 1.000 -ATOM 4215 H2 TIP3 4561 14.059 -2.536 -16.426 0.417 1.000 -ATOM 4216 OH2 TIP3 4562 16.051 1.549 -4.253 -0.834 1.520 -ATOM 4217 H1 TIP3 4562 16.255 1.107 -5.080 0.417 1.000 -ATOM 4218 H2 TIP3 4562 16.833 1.449 -3.640 0.417 1.000 -ATOM 4219 OH2 TIP3 4563 18.207 12.168 -9.292 -0.834 1.520 -ATOM 4220 H1 TIP3 4563 18.067 12.816 -8.530 0.417 1.000 -ATOM 4221 H2 TIP3 4563 17.394 11.692 -9.219 0.417 1.000 -ATOM 4222 OH2 TIP3 4564 12.982 6.177 2.803 -0.834 1.520 -ATOM 4223 H1 TIP3 4564 12.584 5.651 3.506 0.417 1.000 -ATOM 4224 H2 TIP3 4564 13.497 6.805 3.320 0.417 1.000 -ATOM 4225 OH2 TIP3 4565 5.352 13.771 -3.849 -0.834 1.520 -ATOM 4226 H1 TIP3 4565 4.521 13.423 -3.587 0.417 1.000 -ATOM 4227 H2 TIP3 4565 5.594 14.435 -3.108 0.417 1.000 -ATOM 4228 OH2 TIP3 4566 13.839 9.446 17.961 -0.834 1.520 -ATOM 4229 H1 TIP3 4566 14.468 9.338 18.585 0.417 1.000 -ATOM 4230 H2 TIP3 4566 13.581 10.371 18.122 0.417 1.000 -ATOM 4231 OH2 TIP3 4567 1.876 8.147 15.900 -0.834 1.520 -ATOM 4232 H1 TIP3 4567 1.471 7.689 16.573 0.417 1.000 -ATOM 4233 H2 TIP3 4567 1.293 8.795 15.666 0.417 1.000 -ATOM 4234 OH2 TIP3 4568 11.686 4.015 14.228 -0.834 1.520 -ATOM 4235 H1 TIP3 4568 11.010 4.071 14.907 0.417 1.000 -ATOM 4236 H2 TIP3 4568 11.263 4.222 13.320 0.417 1.000 -ATOM 4237 OH2 TIP3 4569 11.683 -3.200 -6.633 -0.834 1.520 -ATOM 4238 H1 TIP3 4569 12.318 -2.620 -6.224 0.417 1.000 -ATOM 4239 H2 TIP3 4569 11.964 -3.242 -7.618 0.417 1.000 -ATOM 4240 OH2 TIP3 4574 13.189 -1.652 16.419 -0.834 1.520 -ATOM 4241 H1 TIP3 4574 13.381 -2.579 16.463 0.417 1.000 -ATOM 4242 H2 TIP3 4574 12.287 -1.545 16.721 0.417 1.000 -ATOM 4243 OH2 TIP3 4578 3.418 7.184 -11.936 -0.834 1.520 -ATOM 4244 H1 TIP3 4578 3.266 6.649 -11.124 0.417 1.000 -ATOM 4245 H2 TIP3 4578 3.361 6.508 -12.646 0.417 1.000 -ATOM 4246 OH2 TIP3 4581 19.486 -1.804 -8.135 -0.834 1.520 -ATOM 4247 H1 TIP3 4581 19.797 -1.290 -7.392 0.417 1.000 -ATOM 4248 H2 TIP3 4581 19.728 -2.737 -7.866 0.417 1.000 -ATOM 4249 OH2 TIP3 4582 4.820 -1.079 -16.483 -0.834 1.520 -ATOM 4250 H1 TIP3 4582 3.987 -0.765 -16.882 0.417 1.000 -ATOM 4251 H2 TIP3 4582 4.810 -2.035 -16.689 0.417 1.000 -ATOM 4252 OH2 TIP3 4585 18.295 2.659 10.005 -0.834 1.520 -ATOM 4253 H1 TIP3 4585 18.196 2.250 9.129 0.417 1.000 -ATOM 4254 H2 TIP3 4585 17.557 3.254 10.066 0.417 1.000 -ATOM 4255 OH2 TIP3 4587 9.475 6.956 11.202 -0.834 1.520 -ATOM 4256 H1 TIP3 4587 10.155 7.521 11.557 0.417 1.000 -ATOM 4257 H2 TIP3 4587 9.508 7.116 10.262 0.417 1.000 -ATOM 4258 OH2 TIP3 4588 6.245 3.672 4.162 -0.834 1.520 -ATOM 4259 H1 TIP3 4588 6.070 3.578 3.176 0.417 1.000 -ATOM 4260 H2 TIP3 4588 6.837 2.892 4.382 0.417 1.000 -ATOM 4261 OH2 TIP3 4592 8.091 6.947 16.769 -0.834 1.520 -ATOM 4262 H1 TIP3 4592 7.135 6.953 16.658 0.417 1.000 -ATOM 4263 H2 TIP3 4592 8.386 7.119 15.833 0.417 1.000 -ATOM 4264 OH2 TIP3 4599 17.291 7.648 -18.152 -0.834 1.520 -ATOM 4265 H1 TIP3 4599 16.437 8.105 -18.052 0.417 1.000 -ATOM 4266 H2 TIP3 4599 17.939 8.329 -18.400 0.417 1.000 -ATOM 4267 OH2 TIP3 4600 17.000 10.922 -16.293 -0.834 1.520 -ATOM 4268 H1 TIP3 4600 17.827 11.075 -15.857 0.417 1.000 -ATOM 4269 H2 TIP3 4600 16.406 11.698 -16.077 0.417 1.000 -ATOM 4270 OH2 TIP3 4605 11.347 8.907 3.122 -0.834 1.520 -ATOM 4271 H1 TIP3 4605 10.519 8.665 3.592 0.417 1.000 -ATOM 4272 H2 TIP3 4605 11.822 8.024 3.151 0.417 1.000 -ATOM 4273 OH2 TIP3 4606 6.291 -3.276 4.473 -0.834 1.520 -ATOM 4274 H1 TIP3 4606 5.444 -3.323 3.993 0.417 1.000 -ATOM 4275 H2 TIP3 4606 6.927 -3.732 3.904 0.417 1.000 -ATOM 4276 OH2 TIP3 4607 17.015 -2.493 5.985 -0.834 1.520 -ATOM 4277 H1 TIP3 4607 17.239 -2.097 6.919 0.417 1.000 -ATOM 4278 H2 TIP3 4607 17.779 -2.999 5.777 0.417 1.000 -ATOM 4279 OH2 TIP3 4608 2.145 13.333 17.529 -0.834 1.520 -ATOM 4280 H1 TIP3 4608 1.979 12.515 18.001 0.417 1.000 -ATOM 4281 H2 TIP3 4608 2.590 13.056 16.741 0.417 1.000 -ATOM 4282 OH2 TIP3 4623 7.223 19.014 -6.033 -0.834 1.520 -ATOM 4283 H1 TIP3 4623 6.743 19.594 -5.397 0.417 1.000 -ATOM 4284 H2 TIP3 4623 6.850 18.084 -5.856 0.417 1.000 -ATOM 4285 OH2 TIP3 4625 5.350 4.745 -6.566 -0.834 1.520 -ATOM 4286 H1 TIP3 4625 6.202 4.228 -6.613 0.417 1.000 -ATOM 4287 H2 TIP3 4625 5.022 4.517 -5.689 0.417 1.000 -ATOM 4288 OH2 TIP3 4626 -1.263 3.393 6.234 -0.834 1.520 -ATOM 4289 H1 TIP3 4626 -1.210 2.937 7.094 0.417 1.000 -ATOM 4290 H2 TIP3 4626 -0.374 3.733 6.125 0.417 1.000 -ATOM 4291 OH2 TIP3 4627 12.361 16.430 -3.441 -0.834 1.520 -ATOM 4292 H1 TIP3 4627 11.788 16.299 -2.730 0.417 1.000 -ATOM 4293 H2 TIP3 4627 11.832 16.094 -4.210 0.417 1.000 -ATOM 4294 OH2 TIP3 4628 19.527 6.045 -11.367 -0.834 1.520 -ATOM 4295 H1 TIP3 4628 18.938 5.260 -11.381 0.417 1.000 -ATOM 4296 H2 TIP3 4628 19.052 6.684 -11.897 0.417 1.000 -ATOM 4297 OH2 TIP3 4630 7.211 10.812 9.615 -0.834 1.520 -ATOM 4298 H1 TIP3 4630 6.789 10.309 10.269 0.417 1.000 -ATOM 4299 H2 TIP3 4630 7.824 10.221 9.210 0.417 1.000 -ATOM 4300 OH2 TIP3 4633 11.767 19.278 7.157 -0.834 1.520 -ATOM 4301 H1 TIP3 4633 12.726 19.564 7.038 0.417 1.000 -ATOM 4302 H2 TIP3 4633 11.646 19.012 8.054 0.417 1.000 -ATOM 4303 OH2 TIP3 4641 11.046 13.069 -14.847 -0.834 1.520 -ATOM 4304 H1 TIP3 4641 11.689 13.175 -14.057 0.417 1.000 -ATOM 4305 H2 TIP3 4641 10.211 13.605 -14.686 0.417 1.000 -ATOM 4306 OH2 TIP3 4645 8.675 13.919 -10.250 -0.834 1.520 -ATOM 4307 H1 TIP3 4645 8.333 12.994 -10.233 0.417 1.000 -ATOM 4308 H2 TIP3 4645 8.157 14.335 -9.591 0.417 1.000 -ATOM 4309 OH2 TIP3 4649 -1.297 8.268 5.613 -0.834 1.520 -ATOM 4310 H1 TIP3 4649 -1.706 7.411 5.851 0.417 1.000 -ATOM 4311 H2 TIP3 4649 -2.019 8.752 5.155 0.417 1.000 -ATOM 4312 OH2 TIP3 4653 13.095 15.980 10.504 -0.834 1.520 -ATOM 4313 H1 TIP3 4653 13.123 16.489 9.727 0.417 1.000 -ATOM 4314 H2 TIP3 4653 14.024 15.716 10.530 0.417 1.000 -ATOM 4315 OH2 TIP3 4654 -2.599 4.980 19.403 -0.834 1.520 -ATOM 4316 H1 TIP3 4654 -1.645 5.096 19.237 0.417 1.000 -ATOM 4317 H2 TIP3 4654 -3.031 5.296 18.591 0.417 1.000 -ATOM 4318 OH2 TIP3 4663 6.521 7.229 -5.307 -0.834 1.520 -ATOM 4319 H1 TIP3 4663 7.351 7.069 -4.827 0.417 1.000 -ATOM 4320 H2 TIP3 4663 6.583 6.483 -5.937 0.417 1.000 -ATOM 4321 OH2 TIP3 4668 12.950 19.024 -3.862 -0.834 1.520 -ATOM 4322 H1 TIP3 4668 12.841 18.104 -3.603 0.417 1.000 -ATOM 4323 H2 TIP3 4668 12.767 18.892 -4.826 0.417 1.000 -ATOM 4324 OH2 TIP3 4669 -1.709 14.973 11.665 -0.834 1.520 -ATOM 4325 H1 TIP3 4669 -1.975 14.247 11.144 0.417 1.000 -ATOM 4326 H2 TIP3 4669 -1.833 15.703 11.016 0.417 1.000 -ATOM 4327 OH2 TIP3 4672 15.569 14.734 10.645 -0.834 1.520 -ATOM 4328 H1 TIP3 4672 15.624 13.978 11.267 0.417 1.000 -ATOM 4329 H2 TIP3 4672 15.623 14.307 9.760 0.417 1.000 -ATOM 4330 OH2 TIP3 4677 11.446 19.237 14.364 -0.834 1.520 -ATOM 4331 H1 TIP3 4677 12.163 19.684 13.928 0.417 1.000 -ATOM 4332 H2 TIP3 4677 11.222 18.514 13.754 0.417 1.000 -ATOM 4333 OH2 TIP3 4685 12.972 13.480 -7.140 -0.834 1.520 -ATOM 4334 H1 TIP3 4685 12.983 12.627 -6.655 0.417 1.000 -ATOM 4335 H2 TIP3 4685 12.533 13.298 -7.993 0.417 1.000 -ATOM 4336 OH2 TIP3 4687 19.317 17.395 -7.048 -0.834 1.520 -ATOM 4337 H1 TIP3 4687 19.031 17.760 -6.186 0.417 1.000 -ATOM 4338 H2 TIP3 4687 19.054 18.127 -7.599 0.417 1.000 -ATOM 4339 OH2 TIP3 4692 8.687 19.611 17.304 -0.834 1.520 -ATOM 4340 H1 TIP3 4692 9.114 20.000 18.070 0.417 1.000 -ATOM 4341 H2 TIP3 4692 9.403 19.024 16.970 0.417 1.000 -ATOM 4342 OH2 TIP3 4706 5.944 13.478 -6.492 -0.834 1.520 -ATOM 4343 H1 TIP3 4706 5.621 13.604 -5.569 0.417 1.000 -ATOM 4344 H2 TIP3 4706 5.947 12.461 -6.527 0.417 1.000 -ATOM 4345 OH2 TIP3 4712 8.709 15.833 6.169 -0.834 1.520 -ATOM 4346 H1 TIP3 4712 9.149 15.672 6.985 0.417 1.000 -ATOM 4347 H2 TIP3 4712 9.141 16.681 5.896 0.417 1.000 -ATOM 4348 OH2 TIP3 4725 19.120 10.964 -11.883 -0.834 1.520 -ATOM 4349 H1 TIP3 4725 19.066 11.439 -10.987 0.417 1.000 -ATOM 4350 H2 TIP3 4725 18.534 11.537 -12.395 0.417 1.000 -ATOM 4351 OH2 TIP3 4732 19.291 14.450 -13.157 -0.834 1.520 -ATOM 4352 H1 TIP3 4732 18.552 14.975 -13.364 0.417 1.000 -ATOM 4353 H2 TIP3 4732 18.950 13.553 -13.314 0.417 1.000 -ATOM 4354 OH2 TIP3 4751 9.941 18.988 -6.723 -0.834 1.520 -ATOM 4355 H1 TIP3 4751 9.993 19.950 -6.895 0.417 1.000 -ATOM 4356 H2 TIP3 4751 8.990 18.865 -6.474 0.417 1.000 -ATOM 4357 OH2 TIP3 4787 16.528 10.978 -19.727 -0.834 1.520 -ATOM 4358 H1 TIP3 4787 16.655 11.907 -19.596 0.417 1.000 -ATOM 4359 H2 TIP3 4787 17.409 10.582 -19.468 0.417 1.000 -ATOM 4360 OH2 TIP3 4797 6.084 -12.396 4.020 -0.834 1.520 -ATOM 4361 H1 TIP3 4797 6.375 -11.741 3.400 0.417 1.000 -ATOM 4362 H2 TIP3 4797 6.866 -12.894 4.289 0.417 1.000 -ATOM 4363 OH2 TIP3 4798 -0.315 -19.138 2.352 -0.834 1.520 -ATOM 4364 H1 TIP3 4798 0.261 -18.505 2.737 0.417 1.000 -ATOM 4365 H2 TIP3 4798 -0.496 -18.701 1.487 0.417 1.000 -ATOM 4366 OH2 TIP3 4800 16.815 -19.359 15.056 -0.834 1.520 -ATOM 4367 H1 TIP3 4800 16.177 -18.755 14.675 0.417 1.000 -ATOM 4368 H2 TIP3 4800 17.254 -18.790 15.687 0.417 1.000 -ATOM 4369 OH2 TIP3 4801 6.954 -15.501 12.059 -0.834 1.520 -ATOM 4370 H1 TIP3 4801 7.894 -15.679 11.823 0.417 1.000 -ATOM 4371 H2 TIP3 4801 7.130 -14.661 12.490 0.417 1.000 -ATOM 4372 OH2 TIP3 4809 -4.102 -16.707 -18.352 -0.834 1.520 -ATOM 4373 H1 TIP3 4809 -4.163 -16.023 -17.641 0.417 1.000 -ATOM 4374 H2 TIP3 4809 -4.935 -17.204 -18.211 0.417 1.000 -ATOM 4375 OH2 TIP3 4814 10.181 -15.917 3.019 -0.834 1.520 -ATOM 4376 H1 TIP3 4814 11.052 -15.903 3.484 0.417 1.000 -ATOM 4377 H2 TIP3 4814 9.710 -16.569 3.539 0.417 1.000 -ATOM 4378 OH2 TIP3 4815 6.942 -17.643 6.825 -0.834 1.520 -ATOM 4379 H1 TIP3 4815 7.237 -17.643 7.694 0.417 1.000 -ATOM 4380 H2 TIP3 4815 6.453 -16.824 6.797 0.417 1.000 -ATOM 4381 OH2 TIP3 4820 14.901 -16.361 2.978 -0.834 1.520 -ATOM 4382 H1 TIP3 4820 14.587 -17.266 2.878 0.417 1.000 -ATOM 4383 H2 TIP3 4820 14.202 -15.983 3.577 0.417 1.000 -ATOM 4384 OH2 TIP3 4822 14.066 -18.958 4.537 -0.834 1.520 -ATOM 4385 H1 TIP3 4822 13.373 -19.364 4.102 0.417 1.000 -ATOM 4386 H2 TIP3 4822 13.669 -18.607 5.389 0.417 1.000 -ATOM 4387 OH2 TIP3 4834 14.338 -17.051 -19.090 -0.834 1.520 -ATOM 4388 H1 TIP3 4834 15.061 -16.382 -19.191 0.417 1.000 -ATOM 4389 H2 TIP3 4834 13.640 -16.569 -18.852 0.417 1.000 -ATOM 4390 OH2 TIP3 4835 7.681 -17.533 -13.447 -0.834 1.520 -ATOM 4391 H1 TIP3 4835 7.966 -18.270 -14.010 0.417 1.000 -ATOM 4392 H2 TIP3 4835 6.680 -17.588 -13.407 0.417 1.000 -ATOM 4393 OH2 TIP3 4836 19.678 -19.638 -16.511 -0.834 1.520 -ATOM 4394 H1 TIP3 4836 18.916 -19.672 -17.116 0.417 1.000 -ATOM 4395 H2 TIP3 4836 19.424 -19.064 -15.768 0.417 1.000 -ATOM 4396 OH2 TIP3 4837 0.972 -16.585 2.583 -0.834 1.520 -ATOM 4397 H1 TIP3 4837 1.469 -16.490 3.422 0.417 1.000 -ATOM 4398 H2 TIP3 4837 0.577 -15.762 2.554 0.417 1.000 -ATOM 4399 OH2 TIP3 4844 14.826 -18.690 13.180 -0.834 1.520 -ATOM 4400 H1 TIP3 4844 14.018 -18.883 13.661 0.417 1.000 -ATOM 4401 H2 TIP3 4844 14.653 -19.037 12.277 0.417 1.000 -ATOM 4402 OH2 TIP3 4849 -3.492 -10.422 -12.319 -0.834 1.520 -ATOM 4403 H1 TIP3 4849 -3.756 -10.962 -13.066 0.417 1.000 -ATOM 4404 H2 TIP3 4849 -2.696 -9.979 -12.484 0.417 1.000 -ATOM 4405 OH2 TIP3 4853 11.985 -15.201 -18.696 -0.834 1.520 -ATOM 4406 H1 TIP3 4853 11.753 -15.117 -17.729 0.417 1.000 -ATOM 4407 H2 TIP3 4853 11.077 -15.212 -19.151 0.417 1.000 -ATOM 4408 OH2 TIP3 4855 8.176 -5.568 0.160 -0.834 1.520 -ATOM 4409 H1 TIP3 4855 8.459 -6.493 0.186 0.417 1.000 -ATOM 4410 H2 TIP3 4855 8.243 -5.318 1.086 0.417 1.000 -ATOM 4411 OH2 TIP3 4856 2.237 -16.532 5.032 -0.834 1.520 -ATOM 4412 H1 TIP3 4856 3.140 -16.678 4.668 0.417 1.000 -ATOM 4413 H2 TIP3 4856 2.341 -16.158 5.910 0.417 1.000 -ATOM 4414 OH2 TIP3 4857 0.278 -7.466 -2.928 -0.834 1.520 -ATOM 4415 H1 TIP3 4857 -0.085 -8.071 -3.603 0.417 1.000 -ATOM 4416 H2 TIP3 4857 1.131 -7.948 -2.581 0.417 1.000 -ATOM 4417 OH2 TIP3 4863 15.492 -9.378 0.787 -0.834 1.520 -ATOM 4418 H1 TIP3 4863 14.502 -9.437 0.967 0.417 1.000 -ATOM 4419 H2 TIP3 4863 15.510 -9.719 -0.109 0.417 1.000 -ATOM 4420 OH2 TIP3 4866 9.012 -18.103 13.656 -0.834 1.520 -ATOM 4421 H1 TIP3 4866 9.902 -17.834 13.886 0.417 1.000 -ATOM 4422 H2 TIP3 4866 8.536 -17.314 13.821 0.417 1.000 -ATOM 4423 OH2 TIP3 4872 18.466 3.022 -19.640 -0.834 1.520 -ATOM 4424 H1 TIP3 4872 17.949 3.849 -19.687 0.417 1.000 -ATOM 4425 H2 TIP3 4872 17.859 2.522 -19.124 0.417 1.000 -ATOM 4426 OH2 TIP3 4875 12.252 -16.879 -14.270 -0.834 1.520 -ATOM 4427 H1 TIP3 4875 12.352 -17.136 -13.354 0.417 1.000 -ATOM 4428 H2 TIP3 4875 12.769 -17.581 -14.725 0.417 1.000 -ATOM 4429 OH2 TIP3 4880 15.164 -15.557 6.230 -0.834 1.520 -ATOM 4430 H1 TIP3 4880 15.428 -15.364 5.315 0.417 1.000 -ATOM 4431 H2 TIP3 4880 15.256 -16.516 6.288 0.417 1.000 -ATOM 4432 OH2 TIP3 4881 6.908 -3.729 18.788 -0.834 1.520 -ATOM 4433 H1 TIP3 4881 7.561 -4.201 19.350 0.417 1.000 -ATOM 4434 H2 TIP3 4881 7.116 -4.132 17.910 0.417 1.000 -ATOM 4435 OH2 TIP3 4887 3.580 -16.606 16.850 -0.834 1.520 -ATOM 4436 H1 TIP3 4887 4.442 -17.005 16.956 0.417 1.000 -ATOM 4437 H2 TIP3 4887 3.076 -17.309 16.339 0.417 1.000 -ATOM 4438 OH2 TIP3 4893 19.063 -5.903 -9.481 -0.834 1.520 -ATOM 4439 H1 TIP3 4893 18.356 -5.539 -10.039 0.417 1.000 -ATOM 4440 H2 TIP3 4893 18.874 -5.575 -8.584 0.417 1.000 -ATOM 4441 OH2 TIP3 4896 17.541 -12.996 -2.630 -0.834 1.520 -ATOM 4442 H1 TIP3 4896 17.467 -14.000 -2.570 0.417 1.000 -ATOM 4443 H2 TIP3 4896 16.717 -12.816 -3.094 0.417 1.000 -ATOM 4444 OH2 TIP3 4897 14.708 -10.140 -12.260 -0.834 1.520 -ATOM 4445 H1 TIP3 4897 14.416 -11.033 -12.177 0.417 1.000 -ATOM 4446 H2 TIP3 4897 14.188 -9.835 -12.999 0.417 1.000 -ATOM 4447 OH2 TIP3 4899 6.984 -12.999 -3.420 -0.834 1.520 -ATOM 4448 H1 TIP3 4899 7.702 -13.663 -3.242 0.417 1.000 -ATOM 4449 H2 TIP3 4899 6.454 -12.952 -2.596 0.417 1.000 -ATOM 4450 OH2 TIP3 4902 15.760 -1.047 12.086 -0.834 1.520 -ATOM 4451 H1 TIP3 4902 15.409 -1.089 12.967 0.417 1.000 -ATOM 4452 H2 TIP3 4902 16.073 -1.910 11.954 0.417 1.000 -ATOM 4453 OH2 TIP3 4903 10.925 -12.071 13.169 -0.834 1.520 -ATOM 4454 H1 TIP3 4903 11.834 -12.025 12.689 0.417 1.000 -ATOM 4455 H2 TIP3 4903 10.892 -13.033 13.389 0.417 1.000 -ATOM 4456 OH2 TIP3 4908 11.306 -9.511 17.031 -0.834 1.520 -ATOM 4457 H1 TIP3 4908 11.699 -10.124 17.656 0.417 1.000 -ATOM 4458 H2 TIP3 4908 11.748 -9.807 16.200 0.417 1.000 -ATOM 4459 OH2 TIP3 4915 13.152 -18.032 -11.724 -0.834 1.520 -ATOM 4460 H1 TIP3 4915 12.689 -18.766 -12.103 0.417 1.000 -ATOM 4461 H2 TIP3 4915 13.804 -18.441 -11.091 0.417 1.000 -ATOM 4462 OH2 TIP3 4916 7.810 -6.090 -15.817 -0.834 1.520 -ATOM 4463 H1 TIP3 4916 6.862 -6.324 -15.942 0.417 1.000 -ATOM 4464 H2 TIP3 4916 7.831 -5.361 -15.195 0.417 1.000 -ATOM 4465 OH2 TIP3 4920 15.784 8.837 11.326 -0.834 1.520 -ATOM 4466 H1 TIP3 4920 15.880 8.813 12.330 0.417 1.000 -ATOM 4467 H2 TIP3 4920 16.712 8.805 11.078 0.417 1.000 -ATOM 4468 OH2 TIP3 4922 9.133 -3.754 -7.115 -0.834 1.520 -ATOM 4469 H1 TIP3 4922 9.997 -3.574 -6.746 0.417 1.000 -ATOM 4470 H2 TIP3 4922 8.558 -3.181 -6.645 0.417 1.000 -ATOM 4471 OH2 TIP3 4924 14.087 -16.808 -4.614 -0.834 1.520 -ATOM 4472 H1 TIP3 4924 14.562 -16.864 -5.446 0.417 1.000 -ATOM 4473 H2 TIP3 4924 13.131 -16.814 -4.979 0.417 1.000 -ATOM 4474 OH2 TIP3 4927 12.132 -15.237 16.788 -0.834 1.520 -ATOM 4475 H1 TIP3 4927 12.463 -15.616 17.615 0.417 1.000 -ATOM 4476 H2 TIP3 4927 12.851 -14.679 16.463 0.417 1.000 -ATOM 4477 OH2 TIP3 4936 16.482 -2.803 -11.567 -0.834 1.520 -ATOM 4478 H1 TIP3 4936 16.006 -3.568 -11.905 0.417 1.000 -ATOM 4479 H2 TIP3 4936 17.417 -2.974 -11.853 0.417 1.000 -ATOM 4480 OH2 TIP3 4937 5.885 -16.784 -16.798 -0.834 1.520 -ATOM 4481 H1 TIP3 4937 5.219 -17.371 -16.331 0.417 1.000 -ATOM 4482 H2 TIP3 4937 6.368 -16.371 -16.085 0.417 1.000 -ATOM 4483 OH2 TIP3 4941 8.290 -13.344 7.868 -0.834 1.520 -ATOM 4484 H1 TIP3 4941 8.905 -14.035 7.575 0.417 1.000 -ATOM 4485 H2 TIP3 4941 8.550 -12.608 7.268 0.417 1.000 -ATOM 4486 OH2 TIP3 4942 14.994 -12.738 -6.980 -0.834 1.520 -ATOM 4487 H1 TIP3 4942 14.847 -13.672 -6.988 0.417 1.000 -ATOM 4488 H2 TIP3 4942 14.197 -12.325 -6.627 0.417 1.000 -ATOM 4489 OH2 TIP3 4944 6.220 -3.865 7.306 -0.834 1.520 -ATOM 4490 H1 TIP3 4944 5.697 -3.604 6.557 0.417 1.000 -ATOM 4491 H2 TIP3 4944 5.783 -4.714 7.521 0.417 1.000 -ATOM 4492 OH2 TIP3 4945 8.104 -4.320 11.702 -0.834 1.520 -ATOM 4493 H1 TIP3 4945 8.381 -5.232 11.799 0.417 1.000 -ATOM 4494 H2 TIP3 4945 8.618 -3.820 12.297 0.417 1.000 -ATOM 4495 OH2 TIP3 4946 10.007 4.900 6.483 -0.834 1.520 -ATOM 4496 H1 TIP3 4946 9.793 5.366 7.313 0.417 1.000 -ATOM 4497 H2 TIP3 4946 9.198 5.090 5.945 0.417 1.000 -ATOM 4498 OH2 TIP3 4957 17.926 -7.773 -11.989 -0.834 1.520 -ATOM 4499 H1 TIP3 4957 17.544 -7.514 -11.160 0.417 1.000 -ATOM 4500 H2 TIP3 4957 17.780 -8.743 -12.062 0.417 1.000 -ATOM 4501 OH2 TIP3 4961 5.085 -6.609 11.613 -0.834 1.520 -ATOM 4502 H1 TIP3 4961 5.873 -6.654 12.261 0.417 1.000 -ATOM 4503 H2 TIP3 4961 4.631 -5.785 11.857 0.417 1.000 -ATOM 4504 OH2 TIP3 4963 7.297 -8.112 -2.289 -0.834 1.520 -ATOM 4505 H1 TIP3 4963 6.465 -7.570 -1.982 0.417 1.000 -ATOM 4506 H2 TIP3 4963 7.970 -7.402 -2.304 0.417 1.000 -ATOM 4507 OH2 TIP3 4965 19.289 2.791 -3.905 -0.834 1.520 -ATOM 4508 H1 TIP3 4965 19.949 3.383 -4.380 0.417 1.000 -ATOM 4509 H2 TIP3 4965 18.789 2.404 -4.631 0.417 1.000 -ATOM 4510 OH2 TIP3 4966 18.443 -8.035 13.988 -0.834 1.520 -ATOM 4511 H1 TIP3 4966 19.321 -7.601 14.211 0.417 1.000 -ATOM 4512 H2 TIP3 4966 18.386 -8.648 14.744 0.417 1.000 -ATOM 4513 OH2 TIP3 4978 4.570 0.269 1.544 -0.834 1.520 -ATOM 4514 H1 TIP3 4978 3.726 -0.140 1.727 0.417 1.000 -ATOM 4515 H2 TIP3 4978 4.781 -0.075 0.650 0.417 1.000 -ATOM 4516 OH2 TIP3 4979 13.989 10.080 2.223 -0.834 1.520 -ATOM 4517 H1 TIP3 4979 13.320 10.750 2.434 0.417 1.000 -ATOM 4518 H2 TIP3 4979 13.808 9.315 2.785 0.417 1.000 -ATOM 4519 OH2 TIP3 4980 12.368 -11.230 -19.060 -0.834 1.520 -ATOM 4520 H1 TIP3 4980 11.494 -10.971 -18.862 0.417 1.000 -ATOM 4521 H2 TIP3 4980 12.306 -11.907 -19.814 0.417 1.000 -ATOM 4522 OH2 TIP3 4981 0.993 -3.463 -4.159 -0.834 1.520 -ATOM 4523 H1 TIP3 4981 0.642 -4.363 -4.444 0.417 1.000 -ATOM 4524 H2 TIP3 4981 0.414 -2.868 -4.691 0.417 1.000 -ATOM 4525 OH2 TIP3 4982 10.789 4.157 -7.751 -0.834 1.520 -ATOM 4526 H1 TIP3 4982 10.760 4.783 -6.986 0.417 1.000 -ATOM 4527 H2 TIP3 4982 11.472 3.574 -7.415 0.417 1.000 -ATOM 4528 OH2 TIP3 4983 8.327 -3.150 -0.984 -0.834 1.520 -ATOM 4529 H1 TIP3 4983 8.182 -3.978 -0.387 0.417 1.000 -ATOM 4530 H2 TIP3 4983 8.722 -2.509 -0.412 0.417 1.000 -ATOM 4531 OH2 TIP3 4986 9.388 -6.781 12.244 -0.834 1.520 -ATOM 4532 H1 TIP3 4986 10.345 -6.708 12.433 0.417 1.000 -ATOM 4533 H2 TIP3 4986 9.289 -7.679 11.965 0.417 1.000 -ATOM 4534 OH2 TIP3 4988 18.167 -8.265 7.717 -0.834 1.520 -ATOM 4535 H1 TIP3 4988 17.581 -7.550 7.473 0.417 1.000 -ATOM 4536 H2 TIP3 4988 18.911 -8.189 7.124 0.417 1.000 -ATOM 4537 OH2 TIP3 4993 17.076 -7.771 11.236 -0.834 1.520 -ATOM 4538 H1 TIP3 4993 16.652 -7.228 10.558 0.417 1.000 -ATOM 4539 H2 TIP3 4993 17.875 -7.396 11.525 0.417 1.000 -ATOM 4540 OH2 TIP3 4998 18.949 9.719 -19.076 -0.834 1.520 -ATOM 4541 H1 TIP3 4998 19.477 9.290 -19.783 0.417 1.000 -ATOM 4542 H2 TIP3 4998 19.699 10.048 -18.388 0.417 1.000 -ATOM 4543 OH2 TIP3 4999 7.726 5.191 -3.601 -0.834 1.520 -ATOM 4544 H1 TIP3 4999 8.178 5.298 -2.718 0.417 1.000 -ATOM 4545 H2 TIP3 4999 8.294 4.579 -4.079 0.417 1.000 -ATOM 4546 OH2 TIP3 5000 15.828 5.902 -3.040 -0.834 1.520 -ATOM 4547 H1 TIP3 5000 16.702 5.575 -2.835 0.417 1.000 -ATOM 4548 H2 TIP3 5000 15.627 5.529 -3.991 0.417 1.000 -ATOM 4549 OH2 TIP3 5001 12.344 1.914 -4.634 -0.834 1.520 -ATOM 4550 H1 TIP3 5001 13.019 2.333 -4.142 0.417 1.000 -ATOM 4551 H2 TIP3 5001 12.552 2.120 -5.547 0.417 1.000 -ATOM 4552 OH2 TIP3 5003 17.884 2.121 7.196 -0.834 1.520 -ATOM 4553 H1 TIP3 5003 17.038 2.303 7.639 0.417 1.000 -ATOM 4554 H2 TIP3 5003 18.336 3.004 7.246 0.417 1.000 -ATOM 4555 OH2 TIP3 5005 13.251 -0.783 -6.277 -0.834 1.520 -ATOM 4556 H1 TIP3 5005 14.032 -1.407 -6.444 0.417 1.000 -ATOM 4557 H2 TIP3 5005 13.686 0.092 -6.254 0.417 1.000 -ATOM 4558 OH2 TIP3 5006 9.338 -2.691 6.203 -0.834 1.520 -ATOM 4559 H1 TIP3 5006 8.488 -2.614 6.493 0.417 1.000 -ATOM 4560 H2 TIP3 5006 9.794 -1.905 6.527 0.417 1.000 -ATOM 4561 OH2 TIP3 5007 15.647 -8.204 4.938 -0.834 1.520 -ATOM 4562 H1 TIP3 5007 16.395 -7.719 4.692 0.417 1.000 -ATOM 4563 H2 TIP3 5007 15.193 -7.517 5.556 0.417 1.000 -ATOM 4564 OH2 TIP3 5009 8.335 -4.521 2.753 -0.834 1.520 -ATOM 4565 H1 TIP3 5009 8.907 -3.963 3.229 0.417 1.000 -ATOM 4566 H2 TIP3 5009 8.670 -5.410 2.894 0.417 1.000 -ATOM 4567 OH2 TIP3 5021 15.370 11.305 -10.968 -0.834 1.520 -ATOM 4568 H1 TIP3 5021 15.419 10.340 -11.090 0.417 1.000 -ATOM 4569 H2 TIP3 5021 14.481 11.418 -10.629 0.417 1.000 -ATOM 4570 OH2 TIP3 5023 13.717 9.411 -12.949 -0.834 1.520 -ATOM 4571 H1 TIP3 5023 13.171 9.886 -13.598 0.417 1.000 -ATOM 4572 H2 TIP3 5023 14.515 9.289 -13.485 0.417 1.000 -ATOM 4573 OH2 TIP3 5024 13.592 8.925 15.367 -0.834 1.520 -ATOM 4574 H1 TIP3 5024 13.688 9.032 16.297 0.417 1.000 -ATOM 4575 H2 TIP3 5024 13.902 8.036 15.148 0.417 1.000 -ATOM 4576 OH2 TIP3 5025 4.093 8.900 -1.456 -0.834 1.520 -ATOM 4577 H1 TIP3 5025 3.326 9.488 -1.234 0.417 1.000 -ATOM 4578 H2 TIP3 5025 4.228 8.394 -0.588 0.417 1.000 -ATOM 4579 OH2 TIP3 5027 14.817 8.039 8.515 -0.834 1.520 -ATOM 4580 H1 TIP3 5027 14.697 8.968 8.241 0.417 1.000 -ATOM 4581 H2 TIP3 5027 15.366 8.109 9.312 0.417 1.000 -ATOM 4582 OH2 TIP3 5028 9.347 13.879 17.349 -0.834 1.520 -ATOM 4583 H1 TIP3 5028 9.080 14.658 17.778 0.417 1.000 -ATOM 4584 H2 TIP3 5028 9.829 14.268 16.598 0.417 1.000 -ATOM 4585 OH2 TIP3 5029 13.402 12.231 17.747 -0.834 1.520 -ATOM 4586 H1 TIP3 5029 14.266 12.607 18.005 0.417 1.000 -ATOM 4587 H2 TIP3 5029 13.539 12.199 16.755 0.417 1.000 -ATOM 4588 OH2 TIP3 5043 8.719 10.906 -8.479 -0.834 1.520 -ATOM 4589 H1 TIP3 5043 8.395 11.187 -7.588 0.417 1.000 -ATOM 4590 H2 TIP3 5043 9.590 11.280 -8.626 0.417 1.000 -ATOM 4591 OH2 TIP3 5044 11.408 7.285 -10.340 -0.834 1.520 -ATOM 4592 H1 TIP3 5044 11.908 6.745 -9.809 0.417 1.000 -ATOM 4593 H2 TIP3 5044 10.631 7.638 -9.829 0.417 1.000 -ATOM 4594 OH2 TIP3 5046 6.889 8.990 2.856 -0.834 1.520 -ATOM 4595 H1 TIP3 5046 7.254 9.757 3.253 0.417 1.000 -ATOM 4596 H2 TIP3 5046 7.221 8.318 3.456 0.417 1.000 -ATOM 4597 OH2 TIP3 5047 19.227 2.722 17.313 -0.834 1.520 -ATOM 4598 H1 TIP3 5047 18.720 1.889 17.635 0.417 1.000 -ATOM 4599 H2 TIP3 5047 18.931 3.438 17.940 0.417 1.000 -ATOM 4600 OH2 TIP3 5048 16.055 3.112 19.410 -0.834 1.520 -ATOM 4601 H1 TIP3 5048 15.615 3.280 18.585 0.417 1.000 -ATOM 4602 H2 TIP3 5048 17.001 3.373 19.291 0.417 1.000 -ATOM 4603 OH2 TIP3 5049 16.051 11.403 -3.424 -0.834 1.520 -ATOM 4604 H1 TIP3 5049 16.273 11.416 -4.349 0.417 1.000 -ATOM 4605 H2 TIP3 5049 16.095 10.464 -3.224 0.417 1.000 -ATOM 4606 OH2 TIP3 5061 15.796 2.236 -10.640 -0.834 1.520 -ATOM 4607 H1 TIP3 5061 15.374 2.018 -11.509 0.417 1.000 -ATOM 4608 H2 TIP3 5061 16.534 2.827 -10.902 0.417 1.000 -ATOM 4609 OH2 TIP3 5064 14.936 17.763 -11.514 -0.834 1.520 -ATOM 4610 H1 TIP3 5064 14.177 17.204 -11.674 0.417 1.000 -ATOM 4611 H2 TIP3 5064 15.428 17.293 -10.802 0.417 1.000 -ATOM 4612 OH2 TIP3 5068 15.022 15.199 -6.902 -0.834 1.520 -ATOM 4613 H1 TIP3 5068 14.280 14.568 -7.107 0.417 1.000 -ATOM 4614 H2 TIP3 5068 15.067 15.282 -5.904 0.417 1.000 -ATOM 4615 OH2 TIP3 5075 13.456 12.771 14.985 -0.834 1.520 -ATOM 4616 H1 TIP3 5075 14.249 13.023 14.552 0.417 1.000 -ATOM 4617 H2 TIP3 5075 13.004 13.597 15.189 0.417 1.000 -ATOM 4618 OH2 TIP3 5087 18.535 18.225 5.801 -0.834 1.520 -ATOM 4619 H1 TIP3 5087 17.831 18.919 5.666 0.417 1.000 -ATOM 4620 H2 TIP3 5087 18.496 17.617 5.062 0.417 1.000 -ATOM 4621 OH2 TIP3 5088 11.866 5.965 -0.276 -0.834 1.520 -ATOM 4622 H1 TIP3 5088 12.546 5.327 -0.078 0.417 1.000 -ATOM 4623 H2 TIP3 5088 11.891 6.600 0.377 0.417 1.000 -ATOM 4624 OH2 TIP3 5089 11.223 19.196 10.003 -0.834 1.520 -ATOM 4625 H1 TIP3 5089 11.656 19.268 10.849 0.417 1.000 -ATOM 4626 H2 TIP3 5089 10.442 18.601 10.189 0.417 1.000 -ATOM 4627 OH2 TIP3 5093 12.994 15.909 3.631 -0.834 1.520 -ATOM 4628 H1 TIP3 5093 12.468 16.675 3.756 0.417 1.000 -ATOM 4629 H2 TIP3 5093 12.508 15.300 4.092 0.417 1.000 -ATOM 4630 OH2 TIP3 5098 5.320 2.189 15.296 -0.834 1.520 -ATOM 4631 H1 TIP3 5098 4.510 2.651 15.054 0.417 1.000 -ATOM 4632 H2 TIP3 5098 5.992 2.848 15.086 0.417 1.000 -ATOM 4633 OH2 TIP3 5106 14.747 15.091 -4.128 -0.834 1.520 -ATOM 4634 H1 TIP3 5106 13.802 15.371 -3.863 0.417 1.000 -ATOM 4635 H2 TIP3 5106 15.027 14.529 -3.414 0.417 1.000 -ATOM 4636 OH2 TIP3 5115 7.081 10.869 15.522 -0.834 1.520 -ATOM 4637 H1 TIP3 5115 7.940 10.969 15.073 0.417 1.000 -ATOM 4638 H2 TIP3 5115 7.069 10.065 15.990 0.417 1.000 -ATOM 4639 OH2 TIP3 5117 18.195 13.937 2.979 -0.834 1.520 -ATOM 4640 H1 TIP3 5117 19.057 13.521 2.760 0.417 1.000 -ATOM 4641 H2 TIP3 5117 18.395 14.887 3.058 0.417 1.000 -ATOM 4642 OH2 TIP3 5125 18.369 13.410 7.513 -0.834 1.520 -ATOM 4643 H1 TIP3 5125 19.192 13.302 6.954 0.417 1.000 -ATOM 4644 H2 TIP3 5125 18.414 14.305 7.918 0.417 1.000 -ATOM 4645 OH2 TIP3 5127 10.081 17.085 -10.702 -0.834 1.520 -ATOM 4646 H1 TIP3 5127 9.579 17.884 -10.372 0.417 1.000 -ATOM 4647 H2 TIP3 5127 9.330 16.618 -11.111 0.417 1.000 -ATOM 4648 OH2 TIP3 5133 6.160 10.788 -5.788 -0.834 1.520 -ATOM 4649 H1 TIP3 5133 6.076 10.109 -5.087 0.417 1.000 -ATOM 4650 H2 TIP3 5133 6.406 10.281 -6.565 0.417 1.000 -ATOM 4651 OH2 TIP3 5164 14.212 8.724 -5.348 -0.834 1.520 -ATOM 4652 H1 TIP3 5164 15.073 8.458 -5.841 0.417 1.000 -ATOM 4653 H2 TIP3 5164 13.910 9.428 -5.910 0.417 1.000 -ATOM 4654 OH2 TIP3 5165 12.937 19.219 -9.628 -0.834 1.520 -ATOM 4655 H1 TIP3 5165 12.903 18.243 -9.731 0.417 1.000 -ATOM 4656 H2 TIP3 5165 13.607 19.380 -8.943 0.417 1.000 -ATOM 4657 OH2 TIP3 5195 14.264 5.494 7.481 -0.834 1.520 -ATOM 4658 H1 TIP3 5195 14.316 6.376 7.834 0.417 1.000 -ATOM 4659 H2 TIP3 5195 15.178 5.206 7.322 0.417 1.000 -ATOM 4660 OH2 TIP3 5234 7.070 -17.015 -5.288 -0.834 1.520 -ATOM 4661 H1 TIP3 5234 7.044 -16.425 -6.080 0.417 1.000 -ATOM 4662 H2 TIP3 5234 7.302 -17.929 -5.602 0.417 1.000 -ATOM 4663 OH2 TIP3 5251 9.248 -4.914 -17.871 -0.834 1.520 -ATOM 4664 H1 TIP3 5251 8.830 -5.681 -17.466 0.417 1.000 -ATOM 4665 H2 TIP3 5251 9.093 -4.167 -17.226 0.417 1.000 -ATOM 4666 OH2 TIP3 5260 15.782 -18.766 -0.276 -0.834 1.520 -ATOM 4667 H1 TIP3 5260 16.295 -17.968 0.016 0.417 1.000 -ATOM 4668 H2 TIP3 5260 14.976 -18.442 -0.801 0.417 1.000 -ATOM 4669 OH2 TIP3 5267 5.592 -14.400 18.398 -0.834 1.520 -ATOM 4670 H1 TIP3 5267 6.554 -14.388 18.622 0.417 1.000 -ATOM 4671 H2 TIP3 5267 5.611 -14.914 17.533 0.417 1.000 -ATOM 4672 OH2 TIP3 5272 16.512 -12.638 -14.642 -0.834 1.520 -ATOM 4673 H1 TIP3 5272 17.156 -12.776 -15.412 0.417 1.000 -ATOM 4674 H2 TIP3 5272 16.664 -13.354 -14.037 0.417 1.000 -ATOM 4675 OH2 TIP3 5302 16.233 -13.190 7.692 -0.834 1.520 -ATOM 4676 H1 TIP3 5302 16.788 -13.086 6.952 0.417 1.000 -ATOM 4677 H2 TIP3 5302 15.588 -12.445 7.567 0.417 1.000 -ATOM 4678 OH2 TIP3 5317 14.299 -12.929 -18.042 -0.834 1.520 -ATOM 4679 H1 TIP3 5317 13.774 -13.479 -17.515 0.417 1.000 -ATOM 4680 H2 TIP3 5317 13.798 -12.145 -18.284 0.417 1.000 -ATOM 4681 OH2 TIP3 5318 16.674 -10.069 -1.764 -0.834 1.520 -ATOM 4682 H1 TIP3 5318 16.138 -10.904 -1.806 0.417 1.000 -ATOM 4683 H2 TIP3 5318 16.354 -9.497 -2.518 0.417 1.000 -ATOM 4684 OH2 TIP3 5319 13.503 -18.835 -15.677 -0.834 1.520 -ATOM 4685 H1 TIP3 5319 12.690 -19.285 -15.951 0.417 1.000 -ATOM 4686 H2 TIP3 5319 14.005 -19.019 -16.487 0.417 1.000 -ATOM 4687 OH2 TIP3 5320 -2.725 -9.990 -1.303 -0.834 1.520 -ATOM 4688 H1 TIP3 5320 -2.106 -10.416 -1.906 0.417 1.000 -ATOM 4689 H2 TIP3 5320 -3.508 -10.528 -1.340 0.417 1.000 -ATOM 4690 OH2 TIP3 5323 8.656 -13.880 4.596 -0.834 1.520 -ATOM 4691 H1 TIP3 5323 9.522 -13.819 4.203 0.417 1.000 -ATOM 4692 H2 TIP3 5323 8.851 -14.185 5.493 0.417 1.000 -ATOM 4693 OH2 TIP3 5341 0.606 -6.048 -5.389 -0.834 1.520 -ATOM 4694 H1 TIP3 5341 0.573 -6.455 -4.500 0.417 1.000 -ATOM 4695 H2 TIP3 5341 0.964 -6.827 -5.957 0.417 1.000 -ATOM 4696 OH2 TIP3 5343 12.398 -8.093 7.573 -0.834 1.520 -ATOM 4697 H1 TIP3 5343 12.054 -8.864 8.119 0.417 1.000 -ATOM 4698 H2 TIP3 5343 11.596 -7.736 7.295 0.417 1.000 -ATOM 4699 OH2 TIP3 5355 7.127 -19.591 -17.384 -0.834 1.520 -ATOM 4700 H1 TIP3 5355 6.234 -19.768 -17.558 0.417 1.000 -ATOM 4701 H2 TIP3 5355 7.331 -18.758 -17.819 0.417 1.000 -ATOM 4702 OH2 TIP3 5356 1.148 -17.212 -15.264 -0.834 1.520 -ATOM 4703 H1 TIP3 5356 1.231 -16.486 -14.719 0.417 1.000 -ATOM 4704 H2 TIP3 5356 2.035 -17.255 -15.702 0.417 1.000 -ATOM 4705 OH2 TIP3 5358 11.374 0.383 -14.397 -0.834 1.520 -ATOM 4706 H1 TIP3 5358 10.606 0.894 -14.264 0.417 1.000 -ATOM 4707 H2 TIP3 5358 11.018 -0.304 -15.045 0.417 1.000 -ATOM 4708 OH2 TIP3 5360 14.296 -11.536 -9.788 -0.834 1.520 -ATOM 4709 H1 TIP3 5360 13.560 -11.925 -10.346 0.417 1.000 -ATOM 4710 H2 TIP3 5360 14.266 -12.091 -8.966 0.417 1.000 -ATOM 4711 OH2 TIP3 5364 8.474 1.819 -1.619 -0.834 1.520 -ATOM 4712 H1 TIP3 5364 9.448 2.091 -1.431 0.417 1.000 -ATOM 4713 H2 TIP3 5364 8.268 1.210 -0.894 0.417 1.000 -ATOM 4714 OH2 TIP3 5365 14.100 -11.342 7.382 -0.834 1.520 -ATOM 4715 H1 TIP3 5365 14.415 -10.569 6.920 0.417 1.000 -ATOM 4716 H2 TIP3 5365 13.394 -11.030 7.979 0.417 1.000 -ATOM 4717 OH2 TIP3 5366 4.747 -17.126 3.859 -0.834 1.520 -ATOM 4718 H1 TIP3 5366 5.471 -16.512 3.596 0.417 1.000 -ATOM 4719 H2 TIP3 5366 5.220 -17.923 4.213 0.417 1.000 -ATOM 4720 OH2 TIP3 5369 10.185 -15.314 6.606 -0.834 1.520 -ATOM 4721 H1 TIP3 5369 10.174 -16.257 6.251 0.417 1.000 -ATOM 4722 H2 TIP3 5369 11.134 -15.158 6.778 0.417 1.000 -ATOM 4723 OH2 TIP3 5370 14.602 0.297 17.848 -0.834 1.520 -ATOM 4724 H1 TIP3 5370 14.040 -0.269 17.290 0.417 1.000 -ATOM 4725 H2 TIP3 5370 15.219 -0.394 18.269 0.417 1.000 -ATOM 4726 OH2 TIP3 5378 9.237 -7.661 -9.299 -0.834 1.520 -ATOM 4727 H1 TIP3 5378 9.431 -6.727 -9.322 0.417 1.000 -ATOM 4728 H2 TIP3 5378 10.103 -8.052 -9.119 0.417 1.000 -ATOM 4729 OH2 TIP3 5380 19.043 0.480 -15.906 -0.834 1.520 -ATOM 4730 H1 TIP3 5380 19.347 -0.428 -15.843 0.417 1.000 -ATOM 4731 H2 TIP3 5380 19.763 0.868 -16.339 0.417 1.000 -ATOM 4732 OH2 TIP3 5381 12.704 10.573 -18.808 -0.834 1.520 -ATOM 4733 H1 TIP3 5381 12.141 10.374 -19.588 0.417 1.000 -ATOM 4734 H2 TIP3 5381 12.294 11.463 -18.495 0.417 1.000 -ATOM 4735 OH2 TIP3 5384 15.575 -11.671 -4.060 -0.834 1.520 -ATOM 4736 H1 TIP3 5384 14.988 -12.150 -4.630 0.417 1.000 -ATOM 4737 H2 TIP3 5384 15.336 -10.762 -4.136 0.417 1.000 -ATOM 4738 OH2 TIP3 5385 3.796 -5.682 -4.344 -0.834 1.520 -ATOM 4739 H1 TIP3 5385 4.661 -5.967 -4.718 0.417 1.000 -ATOM 4740 H2 TIP3 5385 3.317 -6.505 -4.204 0.417 1.000 -ATOM 4741 OH2 TIP3 5393 4.111 2.000 -13.574 -0.834 1.520 -ATOM 4742 H1 TIP3 5393 3.832 2.636 -12.908 0.417 1.000 -ATOM 4743 H2 TIP3 5393 3.879 2.428 -14.467 0.417 1.000 -ATOM 4744 OH2 TIP3 5396 13.185 -9.125 -14.505 -0.834 1.520 -ATOM 4745 H1 TIP3 5396 12.568 -8.575 -13.964 0.417 1.000 -ATOM 4746 H2 TIP3 5396 12.538 -9.411 -15.227 0.417 1.000 -ATOM 4747 OH2 TIP3 5400 14.596 -2.476 -3.442 -0.834 1.520 -ATOM 4748 H1 TIP3 5400 14.209 -1.722 -3.033 0.417 1.000 -ATOM 4749 H2 TIP3 5400 14.831 -2.220 -4.363 0.417 1.000 -ATOM 4750 OH2 TIP3 5401 11.944 2.445 7.176 -0.834 1.520 -ATOM 4751 H1 TIP3 5401 11.738 3.383 7.005 0.417 1.000 -ATOM 4752 H2 TIP3 5401 11.566 1.938 6.435 0.417 1.000 -ATOM 4753 OH2 TIP3 5403 8.367 -11.027 6.187 -0.834 1.520 -ATOM 4754 H1 TIP3 5403 8.718 -10.131 6.098 0.417 1.000 -ATOM 4755 H2 TIP3 5403 8.562 -11.490 5.346 0.417 1.000 -ATOM 4756 OH2 TIP3 5404 6.690 -6.853 -10.123 -0.834 1.520 -ATOM 4757 H1 TIP3 5404 7.483 -7.422 -9.872 0.417 1.000 -ATOM 4758 H2 TIP3 5404 6.446 -6.469 -9.181 0.417 1.000 -ATOM 4759 OH2 TIP3 5406 11.389 -16.853 14.614 -0.834 1.520 -ATOM 4760 H1 TIP3 5406 11.689 -16.497 15.506 0.417 1.000 -ATOM 4761 H2 TIP3 5406 11.586 -16.125 13.966 0.417 1.000 -ATOM 4762 OH2 TIP3 5408 18.703 5.587 10.663 -0.834 1.520 -ATOM 4763 H1 TIP3 5408 18.843 6.362 11.336 0.417 1.000 -ATOM 4764 H2 TIP3 5408 19.098 4.769 11.070 0.417 1.000 -ATOM 4765 OH2 TIP3 5409 7.434 5.012 12.576 -0.834 1.520 -ATOM 4766 H1 TIP3 5409 7.156 5.482 13.389 0.417 1.000 -ATOM 4767 H2 TIP3 5409 7.941 5.705 12.091 0.417 1.000 -ATOM 4768 OH2 TIP3 5410 14.092 -10.907 17.180 -0.834 1.520 -ATOM 4769 H1 TIP3 5410 13.629 -10.783 16.383 0.417 1.000 -ATOM 4770 H2 TIP3 5410 14.906 -10.408 17.069 0.417 1.000 -ATOM 4771 OH2 TIP3 5418 6.978 4.748 -15.229 -0.834 1.520 -ATOM 4772 H1 TIP3 5418 7.752 5.332 -15.017 0.417 1.000 -ATOM 4773 H2 TIP3 5418 6.598 5.191 -15.955 0.417 1.000 -ATOM 4774 OH2 TIP3 5421 -19.208 8.251 -2.977 -0.834 1.520 -ATOM 4775 H1 TIP3 5421 -19.033 8.811 -3.808 0.417 1.000 -ATOM 4776 H2 TIP3 5421 -19.678 7.534 -3.339 0.417 1.000 -ATOM 4777 OH2 TIP3 5423 16.783 5.581 8.647 -0.834 1.520 -ATOM 4778 H1 TIP3 5423 17.154 6.118 7.942 0.417 1.000 -ATOM 4779 H2 TIP3 5423 17.451 5.726 9.351 0.417 1.000 -ATOM 4780 OH2 TIP3 5424 18.809 2.308 4.480 -0.834 1.520 -ATOM 4781 H1 TIP3 5424 18.892 3.167 4.977 0.417 1.000 -ATOM 4782 H2 TIP3 5424 17.869 2.017 4.797 0.417 1.000 -ATOM 4783 OH2 TIP3 5429 14.462 -4.027 14.451 -0.834 1.520 -ATOM 4784 H1 TIP3 5429 15.148 -3.401 14.534 0.417 1.000 -ATOM 4785 H2 TIP3 5429 14.480 -4.395 15.324 0.417 1.000 -ATOM 4786 OH2 TIP3 5430 11.900 -3.789 -3.199 -0.834 1.520 -ATOM 4787 H1 TIP3 5430 12.581 -3.277 -3.608 0.417 1.000 -ATOM 4788 H2 TIP3 5430 11.064 -3.277 -3.338 0.417 1.000 -ATOM 4789 OH2 TIP3 5440 14.485 -0.646 -12.162 -0.834 1.520 -ATOM 4790 H1 TIP3 5440 15.335 -1.131 -11.960 0.417 1.000 -ATOM 4791 H2 TIP3 5440 14.813 0.175 -12.584 0.417 1.000 -ATOM 4792 OH2 TIP3 5443 12.609 -9.258 -3.624 -0.834 1.520 -ATOM 4793 H1 TIP3 5443 11.791 -8.811 -3.825 0.417 1.000 -ATOM 4794 H2 TIP3 5443 12.237 -9.936 -2.981 0.417 1.000 -ATOM 4795 OH2 TIP3 5444 11.100 3.775 -10.543 -0.834 1.520 -ATOM 4796 H1 TIP3 5444 10.416 4.441 -10.781 0.417 1.000 -ATOM 4797 H2 TIP3 5444 10.933 3.615 -9.633 0.417 1.000 -ATOM 4798 OH2 TIP3 5445 11.210 12.340 -9.099 -0.834 1.520 -ATOM 4799 H1 TIP3 5445 11.732 11.533 -9.460 0.417 1.000 -ATOM 4800 H2 TIP3 5445 11.181 12.865 -9.901 0.417 1.000 -ATOM 4801 OH2 TIP3 5448 14.455 0.732 10.621 -0.834 1.520 -ATOM 4802 H1 TIP3 5448 14.754 0.073 11.257 0.417 1.000 -ATOM 4803 H2 TIP3 5448 14.486 0.203 9.747 0.417 1.000 -ATOM 4804 OH2 TIP3 5454 14.812 -8.573 13.499 -0.834 1.520 -ATOM 4805 H1 TIP3 5454 15.552 -8.093 13.151 0.417 1.000 -ATOM 4806 H2 TIP3 5454 14.951 -8.465 14.455 0.417 1.000 -ATOM 4807 OH2 TIP3 5455 9.007 4.256 16.647 -0.834 1.520 -ATOM 4808 H1 TIP3 5455 8.876 3.559 17.371 0.417 1.000 -ATOM 4809 H2 TIP3 5455 9.861 4.650 16.935 0.417 1.000 -ATOM 4810 OH2 TIP3 5456 12.228 10.627 13.602 -0.834 1.520 -ATOM 4811 H1 TIP3 5456 12.672 11.422 13.899 0.417 1.000 -ATOM 4812 H2 TIP3 5456 12.664 9.883 14.024 0.417 1.000 -ATOM 4813 OH2 TIP3 5462 9.361 6.115 -14.689 -0.834 1.520 -ATOM 4814 H1 TIP3 5462 10.188 5.555 -14.557 0.417 1.000 -ATOM 4815 H2 TIP3 5462 9.590 6.982 -14.224 0.417 1.000 -ATOM 4816 OH2 TIP3 5463 4.980 6.576 -8.654 -0.834 1.520 -ATOM 4817 H1 TIP3 5463 5.270 6.086 -7.833 0.417 1.000 -ATOM 4818 H2 TIP3 5463 4.047 6.280 -8.778 0.417 1.000 -ATOM 4819 OH2 TIP3 5466 12.725 -3.052 -12.017 -0.834 1.520 -ATOM 4820 H1 TIP3 5466 13.444 -3.698 -12.046 0.417 1.000 -ATOM 4821 H2 TIP3 5466 13.212 -2.192 -12.134 0.417 1.000 -ATOM 4822 OH2 TIP3 5468 17.093 11.448 3.705 -0.834 1.520 -ATOM 4823 H1 TIP3 5468 17.843 11.474 4.294 0.417 1.000 -ATOM 4824 H2 TIP3 5468 17.116 12.288 3.230 0.417 1.000 -ATOM 4825 OH2 TIP3 5470 5.477 1.060 12.510 -0.834 1.520 -ATOM 4826 H1 TIP3 5470 5.580 0.888 13.447 0.417 1.000 -ATOM 4827 H2 TIP3 5470 5.397 1.990 12.354 0.417 1.000 -ATOM 4828 OH2 TIP3 5472 1.772 0.721 13.296 -0.834 1.520 -ATOM 4829 H1 TIP3 5472 0.857 0.872 13.293 0.417 1.000 -ATOM 4830 H2 TIP3 5472 2.111 1.563 12.903 0.417 1.000 -ATOM 4831 OH2 TIP3 5473 10.150 -2.350 14.111 -0.834 1.520 -ATOM 4832 H1 TIP3 5473 10.498 -2.236 14.969 0.417 1.000 -ATOM 4833 H2 TIP3 5473 9.443 -1.642 14.097 0.417 1.000 -ATOM 4834 OH2 TIP3 5484 11.221 -0.513 -1.272 -0.834 1.520 -ATOM 4835 H1 TIP3 5484 10.595 -0.924 -0.698 0.417 1.000 -ATOM 4836 H2 TIP3 5484 11.999 -0.958 -1.025 0.417 1.000 -ATOM 4837 OH2 TIP3 5485 10.724 -2.726 3.501 -0.834 1.520 -ATOM 4838 H1 TIP3 5485 10.500 -2.364 4.425 0.417 1.000 -ATOM 4839 H2 TIP3 5485 11.702 -2.759 3.492 0.417 1.000 -ATOM 4840 OH2 TIP3 5489 11.882 10.956 5.165 -0.834 1.520 -ATOM 4841 H1 TIP3 5489 11.001 11.046 5.465 0.417 1.000 -ATOM 4842 H2 TIP3 5489 11.776 10.285 4.455 0.417 1.000 -ATOM 4843 OH2 TIP3 5490 13.347 6.042 12.170 -0.834 1.520 -ATOM 4844 H1 TIP3 5490 13.110 6.803 11.609 0.417 1.000 -ATOM 4845 H2 TIP3 5490 12.595 5.502 12.128 0.417 1.000 -ATOM 4846 OH2 TIP3 5505 12.381 9.281 -3.169 -0.834 1.520 -ATOM 4847 H1 TIP3 5505 11.517 8.803 -3.188 0.417 1.000 -ATOM 4848 H2 TIP3 5505 12.710 9.154 -4.038 0.417 1.000 -ATOM 4849 OH2 TIP3 5508 12.486 16.535 13.272 -0.834 1.520 -ATOM 4850 H1 TIP3 5508 13.209 16.329 13.871 0.417 1.000 -ATOM 4851 H2 TIP3 5508 12.769 16.183 12.425 0.417 1.000 -ATOM 4852 OH2 TIP3 5511 14.369 -7.349 18.864 -0.834 1.520 -ATOM 4853 H1 TIP3 5511 13.425 -7.553 18.748 0.417 1.000 -ATOM 4854 H2 TIP3 5511 14.443 -7.447 19.814 0.417 1.000 -ATOM 4855 OH2 TIP3 5514 14.950 3.794 11.426 -0.834 1.520 -ATOM 4856 H1 TIP3 5514 14.798 4.765 11.501 0.417 1.000 -ATOM 4857 H2 TIP3 5514 14.399 3.413 12.040 0.417 1.000 -ATOM 4858 OH2 TIP3 5522 19.036 14.614 -17.999 -0.834 1.520 -ATOM 4859 H1 TIP3 5522 19.729 13.928 -18.017 0.417 1.000 -ATOM 4860 H2 TIP3 5522 19.474 15.397 -17.626 0.417 1.000 -ATOM 4861 OH2 TIP3 5528 11.135 2.229 -1.321 -0.834 1.520 -ATOM 4862 H1 TIP3 5528 11.278 1.353 -1.767 0.417 1.000 -ATOM 4863 H2 TIP3 5528 12.011 2.599 -1.355 0.417 1.000 -ATOM 4864 OH2 TIP3 5530 12.170 19.039 1.156 -0.834 1.520 -ATOM 4865 H1 TIP3 5530 12.699 18.209 0.987 0.417 1.000 -ATOM 4866 H2 TIP3 5530 12.023 19.346 0.242 0.417 1.000 -ATOM 4867 OH2 TIP3 5531 15.862 14.515 5.077 -0.834 1.520 -ATOM 4868 H1 TIP3 5531 16.165 14.505 4.102 0.417 1.000 -ATOM 4869 H2 TIP3 5531 15.031 14.091 5.011 0.417 1.000 -ATOM 4870 OH2 TIP3 5537 14.539 10.511 9.425 -0.834 1.520 -ATOM 4871 H1 TIP3 5537 14.825 10.055 10.231 0.417 1.000 -ATOM 4872 H2 TIP3 5537 15.302 11.126 9.271 0.417 1.000 -ATOM 4873 OH2 TIP3 5545 9.835 15.598 -13.639 -0.834 1.520 -ATOM 4874 H1 TIP3 5545 9.391 16.405 -13.887 0.417 1.000 -ATOM 4875 H2 TIP3 5545 9.216 14.860 -13.933 0.417 1.000 -ATOM 4876 OH2 TIP3 5549 6.448 12.371 -0.027 -0.834 1.520 -ATOM 4877 H1 TIP3 5549 6.085 11.922 0.689 0.417 1.000 -ATOM 4878 H2 TIP3 5549 5.867 13.101 -0.215 0.417 1.000 -ATOM 4879 OH2 TIP3 5550 17.281 11.681 -5.760 -0.834 1.520 -ATOM 4880 H1 TIP3 5550 17.520 12.442 -6.341 0.417 1.000 -ATOM 4881 H2 TIP3 5550 17.940 11.105 -6.124 0.417 1.000 -ATOM 4882 OH2 TIP3 5551 19.291 12.022 -2.462 -0.834 1.520 -ATOM 4883 H1 TIP3 5551 19.395 11.139 -2.833 0.417 1.000 -ATOM 4884 H2 TIP3 5551 18.973 11.884 -1.530 0.417 1.000 -ATOM 4885 OH2 TIP3 5557 18.997 17.076 18.505 -0.834 1.520 -ATOM 4886 H1 TIP3 5557 19.159 16.530 17.701 0.417 1.000 -ATOM 4887 H2 TIP3 5557 18.170 16.717 18.937 0.417 1.000 -ATOM 4888 OH2 TIP3 5566 11.906 14.524 -11.130 -0.834 1.520 -ATOM 4889 H1 TIP3 5566 11.644 15.279 -10.636 0.417 1.000 -ATOM 4890 H2 TIP3 5566 12.499 14.976 -11.759 0.417 1.000 -ATOM 4891 OH2 TIP3 5570 16.934 17.142 3.738 -0.834 1.520 -ATOM 4892 H1 TIP3 5570 16.356 17.888 3.511 0.417 1.000 -ATOM 4893 H2 TIP3 5570 16.553 16.472 3.181 0.417 1.000 -ATOM 4894 OH2 TIP3 5575 8.382 13.106 5.620 -0.834 1.520 -ATOM 4895 H1 TIP3 5575 8.699 14.015 5.900 0.417 1.000 -ATOM 4896 H2 TIP3 5575 8.951 12.449 6.124 0.417 1.000 -ATOM 4897 OH2 TIP3 5607 10.069 15.308 -17.921 -0.834 1.520 -ATOM 4898 H1 TIP3 5607 10.483 15.292 -18.754 0.417 1.000 -ATOM 4899 H2 TIP3 5607 9.513 14.548 -17.868 0.417 1.000 -ATOM 4900 OH2 TIP3 5610 15.900 16.217 -9.230 -0.834 1.520 -ATOM 4901 H1 TIP3 5610 15.441 15.887 -8.458 0.417 1.000 -ATOM 4902 H2 TIP3 5610 15.819 15.482 -9.883 0.417 1.000 -ATOM 4903 OH2 TIP3 5613 19.591 16.397 2.036 -0.834 1.520 -ATOM 4904 H1 TIP3 5613 18.836 16.506 1.366 0.417 1.000 -ATOM 4905 H2 TIP3 5613 19.452 17.178 2.647 0.417 1.000 -ATOM 4906 OH2 TIP3 5669 18.511 -17.954 -14.452 -0.834 1.520 -ATOM 4907 H1 TIP3 5669 17.889 -17.419 -14.932 0.417 1.000 -ATOM 4908 H2 TIP3 5669 17.999 -18.232 -13.736 0.417 1.000 -ATOM 4909 OH2 TIP3 5676 17.038 -15.763 -9.630 -0.834 1.520 -ATOM 4910 H1 TIP3 5676 17.927 -15.462 -9.940 0.417 1.000 -ATOM 4911 H2 TIP3 5676 16.566 -14.950 -9.774 0.417 1.000 -ATOM 4912 OH2 TIP3 5690 9.290 -15.575 -7.608 -0.834 1.520 -ATOM 4913 H1 TIP3 5690 9.842 -15.903 -8.302 0.417 1.000 -ATOM 4914 H2 TIP3 5690 8.399 -15.987 -7.841 0.417 1.000 -ATOM 4915 OH2 TIP3 5710 15.432 -18.020 -9.677 -0.834 1.520 -ATOM 4916 H1 TIP3 5710 16.211 -17.449 -9.542 0.417 1.000 -ATOM 4917 H2 TIP3 5710 15.507 -18.652 -8.903 0.417 1.000 -ATOM 4918 OH2 TIP3 5713 19.421 -18.813 -3.561 -0.834 1.520 -ATOM 4919 H1 TIP3 5713 19.141 -18.504 -4.484 0.417 1.000 -ATOM 4920 H2 TIP3 5713 19.100 -18.072 -3.044 0.417 1.000 -ATOM 4921 OH2 TIP3 5719 16.797 -17.705 6.462 -0.834 1.520 -ATOM 4922 H1 TIP3 5719 16.744 -18.284 7.169 0.417 1.000 -ATOM 4923 H2 TIP3 5719 17.466 -18.102 5.855 0.417 1.000 -ATOM 4924 OH2 TIP3 5720 17.339 -13.758 0.208 -0.834 1.520 -ATOM 4925 H1 TIP3 5720 17.305 -12.855 -0.236 0.417 1.000 -ATOM 4926 H2 TIP3 5720 17.919 -13.566 0.953 0.417 1.000 -ATOM 4927 OH2 TIP3 5723 6.919 -15.757 3.224 -0.834 1.520 -ATOM 4928 H1 TIP3 5723 7.546 -15.400 3.905 0.417 1.000 -ATOM 4929 H2 TIP3 5723 7.492 -15.921 2.426 0.417 1.000 -ATOM 4930 OH2 TIP3 5736 18.769 -15.698 -4.759 -0.834 1.520 -ATOM 4931 H1 TIP3 5736 19.640 -15.481 -4.423 0.417 1.000 -ATOM 4932 H2 TIP3 5736 18.425 -14.887 -5.162 0.417 1.000 -ATOM 4933 OH2 TIP3 5741 17.717 -6.300 5.977 -0.834 1.520 -ATOM 4934 H1 TIP3 5741 18.622 -6.487 6.236 0.417 1.000 -ATOM 4935 H2 TIP3 5741 17.860 -6.305 5.015 0.417 1.000 -ATOM 4936 OH2 TIP3 5756 18.720 -19.085 -10.042 -0.834 1.520 -ATOM 4937 H1 TIP3 5756 18.543 -18.745 -10.939 0.417 1.000 -ATOM 4938 H2 TIP3 5756 19.041 -18.335 -9.553 0.417 1.000 -ATOM 4939 OH2 TIP3 5760 18.464 -18.489 4.239 -0.834 1.520 -ATOM 4940 H1 TIP3 5760 18.696 -19.225 4.807 0.417 1.000 -ATOM 4941 H2 TIP3 5760 18.900 -18.765 3.388 0.417 1.000 -ATOM 4942 OH2 TIP3 5765 17.890 -18.159 17.115 -0.834 1.520 -ATOM 4943 H1 TIP3 5765 18.680 -18.480 17.633 0.417 1.000 -ATOM 4944 H2 TIP3 5765 17.229 -18.064 17.819 0.417 1.000 -ATOM 4945 OH2 TIP3 5767 16.459 -16.347 0.744 -0.834 1.520 -ATOM 4946 H1 TIP3 5767 15.941 -16.315 1.542 0.417 1.000 -ATOM 4947 H2 TIP3 5767 16.754 -15.402 0.621 0.417 1.000 -ATOM 4948 OH2 TIP3 5768 14.731 -4.777 0.339 -0.834 1.520 -ATOM 4949 H1 TIP3 5768 13.991 -5.085 -0.209 0.417 1.000 -ATOM 4950 H2 TIP3 5768 14.317 -4.875 1.247 0.417 1.000 -ATOM 4951 OH2 TIP3 5777 19.925 -10.137 -19.866 -0.834 1.520 -ATOM 4952 H1 TIP3 5777 19.934 -9.190 -19.832 0.417 1.000 -ATOM 4953 H2 TIP3 5777 18.975 -10.416 -19.797 0.417 1.000 -ATOM 4954 OH2 TIP3 5782 0.842 -6.430 4.883 -0.834 1.520 -ATOM 4955 H1 TIP3 5782 1.084 -5.588 5.335 0.417 1.000 -ATOM 4956 H2 TIP3 5782 -0.020 -6.620 5.201 0.417 1.000 -ATOM 4957 OH2 TIP3 5784 19.719 -4.976 8.581 -0.834 1.520 -ATOM 4958 H1 TIP3 5784 18.720 -5.011 8.595 0.417 1.000 -ATOM 4959 H2 TIP3 5784 19.932 -4.591 7.681 0.417 1.000 -ATOM 4960 OH2 TIP3 5785 8.411 -14.609 18.565 -0.834 1.520 -ATOM 4961 H1 TIP3 5785 8.638 -14.019 19.284 0.417 1.000 -ATOM 4962 H2 TIP3 5785 8.889 -15.369 18.738 0.417 1.000 -ATOM 4963 OH2 TIP3 5791 17.884 -10.183 12.645 -0.834 1.520 -ATOM 4964 H1 TIP3 5791 17.483 -9.764 11.870 0.417 1.000 -ATOM 4965 H2 TIP3 5791 17.993 -9.426 13.219 0.417 1.000 -ATOM 4966 OH2 TIP3 5795 10.434 -9.295 -6.732 -0.834 1.520 -ATOM 4967 H1 TIP3 5795 9.617 -9.807 -6.823 0.417 1.000 -ATOM 4968 H2 TIP3 5795 10.536 -9.247 -5.767 0.417 1.000 -ATOM 4969 OH2 TIP3 5803 11.367 -17.504 8.704 -0.834 1.520 -ATOM 4970 H1 TIP3 5803 11.892 -16.719 9.045 0.417 1.000 -ATOM 4971 H2 TIP3 5803 11.378 -18.082 9.459 0.417 1.000 -ATOM 4972 OH2 TIP3 5804 2.274 -17.000 8.005 -0.834 1.520 -ATOM 4973 H1 TIP3 5804 1.899 -16.933 8.900 0.417 1.000 -ATOM 4974 H2 TIP3 5804 2.349 -17.966 7.824 0.417 1.000 -ATOM 4975 OH2 TIP3 5806 19.017 -14.066 11.834 -0.834 1.520 -ATOM 4976 H1 TIP3 5806 19.443 -14.671 11.239 0.417 1.000 -ATOM 4977 H2 TIP3 5806 18.689 -13.358 11.192 0.417 1.000 -ATOM 4978 OH2 TIP3 5807 17.605 -8.794 16.594 -0.834 1.520 -ATOM 4979 H1 TIP3 5807 18.105 -7.996 16.877 0.417 1.000 -ATOM 4980 H2 TIP3 5807 16.755 -8.377 16.258 0.417 1.000 -ATOM 4981 OH2 TIP3 5818 14.951 9.246 -18.216 -0.834 1.520 -ATOM 4982 H1 TIP3 5818 15.492 9.897 -18.603 0.417 1.000 -ATOM 4983 H2 TIP3 5818 14.064 9.568 -18.502 0.417 1.000 -ATOM 4984 OH2 TIP3 5820 15.560 -9.147 -8.955 -0.834 1.520 -ATOM 4985 H1 TIP3 5820 15.946 -9.694 -8.244 0.417 1.000 -ATOM 4986 H2 TIP3 5820 15.112 -9.865 -9.526 0.417 1.000 -ATOM 4987 OH2 TIP3 5821 12.574 -5.635 -5.510 -0.834 1.520 -ATOM 4988 H1 TIP3 5821 11.973 -6.364 -5.597 0.417 1.000 -ATOM 4989 H2 TIP3 5821 12.103 -4.921 -5.889 0.417 1.000 -ATOM 4990 OH2 TIP3 5824 12.379 -18.522 6.530 -0.834 1.520 -ATOM 4991 H1 TIP3 5824 12.027 -19.442 6.456 0.417 1.000 -ATOM 4992 H2 TIP3 5824 12.226 -18.201 7.410 0.417 1.000 -ATOM 4993 OH2 TIP3 5827 3.893 -3.789 3.211 -0.834 1.520 -ATOM 4994 H1 TIP3 5827 3.768 -4.616 2.714 0.417 1.000 -ATOM 4995 H2 TIP3 5827 3.179 -3.227 3.003 0.417 1.000 -ATOM 4996 OH2 TIP3 5834 14.343 -5.605 11.122 -0.834 1.520 -ATOM 4997 H1 TIP3 5834 14.853 -5.155 11.833 0.417 1.000 -ATOM 4998 H2 TIP3 5834 13.561 -5.864 11.598 0.417 1.000 -ATOM 4999 OH2 TIP3 5839 13.028 -3.293 -15.034 -0.834 1.520 -ATOM 5000 H1 TIP3 5839 12.488 -3.000 -14.308 0.417 1.000 -ATOM 5001 H2 TIP3 5839 13.536 -3.972 -14.551 0.417 1.000 -ATOM 5002 OH2 TIP3 5840 15.922 8.590 -15.299 -0.834 1.520 -ATOM 5003 H1 TIP3 5840 15.174 8.530 -15.914 0.417 1.000 -ATOM 5004 H2 TIP3 5840 16.526 9.316 -15.654 0.417 1.000 -ATOM 5005 OH2 TIP3 5842 11.352 -1.409 8.149 -0.834 1.520 -ATOM 5006 H1 TIP3 5842 11.651 -2.223 8.551 0.417 1.000 -ATOM 5007 H2 TIP3 5842 11.234 -0.748 8.819 0.417 1.000 -ATOM 5008 OH2 TIP3 5844 19.698 -9.445 -0.979 -0.834 1.520 -ATOM 5009 H1 TIP3 5844 19.296 -8.881 -1.619 0.417 1.000 -ATOM 5010 H2 TIP3 5844 18.953 -10.002 -0.668 0.417 1.000 -ATOM 5011 OH2 TIP3 5845 12.946 4.486 5.134 -0.834 1.520 -ATOM 5012 H1 TIP3 5845 12.703 5.071 5.902 0.417 1.000 -ATOM 5013 H2 TIP3 5845 13.913 4.605 5.047 0.417 1.000 -ATOM 5014 OH2 TIP3 5849 6.737 -6.211 13.818 -0.834 1.520 -ATOM 5015 H1 TIP3 5849 7.398 -6.834 13.923 0.417 1.000 -ATOM 5016 H2 TIP3 5849 7.206 -5.396 13.613 0.417 1.000 -ATOM 5017 OH2 TIP3 5860 9.708 -4.715 -9.528 -0.834 1.520 -ATOM 5018 H1 TIP3 5860 9.576 -4.508 -8.567 0.417 1.000 -ATOM 5019 H2 TIP3 5860 10.628 -4.486 -9.646 0.417 1.000 -ATOM 5020 OH2 TIP3 5861 17.443 4.171 -12.189 -0.834 1.520 -ATOM 5021 H1 TIP3 5861 16.966 4.983 -12.404 0.417 1.000 -ATOM 5022 H2 TIP3 5861 17.263 3.629 -12.969 0.417 1.000 -ATOM 5023 OH2 TIP3 5862 17.233 0.009 -12.818 -0.834 1.520 -ATOM 5024 H1 TIP3 5862 17.096 -0.610 -13.493 0.417 1.000 -ATOM 5025 H2 TIP3 5862 17.966 -0.341 -12.270 0.417 1.000 -ATOM 5026 OH2 TIP3 5864 9.752 -0.123 10.311 -0.834 1.520 -ATOM 5027 H1 TIP3 5864 9.124 -0.691 9.764 0.417 1.000 -ATOM 5028 H2 TIP3 5864 9.196 0.589 10.657 0.417 1.000 -ATOM 5029 OH2 TIP3 5865 16.679 -6.995 1.116 -0.834 1.520 -ATOM 5030 H1 TIP3 5865 16.232 -7.906 1.064 0.417 1.000 -ATOM 5031 H2 TIP3 5865 16.396 -6.522 0.329 0.417 1.000 -ATOM 5032 OH2 TIP3 5868 14.660 -1.218 8.378 -0.834 1.520 -ATOM 5033 H1 TIP3 5868 15.453 -1.616 8.804 0.417 1.000 -ATOM 5034 H2 TIP3 5868 13.978 -1.884 8.611 0.417 1.000 -ATOM 5035 OH2 TIP3 5870 1.849 11.211 19.309 -0.834 1.520 -ATOM 5036 H1 TIP3 5870 1.681 10.244 19.348 0.417 1.000 -ATOM 5037 H2 TIP3 5870 2.819 11.222 19.501 0.417 1.000 -ATOM 5038 OH2 TIP3 5881 15.444 -10.107 -15.865 -0.834 1.520 -ATOM 5039 H1 TIP3 5881 14.898 -9.815 -15.167 0.417 1.000 -ATOM 5040 H2 TIP3 5881 15.644 -11.006 -15.452 0.417 1.000 -ATOM 5041 OH2 TIP3 5884 19.276 -15.078 -11.090 -0.834 1.520 -ATOM 5042 H1 TIP3 5884 19.353 -14.334 -11.676 0.417 1.000 -ATOM 5043 H2 TIP3 5884 19.973 -14.892 -10.463 0.417 1.000 -ATOM 5044 OH2 TIP3 5889 16.284 -6.832 -10.052 -0.834 1.520 -ATOM 5045 H1 TIP3 5889 16.271 -7.712 -9.561 0.417 1.000 -ATOM 5046 H2 TIP3 5889 15.534 -6.950 -10.703 0.417 1.000 -ATOM 5047 OH2 TIP3 5890 16.687 -5.256 15.841 -0.834 1.520 -ATOM 5048 H1 TIP3 5890 17.327 -5.249 15.159 0.417 1.000 -ATOM 5049 H2 TIP3 5890 17.077 -4.701 16.527 0.417 1.000 -ATOM 5050 OH2 TIP3 5899 2.157 6.309 -9.345 -0.834 1.520 -ATOM 5051 H1 TIP3 5899 2.113 5.340 -9.410 0.417 1.000 -ATOM 5052 H2 TIP3 5899 1.349 6.567 -9.887 0.417 1.000 -ATOM 5053 OH2 TIP3 5901 1.701 -3.796 -8.187 -0.834 1.520 -ATOM 5054 H1 TIP3 5901 1.240 -4.722 -8.322 0.417 1.000 -ATOM 5055 H2 TIP3 5901 2.146 -4.007 -7.398 0.417 1.000 -ATOM 5056 OH2 TIP3 5906 14.317 8.605 -0.076 -0.834 1.520 -ATOM 5057 H1 TIP3 5906 13.682 9.059 -0.695 0.417 1.000 -ATOM 5058 H2 TIP3 5906 14.052 9.046 0.699 0.417 1.000 -ATOM 5059 OH2 TIP3 5907 19.718 -0.138 6.819 -0.834 1.520 -ATOM 5060 H1 TIP3 5907 19.928 -0.283 7.739 0.417 1.000 -ATOM 5061 H2 TIP3 5907 19.425 0.779 6.771 0.417 1.000 -ATOM 5062 OH2 TIP3 5910 10.644 6.866 8.586 -0.834 1.520 -ATOM 5063 H1 TIP3 5910 11.352 6.691 9.172 0.417 1.000 -ATOM 5064 H2 TIP3 5910 11.140 7.329 7.913 0.417 1.000 -ATOM 5065 OH2 TIP3 5911 14.024 0.067 1.448 -0.834 1.520 -ATOM 5066 H1 TIP3 5911 14.544 0.795 1.708 0.417 1.000 -ATOM 5067 H2 TIP3 5911 13.067 0.502 1.486 0.417 1.000 -ATOM 5068 OH2 TIP3 5913 4.823 3.470 6.798 -0.834 1.520 -ATOM 5069 H1 TIP3 5913 5.330 4.268 6.950 0.417 1.000 -ATOM 5070 H2 TIP3 5913 5.191 3.224 5.984 0.417 1.000 -ATOM 5071 OH2 TIP3 5914 18.471 -9.128 19.883 -0.834 1.520 -ATOM 5072 H1 TIP3 5914 19.390 -9.501 19.765 0.417 1.000 -ATOM 5073 H2 TIP3 5914 18.468 -8.403 19.264 0.417 1.000 -ATOM 5074 OH2 TIP3 5920 14.510 -6.294 -14.442 -0.834 1.520 -ATOM 5075 H1 TIP3 5920 14.762 -6.216 -15.357 0.417 1.000 -ATOM 5076 H2 TIP3 5920 14.115 -7.218 -14.395 0.417 1.000 -ATOM 5077 OH2 TIP3 5924 17.133 6.283 2.439 -0.834 1.520 -ATOM 5078 H1 TIP3 5924 17.505 7.189 2.338 0.417 1.000 -ATOM 5079 H2 TIP3 5924 16.912 6.021 1.476 0.417 1.000 -ATOM 5080 OH2 TIP3 5925 10.116 18.130 -17.236 -0.834 1.520 -ATOM 5081 H1 TIP3 5925 10.739 17.963 -16.532 0.417 1.000 -ATOM 5082 H2 TIP3 5925 9.814 17.221 -17.426 0.417 1.000 -ATOM 5083 OH2 TIP3 5930 10.375 17.848 4.514 -0.834 1.520 -ATOM 5084 H1 TIP3 5930 10.747 18.288 5.337 0.417 1.000 -ATOM 5085 H2 TIP3 5930 10.077 18.539 3.949 0.417 1.000 -ATOM 5086 OH2 TIP3 5932 15.664 4.835 4.312 -0.834 1.520 -ATOM 5087 H1 TIP3 5932 16.209 5.213 3.655 0.417 1.000 -ATOM 5088 H2 TIP3 5932 16.218 5.094 5.054 0.417 1.000 -ATOM 5089 OH2 TIP3 5935 10.481 9.878 11.227 -0.834 1.520 -ATOM 5090 H1 TIP3 5935 11.225 10.170 11.844 0.417 1.000 -ATOM 5091 H2 TIP3 5935 10.797 10.174 10.293 0.417 1.000 -ATOM 5092 OH2 TIP3 5941 15.927 17.566 -3.842 -0.834 1.520 -ATOM 5093 H1 TIP3 5941 15.511 17.790 -2.984 0.417 1.000 -ATOM 5094 H2 TIP3 5941 15.663 16.687 -4.098 0.417 1.000 -ATOM 5095 OH2 TIP3 5945 7.702 9.196 0.160 -0.834 1.520 -ATOM 5096 H1 TIP3 5945 7.123 9.912 -0.191 0.417 1.000 -ATOM 5097 H2 TIP3 5945 7.403 9.079 1.069 0.417 1.000 -ATOM 5098 OH2 TIP3 5972 16.858 7.112 6.018 -0.834 1.520 -ATOM 5099 H1 TIP3 5972 16.455 7.899 6.455 0.417 1.000 -ATOM 5100 H2 TIP3 5972 17.484 7.544 5.453 0.417 1.000 -ATOM 5101 OH2 TIP3 5973 15.696 14.271 14.278 -0.834 1.520 -ATOM 5102 H1 TIP3 5973 15.870 13.468 13.719 0.417 1.000 -ATOM 5103 H2 TIP3 5973 16.506 14.719 14.177 0.417 1.000 -ATOM 5104 OH2 TIP3 5977 18.465 11.788 15.750 -0.834 1.520 -ATOM 5105 H1 TIP3 5977 17.791 11.588 15.036 0.417 1.000 -ATOM 5106 H2 TIP3 5977 18.044 11.301 16.503 0.417 1.000 -ATOM 5107 OH2 TIP3 5989 5.958 17.112 -9.465 -0.834 1.520 -ATOM 5108 H1 TIP3 5989 6.463 17.075 -10.303 0.417 1.000 -ATOM 5109 H2 TIP3 5989 6.119 18.021 -9.170 0.417 1.000 -ATOM 5110 OH2 TIP3 5992 13.061 16.541 0.071 -0.834 1.520 -ATOM 5111 H1 TIP3 5992 12.167 16.450 -0.238 0.417 1.000 -ATOM 5112 H2 TIP3 5992 13.259 15.623 0.332 0.417 1.000 -ATOM 5113 OH2 TIP3 5993 8.263 16.264 9.221 -0.834 1.520 -ATOM 5114 H1 TIP3 5993 9.031 16.326 9.780 0.417 1.000 -ATOM 5115 H2 TIP3 5993 7.811 15.455 9.592 0.417 1.000 -ATOM 5116 OH2 TIP3 5996 16.031 9.340 14.083 -0.834 1.520 -ATOM 5117 H1 TIP3 5996 16.709 8.952 14.620 0.417 1.000 -ATOM 5118 H2 TIP3 5996 15.219 9.300 14.549 0.417 1.000 -ATOM 5119 OH2 TIP3 6012 18.970 19.936 8.056 -0.834 1.520 -ATOM 5120 H1 TIP3 6012 19.867 19.798 8.384 0.417 1.000 -ATOM 5121 H2 TIP3 6012 19.077 19.535 7.154 0.417 1.000 -ATOM 5122 OH2 TIP3 6019 13.835 11.798 -1.720 -0.834 1.520 -ATOM 5123 H1 TIP3 6019 14.717 11.778 -2.057 0.417 1.000 -ATOM 5124 H2 TIP3 6019 13.509 10.949 -2.116 0.417 1.000 -ATOM 5125 OH2 TIP3 6036 18.524 12.307 0.226 -0.834 1.520 -ATOM 5126 H1 TIP3 6036 18.597 12.412 1.225 0.417 1.000 -ATOM 5127 H2 TIP3 6036 17.692 11.827 0.112 0.417 1.000 -ATOM 5128 OH2 TIP3 6039 15.350 14.076 8.081 -0.834 1.520 -ATOM 5129 H1 TIP3 6039 16.016 14.136 7.313 0.417 1.000 -ATOM 5130 H2 TIP3 6039 14.474 14.045 7.573 0.417 1.000 -ATOM 5131 OH2 TIP3 6048 15.236 12.545 -15.055 -0.834 1.520 -ATOM 5132 H1 TIP3 6048 14.374 12.178 -14.836 0.417 1.000 -ATOM 5133 H2 TIP3 6048 15.075 13.510 -14.862 0.417 1.000 -ATOM 5134 OH2 TIP3 6110 18.595 -18.216 -18.755 -0.834 1.520 -ATOM 5135 H1 TIP3 6110 18.500 -18.695 -19.587 0.417 1.000 -ATOM 5136 H2 TIP3 6110 19.426 -17.785 -18.960 0.417 1.000 -ATOM 5137 OH2 TIP3 6117 18.184 18.079 -17.294 -0.834 1.520 -ATOM 5138 H1 TIP3 6117 17.940 17.568 -16.584 0.417 1.000 -ATOM 5139 H2 TIP3 6117 19.167 18.220 -17.182 0.417 1.000 -ATOM 5140 OH2 TIP3 6136 16.949 -10.849 -7.430 -0.834 1.520 -ATOM 5141 H1 TIP3 6136 17.451 -10.866 -8.263 0.417 1.000 -ATOM 5142 H2 TIP3 6136 16.438 -11.693 -7.510 0.417 1.000 -ATOM 5143 OH2 TIP3 6138 12.773 -17.741 -7.363 -0.834 1.520 -ATOM 5144 H1 TIP3 6138 12.793 -18.533 -6.791 0.417 1.000 -ATOM 5145 H2 TIP3 6138 12.105 -17.987 -8.009 0.417 1.000 -ATOM 5146 OH2 TIP3 6139 16.511 -10.540 6.593 -0.834 1.520 -ATOM 5147 H1 TIP3 6139 17.314 -10.950 6.308 0.417 1.000 -ATOM 5148 H2 TIP3 6139 16.610 -9.592 6.226 0.417 1.000 -ATOM 5149 OH2 TIP3 6158 3.865 -18.173 -15.336 -0.834 1.520 -ATOM 5150 H1 TIP3 6158 3.526 -19.028 -15.556 0.417 1.000 -ATOM 5151 H2 TIP3 6158 4.483 -18.343 -14.531 0.417 1.000 -ATOM 5152 OH2 TIP3 6178 17.511 -11.193 2.131 -0.834 1.520 -ATOM 5153 H1 TIP3 6178 18.343 -10.683 1.977 0.417 1.000 -ATOM 5154 H2 TIP3 6178 16.886 -10.520 1.867 0.417 1.000 -ATOM 5155 OH2 TIP3 6183 9.289 -16.850 -10.699 -0.834 1.520 -ATOM 5156 H1 TIP3 6183 9.950 -16.210 -11.070 0.417 1.000 -ATOM 5157 H2 TIP3 6183 8.761 -17.105 -11.479 0.417 1.000 -ATOM 5158 OH2 TIP3 6187 14.008 -18.363 9.864 -0.834 1.520 -ATOM 5159 H1 TIP3 6187 14.988 -18.244 9.729 0.417 1.000 -ATOM 5160 H2 TIP3 6187 13.759 -17.437 9.984 0.417 1.000 -ATOM 5161 OH2 TIP3 6188 16.927 -15.196 15.751 -0.834 1.520 -ATOM 5162 H1 TIP3 6188 17.543 -15.675 16.351 0.417 1.000 -ATOM 5163 H2 TIP3 6188 17.511 -14.574 15.344 0.417 1.000 -ATOM 5164 OH2 TIP3 6195 10.673 -8.999 -16.499 -0.834 1.520 -ATOM 5165 H1 TIP3 6195 10.445 -9.896 -16.093 0.417 1.000 -ATOM 5166 H2 TIP3 6195 9.950 -8.827 -17.173 0.417 1.000 -ATOM 5167 OH2 TIP3 6198 19.062 -5.607 -13.274 -0.834 1.520 -ATOM 5168 H1 TIP3 6198 18.900 -6.403 -12.820 0.417 1.000 -ATOM 5169 H2 TIP3 6198 18.341 -5.478 -13.914 0.417 1.000 -ATOM 5170 OH2 TIP3 6200 18.172 -18.411 -6.104 -0.834 1.520 -ATOM 5171 H1 TIP3 6200 17.963 -17.499 -6.047 0.417 1.000 -ATOM 5172 H2 TIP3 6200 17.215 -18.764 -6.166 0.417 1.000 -ATOM 5173 OH2 TIP3 6219 18.442 -14.018 -16.211 -0.834 1.520 -ATOM 5174 H1 TIP3 6219 18.510 -14.805 -15.620 0.417 1.000 -ATOM 5175 H2 TIP3 6219 19.384 -14.022 -16.506 0.417 1.000 -ATOM 5176 OH2 TIP3 6220 12.627 0.031 -9.044 -0.834 1.520 -ATOM 5177 H1 TIP3 6220 11.932 -0.017 -9.766 0.417 1.000 -ATOM 5178 H2 TIP3 6220 12.516 -0.821 -8.536 0.417 1.000 -ATOM 5179 OH2 TIP3 6240 -16.920 -19.051 -8.212 -0.834 1.520 -ATOM 5180 H1 TIP3 6240 -16.310 -19.500 -8.828 0.417 1.000 -ATOM 5181 H2 TIP3 6240 -17.804 -19.444 -8.359 0.417 1.000 -ATOM 5182 OH2 TIP3 6241 9.462 1.024 -9.649 -0.834 1.520 -ATOM 5183 H1 TIP3 6241 9.814 0.763 -10.497 0.417 1.000 -ATOM 5184 H2 TIP3 6241 9.452 0.119 -9.241 0.417 1.000 -ATOM 5185 OH2 TIP3 6243 19.114 -10.058 -3.913 -0.834 1.520 -ATOM 5186 H1 TIP3 6243 18.333 -10.698 -3.714 0.417 1.000 -ATOM 5187 H2 TIP3 6243 19.792 -10.607 -3.510 0.417 1.000 -ATOM 5188 OH2 TIP3 6247 9.430 0.387 14.216 -0.834 1.520 -ATOM 5189 H1 TIP3 6247 9.429 1.378 14.066 0.417 1.000 -ATOM 5190 H2 TIP3 6247 10.158 0.138 13.637 0.417 1.000 -ATOM 5191 OH2 TIP3 6256 18.710 -11.190 -9.476 -0.834 1.520 -ATOM 5192 H1 TIP3 6256 19.285 -10.435 -9.422 0.417 1.000 -ATOM 5193 H2 TIP3 6256 19.249 -11.946 -9.577 0.417 1.000 -ATOM 5194 OH2 TIP3 6258 14.517 -5.304 -8.677 -0.834 1.520 -ATOM 5195 H1 TIP3 6258 14.017 -5.790 -8.053 0.417 1.000 -ATOM 5196 H2 TIP3 6258 15.388 -5.778 -8.775 0.417 1.000 -ATOM 5197 OH2 TIP3 6266 13.874 -10.066 3.981 -0.834 1.520 -ATOM 5198 H1 TIP3 6266 14.466 -9.322 4.250 0.417 1.000 -ATOM 5199 H2 TIP3 6266 14.188 -10.361 3.145 0.417 1.000 -ATOM 5200 OH2 TIP3 6300 8.603 5.046 -11.244 -0.834 1.520 -ATOM 5201 H1 TIP3 6300 8.196 5.721 -10.650 0.417 1.000 -ATOM 5202 H2 TIP3 6300 8.345 5.319 -12.104 0.417 1.000 -ATOM 5203 OH2 TIP3 6302 15.255 17.615 -1.139 -0.834 1.520 -ATOM 5204 H1 TIP3 6302 15.637 16.714 -1.125 0.417 1.000 -ATOM 5205 H2 TIP3 6302 14.346 17.487 -0.863 0.417 1.000 -ATOM 5206 OH2 TIP3 6309 15.779 3.135 0.132 -0.834 1.520 -ATOM 5207 H1 TIP3 6309 15.918 2.804 1.032 0.417 1.000 -ATOM 5208 H2 TIP3 6309 15.559 4.079 0.225 0.417 1.000 -ATOM 5209 OH2 TIP3 6311 14.117 -15.216 -7.681 -0.834 1.520 -ATOM 5210 H1 TIP3 6311 13.538 -15.951 -7.665 0.417 1.000 -ATOM 5211 H2 TIP3 6311 14.966 -15.599 -7.412 0.417 1.000 -ATOM 5212 OH2 TIP3 6315 13.898 -12.433 19.265 -0.834 1.520 -ATOM 5213 H1 TIP3 6315 14.046 -11.787 18.505 0.417 1.000 -ATOM 5214 H2 TIP3 6315 14.292 -13.272 18.976 0.417 1.000 -ATOM 5215 OH2 TIP3 6321 16.759 -6.142 -6.759 -0.834 1.520 -ATOM 5216 H1 TIP3 6321 17.254 -6.922 -6.700 0.417 1.000 -ATOM 5217 H2 TIP3 6321 16.903 -5.723 -5.906 0.417 1.000 -ATOM 5218 OH2 TIP3 6325 7.495 0.734 -3.941 -0.834 1.520 -ATOM 5219 H1 TIP3 6325 7.618 1.083 -3.066 0.417 1.000 -ATOM 5220 H2 TIP3 6325 6.546 0.766 -4.029 0.417 1.000 -ATOM 5221 OH2 TIP3 6333 14.076 -4.182 17.215 -0.834 1.520 -ATOM 5222 H1 TIP3 6333 13.717 -4.418 18.037 0.417 1.000 -ATOM 5223 H2 TIP3 6333 15.017 -4.453 17.223 0.417 1.000 -ATOM 5224 OH2 TIP3 6347 17.415 8.449 -0.750 -0.834 1.520 -ATOM 5225 H1 TIP3 6347 16.432 8.260 -0.793 0.417 1.000 -ATOM 5226 H2 TIP3 6347 17.695 8.409 -1.641 0.417 1.000 -ATOM 5227 OH2 TIP3 6348 18.265 5.005 -7.753 -0.834 1.520 -ATOM 5228 H1 TIP3 6348 18.893 4.231 -8.109 0.417 1.000 -ATOM 5229 H2 TIP3 6348 17.406 4.598 -7.627 0.417 1.000 -ATOM 5230 OH2 TIP3 6352 12.470 12.566 2.559 -0.834 1.520 -ATOM 5231 H1 TIP3 6352 11.584 12.597 2.092 0.417 1.000 -ATOM 5232 H2 TIP3 6352 12.196 12.410 3.533 0.417 1.000 -ATOM 5233 OH2 TIP3 6356 13.430 5.959 15.069 -0.834 1.520 -ATOM 5234 H1 TIP3 6356 12.749 5.332 15.250 0.417 1.000 -ATOM 5235 H2 TIP3 6356 13.448 6.034 14.131 0.417 1.000 -ATOM 5236 OH2 TIP3 6370 16.417 0.527 4.809 -0.834 1.520 -ATOM 5237 H1 TIP3 6370 15.913 1.083 5.518 0.417 1.000 -ATOM 5238 H2 TIP3 6370 16.555 -0.381 5.118 0.417 1.000 -ATOM 5239 OH2 TIP3 6373 17.481 9.369 8.871 -0.834 1.520 -ATOM 5240 H1 TIP3 6373 16.902 9.820 8.223 0.417 1.000 -ATOM 5241 H2 TIP3 6373 18.334 9.258 8.353 0.417 1.000 -ATOM 5242 OH2 TIP3 6381 15.388 -5.799 -17.128 -0.834 1.520 -ATOM 5243 H1 TIP3 6381 15.822 -6.583 -17.414 0.417 1.000 -ATOM 5244 H2 TIP3 6381 15.683 -5.117 -17.748 0.417 1.000 -ATOM 5245 OH2 TIP3 6404 14.627 19.477 -18.971 -0.834 1.520 -ATOM 5246 H1 TIP3 6404 15.534 19.676 -18.599 0.417 1.000 -ATOM 5247 H2 TIP3 6404 14.656 19.858 -19.872 0.417 1.000 -ATOM 5248 OH2 TIP3 6417 16.099 11.041 0.540 -0.834 1.520 -ATOM 5249 H1 TIP3 6417 15.853 10.544 -0.247 0.417 1.000 -ATOM 5250 H2 TIP3 6417 15.397 10.963 1.168 0.417 1.000 -ATOM 5251 OH2 TIP3 6425 14.706 13.591 -18.454 -0.834 1.520 -ATOM 5252 H1 TIP3 6425 15.001 13.098 -17.650 0.417 1.000 -ATOM 5253 H2 TIP3 6425 13.797 13.825 -18.206 0.417 1.000 -ATOM 5254 OH2 TIP3 6429 16.114 8.527 -10.530 -0.834 1.520 -ATOM 5255 H1 TIP3 6429 16.585 8.342 -9.719 0.417 1.000 -ATOM 5256 H2 TIP3 6429 16.687 8.403 -11.276 0.417 1.000 -ATOM 5257 OH2 TIP3 6439 16.110 12.348 12.423 -0.834 1.520 -ATOM 5258 H1 TIP3 6439 16.368 12.137 11.512 0.417 1.000 -ATOM 5259 H2 TIP3 6439 16.051 11.474 12.873 0.417 1.000 -ATOM 5260 OH2 TIP3 6456 13.464 13.208 5.608 -0.834 1.520 -ATOM 5261 H1 TIP3 6456 13.071 12.324 5.540 0.417 1.000 -ATOM 5262 H2 TIP3 6456 12.710 13.743 5.337 0.417 1.000 -ATOM 5263 OH2 TIP3 6483 18.297 15.389 13.797 -0.834 1.520 -ATOM 5264 H1 TIP3 6483 18.161 16.339 14.125 0.417 1.000 -ATOM 5265 H2 TIP3 6483 18.816 14.979 14.506 0.417 1.000 -ATOM 5266 OH2 TIP3 6492 10.201 8.396 -5.748 -0.834 1.520 -ATOM 5267 H1 TIP3 6492 9.790 9.206 -5.358 0.417 1.000 -ATOM 5268 H2 TIP3 6492 10.307 7.838 -4.965 0.417 1.000 -ATOM 5269 OH2 TIP3 6499 15.826 8.528 -3.171 -0.834 1.520 -ATOM 5270 H1 TIP3 6499 15.546 7.563 -2.983 0.417 1.000 -ATOM 5271 H2 TIP3 6499 15.225 8.805 -3.879 0.417 1.000 -ATOM 5272 OH2 TIP3 6502 18.029 18.224 13.986 -0.834 1.520 -ATOM 5273 H1 TIP3 6502 18.944 18.397 14.377 0.417 1.000 -ATOM 5274 H2 TIP3 6502 17.985 18.806 13.217 0.417 1.000 -ATOM 5275 OH2 TIP3 6551 17.038 -12.756 -18.318 -0.834 1.520 -ATOM 5276 H1 TIP3 6551 16.056 -12.714 -18.143 0.417 1.000 -ATOM 5277 H2 TIP3 6551 17.432 -13.299 -17.555 0.417 1.000 -ATOM 5278 OH2 TIP3 6575 16.685 -13.065 -10.242 -0.834 1.520 -ATOM 5279 H1 TIP3 6575 15.864 -12.581 -10.217 0.417 1.000 -ATOM 5280 H2 TIP3 6575 17.340 -12.414 -10.034 0.417 1.000 -ATOM 5281 OH2 TIP3 6577 18.667 -17.062 -1.377 -0.834 1.520 -ATOM 5282 H1 TIP3 6577 18.061 -16.505 -1.934 0.417 1.000 -ATOM 5283 H2 TIP3 6577 18.224 -17.043 -0.502 0.417 1.000 -ATOM 5284 OH2 TIP3 6578 18.057 -15.886 3.645 -0.834 1.520 -ATOM 5285 H1 TIP3 6578 17.174 -16.221 3.329 0.417 1.000 -ATOM 5286 H2 TIP3 6578 18.489 -16.639 4.159 0.417 1.000 -ATOM 5287 OH2 TIP3 6583 5.431 -14.780 6.033 -0.834 1.520 -ATOM 5288 H1 TIP3 6583 5.686 -13.883 5.671 0.417 1.000 -ATOM 5289 H2 TIP3 6583 5.655 -14.734 6.978 0.417 1.000 -ATOM 5290 OH2 TIP3 6597 16.934 -18.378 -12.167 -0.834 1.520 -ATOM 5291 H1 TIP3 6597 16.171 -18.749 -12.620 0.417 1.000 -ATOM 5292 H2 TIP3 6597 16.578 -17.959 -11.361 0.417 1.000 -ATOM 5293 OH2 TIP3 6603 18.685 -7.603 -2.963 -0.834 1.520 -ATOM 5294 H1 TIP3 6603 17.893 -7.205 -3.360 0.417 1.000 -ATOM 5295 H2 TIP3 6603 18.756 -8.437 -3.418 0.417 1.000 -ATOM 5296 OH2 TIP3 6623 15.905 3.289 -7.823 -0.834 1.520 -ATOM 5297 H1 TIP3 6623 15.405 2.453 -7.737 0.417 1.000 -ATOM 5298 H2 TIP3 6623 16.099 3.300 -8.793 0.417 1.000 -ATOM 5299 OH2 TIP3 6661 16.588 -1.763 -14.695 -0.834 1.520 -ATOM 5300 H1 TIP3 6661 16.139 -1.597 -15.521 0.417 1.000 -ATOM 5301 H2 TIP3 6661 16.515 -2.721 -14.635 0.417 1.000 -ATOM 5302 OH2 TIP3 6663 16.714 -10.070 9.636 -0.834 1.520 -ATOM 5303 H1 TIP3 6663 17.136 -9.185 9.734 0.417 1.000 -ATOM 5304 H2 TIP3 6663 16.615 -10.113 8.679 0.417 1.000 -ATOM 5305 OH2 TIP3 6667 14.995 -17.815 18.545 -0.834 1.520 -ATOM 5306 H1 TIP3 6667 14.341 -18.180 17.916 0.417 1.000 -ATOM 5307 H2 TIP3 6667 14.462 -17.068 18.949 0.417 1.000 -ATOM 5308 OH2 TIP3 6669 15.835 -13.074 12.145 -0.834 1.520 -ATOM 5309 H1 TIP3 6669 16.636 -13.402 11.616 0.417 1.000 -ATOM 5310 H2 TIP3 6669 15.634 -13.890 12.729 0.417 1.000 -ATOM 5311 OH2 TIP3 6671 -19.103 -7.187 0.940 -0.834 1.520 -ATOM 5312 H1 TIP3 6671 -18.766 -6.423 1.489 0.417 1.000 -ATOM 5313 H2 TIP3 6671 -18.890 -7.917 1.442 0.417 1.000 -ATOM 5314 OH2 TIP3 6672 12.685 -10.560 14.879 -0.834 1.520 -ATOM 5315 H1 TIP3 6672 12.047 -11.075 14.323 0.417 1.000 -ATOM 5316 H2 TIP3 6672 13.281 -10.201 14.205 0.417 1.000 -ATOM 5317 OH2 TIP3 6681 16.626 0.950 -18.215 -0.834 1.520 -ATOM 5318 H1 TIP3 6681 16.391 1.874 -17.889 0.417 1.000 -ATOM 5319 H2 TIP3 6681 17.091 0.565 -17.414 0.417 1.000 -ATOM 5320 OH2 TIP3 6684 7.912 -9.027 -15.928 -0.834 1.520 -ATOM 5321 H1 TIP3 6684 6.970 -9.310 -15.925 0.417 1.000 -ATOM 5322 H2 TIP3 6684 7.786 -8.059 -16.065 0.417 1.000 -ATOM 5323 OH2 TIP3 6703 14.408 -7.477 -6.332 -0.834 1.520 -ATOM 5324 H1 TIP3 6703 14.017 -6.689 -6.042 0.417 1.000 -ATOM 5325 H2 TIP3 6703 15.307 -7.120 -6.630 0.417 1.000 -ATOM 5326 OH2 TIP3 6705 14.244 2.149 -2.137 -0.834 1.520 -ATOM 5327 H1 TIP3 6705 14.911 2.111 -1.431 0.417 1.000 -ATOM 5328 H2 TIP3 6705 14.746 1.912 -2.910 0.417 1.000 -ATOM 5329 OH2 TIP3 6707 15.347 -15.272 9.772 -0.834 1.520 -ATOM 5330 H1 TIP3 6707 15.928 -14.672 9.283 0.417 1.000 -ATOM 5331 H2 TIP3 6707 15.826 -16.067 9.694 0.417 1.000 -ATOM 5332 OH2 TIP3 6726 -1.987 -3.388 -1.134 -0.834 1.520 -ATOM 5333 H1 TIP3 6726 -1.039 -3.237 -1.130 0.417 1.000 -ATOM 5334 H2 TIP3 6726 -2.097 -4.148 -1.767 0.417 1.000 -ATOM 5335 OH2 TIP3 6751 -16.952 6.445 12.140 -0.834 1.520 -ATOM 5336 H1 TIP3 6751 -16.619 5.736 12.733 0.417 1.000 -ATOM 5337 H2 TIP3 6751 -17.900 6.429 12.339 0.417 1.000 -ATOM 5338 OH2 TIP3 6774 8.445 8.554 8.432 -0.834 1.520 -ATOM 5339 H1 TIP3 6774 9.322 8.154 8.374 0.417 1.000 -ATOM 5340 H2 TIP3 6774 7.812 7.759 8.510 0.417 1.000 -ATOM 5341 OH2 TIP3 6813 13.325 -5.870 -2.151 -0.834 1.520 -ATOM 5342 H1 TIP3 6813 13.550 -6.514 -2.851 0.417 1.000 -ATOM 5343 H2 TIP3 6813 12.837 -5.114 -2.565 0.417 1.000 -ATOM 5344 OH2 TIP3 6834 5.747 14.167 -16.239 -0.834 1.520 -ATOM 5345 H1 TIP3 6834 5.515 14.736 -17.052 0.417 1.000 -ATOM 5346 H2 TIP3 6834 4.967 14.186 -15.602 0.417 1.000 -ATOM 5347 OH2 TIP3 6837 18.348 0.190 12.227 -0.834 1.520 -ATOM 5348 H1 TIP3 6837 18.102 1.040 11.791 0.417 1.000 -ATOM 5349 H2 TIP3 6837 17.479 -0.146 12.542 0.417 1.000 -ATOM 5350 OH2 TIP3 6854 16.928 14.027 -1.992 -0.834 1.520 -ATOM 5351 H1 TIP3 6854 16.850 13.124 -2.383 0.417 1.000 -ATOM 5352 H2 TIP3 6854 17.662 14.429 -2.485 0.417 1.000 -ATOM 5353 OH2 TIP3 6855 13.240 3.893 0.917 -0.834 1.520 -ATOM 5354 H1 TIP3 6855 13.505 4.515 1.564 0.417 1.000 -ATOM 5355 H2 TIP3 6855 13.133 3.113 1.432 0.417 1.000 -ATOM 5356 OH2 TIP3 6867 8.346 13.096 -3.718 -0.834 1.520 -ATOM 5357 H1 TIP3 6867 8.406 14.067 -3.550 0.417 1.000 -ATOM 5358 H2 TIP3 6867 7.374 12.973 -3.851 0.417 1.000 -ATOM 5359 OH2 TIP3 6877 11.790 10.649 8.873 -0.834 1.520 -ATOM 5360 H1 TIP3 6877 11.748 11.503 9.268 0.417 1.000 -ATOM 5361 H2 TIP3 6877 12.731 10.397 8.971 0.417 1.000 -ATOM 5362 OH2 TIP3 6917 17.309 11.938 10.025 -0.834 1.520 -ATOM 5363 H1 TIP3 6917 17.406 11.032 9.653 0.417 1.000 -ATOM 5364 H2 TIP3 6917 17.874 12.461 9.446 0.417 1.000 -ATOM 5365 OH2 TIP3 6975 16.688 -15.729 -2.742 -0.834 1.520 -ATOM 5366 H1 TIP3 6975 16.893 -15.870 -3.654 0.417 1.000 -ATOM 5367 H2 TIP3 6975 15.924 -16.267 -2.556 0.417 1.000 -ATOM 5368 OH2 TIP3 6979 18.530 8.226 15.245 -0.834 1.520 -ATOM 5369 H1 TIP3 6979 19.218 8.419 15.889 0.417 1.000 -ATOM 5370 H2 TIP3 6979 18.179 7.357 15.475 0.417 1.000 -ATOM 5371 OH2 TIP3 7017 16.067 -18.799 -17.653 -0.834 1.520 -ATOM 5372 H1 TIP3 7017 15.519 -18.640 -18.474 0.417 1.000 -ATOM 5373 H2 TIP3 7017 16.916 -18.501 -17.937 0.417 1.000 -ATOM 5374 OH2 TIP3 7021 19.529 -9.441 1.670 -0.834 1.520 -ATOM 5375 H1 TIP3 7021 19.411 -8.627 2.121 0.417 1.000 -ATOM 5376 H2 TIP3 7021 19.816 -9.096 0.723 0.417 1.000 -ATOM 5377 OH2 TIP3 7027 -19.283 -18.618 15.598 -0.834 1.520 -ATOM 5378 H1 TIP3 7027 -18.453 -19.138 15.690 0.417 1.000 -ATOM 5379 H2 TIP3 7027 -19.453 -18.376 16.484 0.417 1.000 -ATOM 5380 OH2 TIP3 7041 17.833 -8.618 -6.082 -0.834 1.520 -ATOM 5381 H1 TIP3 7041 17.472 -9.335 -6.648 0.417 1.000 -ATOM 5382 H2 TIP3 7041 18.290 -9.112 -5.415 0.417 1.000 -ATOM 5383 OH2 TIP3 7052 14.779 -4.828 -11.945 -0.834 1.520 -ATOM 5384 H1 TIP3 7052 15.198 -5.207 -11.212 0.417 1.000 -ATOM 5385 H2 TIP3 7052 14.457 -5.617 -12.426 0.417 1.000 -ATOM 5386 OH2 TIP3 7058 7.696 -1.366 -5.657 -0.834 1.520 -ATOM 5387 H1 TIP3 7058 6.941 -0.984 -5.209 0.417 1.000 -ATOM 5388 H2 TIP3 7058 8.424 -0.986 -5.075 0.417 1.000 -ATOM 5389 OH2 TIP3 7062 18.062 -4.590 0.332 -0.834 1.520 -ATOM 5390 H1 TIP3 7062 17.339 -4.860 0.883 0.417 1.000 -ATOM 5391 H2 TIP3 7062 17.656 -3.997 -0.369 0.417 1.000 -ATOM 5392 OH2 TIP3 7068 13.480 -11.792 12.114 -0.834 1.520 -ATOM 5393 H1 TIP3 7068 13.573 -10.949 11.593 0.417 1.000 -ATOM 5394 H2 TIP3 7068 14.407 -12.124 12.157 0.417 1.000 -ATOM 5395 OH2 TIP3 7078 13.653 1.374 -15.511 -0.834 1.520 -ATOM 5396 H1 TIP3 7078 13.702 0.838 -16.298 0.417 1.000 -ATOM 5397 H2 TIP3 7078 12.888 1.034 -15.044 0.417 1.000 -ATOM 5398 OH2 TIP3 7121 17.815 -13.426 -6.045 -0.834 1.520 -ATOM 5399 H1 TIP3 7121 16.975 -12.898 -6.101 0.417 1.000 -ATOM 5400 H2 TIP3 7121 18.523 -12.863 -5.927 0.417 1.000 -ATOM 5401 OH2 TIP3 7130 17.965 -11.088 18.026 -0.834 1.520 -ATOM 5402 H1 TIP3 7130 17.727 -10.479 17.293 0.417 1.000 -ATOM 5403 H2 TIP3 7130 18.030 -10.567 18.768 0.417 1.000 -ATOM 5404 OH2 TIP3 7133 -16.425 -2.423 15.420 -0.834 1.520 -ATOM 5405 H1 TIP3 7133 -15.472 -2.401 15.232 0.417 1.000 -ATOM 5406 H2 TIP3 7133 -16.705 -3.257 15.025 0.417 1.000 -ATOM 5407 OH2 TIP3 7141 -3.702 2.765 -5.053 -0.834 1.520 -ATOM 5408 H1 TIP3 7141 -3.906 2.020 -5.582 0.417 1.000 -ATOM 5409 H2 TIP3 7141 -2.737 2.705 -4.973 0.417 1.000 -ATOM 5410 OH2 TIP3 7147 16.166 6.356 -13.323 -0.834 1.520 -ATOM 5411 H1 TIP3 7147 15.328 6.530 -12.894 0.417 1.000 -ATOM 5412 H2 TIP3 7147 16.749 7.118 -12.998 0.417 1.000 -ATOM 5413 OH2 TIP3 7170 17.428 2.797 14.373 -0.834 1.520 -ATOM 5414 H1 TIP3 7170 17.633 3.370 15.112 0.417 1.000 -ATOM 5415 H2 TIP3 7170 16.520 2.918 14.215 0.417 1.000 -ATOM 5416 OH2 TIP3 7174 19.220 -12.987 15.804 -0.834 1.520 -ATOM 5417 H1 TIP3 7174 18.677 -12.417 16.388 0.417 1.000 -ATOM 5418 H2 TIP3 7174 19.322 -13.757 16.344 0.417 1.000 -ATOM 5419 OH2 TIP3 7192 15.673 9.757 5.294 -0.834 1.520 -ATOM 5420 H1 TIP3 7192 16.044 10.251 4.538 0.417 1.000 -ATOM 5421 H2 TIP3 7192 15.922 10.353 6.042 0.417 1.000 -ATOM 5422 OH2 TIP3 7222 -13.745 -10.198 -19.636 -0.834 1.520 -ATOM 5423 H1 TIP3 7222 -13.046 -10.879 -19.329 0.417 1.000 -ATOM 5424 H2 TIP3 7222 -14.541 -10.736 -19.804 0.417 1.000 -ATOM 5425 OH2 TIP3 7252 10.691 -0.088 5.720 -0.834 1.520 -ATOM 5426 H1 TIP3 7252 11.071 0.322 4.919 0.417 1.000 -ATOM 5427 H2 TIP3 7252 11.454 -0.476 6.131 0.417 1.000 -ATOM 5428 OH2 TIP3 7295 -19.149 2.646 6.279 -0.834 1.520 -ATOM 5429 H1 TIP3 7295 -18.913 1.836 5.835 0.417 1.000 -ATOM 5430 H2 TIP3 7295 -19.759 2.368 6.986 0.417 1.000 -ATOM 5431 OH2 TIP3 7335 18.795 19.215 -9.145 -0.834 1.520 -ATOM 5432 H1 TIP3 7335 19.201 19.840 -9.737 0.417 1.000 -ATOM 5433 H2 TIP3 7335 18.593 18.469 -9.736 0.417 1.000 -ATOM 5434 OH2 TIP3 7352 17.693 13.942 -7.250 -0.834 1.520 -ATOM 5435 H1 TIP3 7352 18.336 14.171 -6.505 0.417 1.000 -ATOM 5436 H2 TIP3 7352 16.961 14.518 -7.055 0.417 1.000 -ATOM 5437 OH2 TIP3 7374 14.785 14.606 -11.307 -0.834 1.520 -ATOM 5438 H1 TIP3 7374 14.825 14.231 -12.199 0.417 1.000 -ATOM 5439 H2 TIP3 7374 13.990 14.217 -10.910 0.417 1.000 -ATOM 5440 OH2 TIP3 7395 18.647 16.816 -10.714 -0.834 1.520 -ATOM 5441 H1 TIP3 7395 19.199 16.093 -11.008 0.417 1.000 -ATOM 5442 H2 TIP3 7395 17.955 16.462 -10.194 0.417 1.000 -ATOM 5443 OH2 TIP3 7437 16.637 -16.038 -6.827 -0.834 1.520 -ATOM 5444 H1 TIP3 7437 17.082 -15.250 -6.454 0.417 1.000 -ATOM 5445 H2 TIP3 7437 17.123 -16.088 -7.717 0.417 1.000 -ATOM 5446 OH2 TIP3 7479 -13.860 -16.331 -16.296 -0.834 1.520 -ATOM 5447 H1 TIP3 7479 -13.268 -16.163 -17.051 0.417 1.000 -ATOM 5448 H2 TIP3 7479 -13.193 -16.592 -15.622 0.417 1.000 -ATOM 5449 OH2 TIP3 7501 13.476 -15.160 -11.139 -0.834 1.520 -ATOM 5450 H1 TIP3 7501 13.896 -15.340 -10.325 0.417 1.000 -ATOM 5451 H2 TIP3 7501 13.229 -16.074 -11.329 0.417 1.000 -ATOM 5452 OH2 TIP3 7510 -14.850 -8.315 -8.006 -0.834 1.520 -ATOM 5453 H1 TIP3 7510 -14.688 -7.359 -7.980 0.417 1.000 -ATOM 5454 H2 TIP3 7510 -14.386 -8.595 -7.222 0.417 1.000 -ATOM 5455 OH2 TIP3 7525 12.999 -10.993 1.240 -0.834 1.520 -ATOM 5456 H1 TIP3 7525 12.490 -11.055 0.384 0.417 1.000 -ATOM 5457 H2 TIP3 7525 12.823 -11.900 1.616 0.417 1.000 -ATOM 5458 OH2 TIP3 7532 -18.993 -11.593 17.837 -0.834 1.520 -ATOM 5459 H1 TIP3 7532 -18.402 -12.206 17.369 0.417 1.000 -ATOM 5460 H2 TIP3 7532 -18.847 -11.855 18.765 0.417 1.000 -ATOM 5461 OH2 TIP3 7563 -14.804 -0.696 -4.685 -0.834 1.520 -ATOM 5462 H1 TIP3 7563 -14.773 0.213 -5.058 0.417 1.000 -ATOM 5463 H2 TIP3 7563 -14.748 -1.280 -5.431 0.417 1.000 -ATOM 5464 OH2 TIP3 7567 16.186 -4.390 -2.041 -0.834 1.520 -ATOM 5465 H1 TIP3 7567 15.536 -3.812 -2.525 0.417 1.000 -ATOM 5466 H2 TIP3 7567 15.630 -4.621 -1.255 0.417 1.000 -ATOM 5467 OH2 TIP3 7568 -16.319 -12.656 3.826 -0.834 1.520 -ATOM 5468 H1 TIP3 7568 -16.420 -12.533 4.764 0.417 1.000 -ATOM 5469 H2 TIP3 7568 -16.369 -11.739 3.500 0.417 1.000 -ATOM 5470 OH2 TIP3 7592 -15.391 4.656 13.926 -0.834 1.520 -ATOM 5471 H1 TIP3 7592 -15.711 5.189 14.710 0.417 1.000 -ATOM 5472 H2 TIP3 7592 -15.687 3.763 14.198 0.417 1.000 -ATOM 5473 OH2 TIP3 7603 -15.354 16.705 -14.461 -0.834 1.520 -ATOM 5474 H1 TIP3 7603 -16.194 17.258 -14.588 0.417 1.000 -ATOM 5475 H2 TIP3 7603 -14.904 16.891 -15.260 0.417 1.000 -ATOM 5476 OH2 TIP3 7605 -13.313 4.853 -9.652 -0.834 1.520 -ATOM 5477 H1 TIP3 7605 -12.412 4.883 -9.271 0.417 1.000 -ATOM 5478 H2 TIP3 7605 -13.156 4.632 -10.581 0.417 1.000 -ATOM 5479 OH2 TIP3 7612 19.974 -5.947 -0.977 -0.834 1.520 -ATOM 5480 H1 TIP3 7612 19.316 -6.427 -1.528 0.417 1.000 -ATOM 5481 H2 TIP3 7612 19.402 -5.571 -0.386 0.417 1.000 -ATOM 5482 OH2 TIP3 7630 -17.821 -6.536 -12.823 -0.834 1.520 -ATOM 5483 H1 TIP3 7630 -17.281 -5.939 -12.263 0.417 1.000 -ATOM 5484 H2 TIP3 7630 -18.360 -6.979 -12.157 0.417 1.000 -ATOM 5485 OH2 TIP3 7631 -18.074 1.439 -2.973 -0.834 1.520 -ATOM 5486 H1 TIP3 7631 -17.328 1.817 -3.455 0.417 1.000 -ATOM 5487 H2 TIP3 7631 -17.602 0.912 -2.338 0.417 1.000 -ATOM 5488 OH2 TIP3 7634 -16.686 -8.049 13.268 -0.834 1.520 -ATOM 5489 H1 TIP3 7634 -16.819 -7.663 12.373 0.417 1.000 -ATOM 5490 H2 TIP3 7634 -15.934 -8.600 13.009 0.417 1.000 -ATOM 5491 OH2 TIP3 7643 15.653 5.857 -16.046 -0.834 1.520 -ATOM 5492 H1 TIP3 7643 15.956 6.183 -15.187 0.417 1.000 -ATOM 5493 H2 TIP3 7643 16.136 6.461 -16.642 0.417 1.000 -ATOM 5494 OH2 TIP3 7647 -18.693 5.327 -9.867 -0.834 1.520 -ATOM 5495 H1 TIP3 7647 -17.748 5.463 -9.923 0.417 1.000 -ATOM 5496 H2 TIP3 7647 -18.878 4.555 -10.528 0.417 1.000 -ATOM 5497 OH2 TIP3 7650 -15.902 7.516 -15.559 -0.834 1.520 -ATOM 5498 H1 TIP3 7650 -16.131 6.827 -14.935 0.417 1.000 -ATOM 5499 H2 TIP3 7650 -14.916 7.574 -15.407 0.417 1.000 -ATOM 5500 OH2 TIP3 7661 -16.960 -4.174 17.777 -0.834 1.520 -ATOM 5501 H1 TIP3 7661 -17.448 -3.363 17.476 0.417 1.000 -ATOM 5502 H2 TIP3 7661 -17.726 -4.788 18.160 0.417 1.000 -ATOM 5503 OH2 TIP3 7668 12.031 6.248 -6.222 -0.834 1.520 -ATOM 5504 H1 TIP3 7668 11.580 7.134 -6.055 0.417 1.000 -ATOM 5505 H2 TIP3 7668 12.425 6.036 -5.354 0.417 1.000 -ATOM 5506 OH2 TIP3 7676 -12.967 -8.515 11.967 -0.834 1.520 -ATOM 5507 H1 TIP3 7676 -12.071 -8.669 12.292 0.417 1.000 -ATOM 5508 H2 TIP3 7676 -13.455 -9.240 12.326 0.417 1.000 -ATOM 5509 OH2 TIP3 7690 13.776 4.452 -14.397 -0.834 1.520 -ATOM 5510 H1 TIP3 7690 14.121 4.657 -15.315 0.417 1.000 -ATOM 5511 H2 TIP3 7690 13.743 5.307 -13.945 0.417 1.000 -ATOM 5512 OH2 TIP3 7707 -19.312 -17.219 -12.886 -0.834 1.520 -ATOM 5513 H1 TIP3 7707 -18.512 -16.810 -13.297 0.417 1.000 -ATOM 5514 H2 TIP3 7707 -19.947 -16.571 -13.070 0.417 1.000 -ATOM 5515 OH2 TIP3 7715 -17.093 18.455 2.007 -0.834 1.520 -ATOM 5516 H1 TIP3 7715 -17.451 18.286 2.898 0.417 1.000 -ATOM 5517 H2 TIP3 7715 -16.597 19.349 2.100 0.417 1.000 -ATOM 5518 OH2 TIP3 7716 -12.598 8.660 -9.639 -0.834 1.520 -ATOM 5519 H1 TIP3 7716 -13.391 9.153 -9.466 0.417 1.000 -ATOM 5520 H2 TIP3 7716 -12.363 8.912 -10.514 0.417 1.000 -ATOM 5521 OH2 TIP3 7739 -15.403 3.385 2.279 -0.834 1.520 -ATOM 5522 H1 TIP3 7739 -16.085 3.520 1.604 0.417 1.000 -ATOM 5523 H2 TIP3 7739 -15.588 4.142 2.857 0.417 1.000 -ATOM 5524 OH2 TIP3 7748 -18.613 12.752 -18.148 -0.834 1.520 -ATOM 5525 H1 TIP3 7748 -17.761 12.757 -18.474 0.417 1.000 -ATOM 5526 H2 TIP3 7748 -18.484 12.728 -17.200 0.417 1.000 -ATOM 5527 OH2 TIP3 7860 17.007 -4.910 8.251 -0.834 1.520 -ATOM 5528 H1 TIP3 7860 16.296 -5.590 8.477 0.417 1.000 -ATOM 5529 H2 TIP3 7860 16.957 -4.922 7.278 0.417 1.000 -ATOM 5530 OH2 TIP3 7904 19.140 -19.452 9.228 -0.834 1.520 -ATOM 5531 H1 TIP3 7904 18.639 -19.941 8.527 0.417 1.000 -ATOM 5532 H2 TIP3 7904 19.818 -18.903 8.770 0.417 1.000 -ATOM 5533 OH2 TIP3 7945 -10.765 -14.413 3.329 -0.834 1.520 -ATOM 5534 H1 TIP3 7945 -10.542 -13.865 4.099 0.417 1.000 -ATOM 5535 H2 TIP3 7945 -11.515 -13.869 2.972 0.417 1.000 -ATOM 5536 OH2 TIP3 7951 -16.555 -16.133 18.949 -0.834 1.520 -ATOM 5537 H1 TIP3 7951 -16.199 -16.682 18.209 0.417 1.000 -ATOM 5538 H2 TIP3 7951 -16.814 -16.782 19.626 0.417 1.000 -ATOM 5539 OH2 TIP3 7964 17.329 -0.581 -5.197 -0.834 1.520 -ATOM 5540 H1 TIP3 7964 18.207 -0.712 -4.713 0.417 1.000 -ATOM 5541 H2 TIP3 7964 17.005 -1.481 -5.308 0.417 1.000 -ATOM 5542 OH2 TIP3 7985 -19.551 -12.634 -10.860 -0.834 1.520 -ATOM 5543 H1 TIP3 7985 -19.798 -13.521 -10.905 0.417 1.000 -ATOM 5544 H2 TIP3 7985 -19.204 -12.437 -11.744 0.417 1.000 -ATOM 5545 OH2 TIP3 8014 -16.496 1.790 14.010 -0.834 1.520 -ATOM 5546 H1 TIP3 8014 -15.973 1.570 13.237 0.417 1.000 -ATOM 5547 H2 TIP3 8014 -17.156 2.371 13.635 0.417 1.000 -ATOM 5548 OH2 TIP3 8023 -19.087 -7.680 -19.063 -0.834 1.520 -ATOM 5549 H1 TIP3 8023 -19.377 -8.300 -19.732 0.417 1.000 -ATOM 5550 H2 TIP3 8023 -18.710 -8.216 -18.372 0.417 1.000 -ATOM 5551 OH2 TIP3 8024 -15.891 5.989 -9.851 -0.834 1.520 -ATOM 5552 H1 TIP3 8024 -14.997 5.645 -9.650 0.417 1.000 -ATOM 5553 H2 TIP3 8024 -15.683 6.768 -10.417 0.417 1.000 -ATOM 5554 OH2 TIP3 8029 -12.111 -3.003 -5.640 -0.834 1.520 -ATOM 5555 H1 TIP3 8029 -12.065 -2.819 -6.642 0.417 1.000 -ATOM 5556 H2 TIP3 8029 -11.398 -2.438 -5.266 0.417 1.000 -ATOM 5557 OH2 TIP3 8046 -16.770 2.882 -8.264 -0.834 1.520 -ATOM 5558 H1 TIP3 8046 -16.399 1.950 -8.330 0.417 1.000 -ATOM 5559 H2 TIP3 8046 -17.139 2.992 -9.147 0.417 1.000 -ATOM 5560 OH2 TIP3 8055 -13.838 -2.289 15.087 -0.834 1.520 -ATOM 5561 H1 TIP3 8055 -13.356 -2.334 15.913 0.417 1.000 -ATOM 5562 H2 TIP3 8055 -13.434 -1.507 14.651 0.417 1.000 -ATOM 5563 OH2 TIP3 8064 -15.380 2.335 -12.870 -0.834 1.520 -ATOM 5564 H1 TIP3 8064 -16.246 2.591 -12.410 0.417 1.000 -ATOM 5565 H2 TIP3 8064 -14.822 2.349 -12.093 0.417 1.000 -ATOM 5566 OH2 TIP3 8067 -18.478 9.688 -5.200 -0.834 1.520 -ATOM 5567 H1 TIP3 8067 -18.476 10.417 -5.842 0.417 1.000 -ATOM 5568 H2 TIP3 8067 -17.570 9.403 -4.980 0.417 1.000 -ATOM 5569 OH2 TIP3 8068 -18.876 2.962 -6.486 -0.834 1.520 -ATOM 5570 H1 TIP3 8068 -18.163 2.901 -7.140 0.417 1.000 -ATOM 5571 H2 TIP3 8068 -19.315 3.799 -6.690 0.417 1.000 -ATOM 5572 OH2 TIP3 8070 13.465 -12.498 -12.880 -0.834 1.520 -ATOM 5573 H1 TIP3 8070 13.340 -12.871 -13.808 0.417 1.000 -ATOM 5574 H2 TIP3 8070 13.740 -13.267 -12.324 0.417 1.000 -ATOM 5575 OH2 TIP3 8073 16.526 -2.619 9.510 -0.834 1.520 -ATOM 5576 H1 TIP3 8073 16.955 -3.347 9.033 0.417 1.000 -ATOM 5577 H2 TIP3 8073 16.593 -2.909 10.428 0.417 1.000 -ATOM 5578 OH2 TIP3 8076 -12.634 4.266 8.891 -0.834 1.520 -ATOM 5579 H1 TIP3 8076 -13.480 4.258 9.415 0.417 1.000 -ATOM 5580 H2 TIP3 8076 -12.923 3.998 7.984 0.417 1.000 -ATOM 5581 OH2 TIP3 8094 -11.265 4.622 18.928 -0.834 1.520 -ATOM 5582 H1 TIP3 8094 -10.531 4.022 18.715 0.417 1.000 -ATOM 5583 H2 TIP3 8094 -11.728 4.616 18.104 0.417 1.000 -ATOM 5584 OH2 TIP3 8133 -18.962 9.805 4.340 -0.834 1.520 -ATOM 5585 H1 TIP3 8133 -18.822 8.861 4.127 0.417 1.000 -ATOM 5586 H2 TIP3 8133 -19.353 9.734 5.231 0.417 1.000 -ATOM 5587 OH2 TIP3 8136 -18.586 11.430 -7.698 -0.834 1.520 -ATOM 5588 H1 TIP3 8136 -17.925 10.965 -8.249 0.417 1.000 -ATOM 5589 H2 TIP3 8136 -18.258 12.354 -7.659 0.417 1.000 -ATOM 5590 OH2 TIP3 8174 -17.237 6.896 -7.696 -0.834 1.520 -ATOM 5591 H1 TIP3 8174 -16.599 6.364 -8.255 0.417 1.000 -ATOM 5592 H2 TIP3 8174 -17.249 7.725 -8.141 0.417 1.000 -ATOM 5593 OH2 TIP3 8176 -15.886 13.989 8.277 -0.834 1.520 -ATOM 5594 H1 TIP3 8176 -15.618 14.939 8.099 0.417 1.000 -ATOM 5595 H2 TIP3 8176 -15.653 13.906 9.206 0.417 1.000 -ATOM 5596 OH2 TIP3 8185 17.580 6.104 16.715 -0.834 1.520 -ATOM 5597 H1 TIP3 8185 16.808 5.636 16.356 0.417 1.000 -ATOM 5598 H2 TIP3 8185 17.695 5.614 17.578 0.417 1.000 -ATOM 5599 OH2 TIP3 8193 -18.204 15.376 -13.042 -0.834 1.520 -ATOM 5600 H1 TIP3 8193 -19.138 15.378 -13.378 0.417 1.000 -ATOM 5601 H2 TIP3 8193 -17.818 16.170 -13.647 0.417 1.000 -ATOM 5602 OH2 TIP3 8206 -9.087 6.333 19.362 -0.834 1.520 -ATOM 5603 H1 TIP3 8206 -9.778 5.705 19.171 0.417 1.000 -ATOM 5604 H2 TIP3 8206 -8.496 5.710 19.872 0.417 1.000 -ATOM 5605 OH2 TIP3 8222 -15.523 19.384 14.416 -0.834 1.520 -ATOM 5606 H1 TIP3 8222 -15.396 18.706 13.741 0.417 1.000 -ATOM 5607 H2 TIP3 8222 -15.890 18.813 15.147 0.417 1.000 -ATOM 5608 OH2 TIP3 8242 -5.562 18.821 0.722 -0.834 1.520 -ATOM 5609 H1 TIP3 8242 -4.820 18.250 0.442 0.417 1.000 -ATOM 5610 H2 TIP3 8242 -6.254 18.198 1.081 0.417 1.000 -ATOM 5611 OH2 TIP3 8263 -16.761 16.744 8.122 -0.834 1.520 -ATOM 5612 H1 TIP3 8263 -17.393 16.352 8.722 0.417 1.000 -ATOM 5613 H2 TIP3 8263 -17.291 17.003 7.327 0.417 1.000 -ATOM 5614 OH2 TIP3 8265 -17.940 14.822 17.197 -0.834 1.520 -ATOM 5615 H1 TIP3 8265 -18.139 15.621 17.663 0.417 1.000 -ATOM 5616 H2 TIP3 8265 -16.981 14.885 17.279 0.417 1.000 -ATOM 5617 OH2 TIP3 8326 18.000 -15.488 7.686 -0.834 1.520 -ATOM 5618 H1 TIP3 8326 17.605 -16.367 7.423 0.417 1.000 -ATOM 5619 H2 TIP3 8326 17.181 -14.998 7.900 0.417 1.000 -ATOM 5620 OH2 TIP3 8364 -11.439 -9.076 -3.119 -0.834 1.520 -ATOM 5621 H1 TIP3 8364 -12.084 -8.812 -3.798 0.417 1.000 -ATOM 5622 H2 TIP3 8364 -11.691 -9.992 -2.877 0.417 1.000 -ATOM 5623 OH2 TIP3 8370 -3.988 -15.932 4.241 -0.834 1.520 -ATOM 5624 H1 TIP3 8370 -3.379 -16.214 3.521 0.417 1.000 -ATOM 5625 H2 TIP3 8370 -3.445 -15.992 5.013 0.417 1.000 -ATOM 5626 OH2 TIP3 8394 -11.010 -12.369 16.752 -0.834 1.520 -ATOM 5627 H1 TIP3 8394 -10.423 -11.699 17.070 0.417 1.000 -ATOM 5628 H2 TIP3 8394 -11.840 -12.279 17.323 0.417 1.000 -ATOM 5629 OH2 TIP3 8403 -15.249 -0.991 -17.186 -0.834 1.520 -ATOM 5630 H1 TIP3 8403 -15.246 -1.022 -16.240 0.417 1.000 -ATOM 5631 H2 TIP3 8403 -14.700 -1.694 -17.388 0.417 1.000 -ATOM 5632 OH2 TIP3 8408 -19.409 -15.347 5.328 -0.834 1.520 -ATOM 5633 H1 TIP3 8408 -19.253 -15.507 4.381 0.417 1.000 -ATOM 5634 H2 TIP3 8408 -18.744 -15.897 5.785 0.417 1.000 -ATOM 5635 OH2 TIP3 8409 13.953 -13.595 2.441 -0.834 1.520 -ATOM 5636 H1 TIP3 8409 14.304 -14.391 1.938 0.417 1.000 -ATOM 5637 H2 TIP3 8409 14.567 -12.876 2.197 0.417 1.000 -ATOM 5638 OH2 TIP3 8411 -16.594 -19.883 -5.507 -0.834 1.520 -ATOM 5639 H1 TIP3 8411 -16.652 -19.756 -6.454 0.417 1.000 -ATOM 5640 H2 TIP3 8411 -15.622 -19.810 -5.276 0.417 1.000 -ATOM 5641 OH2 TIP3 8412 -11.831 -17.863 17.598 -0.834 1.520 -ATOM 5642 H1 TIP3 8412 -11.739 -16.914 17.790 0.417 1.000 -ATOM 5643 H2 TIP3 8412 -12.095 -17.832 16.631 0.417 1.000 -ATOM 5644 OH2 TIP3 8425 -17.722 -16.078 -18.800 -0.834 1.520 -ATOM 5645 H1 TIP3 8425 -17.299 -16.608 -19.440 0.417 1.000 -ATOM 5646 H2 TIP3 8425 -18.444 -16.594 -18.585 0.417 1.000 -ATOM 5647 OH2 TIP3 8441 -13.754 1.216 -6.436 -0.834 1.520 -ATOM 5648 H1 TIP3 8441 -12.873 1.533 -6.206 0.417 1.000 -ATOM 5649 H2 TIP3 8441 -14.198 2.075 -6.545 0.417 1.000 -ATOM 5650 OH2 TIP3 8448 -19.584 -0.598 6.409 -0.834 1.520 -ATOM 5651 H1 TIP3 8448 -18.628 -0.288 6.262 0.417 1.000 -ATOM 5652 H2 TIP3 8448 -19.472 -1.461 6.599 0.417 1.000 -ATOM 5653 OH2 TIP3 8457 -10.564 -4.268 12.393 -0.834 1.520 -ATOM 5654 H1 TIP3 8457 -11.188 -4.698 12.981 0.417 1.000 -ATOM 5655 H2 TIP3 8457 -9.713 -4.285 12.899 0.417 1.000 -ATOM 5656 OH2 TIP3 8462 18.064 0.344 -9.343 -0.834 1.520 -ATOM 5657 H1 TIP3 8462 18.211 -0.518 -8.908 0.417 1.000 -ATOM 5658 H2 TIP3 8462 17.319 0.197 -10.027 0.417 1.000 -ATOM 5659 OH2 TIP3 8466 -14.652 -4.541 -14.012 -0.834 1.520 -ATOM 5660 H1 TIP3 8466 -15.058 -3.789 -13.535 0.417 1.000 -ATOM 5661 H2 TIP3 8466 -15.036 -5.321 -13.578 0.417 1.000 -ATOM 5662 OH2 TIP3 8468 -18.688 -6.423 -6.171 -0.834 1.520 -ATOM 5663 H1 TIP3 8468 -18.406 -6.650 -7.037 0.417 1.000 -ATOM 5664 H2 TIP3 8468 -19.095 -5.557 -6.366 0.417 1.000 -ATOM 5665 OH2 TIP3 8491 -9.605 1.375 2.397 -0.834 1.520 -ATOM 5666 H1 TIP3 8491 -9.100 0.680 2.794 0.417 1.000 -ATOM 5667 H2 TIP3 8491 -9.318 2.154 2.828 0.417 1.000 -ATOM 5668 OH2 TIP3 8492 -18.407 3.215 12.879 -0.834 1.520 -ATOM 5669 H1 TIP3 8492 -19.142 3.389 13.452 0.417 1.000 -ATOM 5670 H2 TIP3 8492 -18.801 3.016 12.034 0.417 1.000 -ATOM 5671 OH2 TIP3 8509 19.685 -15.552 -13.837 -0.834 1.520 -ATOM 5672 H1 TIP3 8509 19.380 -15.628 -12.919 0.417 1.000 -ATOM 5673 H2 TIP3 8509 19.772 -16.432 -14.133 0.417 1.000 -ATOM 5674 OH2 TIP3 8528 -13.987 -3.915 -16.674 -0.834 1.520 -ATOM 5675 H1 TIP3 8528 -13.984 -3.965 -15.708 0.417 1.000 -ATOM 5676 H2 TIP3 8528 -14.751 -4.484 -16.954 0.417 1.000 -ATOM 5677 OH2 TIP3 8534 -17.816 2.110 -10.500 -0.834 1.520 -ATOM 5678 H1 TIP3 8534 -18.087 1.297 -10.002 0.417 1.000 -ATOM 5679 H2 TIP3 8534 -18.611 2.233 -11.036 0.417 1.000 -ATOM 5680 OH2 TIP3 8536 -16.793 -6.021 -2.228 -0.834 1.520 -ATOM 5681 H1 TIP3 8536 -16.053 -5.918 -1.627 0.417 1.000 -ATOM 5682 H2 TIP3 8536 -17.415 -5.315 -2.079 0.417 1.000 -ATOM 5683 OH2 TIP3 8548 -6.361 -3.902 -14.731 -0.834 1.520 -ATOM 5684 H1 TIP3 8548 -5.901 -4.606 -15.128 0.417 1.000 -ATOM 5685 H2 TIP3 8548 -7.245 -4.276 -14.657 0.417 1.000 -ATOM 5686 OH2 TIP3 8549 -15.402 8.408 -1.681 -0.834 1.520 -ATOM 5687 H1 TIP3 8549 -15.331 8.317 -2.645 0.417 1.000 -ATOM 5688 H2 TIP3 8549 -14.610 7.828 -1.358 0.417 1.000 -ATOM 5689 OH2 TIP3 8551 -13.816 14.140 -15.946 -0.834 1.520 -ATOM 5690 H1 TIP3 8551 -14.257 14.819 -16.528 0.417 1.000 -ATOM 5691 H2 TIP3 8551 -14.494 13.825 -15.380 0.417 1.000 -ATOM 5692 OH2 TIP3 8555 -13.816 1.625 4.372 -0.834 1.520 -ATOM 5693 H1 TIP3 8555 -14.369 1.179 3.798 0.417 1.000 -ATOM 5694 H2 TIP3 8555 -14.042 1.386 5.308 0.417 1.000 -ATOM 5695 OH2 TIP3 8556 -18.019 -3.365 -1.337 -0.834 1.520 -ATOM 5696 H1 TIP3 8556 -18.079 -2.819 -0.471 0.417 1.000 -ATOM 5697 H2 TIP3 8556 -17.344 -2.883 -1.844 0.417 1.000 -ATOM 5698 OH2 TIP3 8558 -17.987 5.789 -5.125 -0.834 1.520 -ATOM 5699 H1 TIP3 8558 -18.922 5.523 -4.994 0.417 1.000 -ATOM 5700 H2 TIP3 8558 -17.882 6.044 -6.077 0.417 1.000 -ATOM 5701 OH2 TIP3 8566 -18.671 3.741 17.937 -0.834 1.520 -ATOM 5702 H1 TIP3 8566 -18.831 3.178 17.166 0.417 1.000 -ATOM 5703 H2 TIP3 8566 -19.277 4.496 17.762 0.417 1.000 -ATOM 5704 OH2 TIP3 8574 -15.893 8.282 -4.761 -0.834 1.520 -ATOM 5705 H1 TIP3 8574 -15.023 8.023 -5.218 0.417 1.000 -ATOM 5706 H2 TIP3 8574 -16.446 7.530 -4.982 0.417 1.000 -ATOM 5707 OH2 TIP3 8576 -9.957 16.852 -6.288 -0.834 1.520 -ATOM 5708 H1 TIP3 8576 -9.172 17.292 -5.846 0.417 1.000 -ATOM 5709 H2 TIP3 8576 -10.671 17.362 -6.055 0.417 1.000 -ATOM 5710 OH2 TIP3 8578 -13.604 18.881 5.021 -0.834 1.520 -ATOM 5711 H1 TIP3 8578 -13.286 18.520 4.184 0.417 1.000 -ATOM 5712 H2 TIP3 8578 -13.507 18.150 5.663 0.417 1.000 -ATOM 5713 OH2 TIP3 8579 -13.792 10.748 6.763 -0.834 1.520 -ATOM 5714 H1 TIP3 8579 -13.747 11.642 6.366 0.417 1.000 -ATOM 5715 H2 TIP3 8579 -14.788 10.523 6.975 0.417 1.000 -ATOM 5716 OH2 TIP3 8600 -14.632 7.922 11.937 -0.834 1.520 -ATOM 5717 H1 TIP3 8600 -15.523 7.601 12.188 0.417 1.000 -ATOM 5718 H2 TIP3 8600 -14.616 7.715 11.037 0.417 1.000 -ATOM 5719 OH2 TIP3 8613 -11.883 13.380 -17.732 -0.834 1.520 -ATOM 5720 H1 TIP3 8613 -12.415 13.594 -17.008 0.417 1.000 -ATOM 5721 H2 TIP3 8613 -11.143 14.005 -17.527 0.417 1.000 -ATOM 5722 OH2 TIP3 8617 -11.864 17.527 -12.535 -0.834 1.520 -ATOM 5723 H1 TIP3 8617 -12.147 18.042 -11.719 0.417 1.000 -ATOM 5724 H2 TIP3 8617 -11.347 16.807 -12.108 0.417 1.000 -ATOM 5725 OH2 TIP3 8642 -15.194 15.050 16.989 -0.834 1.520 -ATOM 5726 H1 TIP3 8642 -14.868 14.161 16.565 0.417 1.000 -ATOM 5727 H2 TIP3 8642 -14.869 15.693 16.374 0.417 1.000 -ATOM 5728 OH2 TIP3 8645 -19.641 9.801 6.958 -0.834 1.520 -ATOM 5729 H1 TIP3 8645 -19.967 9.183 7.647 0.417 1.000 -ATOM 5730 H2 TIP3 8645 -19.944 10.709 7.128 0.417 1.000 -ATOM 5731 OH2 TIP3 8653 -18.572 19.027 -17.845 -0.834 1.520 -ATOM 5732 H1 TIP3 8653 -18.507 19.600 -16.989 0.417 1.000 -ATOM 5733 H2 TIP3 8653 -18.462 18.186 -17.492 0.417 1.000 -ATOM 5734 OH2 TIP3 8658 -17.830 18.392 16.274 -0.834 1.520 -ATOM 5735 H1 TIP3 8658 -18.417 17.888 15.662 0.417 1.000 -ATOM 5736 H2 TIP3 8658 -18.289 19.231 16.405 0.417 1.000 -ATOM 5737 OH2 TIP3 8679 -17.787 17.935 -14.357 -0.834 1.520 -ATOM 5738 H1 TIP3 8679 -17.845 18.521 -13.599 0.417 1.000 -ATOM 5739 H2 TIP3 8679 -17.927 18.558 -15.075 0.417 1.000 -ATOM 5740 OH2 TIP3 8683 -19.503 15.881 1.658 -0.834 1.520 -ATOM 5741 H1 TIP3 8683 -19.764 15.928 0.778 0.417 1.000 -ATOM 5742 H2 TIP3 8683 -18.803 16.514 1.645 0.417 1.000 -ATOM 5743 OH2 TIP3 8687 -18.370 12.397 18.570 -0.834 1.520 -ATOM 5744 H1 TIP3 8687 -18.137 13.066 17.921 0.417 1.000 -ATOM 5745 H2 TIP3 8687 -18.953 12.857 19.192 0.417 1.000 -ATOM 5746 OH2 TIP3 8760 -6.543 0.491 -13.455 -0.834 1.520 -ATOM 5747 H1 TIP3 8760 -6.456 -0.287 -13.041 0.417 1.000 -ATOM 5748 H2 TIP3 8760 -6.801 0.170 -14.399 0.417 1.000 -ATOM 5749 OH2 TIP3 8780 -16.562 -11.901 -19.684 -0.834 1.520 -ATOM 5750 H1 TIP3 8780 -17.453 -12.153 -19.423 0.417 1.000 -ATOM 5751 H2 TIP3 8780 -16.111 -12.225 -18.907 0.417 1.000 -ATOM 5752 OH2 TIP3 8801 -10.984 -4.310 -10.515 -0.834 1.520 -ATOM 5753 H1 TIP3 8801 -10.842 -5.231 -10.299 0.417 1.000 -ATOM 5754 H2 TIP3 8801 -11.463 -4.446 -11.348 0.417 1.000 -ATOM 5755 OH2 TIP3 8813 -15.406 -7.857 16.989 -0.834 1.520 -ATOM 5756 H1 TIP3 8813 -15.792 -7.901 17.928 0.417 1.000 -ATOM 5757 H2 TIP3 8813 -16.238 -7.910 16.469 0.417 1.000 -ATOM 5758 OH2 TIP3 8822 -18.438 -13.464 -7.761 -0.834 1.520 -ATOM 5759 H1 TIP3 8822 -19.040 -12.750 -7.951 0.417 1.000 -ATOM 5760 H2 TIP3 8822 -18.803 -14.173 -8.447 0.417 1.000 -ATOM 5761 OH2 TIP3 8829 -18.686 -10.615 -12.827 -0.834 1.520 -ATOM 5762 H1 TIP3 8829 -18.667 -11.294 -13.556 0.417 1.000 -ATOM 5763 H2 TIP3 8829 -17.944 -10.047 -13.020 0.417 1.000 -ATOM 5764 OH2 TIP3 8833 -17.737 -17.660 10.533 -0.834 1.520 -ATOM 5765 H1 TIP3 8833 -18.006 -18.249 11.233 0.417 1.000 -ATOM 5766 H2 TIP3 8833 -18.591 -17.118 10.429 0.417 1.000 -ATOM 5767 OH2 TIP3 8843 -12.428 -19.580 -16.522 -0.834 1.520 -ATOM 5768 H1 TIP3 8843 -12.364 -19.661 -17.497 0.417 1.000 -ATOM 5769 H2 TIP3 8843 -13.372 -19.766 -16.470 0.417 1.000 -ATOM 5770 OH2 TIP3 8845 -18.867 -12.920 -14.922 -0.834 1.520 -ATOM 5771 H1 TIP3 8845 -18.799 -12.898 -15.863 0.417 1.000 -ATOM 5772 H2 TIP3 8845 -19.642 -13.451 -14.698 0.417 1.000 -ATOM 5773 OH2 TIP3 8848 -9.416 -16.789 7.118 -0.834 1.520 -ATOM 5774 H1 TIP3 8848 -8.820 -16.008 6.914 0.417 1.000 -ATOM 5775 H2 TIP3 8848 -10.016 -16.742 6.356 0.417 1.000 -ATOM 5776 OH2 TIP3 8852 -6.754 -10.545 5.397 -0.834 1.520 -ATOM 5777 H1 TIP3 8852 -6.003 -10.112 5.829 0.417 1.000 -ATOM 5778 H2 TIP3 8852 -6.414 -11.026 4.659 0.417 1.000 -ATOM 5779 OH2 TIP3 8865 -8.485 2.342 -15.173 -0.834 1.520 -ATOM 5780 H1 TIP3 8865 -9.125 1.911 -15.815 0.417 1.000 -ATOM 5781 H2 TIP3 8865 -8.795 1.919 -14.306 0.417 1.000 -ATOM 5782 OH2 TIP3 8869 -14.721 -14.245 -8.543 -0.834 1.520 -ATOM 5783 H1 TIP3 8869 -15.496 -14.667 -9.033 0.417 1.000 -ATOM 5784 H2 TIP3 8869 -14.436 -15.014 -7.981 0.417 1.000 -ATOM 5785 OH2 TIP3 8870 -19.092 -7.587 5.925 -0.834 1.520 -ATOM 5786 H1 TIP3 8870 -19.146 -6.699 5.615 0.417 1.000 -ATOM 5787 H2 TIP3 8870 -19.982 -7.938 5.781 0.417 1.000 -ATOM 5788 OH2 TIP3 8886 9.059 -3.202 -14.555 -0.834 1.520 -ATOM 5789 H1 TIP3 8886 8.687 -2.745 -13.761 0.417 1.000 -ATOM 5790 H2 TIP3 8886 9.347 -2.472 -15.130 0.417 1.000 -ATOM 5791 OH2 TIP3 8887 -11.110 1.041 -3.930 -0.834 1.520 -ATOM 5792 H1 TIP3 8887 -11.302 1.572 -4.700 0.417 1.000 -ATOM 5793 H2 TIP3 8887 -10.200 1.340 -3.756 0.417 1.000 -ATOM 5794 OH2 TIP3 8895 -14.000 -8.717 2.324 -0.834 1.520 -ATOM 5795 H1 TIP3 8895 -14.134 -7.943 2.939 0.417 1.000 -ATOM 5796 H2 TIP3 8895 -14.137 -8.366 1.452 0.417 1.000 -ATOM 5797 OH2 TIP3 8898 -10.631 -6.093 17.857 -0.834 1.520 -ATOM 5798 H1 TIP3 8898 -9.953 -6.488 18.378 0.417 1.000 -ATOM 5799 H2 TIP3 8898 -11.386 -5.956 18.509 0.417 1.000 -ATOM 5800 OH2 TIP3 8903 -3.672 -18.849 -14.215 -0.834 1.520 -ATOM 5801 H1 TIP3 8903 -2.908 -19.461 -14.122 0.417 1.000 -ATOM 5802 H2 TIP3 8903 -4.404 -19.365 -13.851 0.417 1.000 -ATOM 5803 OH2 TIP3 8905 -12.166 -5.592 -12.473 -0.834 1.520 -ATOM 5804 H1 TIP3 8905 -12.895 -5.283 -13.007 0.417 1.000 -ATOM 5805 H2 TIP3 8905 -11.806 -6.286 -13.074 0.417 1.000 -ATOM 5806 OH2 TIP3 8908 -10.655 11.960 -14.096 -0.834 1.520 -ATOM 5807 H1 TIP3 8908 -10.512 11.566 -13.167 0.417 1.000 -ATOM 5808 H2 TIP3 8908 -11.101 12.828 -13.960 0.417 1.000 -ATOM 5809 OH2 TIP3 8918 -11.744 -0.880 13.820 -0.834 1.520 -ATOM 5810 H1 TIP3 8918 -10.977 -1.321 13.483 0.417 1.000 -ATOM 5811 H2 TIP3 8918 -11.615 0.026 13.600 0.417 1.000 -ATOM 5812 OH2 TIP3 8926 -9.781 5.985 -14.833 -0.834 1.520 -ATOM 5813 H1 TIP3 8926 -9.309 5.282 -15.221 0.417 1.000 -ATOM 5814 H2 TIP3 8926 -9.651 5.758 -13.869 0.417 1.000 -ATOM 5815 OH2 TIP3 8927 -15.351 7.814 -11.678 -0.834 1.520 -ATOM 5816 H1 TIP3 8927 -14.731 8.535 -11.993 0.417 1.000 -ATOM 5817 H2 TIP3 8927 -16.228 8.055 -12.040 0.417 1.000 -ATOM 5818 OH2 TIP3 8928 -14.358 -6.559 7.230 -0.834 1.520 -ATOM 5819 H1 TIP3 8928 -14.171 -5.615 7.385 0.417 1.000 -ATOM 5820 H2 TIP3 8928 -13.841 -7.091 7.879 0.417 1.000 -ATOM 5821 OH2 TIP3 8931 -14.333 -8.188 -0.458 -0.834 1.520 -ATOM 5822 H1 TIP3 8931 -14.353 -7.257 -0.503 0.417 1.000 -ATOM 5823 H2 TIP3 8931 -14.111 -8.371 -1.382 0.417 1.000 -ATOM 5824 OH2 TIP3 8932 -7.003 -1.424 -4.793 -0.834 1.520 -ATOM 5825 H1 TIP3 8932 -7.383 -0.807 -5.507 0.417 1.000 -ATOM 5826 H2 TIP3 8932 -6.418 -0.837 -4.263 0.417 1.000 -ATOM 5827 OH2 TIP3 8935 -19.325 -8.426 -9.048 -0.834 1.520 -ATOM 5828 H1 TIP3 8935 -18.403 -8.454 -9.426 0.417 1.000 -ATOM 5829 H2 TIP3 8935 -19.735 -7.850 -9.661 0.417 1.000 -ATOM 5830 OH2 TIP3 8939 -18.020 -3.708 12.037 -0.834 1.520 -ATOM 5831 H1 TIP3 8939 -17.556 -4.251 12.703 0.417 1.000 -ATOM 5832 H2 TIP3 8939 -18.505 -3.002 12.564 0.417 1.000 -ATOM 5833 OH2 TIP3 8940 -14.210 -10.768 13.382 -0.834 1.520 -ATOM 5834 H1 TIP3 8940 -15.013 -11.368 13.560 0.417 1.000 -ATOM 5835 H2 TIP3 8940 -13.414 -11.201 13.717 0.417 1.000 -ATOM 5836 OH2 TIP3 8949 -11.218 -2.813 -17.638 -0.834 1.520 -ATOM 5837 H1 TIP3 8949 -11.996 -3.214 -17.203 0.417 1.000 -ATOM 5838 H2 TIP3 8949 -10.860 -3.578 -18.030 0.417 1.000 -ATOM 5839 OH2 TIP3 8952 -12.407 -10.504 3.616 -0.834 1.520 -ATOM 5840 H1 TIP3 8952 -11.904 -9.827 4.113 0.417 1.000 -ATOM 5841 H2 TIP3 8952 -13.032 -9.951 3.068 0.417 1.000 -ATOM 5842 OH2 TIP3 8954 -13.610 9.666 -12.829 -0.834 1.520 -ATOM 5843 H1 TIP3 8954 -13.211 9.750 -13.709 0.417 1.000 -ATOM 5844 H2 TIP3 8954 -14.087 10.472 -12.758 0.417 1.000 -ATOM 5845 OH2 TIP3 8956 -17.887 -13.484 1.893 -0.834 1.520 -ATOM 5846 H1 TIP3 8956 -17.830 -14.424 2.160 0.417 1.000 -ATOM 5847 H2 TIP3 8956 -17.554 -13.051 2.707 0.417 1.000 -ATOM 5848 OH2 TIP3 8960 -17.255 -8.754 19.163 -0.834 1.520 -ATOM 5849 H1 TIP3 8960 -17.698 -9.363 18.623 0.417 1.000 -ATOM 5850 H2 TIP3 8960 -17.868 -8.584 19.860 0.417 1.000 -ATOM 5851 OH2 TIP3 8961 -8.111 -11.830 15.099 -0.834 1.520 -ATOM 5852 H1 TIP3 8961 -7.310 -11.399 14.804 0.417 1.000 -ATOM 5853 H2 TIP3 8961 -8.769 -11.432 14.464 0.417 1.000 -ATOM 5854 OH2 TIP3 8970 -1.689 3.380 -7.612 -0.834 1.520 -ATOM 5855 H1 TIP3 8970 -1.950 2.472 -7.588 0.417 1.000 -ATOM 5856 H2 TIP3 8970 -1.142 3.546 -6.833 0.417 1.000 -ATOM 5857 OH2 TIP3 8972 -16.200 11.154 -2.205 -0.834 1.520 -ATOM 5858 H1 TIP3 8972 -16.424 11.376 -3.168 0.417 1.000 -ATOM 5859 H2 TIP3 8972 -16.174 10.184 -2.177 0.417 1.000 -ATOM 5860 OH2 TIP3 8973 -16.339 5.314 -14.330 -0.834 1.520 -ATOM 5861 H1 TIP3 8973 -15.828 4.871 -15.004 0.417 1.000 -ATOM 5862 H2 TIP3 8973 -15.952 5.053 -13.531 0.417 1.000 -ATOM 5863 OH2 TIP3 8976 -11.068 7.387 -11.991 -0.834 1.520 -ATOM 5864 H1 TIP3 8976 -11.791 7.019 -11.389 0.417 1.000 -ATOM 5865 H2 TIP3 8976 -10.238 6.895 -11.786 0.417 1.000 -ATOM 5866 OH2 TIP3 8977 -17.417 -3.877 -7.954 -0.834 1.520 -ATOM 5867 H1 TIP3 8977 -16.509 -3.492 -7.941 0.417 1.000 -ATOM 5868 H2 TIP3 8977 -17.688 -3.688 -7.113 0.417 1.000 -ATOM 5869 OH2 TIP3 8988 -17.754 0.883 -15.005 -0.834 1.520 -ATOM 5870 H1 TIP3 8988 -18.389 0.097 -15.115 0.417 1.000 -ATOM 5871 H2 TIP3 8988 -16.921 0.473 -14.805 0.417 1.000 -ATOM 5872 OH2 TIP3 8994 -8.866 13.465 7.648 -0.834 1.520 -ATOM 5873 H1 TIP3 8994 -9.663 13.889 8.046 0.417 1.000 -ATOM 5874 H2 TIP3 8994 -9.280 12.732 7.163 0.417 1.000 -ATOM 5875 OH2 TIP3 9001 -4.087 4.342 15.186 -0.834 1.520 -ATOM 5876 H1 TIP3 9001 -3.693 3.514 15.072 0.417 1.000 -ATOM 5877 H2 TIP3 9001 -5.007 4.201 15.323 0.417 1.000 -ATOM 5878 OH2 TIP3 9013 -13.681 11.624 -9.894 -0.834 1.520 -ATOM 5879 H1 TIP3 9013 -12.913 11.877 -10.459 0.417 1.000 -ATOM 5880 H2 TIP3 9013 -14.236 12.421 -10.039 0.417 1.000 -ATOM 5881 OH2 TIP3 9015 -0.007 10.539 -8.466 -0.834 1.520 -ATOM 5882 H1 TIP3 9015 0.630 11.251 -8.418 0.417 1.000 -ATOM 5883 H2 TIP3 9015 0.051 10.203 -7.536 0.417 1.000 -ATOM 5884 OH2 TIP3 9017 -18.951 -0.123 11.163 -0.834 1.520 -ATOM 5885 H1 TIP3 9017 -19.138 -0.350 12.077 0.417 1.000 -ATOM 5886 H2 TIP3 9017 -19.580 -0.682 10.641 0.417 1.000 -ATOM 5887 OH2 TIP3 9034 -4.246 13.645 -8.855 -0.834 1.520 -ATOM 5888 H1 TIP3 9034 -4.524 13.296 -9.696 0.417 1.000 -ATOM 5889 H2 TIP3 9034 -3.283 13.556 -8.962 0.417 1.000 -ATOM 5890 OH2 TIP3 9035 -17.453 15.847 -8.873 -0.834 1.520 -ATOM 5891 H1 TIP3 9035 -16.878 15.236 -9.378 0.417 1.000 -ATOM 5892 H2 TIP3 9035 -18.266 15.322 -8.781 0.417 1.000 -ATOM 5893 OH2 TIP3 9037 -10.653 15.169 9.389 -0.834 1.520 -ATOM 5894 H1 TIP3 9037 -10.651 14.510 10.081 0.417 1.000 -ATOM 5895 H2 TIP3 9037 -10.866 16.013 9.882 0.417 1.000 -ATOM 5896 OH2 TIP3 9047 -15.284 8.389 -19.042 -0.834 1.520 -ATOM 5897 H1 TIP3 9047 -16.001 8.738 -18.510 0.417 1.000 -ATOM 5898 H2 TIP3 9047 -15.433 7.411 -18.991 0.417 1.000 -ATOM 5899 OH2 TIP3 9054 -12.244 10.127 -6.148 -0.834 1.520 -ATOM 5900 H1 TIP3 9054 -11.679 10.781 -6.711 0.417 1.000 -ATOM 5901 H2 TIP3 9054 -13.136 10.405 -6.437 0.417 1.000 -ATOM 5902 OH2 TIP3 9055 -16.995 9.797 -16.973 -0.834 1.520 -ATOM 5903 H1 TIP3 9055 -17.170 8.988 -16.504 0.417 1.000 -ATOM 5904 H2 TIP3 9055 -16.221 10.190 -16.587 0.417 1.000 -ATOM 5905 OH2 TIP3 9056 -10.546 17.563 5.092 -0.834 1.520 -ATOM 5906 H1 TIP3 9056 -10.652 16.598 4.989 0.417 1.000 -ATOM 5907 H2 TIP3 9056 -10.017 17.607 5.931 0.417 1.000 -ATOM 5908 OH2 TIP3 9057 -7.410 0.617 8.532 -0.834 1.520 -ATOM 5909 H1 TIP3 9057 -7.622 0.494 9.511 0.417 1.000 -ATOM 5910 H2 TIP3 9057 -8.213 0.273 8.098 0.417 1.000 -ATOM 5911 OH2 TIP3 9082 -11.844 -2.436 -8.480 -0.834 1.520 -ATOM 5912 H1 TIP3 9082 -11.645 -1.655 -9.079 0.417 1.000 -ATOM 5913 H2 TIP3 9082 -11.666 -3.180 -9.126 0.417 1.000 -ATOM 5914 OH2 TIP3 9084 -11.252 9.168 14.621 -0.834 1.520 -ATOM 5915 H1 TIP3 9084 -11.545 9.630 13.875 0.417 1.000 -ATOM 5916 H2 TIP3 9084 -12.003 8.592 14.797 0.417 1.000 -ATOM 5917 OH2 TIP3 9093 -10.008 15.829 -16.703 -0.834 1.520 -ATOM 5918 H1 TIP3 9093 -10.013 16.093 -17.662 0.417 1.000 -ATOM 5919 H2 TIP3 9093 -9.070 15.998 -16.520 0.417 1.000 -ATOM 5920 OH2 TIP3 9096 -17.085 -5.803 -16.607 -0.834 1.520 -ATOM 5921 H1 TIP3 9096 -17.845 -5.586 -16.084 0.417 1.000 -ATOM 5922 H2 TIP3 9096 -17.281 -6.667 -16.989 0.417 1.000 -ATOM 5923 OH2 TIP3 9127 -5.246 18.382 8.553 -0.834 1.520 -ATOM 5924 H1 TIP3 9127 -5.561 19.111 7.984 0.417 1.000 -ATOM 5925 H2 TIP3 9127 -5.914 18.448 9.262 0.417 1.000 -ATOM 5926 OH2 TIP3 9165 -12.613 -19.814 6.924 -0.834 1.520 -ATOM 5927 H1 TIP3 9165 -12.998 -19.069 6.433 0.417 1.000 -ATOM 5928 H2 TIP3 9165 -13.054 -19.750 7.843 0.417 1.000 -ATOM 5929 OH2 TIP3 9170 7.884 19.129 1.844 -0.834 1.520 -ATOM 5930 H1 TIP3 9170 8.466 18.885 1.122 0.417 1.000 -ATOM 5931 H2 TIP3 9170 7.278 18.412 1.870 0.417 1.000 -ATOM 5932 OH2 TIP3 9212 -15.144 -18.317 17.499 -0.834 1.520 -ATOM 5933 H1 TIP3 9212 -14.489 -18.228 16.838 0.417 1.000 -ATOM 5934 H2 TIP3 9212 -14.650 -18.818 18.202 0.417 1.000 -ATOM 5935 OH2 TIP3 9226 -11.422 -19.168 -13.649 -0.834 1.520 -ATOM 5936 H1 TIP3 9226 -12.072 -19.470 -14.307 0.417 1.000 -ATOM 5937 H2 TIP3 9226 -11.437 -18.199 -13.665 0.417 1.000 -ATOM 5938 OH2 TIP3 9241 -12.713 -9.828 -6.185 -0.834 1.520 -ATOM 5939 H1 TIP3 9241 -13.369 -10.527 -5.923 0.417 1.000 -ATOM 5940 H2 TIP3 9241 -11.881 -10.331 -6.148 0.417 1.000 -ATOM 5941 OH2 TIP3 9250 -16.653 -9.513 -0.186 -0.834 1.520 -ATOM 5942 H1 TIP3 9250 -17.208 -9.045 -0.812 0.417 1.000 -ATOM 5943 H2 TIP3 9250 -15.736 -9.361 -0.544 0.417 1.000 -END diff --git a/tests/opencl/fft/.depend b/tests/opencl/fft/.depend new file mode 100644 index 00000000..e2cadcd3 --- /dev/null +++ b/tests/opencl/fft/.depend @@ -0,0 +1,7 @@ +main.o: main.cc /opt/pocl/runtime/include/CL/opencl.h \ + /opt/pocl/runtime/include/CL/cl.h \ + /opt/pocl/runtime/include/CL/cl_version.h \ + /opt/pocl/runtime/include/CL/cl_platform.h \ + /opt/pocl/runtime/include/CL/cl_gl.h \ + /opt/pocl/runtime/include/CL/cl_gl_ext.h \ + /opt/pocl/runtime/include/CL/cl_ext.h common.h diff --git a/tests/opencl/sgemm2/Makefile b/tests/opencl/fft/Makefile similarity index 75% rename from tests/opencl/sgemm2/Makefile rename to tests/opencl/fft/Makefile index f507d9ed..fd039b0e 100644 --- a/tests/opencl/sgemm2/Makefile +++ b/tests/opencl/fft/Makefile @@ -1,4 +1,4 @@ -PROJECT = sgemm2 +PROJECT = fft4 SRCS = main.cc diff --git a/tests/opencl/fft/common.h b/tests/opencl/fft/common.h new file mode 100644 index 00000000..8c8e3344 --- /dev/null +++ b/tests/opencl/fft/common.h @@ -0,0 +1,3 @@ +#pragma once + +#define LOCAL_SIZE 16 \ No newline at end of file diff --git a/tests/opencl/fft/fft4 b/tests/opencl/fft/fft4 new file mode 100755 index 0000000000000000000000000000000000000000..044377ffa4e28495df685213058fff9f98666f4d GIT binary patch literal 19016 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 literal 0 HcmV?d00001 diff --git a/tests/opencl/fft/fft_radix4.dump b/tests/opencl/fft/fft_radix4.dump new file mode 100644 index 00000000..b8fc3a32 --- /dev/null +++ b/tests/opencl/fft/fft_radix4.dump @@ -0,0 +1,5495 @@ + +/tmp/pocl_vortex_kernel_ZOVlwB.elf: file format elf32-littleriscv + +Disassembly of section .init: + +80000000 <_start>: +80000000: f3 22 10 fc csrr t0, nw +80000004: 17 13 00 00 auipc t1, 1 +80000008: 13 03 43 8d addi t1, t1, -1836 +8000000c: 0b 90 62 00 vx_wspawn t0, t1 +80000010: 93 02 f0 ff li t0, -1 +80000014: 0b 80 02 00 vx_tmc t0 +80000018: ef 00 d0 08 jal 0x800008a4 +8000001c: 93 02 10 00 li t0, 1 +80000020: 0b 80 02 00 vx_tmc t0 +80000024: ef 00 d0 0d jal 0x80000900 +80000028: f3 22 10 fc csrr t0, nw +8000002c: 17 13 00 00 auipc t1, 1 +80000030: 13 03 03 8c addi t1, t1, -1856 +80000034: 0b 90 62 00 vx_wspawn t0, t1 +80000038: 93 02 f0 ff li t0, -1 +8000003c: 0b 80 02 00 vx_tmc t0 +80000040: ef 00 10 0d jal 0x80000910 <__init_tls> +80000044: 93 02 10 00 li t0, 1 +80000048: 0b 80 02 00 vx_tmc t0 +8000004c: ef 00 50 0b jal 0x80000900 +80000050: 17 45 00 00 auipc a0, 4 +80000054: 13 05 c5 f7 addi a0, a0, -132 +80000058: 17 56 00 00 auipc a2, 5 +8000005c: 13 06 46 f7 addi a2, a2, -140 +80000060: 33 06 a6 40 sub a2, a2, a0 +80000064: 93 05 00 00 li a1, 0 +80000068: ef 20 c0 2e jal 0x80002354 +8000006c: 17 15 00 00 auipc a0, 1 +80000070: 13 05 c5 97 addi a0, a0, -1668 +80000074: ef 20 80 12 jal 0x8000219c +80000078: ef 00 d0 0d jal 0x80000954 <__libc_init_array> +8000007c: ef 00 40 05 jal 0x800000d0
+80000080: 6f 00 40 00 j 0x80000084 + +Disassembly of section .text: + +80000084 : +80000084: 13 01 01 ff addi sp, sp, -16 +80000088: 93 05 00 00 li a1, 0 +8000008c: 23 24 81 00 sw s0, 8(sp) +80000090: 23 26 11 00 sw ra, 12(sp) +80000094: 13 04 05 00 mv s0, a0 +80000098: ef 20 40 43 jal 0x800024cc <__call_exitprocs> +8000009c: 17 45 00 00 auipc a0, 4 +800000a0: 03 25 c5 f2 lw a0, -212(a0) +800000a4: 83 27 c5 03 lw a5, 60(a0) +800000a8: 63 84 07 00 beqz a5, 0x800000b0 +800000ac: e7 80 07 00 jalr a5 +800000b0: 13 05 04 00 mv a0, s0 +800000b4: ef 00 00 7e jal 0x80000894 <_exit> + +800000b8 : +800000b8: 93 07 00 00 li a5, 0 +800000bc: 63 88 07 00 beqz a5, 0x800000cc +800000c0: 17 15 00 00 auipc a0, 1 +800000c4: 13 05 85 92 addi a0, a0, -1752 +800000c8: 6f 20 40 0d j 0x8000219c +800000cc: 67 80 00 00 ret + +800000d0
: +800000d0: 13 01 01 ff addi sp, sp, -16 +800000d4: 23 26 11 00 sw ra, 12(sp) +800000d8: 37 05 00 80 lui a0, 524288 +800000dc: 93 05 45 14 addi a1, a0, 324 +800000e0: 37 05 ff 7f lui a0, 524272 +800000e4: 13 06 45 03 addi a2, a0, 52 +800000e8: ef 00 10 36 jal 0x80000c48 +800000ec: 13 05 00 00 li a0, 0 +800000f0: 83 20 c1 00 lw ra, 12(sp) +800000f4: 13 01 01 01 addi sp, sp, 16 +800000f8: 67 80 00 00 ret + +800000fc <_Z7_cl_cosf>: +800000fc: 13 01 01 ff addi sp, sp, -16 +80000100: 23 26 11 00 sw ra, 12(sp) +80000104: 23 24 81 00 sw s0, 8(sp) +80000108: 13 04 01 01 addi s0, sp, 16 +8000010c: 83 20 c1 00 lw ra, 12(sp) +80000110: 03 24 81 00 lw s0, 8(sp) +80000114: 13 01 01 01 addi sp, sp, 16 +80000118: 17 13 00 00 auipc t1, 1 +8000011c: 67 00 03 f4 jr -192(t1) + +80000120 <_Z7_cl_sinf>: +80000120: 13 01 01 ff addi sp, sp, -16 +80000124: 23 26 11 00 sw ra, 12(sp) +80000128: 23 24 81 00 sw s0, 8(sp) +8000012c: 13 04 01 01 addi s0, sp, 16 +80000130: 83 20 c1 00 lw ra, 12(sp) +80000134: 03 24 81 00 lw s0, 8(sp) +80000138: 13 01 01 01 addi sp, sp, 16 +8000013c: 17 13 00 00 auipc t1, 1 +80000140: 67 00 c3 fb jr -68(t1) + +80000144 <_pocl_kernel_fft_radix4_workgroup>: +80000144: 13 01 01 f0 addi sp, sp, -256 +80000148: 23 2e 11 0e sw ra, 252(sp) +8000014c: 23 2c 81 0e sw s0, 248(sp) +80000150: 23 2a 91 0e sw s1, 244(sp) +80000154: 23 28 21 0f sw s2, 240(sp) +80000158: 23 26 31 0f sw s3, 236(sp) +8000015c: 23 24 41 0f sw s4, 232(sp) +80000160: 23 22 51 0f sw s5, 228(sp) +80000164: 23 20 61 0f sw s6, 224(sp) +80000168: 23 2e 71 0d sw s7, 220(sp) +8000016c: 23 2c 81 0d sw s8, 216(sp) +80000170: 23 2a 91 0d sw s9, 212(sp) +80000174: 23 28 a1 0d sw s10, 208(sp) +80000178: 23 26 b1 0d sw s11, 204(sp) +8000017c: 27 24 81 0c fsw fs0, 200(sp) +80000180: 27 22 91 0c fsw fs1, 196(sp) +80000184: 27 20 21 0d fsw fs2, 192(sp) +80000188: 27 2e 31 0b fsw fs3, 188(sp) +8000018c: 13 04 01 10 addi s0, sp, 256 +80000190: 13 71 01 f8 andi sp, sp, -128 +80000194: 93 04 01 00 mv s1, sp +80000198: 83 26 05 00 lw a3, 0(a0) +8000019c: 03 27 45 00 lw a4, 4(a0) +800001a0: 83 27 85 00 lw a5, 8(a0) +800001a4: 83 a8 85 01 lw a7, 24(a1) +800001a8: 83 a2 c5 01 lw t0, 28(a1) +800001ac: 03 ab 05 02 lw s6, 32(a1) +800001b0: 83 25 c5 00 lw a1, 12(a0) +800001b4: 03 25 05 01 lw a0, 16(a0) +800001b8: 33 88 12 03 mul a6, t0, a7 +800001bc: 23 a2 04 07 sw a6, 100(s1) +800001c0: 33 08 68 03 mul a6, a6, s6 +800001c4: 23 ae 04 03 sw a6, 60(s1) +800001c8: 13 18 28 00 slli a6, a6, 2 +800001cc: 13 08 f8 00 addi a6, a6, 15 +800001d0: 13 78 08 ff andi a6, a6, -16 +800001d4: 23 a2 04 05 sw a6, 68(s1) +800001d8: 33 08 01 41 sub a6, sp, a6 +800001dc: 13 7d 08 f8 andi s10, a6, -128 +800001e0: 13 01 0d 00 mv sp, s10 +800001e4: 13 b8 18 00 seqz a6, a7 +800001e8: 0b 28 08 00 vx_split a6, a6 +800001ec: 93 8b 08 00 mv s7, a7 +800001f0: 63 94 08 00 bnez a7, 0x800001f8 <_pocl_kernel_fft_radix4_workgroup+0xb4> +800001f4: 93 0b 10 00 li s7, 1 +800001f8: 83 a3 06 00 lw t2, 0(a3) +800001fc: 83 26 07 00 lw a3, 0(a4) +80000200: 23 a8 d4 04 sw a3, 80(s1) +80000204: 83 ac 07 00 lw s9, 0(a5) +80000208: 83 a0 05 00 lw ra, 0(a1) +8000020c: 83 25 05 00 lw a1, 0(a0) +80000210: b3 8a c8 02 mul s5, a7, a2 +80000214: 0b 30 08 00 vx_join a6 +80000218: 13 b5 12 00 seqz a0, t0 +8000021c: 0b 25 05 00 vx_split a0, a0 +80000220: 63 94 02 00 bnez t0, 0x80000228 <_pocl_kernel_fft_radix4_workgroup+0xe4> +80000224: 93 02 10 00 li t0, 1 +80000228: 0b 30 05 00 vx_join a0 +8000022c: 13 35 1b 00 seqz a0, s6 +80000230: 0b 25 05 00 vx_split a0, a0 +80000234: 63 14 0b 00 bnez s6, 0x8000023c <_pocl_kernel_fft_radix4_workgroup+0xf8> +80000238: 13 0b 10 00 li s6, 1 +8000023c: 23 a0 74 04 sw t2, 64(s1) +80000240: 23 ac b4 06 sw a1, 120(s1) +80000244: 23 a6 54 06 sw t0, 108(s1) +80000248: 0b 30 05 00 vx_join a0 +8000024c: 93 05 00 00 li a1, 0 +80000250: 03 a5 44 06 lw a0, 100(s1) +80000254: 13 15 25 00 slli a0, a0, 2 +80000258: 23 a4 a4 06 sw a0, 104(s1) +8000025c: 37 25 00 80 lui a0, 524290 +80000260: 07 29 c5 63 flw fs2, 1596(a0) +80000264: 37 25 00 80 lui a0, 524290 +80000268: 87 29 05 64 flw fs3, 1600(a0) +8000026c: 23 a4 14 05 sw a7, 72(s1) +80000270: 93 98 28 00 slli a7, a7, 2 +80000274: 23 ae 14 07 sw a7, 124(s1) +80000278: 73 25 40 cc csrr a0, tmask +8000027c: 23 a6 a4 04 sw a0, 76(s1) +80000280: 13 09 30 00 li s2, 3 +80000284: 23 aa a4 05 sw s10, 84(s1) +80000288: 23 a0 64 07 sw s6, 96(s1) +8000028c: 6f 00 00 03 j 0x800002bc <_pocl_kernel_fft_radix4_workgroup+0x178> +80000290: 83 a5 c4 05 lw a1, 92(s1) +80000294: 93 85 15 00 addi a1, a1, 1 +80000298: 03 a5 84 06 lw a0, 104(s1) +8000029c: 03 ad 84 05 lw s10, 88(s1) +800002a0: 33 0d ad 00 add s10, s10, a0 +800002a4: 03 ab 04 06 lw s6, 96(s1) +800002a8: 33 c5 65 01 xor a0, a1, s6 +800002ac: 33 35 a0 00 snez a0, a0 +800002b0: 03 a6 c4 04 lw a2, 76(s1) +800002b4: 0b 50 c5 00 vx_pred a0, a2 +800002b8: 63 8a 65 0b beq a1, s6, 0x8000036c <_pocl_kernel_fft_radix4_workgroup+0x228> +800002bc: 23 ae b4 04 sw a1, 92(s1) +800002c0: 13 0c 00 00 li s8, 0 +800002c4: 73 25 40 cc csrr a0, tmask +800002c8: 23 a8 a4 06 sw a0, 112(s1) +800002cc: 23 ac a4 05 sw s10, 88(s1) +800002d0: 6f 00 c0 02 j 0x800002fc <_pocl_kernel_fft_radix4_workgroup+0x1b8> +800002d4: 13 0c 1c 00 addi s8, s8, 1 +800002d8: 03 a5 c4 07 lw a0, 124(s1) +800002dc: 03 ad 44 07 lw s10, 116(s1) +800002e0: 33 0d ad 00 add s10, s10, a0 +800002e4: 83 a5 c4 06 lw a1, 108(s1) +800002e8: 33 45 bc 00 xor a0, s8, a1 +800002ec: 33 35 a0 00 snez a0, a0 +800002f0: 03 a6 04 07 lw a2, 112(s1) +800002f4: 0b 50 c5 00 vx_pred a0, a2 +800002f8: e3 0c bc f8 beq s8, a1, 0x80000290 <_pocl_kernel_fft_radix4_workgroup+0x14c> +800002fc: 13 0a 00 00 li s4, 0 +80000300: f3 29 40 cc csrr s3, tmask +80000304: 23 aa a4 07 sw s10, 116(s1) +80000308: 03 ab 84 07 lw s6, 120(s1) +8000030c: 6f 00 00 02 j 0x8000032c <_pocl_kernel_fft_radix4_workgroup+0x1e8> +80000310: 13 0a 1a 00 addi s4, s4, 1 +80000314: 13 0b 8b 00 addi s6, s6, 8 +80000318: 13 0d 4d 00 addi s10, s10, 4 +8000031c: 33 c5 4b 01 xor a0, s7, s4 +80000320: 33 35 a0 00 snez a0, a0 +80000324: 0b 50 35 01 vx_pred a0, s3 +80000328: e3 86 4b fb beq s7, s4, 0x800002d4 <_pocl_kernel_fft_radix4_workgroup+0x190> +8000032c: 33 85 4a 01 add a0, s5, s4 +80000330: 23 20 ad 00 sw a0, 0(s10) +80000334: e3 4e 49 fd blt s2, s4, 0x80000310 <_pocl_kernel_fft_radix4_workgroup+0x1cc> +80000338: 53 70 0a d0 fcvt.s.w ft0, s4 +8000033c: 53 70 20 11 fmul.s ft0, ft0, fs2 +80000340: 53 74 30 11 fmul.s fs0, ft0, fs3 +80000344: 53 05 84 20 fmv.s fa0, fs0 +80000348: 93 8d 00 00 mv s11, ra +8000034c: ef f0 1f db jal 0x800000fc <_Z7_cl_cosf> +80000350: d3 04 a5 20 fmv.s fs1, fa0 +80000354: 53 05 84 20 fmv.s fa0, fs0 +80000358: ef f0 9f dc jal 0x80000120 <_Z7_cl_sinf> +8000035c: 93 80 0d 00 mv ra, s11 +80000360: 27 22 ab 00 fsw fa0, 4(s6) +80000364: 27 20 9b 00 fsw fs1, 0(s6) +80000368: 6f f0 9f fa j 0x80000310 <_pocl_kernel_fft_radix4_workgroup+0x1cc> +8000036c: 03 a5 c4 03 lw a0, 60(s1) +80000370: 13 05 f5 00 addi a0, a0, 15 +80000374: 13 75 05 ff andi a0, a0, -16 +80000378: 33 05 a1 40 sub a0, sp, a0 +8000037c: 13 75 05 f8 andi a0, a0, -128 +80000380: 13 01 05 00 mv sp, a0 +80000384: 93 05 00 00 li a1, 0 +80000388: 73 26 40 cc csrr a2, tmask +8000038c: 83 a6 44 05 lw a3, 84(s1) +80000390: 13 07 05 00 mv a4, a0 +80000394: 03 ad 84 04 lw s10, 72(s1) +80000398: 83 ad c4 06 lw s11, 108(s1) +8000039c: 83 a9 04 04 lw s3, 64(s1) +800003a0: 6f 00 80 02 j 0x800003c8 <_pocl_kernel_fft_radix4_workgroup+0x284> +800003a4: 93 85 15 00 addi a1, a1, 1 +800003a8: 83 a7 44 06 lw a5, 100(s1) +800003ac: 33 07 f7 00 add a4, a4, a5 +800003b0: 83 a7 84 06 lw a5, 104(s1) +800003b4: b3 86 f6 00 add a3, a3, a5 +800003b8: b3 c7 65 01 xor a5, a1, s6 +800003bc: b3 37 f0 00 snez a5, a5 +800003c0: 0b d0 c7 00 vx_pred a5, a2 +800003c4: 63 80 65 0b beq a1, s6, 0x80000464 <_pocl_kernel_fft_radix4_workgroup+0x320> +800003c8: 93 07 00 00 li a5, 0 +800003cc: 73 28 40 cc csrr a6, tmask +800003d0: 93 88 06 00 mv a7, a3 +800003d4: 93 02 07 00 mv t0, a4 +800003d8: 6f 00 40 02 j 0x800003fc <_pocl_kernel_fft_radix4_workgroup+0x2b8> +800003dc: 93 87 17 00 addi a5, a5, 1 +800003e0: b3 82 a2 01 add t0, t0, s10 +800003e4: 03 a3 c4 07 lw t1, 124(s1) +800003e8: b3 88 68 00 add a7, a7, t1 +800003ec: 33 c3 b7 01 xor t1, a5, s11 +800003f0: 33 33 60 00 snez t1, t1 +800003f4: 0b 50 03 01 vx_pred t1, a6 +800003f8: e3 86 b7 fb beq a5, s11, 0x800003a4 <_pocl_kernel_fft_radix4_workgroup+0x260> +800003fc: 73 23 40 cc csrr t1, tmask +80000400: 93 83 08 00 mv t2, a7 +80000404: 13 8e 02 00 mv t3, t0 +80000408: 93 8e 00 00 mv t4, ra +8000040c: 13 8f 0b 00 mv t5, s7 +80000410: 6f 00 40 02 j 0x80000434 <_pocl_kernel_fft_radix4_workgroup+0x2f0> +80000414: 0b b0 0f 00 vx_join t6 +80000418: 13 0f ff ff addi t5, t5, -1 +8000041c: 93 8e 8e 00 addi t4, t4, 8 +80000420: 13 0e 1e 00 addi t3, t3, 1 +80000424: 93 83 43 00 addi t2, t2, 4 +80000428: b3 3f e0 01 snez t6, t5 +8000042c: 0b d0 6f 00 vx_pred t6, t1 +80000430: e3 06 0f fa beqz t5, 0x800003dc <_pocl_kernel_fft_radix4_workgroup+0x298> +80000434: 03 a9 03 00 lw s2, 0(t2) +80000438: b3 3f 99 01 sltu t6, s2, s9 +8000043c: 23 00 fe 01 sb t6, 0(t3) +80000440: 8b af 0f 00 vx_split t6, t6 +80000444: e3 78 99 fd bgeu s2, s9, 0x80000414 <_pocl_kernel_fft_radix4_workgroup+0x2d0> +80000448: 13 19 39 00 slli s2, s2, 3 +8000044c: 33 89 29 01 add s2, s3, s2 +80000450: 07 20 49 00 flw ft0, 4(s2) +80000454: 87 20 09 00 flw ft1, 0(s2) +80000458: 27 a2 0e 00 fsw ft0, 4(t4) +8000045c: 27 a0 1e 00 fsw ft1, 0(t4) +80000460: 6f f0 5f fb j 0x80000414 <_pocl_kernel_fft_radix4_workgroup+0x2d0> +80000464: 83 a6 44 04 lw a3, 68(s1) +80000468: b3 05 d1 40 sub a1, sp, a3 +8000046c: 13 f6 05 f8 andi a2, a1, -128 +80000470: 13 01 06 00 mv sp, a2 +80000474: b3 05 d1 40 sub a1, sp, a3 +80000478: 93 f5 05 f8 andi a1, a1, -128 +8000047c: 13 81 05 00 mv sp, a1 +80000480: 93 06 00 00 li a3, 0 +80000484: 73 27 40 cc csrr a4, tmask +80000488: 93 07 10 00 li a5, 1 +8000048c: 13 88 05 00 mv a6, a1 +80000490: 93 08 06 00 mv a7, a2 +80000494: 83 ac 84 06 lw s9, 104(s1) +80000498: 93 02 00 00 li t0, 0 +8000049c: 73 23 40 cc csrr t1, tmask +800004a0: 93 03 08 00 mv t2, a6 +800004a4: 13 8e 08 00 mv t3, a7 +800004a8: f3 2e 40 cc csrr t4, tmask +800004ac: 13 8f 00 00 mv t5, ra +800004b0: 93 8f 03 00 mv t6, t2 +800004b4: 13 09 0e 00 mv s2, t3 +800004b8: 93 89 0b 00 mv s3, s7 +800004bc: 23 a0 ef 01 sw t5, 0(t6) +800004c0: 23 20 f9 00 sw a5, 0(s2) +800004c4: 93 89 f9 ff addi s3, s3, -1 +800004c8: 13 09 49 00 addi s2, s2, 4 +800004cc: 93 8f 4f 00 addi t6, t6, 4 +800004d0: 13 0f 8f 00 addi t5, t5, 8 +800004d4: 33 3a 30 01 snez s4, s3 +800004d8: 0b 50 da 01 vx_pred s4, t4 +800004dc: e3 90 09 fe bnez s3, 0x800004bc <_pocl_kernel_fft_radix4_workgroup+0x378> +800004e0: 93 82 12 00 addi t0, t0, 1 +800004e4: 83 ae c4 07 lw t4, 124(s1) +800004e8: 33 0e de 01 add t3, t3, t4 +800004ec: b3 83 d3 01 add t2, t2, t4 +800004f0: b3 ce b2 01 xor t4, t0, s11 +800004f4: b3 3e d0 01 snez t4, t4 +800004f8: 0b d0 6e 00 vx_pred t4, t1 +800004fc: e3 96 b2 fb bne t0, s11, 0x800004a8 <_pocl_kernel_fft_radix4_workgroup+0x364> +80000500: 93 86 16 00 addi a3, a3, 1 +80000504: b3 88 98 01 add a7, a7, s9 +80000508: 33 08 98 01 add a6, a6, s9 +8000050c: b3 c2 66 01 xor t0, a3, s6 +80000510: b3 32 50 00 snez t0, t0 +80000514: 0b d0 e2 00 vx_pred t0, a4 +80000518: e3 90 66 f9 bne a3, s6, 0x80000498 <_pocl_kernel_fft_radix4_workgroup+0x354> +8000051c: 93 08 00 00 li a7, 0 +80000520: f3 26 40 cc csrr a3, tmask +80000524: 23 aa d4 06 sw a3, 116(s1) +80000528: 13 07 00 01 li a4, 16 +8000052c: 93 07 80 01 li a5, 24 +80000530: 53 00 00 f0 fmv.w.x ft0, zero +80000534: 6f 00 c0 01 j 0x80000550 <_pocl_kernel_fft_radix4_workgroup+0x40c> +80000538: 0b b0 02 00 vx_join t0 +8000053c: 83 ac 84 06 lw s9, 104(s1) +80000540: 93 42 18 00 xori t0, a6, 1 +80000544: 83 a6 44 07 lw a3, 116(s1) +80000548: 0b d0 d2 00 vx_pred t0, a3 +8000054c: 63 10 08 22 bnez a6, 0x8000076c <_pocl_kernel_fft_radix4_workgroup+0x628> +80000550: 13 03 00 00 li t1, 0 +80000554: 33 8e 1c 03 mul t3, s9, a7 +80000558: b3 83 c5 01 add t2, a1, t3 +8000055c: 33 0e c6 01 add t3, a2, t3 +80000560: f3 2e 40 cc csrr t4, tmask +80000564: 13 0f 00 00 li t5, 0 +80000568: f3 2f 40 cc csrr t6, tmask +8000056c: 93 0a 0e 00 mv s5, t3 +80000570: 13 8b 03 00 mv s6, t2 +80000574: 93 8c 00 00 mv s9, ra +80000578: 83 a6 84 07 lw a3, 120(s1) +8000057c: 03 a8 0a 00 lw a6, 0(s5) +80000580: b3 52 0f 03 divu t0, t5, a6 +80000584: 13 f9 32 00 andi s2, t0, 3 +80000588: 93 12 28 00 slli t0, a6, 2 +8000058c: 93 f9 c2 0f andi s3, t0, 252 +80000590: b3 59 37 03 divu s3, a4, s3 +80000594: 33 09 39 03 mul s2, s2, s3 +80000598: 13 19 39 00 slli s2, s2, 3 +8000059c: 83 29 0b 00 lw s3, 0(s6) +800005a0: 33 89 26 01 add s2, a3, s2 +800005a4: 87 20 49 00 flw ft1, 4(s2) +800005a8: 07 21 09 00 flw ft2, 0(s2) +800005ac: 87 a1 49 00 flw ft3, 4(s3) +800005b0: 07 a2 09 00 flw ft4, 0(s3) +800005b4: 33 09 0f 01 add s2, t5, a6 +800005b8: 13 19 39 00 slli s2, s2, 3 +800005bc: 33 89 20 01 add s2, ra, s2 +800005c0: 87 22 49 00 flw ft5, 4(s2) +800005c4: 07 23 09 00 flw ft6, 0(s2) +800005c8: 13 1a 48 00 slli s4, a6, 4 +800005cc: 33 8a 4c 01 add s4, s9, s4 +800005d0: 87 23 4a 00 flw ft7, 4(s4) +800005d4: 07 25 0a 00 flw fa0, 0(s4) +800005d8: 33 0c f8 02 mul s8, a6, a5 +800005dc: 33 8c 8c 01 add s8, s9, s8 +800005e0: 87 25 4c 00 flw fa1, 4(s8) +800005e4: 07 26 0c 00 flw fa2, 0(s8) +800005e8: 53 73 61 10 fmul.s ft6, ft2, ft6 +800005ec: d3 f2 50 10 fmul.s ft5, ft1, ft5 +800005f0: d3 76 21 10 fmul.s fa3, ft2, ft2 +800005f4: 53 f7 10 10 fmul.s fa4, ft1, ft1 +800005f8: 53 f5 a6 10 fmul.s fa0, fa3, fa0 +800005fc: d3 73 77 10 fmul.s ft7, fa4, ft7 +80000600: 53 71 d1 10 fmul.s ft2, ft2, fa3 +80000604: d3 f0 e0 10 fmul.s ft1, ft1, fa4 +80000608: 53 71 c1 10 fmul.s ft2, ft2, fa2 +8000060c: d3 f0 b0 10 fmul.s ft1, ft1, fa1 +80000610: d3 75 a2 00 fadd.s fa1, ft4, fa0 +80000614: 53 f6 71 00 fadd.s fa2, ft3, ft7 +80000618: 53 72 a2 08 fsub.s ft4, ft4, fa0 +8000061c: d3 f1 71 08 fsub.s ft3, ft3, ft7 +80000620: d3 73 23 00 fadd.s ft7, ft6, ft2 +80000624: 53 f5 12 00 fadd.s fa0, ft5, ft1 +80000628: 53 71 23 08 fsub.s ft2, ft6, ft2 +8000062c: d3 f0 12 08 fsub.s ft1, ft5, ft1 +80000630: 53 71 01 10 fmul.s ft2, ft2, ft0 +80000634: d3 f2 75 00 fadd.s ft5, fa1, ft7 +80000638: 53 73 a6 00 fadd.s ft6, fa2, fa0 +8000063c: 27 a0 59 00 fsw ft5, 0(s3) +80000640: 27 a2 69 00 fsw ft6, 4(s3) +80000644: d3 72 22 00 fadd.s ft5, ft4, ft2 +80000648: 53 f3 11 08 fsub.s ft6, ft3, ft1 +8000064c: 27 20 59 00 fsw ft5, 0(s2) +80000650: 27 22 69 00 fsw ft6, 4(s2) +80000654: d3 f2 75 08 fsub.s ft5, fa1, ft7 +80000658: 53 73 a6 08 fsub.s ft6, fa2, fa0 +8000065c: 27 20 5a 00 fsw ft5, 0(s4) +80000660: 27 22 6a 00 fsw ft6, 4(s4) +80000664: 53 71 22 08 fsub.s ft2, ft4, ft2 +80000668: d3 f0 11 00 fadd.s ft1, ft3, ft1 +8000066c: 27 20 2c 00 fsw ft2, 0(s8) +80000670: 27 22 1c 00 fsw ft1, 4(s8) +80000674: 13 0f 1f 00 addi t5, t5, 1 +80000678: 93 8c 8c 00 addi s9, s9, 8 +8000067c: 13 0b 4b 00 addi s6, s6, 4 +80000680: 93 8a 4a 00 addi s5, s5, 4 +80000684: 33 c9 eb 01 xor s2, s7, t5 +80000688: 33 39 20 01 snez s2, s2 +8000068c: 0b 50 f9 01 vx_pred s2, t6 +80000690: e3 96 eb ef bne s7, t5, 0x8000057c <_pocl_kernel_fft_radix4_workgroup+0x438> +80000694: 13 03 13 00 addi t1, t1, 1 +80000698: 03 af c4 07 lw t5, 124(s1) +8000069c: b3 83 e3 01 add t2, t2, t5 +800006a0: 33 0e ee 01 add t3, t3, t5 +800006a4: 33 4f b3 01 xor t5, t1, s11 +800006a8: 33 3f e0 01 snez t5, t5 +800006ac: 0b 50 df 01 vx_pred t5, t4 +800006b0: e3 1a b3 eb bne t1, s11, 0x80000564 <_pocl_kernel_fft_radix4_workgroup+0x420> +800006b4: 93 88 18 00 addi a7, a7, 1 +800006b8: 03 ab 04 06 lw s6, 96(s1) +800006bc: 33 c3 68 01 xor t1, a7, s6 +800006c0: 13 33 13 00 seqz t1, t1 +800006c4: 0b 23 03 00 vx_split t1, t1 +800006c8: 93 03 10 00 li t2, 1 +800006cc: 03 ac 44 05 lw s8, 84(s1) +800006d0: 63 90 68 09 bne a7, s6, 0x80000750 <_pocl_kernel_fft_radix4_workgroup+0x60c> +800006d4: 93 08 00 00 li a7, 0 +800006d8: f3 23 40 cc csrr t2, tmask +800006dc: 13 0e 06 00 mv t3, a2 +800006e0: 83 ac 84 06 lw s9, 104(s1) +800006e4: 93 0e 00 00 li t4, 0 +800006e8: 73 2f 40 cc csrr t5, tmask +800006ec: 93 0f 0e 00 mv t6, t3 +800006f0: 73 29 40 cc csrr s2, tmask +800006f4: 93 89 0f 00 mv s3, t6 +800006f8: 13 8a 0b 00 mv s4, s7 +800006fc: 23 a0 59 00 sw t0, 0(s3) +80000700: 13 0a fa ff addi s4, s4, -1 +80000704: 93 89 49 00 addi s3, s3, 4 +80000708: b3 3a 40 01 snez s5, s4 +8000070c: 0b d0 2a 01 vx_pred s5, s2 +80000710: e3 16 0a fe bnez s4, 0x800006fc <_pocl_kernel_fft_radix4_workgroup+0x5b8> +80000714: 93 8e 1e 00 addi t4, t4, 1 +80000718: 03 a9 c4 07 lw s2, 124(s1) +8000071c: b3 8f 2f 01 add t6, t6, s2 +80000720: 33 c9 be 01 xor s2, t4, s11 +80000724: 33 39 20 01 snez s2, s2 +80000728: 0b 50 e9 01 vx_pred s2, t5 +8000072c: e3 92 be fd bne t4, s11, 0x800006f0 <_pocl_kernel_fft_radix4_workgroup+0x5ac> +80000730: 93 88 18 00 addi a7, a7, 1 +80000734: 33 0e 9e 01 add t3, t3, s9 +80000738: b3 ce 68 01 xor t4, a7, s6 +8000073c: b3 3e d0 01 snez t4, t4 +80000740: 0b d0 7e 00 vx_pred t4, t2 +80000744: e3 90 68 fb bne a7, s6, 0x800006e4 <_pocl_kernel_fft_radix4_workgroup+0x5a0> +80000748: 93 08 00 00 li a7, 0 +8000074c: 93 33 48 00 sltiu t2, a6, 4 +80000750: 0b 30 03 00 vx_join t1 +80000754: 8b a2 03 00 vx_split t0, t2 +80000758: 13 08 10 00 li a6, 1 +8000075c: 83 aa 04 05 lw s5, 80(s1) +80000760: e3 8c 03 dc beqz t2, 0x80000538 <_pocl_kernel_fft_radix4_workgroup+0x3f4> +80000764: 13 08 00 00 li a6, 0 +80000768: 6f f0 1f dd j 0x80000538 <_pocl_kernel_fft_radix4_workgroup+0x3f4> +8000076c: 13 06 00 00 li a2, 0 +80000770: f3 26 40 cc csrr a3, tmask +80000774: 03 aa 04 06 lw s4, 96(s1) +80000778: 6f 00 80 02 j 0x800007a0 <_pocl_kernel_fft_radix4_workgroup+0x65c> +8000077c: 13 06 16 00 addi a2, a2, 1 +80000780: b3 85 95 01 add a1, a1, s9 +80000784: 33 0c 9c 01 add s8, s8, s9 +80000788: 03 a7 44 06 lw a4, 100(s1) +8000078c: 33 05 e5 00 add a0, a0, a4 +80000790: 33 47 46 01 xor a4, a2, s4 +80000794: 33 37 e0 00 snez a4, a4 +80000798: 0b 50 d7 00 vx_pred a4, a3 +8000079c: 63 04 46 0b beq a2, s4, 0x80000844 <_pocl_kernel_fft_radix4_workgroup+0x700> +800007a0: 13 07 00 00 li a4, 0 +800007a4: f3 27 40 cc csrr a5, tmask +800007a8: 13 08 05 00 mv a6, a0 +800007ac: 93 08 0c 00 mv a7, s8 +800007b0: 93 82 05 00 mv t0, a1 +800007b4: 6f 00 80 02 j 0x800007dc <_pocl_kernel_fft_radix4_workgroup+0x698> +800007b8: 13 07 17 00 addi a4, a4, 1 +800007bc: 03 a3 c4 07 lw t1, 124(s1) +800007c0: b3 82 62 00 add t0, t0, t1 +800007c4: b3 88 68 00 add a7, a7, t1 +800007c8: 33 08 a8 01 add a6, a6, s10 +800007cc: 33 43 b7 01 xor t1, a4, s11 +800007d0: 33 33 60 00 snez t1, t1 +800007d4: 0b 50 f3 00 vx_pred t1, a5 +800007d8: e3 02 b7 fb beq a4, s11, 0x8000077c <_pocl_kernel_fft_radix4_workgroup+0x638> +800007dc: 73 23 40 cc csrr t1, tmask +800007e0: 93 03 08 00 mv t2, a6 +800007e4: 13 8e 08 00 mv t3, a7 +800007e8: 93 8e 02 00 mv t4, t0 +800007ec: 13 8f 0b 00 mv t5, s7 +800007f0: 6f 00 40 02 j 0x80000814 <_pocl_kernel_fft_radix4_workgroup+0x6d0> +800007f4: 0b b0 0f 00 vx_join t6 +800007f8: 13 0f ff ff addi t5, t5, -1 +800007fc: 93 8e 4e 00 addi t4, t4, 4 +80000800: 13 0e 4e 00 addi t3, t3, 4 +80000804: 93 83 13 00 addi t2, t2, 1 +80000808: b3 3f e0 01 snez t6, t5 +8000080c: 0b d0 6f 00 vx_pred t6, t1 +80000810: e3 04 0f fa beqz t5, 0x800007b8 <_pocl_kernel_fft_radix4_workgroup+0x674> +80000814: 03 c9 03 00 lbu s2, 0(t2) +80000818: 8b 2f 09 00 vx_split t6, s2 +8000081c: e3 0c 09 fc beqz s2, 0x800007f4 <_pocl_kernel_fft_radix4_workgroup+0x6b0> +80000820: 03 a9 0e 00 lw s2, 0(t4) +80000824: 83 29 0e 00 lw s3, 0(t3) +80000828: 07 20 49 00 flw ft0, 4(s2) +8000082c: 87 20 09 00 flw ft1, 0(s2) +80000830: 93 99 39 00 slli s3, s3, 3 +80000834: b3 89 3a 01 add s3, s5, s3 +80000838: 27 a2 09 00 fsw ft0, 4(s3) +8000083c: 27 a0 19 00 fsw ft1, 0(s3) +80000840: 6f f0 5f fb j 0x800007f4 <_pocl_kernel_fft_radix4_workgroup+0x6b0> +80000844: 13 01 04 f0 addi sp, s0, -256 +80000848: 83 20 c1 0f lw ra, 252(sp) +8000084c: 03 24 81 0f lw s0, 248(sp) +80000850: 83 24 41 0f lw s1, 244(sp) +80000854: 03 29 01 0f lw s2, 240(sp) +80000858: 83 29 c1 0e lw s3, 236(sp) +8000085c: 03 2a 81 0e lw s4, 232(sp) +80000860: 83 2a 41 0e lw s5, 228(sp) +80000864: 03 2b 01 0e lw s6, 224(sp) +80000868: 83 2b c1 0d lw s7, 220(sp) +8000086c: 03 2c 81 0d lw s8, 216(sp) +80000870: 83 2c 41 0d lw s9, 212(sp) +80000874: 03 2d 01 0d lw s10, 208(sp) +80000878: 83 2d c1 0c lw s11, 204(sp) +8000087c: 07 24 81 0c flw fs0, 200(sp) +80000880: 87 24 41 0c flw fs1, 196(sp) +80000884: 07 29 01 0c flw fs2, 192(sp) +80000888: 87 29 c1 0b flw fs3, 188(sp) +8000088c: 13 01 01 10 addi sp, sp, 256 +80000890: 67 80 00 00 ret + +80000894 <_exit>: +80000894: 13 04 05 00 mv s0, a0 +80000898: ef 00 80 5a jal 0x80000e40 +8000089c: 93 01 04 00 mv gp, s0 +800008a0: 0b 00 00 00 vx_tmc zero + +800008a4 : +800008a4: 97 41 00 00 auipc gp, 4 +800008a8: 93 81 c1 e9 addi gp, gp, -356 +800008ac: 37 01 00 ff lui sp, 1044480 +800008b0: f3 22 40 f1 csrr t0, mhartid +800008b4: 13 93 d2 00 slli t1, t0, 13 +800008b8: 33 01 61 40 sub sp, sp, t1 +800008bc: 13 03 00 00 li t1, 0 +800008c0: b3 82 62 02 mul t0, t0, t1 +800008c4: 17 42 00 00 auipc tp, 4 +800008c8: 13 02 72 74 addi tp, tp, 1863 +800008cc: 33 02 52 00 add tp, tp, t0 +800008d0: 13 72 02 fc andi tp, tp, -64 +800008d4: 67 80 00 00 ret + +800008d8 : +800008d8: 93 02 f0 ff li t0, -1 +800008dc: 0b 80 02 00 vx_tmc t0 +800008e0: ef f0 5f fc jal 0x800008a4 +800008e4: 0b 00 00 00 vx_tmc zero +800008e8: 67 80 00 00 ret + +800008ec : +800008ec: 93 02 f0 ff li t0, -1 +800008f0: 0b 80 02 00 vx_tmc t0 +800008f4: ef 00 c0 01 jal 0x80000910 <__init_tls> +800008f8: 0b 00 00 00 vx_tmc zero +800008fc: 67 80 00 00 ret + +80000900 : +80000900: f3 22 30 cc csrr t0, gid +80000904: 13 03 10 00 li t1, 1 +80000908: e3 9c 62 fe bne t0, t1, 0x80000900 +8000090c: 67 80 00 00 ret + +80000910 <__init_tls>: +80000910: 13 01 01 ff addi sp, sp, -16 +80000914: 13 06 00 00 li a2, 0 +80000918: 97 35 00 00 auipc a1, 3 +8000091c: 93 85 c5 1f addi a1, a1, 508 +80000920: 13 05 02 00 mv a0, tp +80000924: 23 24 81 00 sw s0, 8(sp) +80000928: 23 26 11 00 sw ra, 12(sp) +8000092c: 13 04 02 00 mv s0, tp +80000930: ef 10 10 08 jal 0x800021b0 +80000934: 13 05 00 00 li a0, 0 +80000938: 33 05 a4 00 add a0, s0, a0 +8000093c: 03 24 81 00 lw s0, 8(sp) +80000940: 83 20 c1 00 lw ra, 12(sp) +80000944: 13 06 00 00 li a2, 0 +80000948: 93 05 00 00 li a1, 0 +8000094c: 13 01 01 01 addi sp, sp, 16 +80000950: 6f 10 50 20 j 0x80002354 + +80000954 <__libc_init_array>: +80000954: 13 01 01 ff addi sp, sp, -16 +80000958: 23 24 81 00 sw s0, 8(sp) +8000095c: 23 20 21 01 sw s2, 0(sp) +80000960: 97 37 00 00 auipc a5, 3 +80000964: 93 87 47 1b addi a5, a5, 436 +80000968: 17 34 00 00 auipc s0, 3 +8000096c: 13 04 c4 1a addi s0, s0, 428 +80000970: 23 26 11 00 sw ra, 12(sp) +80000974: 23 22 91 00 sw s1, 4(sp) +80000978: 33 89 87 40 sub s2, a5, s0 +8000097c: 63 80 87 02 beq a5, s0, 0x8000099c <__libc_init_array+0x48> +80000980: 13 59 29 40 srai s2, s2, 2 +80000984: 93 04 00 00 li s1, 0 +80000988: 83 27 04 00 lw a5, 0(s0) +8000098c: 93 84 14 00 addi s1, s1, 1 +80000990: 13 04 44 00 addi s0, s0, 4 +80000994: e7 80 07 00 jalr a5 +80000998: e3 e8 24 ff bltu s1, s2, 0x80000988 <__libc_init_array+0x34> +8000099c: 97 37 00 00 auipc a5, 3 +800009a0: 93 87 c7 17 addi a5, a5, 380 +800009a4: 17 34 00 00 auipc s0, 3 +800009a8: 13 04 04 17 addi s0, s0, 368 +800009ac: 33 89 87 40 sub s2, a5, s0 +800009b0: 13 59 29 40 srai s2, s2, 2 +800009b4: 63 8e 87 00 beq a5, s0, 0x800009d0 <__libc_init_array+0x7c> +800009b8: 93 04 00 00 li s1, 0 +800009bc: 83 27 04 00 lw a5, 0(s0) +800009c0: 93 84 14 00 addi s1, s1, 1 +800009c4: 13 04 44 00 addi s0, s0, 4 +800009c8: e7 80 07 00 jalr a5 +800009cc: e3 e8 24 ff bltu s1, s2, 0x800009bc <__libc_init_array+0x68> +800009d0: 83 20 c1 00 lw ra, 12(sp) +800009d4: 03 24 81 00 lw s0, 8(sp) +800009d8: 83 24 41 00 lw s1, 4(sp) +800009dc: 03 29 01 00 lw s2, 0(sp) +800009e0: 13 01 01 01 addi sp, sp, 16 +800009e4: 67 80 00 00 ret + +800009e8 <__libc_fini_array>: +800009e8: 13 01 01 ff addi sp, sp, -16 +800009ec: 23 24 81 00 sw s0, 8(sp) +800009f0: 97 37 00 00 auipc a5, 3 +800009f4: 93 87 87 12 addi a5, a5, 296 +800009f8: 17 34 00 00 auipc s0, 3 +800009fc: 13 04 04 12 addi s0, s0, 288 +80000a00: 33 04 f4 40 sub s0, s0, a5 +80000a04: 23 22 91 00 sw s1, 4(sp) +80000a08: 23 26 11 00 sw ra, 12(sp) +80000a0c: 93 54 24 40 srai s1, s0, 2 +80000a10: 63 80 04 02 beqz s1, 0x80000a30 <__libc_fini_array+0x48> +80000a14: 13 04 c4 ff addi s0, s0, -4 +80000a18: 33 04 f4 00 add s0, s0, a5 +80000a1c: 83 27 04 00 lw a5, 0(s0) +80000a20: 93 84 f4 ff addi s1, s1, -1 +80000a24: 13 04 c4 ff addi s0, s0, -4 +80000a28: e7 80 07 00 jalr a5 +80000a2c: e3 98 04 fe bnez s1, 0x80000a1c <__libc_fini_array+0x34> +80000a30: 83 20 c1 00 lw ra, 12(sp) +80000a34: 03 24 81 00 lw s0, 8(sp) +80000a38: 83 24 41 00 lw s1, 4(sp) +80000a3c: 13 01 01 01 addi sp, sp, 16 +80000a40: 67 80 00 00 ret + +80000a44 : +80000a44: 13 01 01 fe addi sp, sp, -32 +80000a48: 23 2e 11 00 sw ra, 28(sp) +80000a4c: 23 2c 81 00 sw s0, 24(sp) +80000a50: 23 2a 91 00 sw s1, 20(sp) +80000a54: 23 28 21 01 sw s2, 16(sp) +80000a58: 23 26 31 01 sw s3, 12(sp) +80000a5c: 23 24 41 01 sw s4, 8(sp) +80000a60: 73 25 00 fc csrr a0, nt +80000a64: 73 26 20 cc csrr a2, cid +80000a68: 73 27 10 cc csrr a4, wid +80000a6c: f3 26 00 cc csrr a3, tid +80000a70: 97 37 00 00 auipc a5, 3 +80000a74: 93 87 c7 55 addi a5, a5, 1372 +80000a78: 13 16 26 00 slli a2, a2, 2 +80000a7c: b3 87 c7 00 add a5, a5, a2 +80000a80: 83 a4 07 00 lw s1, 0(a5) +80000a84: 83 a7 44 01 lw a5, 20(s1) +80000a88: 03 a6 04 01 lw a2, 16(s1) +80000a8c: 33 2a f7 00 slt s4, a4, a5 +80000a90: 33 04 e6 02 mul s0, a2, a4 +80000a94: 33 0a ca 00 add s4, s4, a2 +80000a98: 63 54 f7 00 bge a4, a5, 0x80000aa0 +80000a9c: 93 07 07 00 mv a5, a4 +80000aa0: 33 04 f4 00 add s0, s0, a5 +80000aa4: 83 a5 04 00 lw a1, 0(s1) +80000aa8: 03 a6 c4 00 lw a2, 12(s1) +80000aac: 03 c7 84 01 lbu a4, 24(s1) +80000ab0: 03 a9 05 00 lw s2, 0(a1) +80000ab4: 83 a9 45 00 lw s3, 4(a1) +80000ab8: 33 04 a4 02 mul s0, s0, a0 +80000abc: b3 07 da 02 mul a5, s4, a3 +80000ac0: 33 04 c4 00 add s0, s0, a2 +80000ac4: 33 04 f4 00 add s0, s0, a5 +80000ac8: b3 09 39 03 mul s3, s2, s3 +80000acc: 33 0a 8a 00 add s4, s4, s0 +80000ad0: 63 00 07 08 beqz a4, 0x80000b50 +80000ad4: 63 44 44 03 blt s0, s4, 0x80000afc +80000ad8: 83 20 c1 01 lw ra, 28(sp) +80000adc: 03 24 81 01 lw s0, 24(sp) +80000ae0: 83 24 41 01 lw s1, 20(sp) +80000ae4: 03 29 01 01 lw s2, 16(sp) +80000ae8: 83 29 c1 00 lw s3, 12(sp) +80000aec: 03 2a 81 00 lw s4, 8(sp) +80000af0: 13 01 01 02 addi sp, sp, 32 +80000af4: 67 80 00 00 ret +80000af8: 83 a5 04 00 lw a1, 0(s1) +80000afc: 03 c7 94 01 lbu a4, 25(s1) +80000b00: 83 c6 a4 01 lbu a3, 26(s1) +80000b04: 03 a8 44 00 lw a6, 4(s1) +80000b08: 33 57 e4 40 sra a4, s0, a4 +80000b0c: b3 87 e9 02 mul a5, s3, a4 +80000b10: 03 a5 84 00 lw a0, 8(s1) +80000b14: b3 07 f4 40 sub a5, s0, a5 +80000b18: b3 d6 d7 40 sra a3, a5, a3 +80000b1c: 33 06 d9 02 mul a2, s2, a3 +80000b20: 13 04 14 00 addi s0, s0, 1 +80000b24: 33 86 c7 40 sub a2, a5, a2 +80000b28: e7 00 08 00 jalr a6 +80000b2c: e3 16 8a fc bne s4, s0, 0x80000af8 +80000b30: 83 20 c1 01 lw ra, 28(sp) +80000b34: 03 24 81 01 lw s0, 24(sp) +80000b38: 83 24 41 01 lw s1, 20(sp) +80000b3c: 03 29 01 01 lw s2, 16(sp) +80000b40: 83 29 c1 00 lw s3, 12(sp) +80000b44: 03 2a 81 00 lw s4, 8(sp) +80000b48: 13 01 01 02 addi sp, sp, 32 +80000b4c: 67 80 00 00 ret +80000b50: 63 46 44 01 blt s0, s4, 0x80000b5c +80000b54: 6f f0 5f f8 j 0x80000ad8 +80000b58: 83 a5 04 00 lw a1, 0(s1) +80000b5c: 33 66 34 03 rem a2, s0, s3 +80000b60: 83 a7 44 00 lw a5, 4(s1) +80000b64: 03 a5 84 00 lw a0, 8(s1) +80000b68: 33 47 34 03 div a4, s0, s3 +80000b6c: 13 04 14 00 addi s0, s0, 1 +80000b70: b3 46 26 03 div a3, a2, s2 +80000b74: 33 66 26 03 rem a2, a2, s2 +80000b78: e7 80 07 00 jalr a5 +80000b7c: e3 1e 8a fc bne s4, s0, 0x80000b58 +80000b80: 83 20 c1 01 lw ra, 28(sp) +80000b84: 03 24 81 01 lw s0, 24(sp) +80000b88: 83 24 41 01 lw s1, 20(sp) +80000b8c: 03 29 01 01 lw s2, 16(sp) +80000b90: 83 29 c1 00 lw s3, 12(sp) +80000b94: 03 2a 81 00 lw s4, 8(sp) +80000b98: 13 01 01 02 addi sp, sp, 32 +80000b9c: 67 80 00 00 ret + +80000ba0 : +80000ba0: 73 27 20 cc csrr a4, cid +80000ba4: 73 28 00 cc csrr a6, tid +80000ba8: 97 37 00 00 auipc a5, 3 +80000bac: 93 87 47 42 addi a5, a5, 1060 +80000bb0: 13 17 27 00 slli a4, a4, 2 +80000bb4: b3 87 e7 00 add a5, a5, a4 +80000bb8: 83 a7 07 00 lw a5, 0(a5) +80000bbc: 83 a5 07 00 lw a1, 0(a5) +80000bc0: 83 a6 c7 00 lw a3, 12(a5) +80000bc4: 03 c7 87 01 lbu a4, 24(a5) +80000bc8: 03 a6 05 00 lw a2, 0(a1) +80000bcc: 83 a8 45 00 lw a7, 4(a1) +80000bd0: 33 08 d8 00 add a6, a6, a3 +80000bd4: b3 08 16 03 mul a7, a2, a7 +80000bd8: 63 08 07 02 beqz a4, 0x80000c08 +80000bdc: 03 c7 97 01 lbu a4, 25(a5) +80000be0: 83 c6 a7 01 lbu a3, 26(a5) +80000be4: 03 a3 47 00 lw t1, 4(a5) +80000be8: 33 57 e8 40 sra a4, a6, a4 +80000bec: 03 a5 87 00 lw a0, 8(a5) +80000bf0: b3 88 e8 02 mul a7, a7, a4 +80000bf4: 33 08 18 41 sub a6, a6, a7 +80000bf8: b3 56 d8 40 sra a3, a6, a3 +80000bfc: 33 06 d6 02 mul a2, a2, a3 +80000c00: 33 06 c8 40 sub a2, a6, a2 +80000c04: 67 00 03 00 jr t1 +80000c08: 33 63 18 03 rem t1, a6, a7 +80000c0c: 03 ae 47 00 lw t3, 4(a5) +80000c10: 03 a5 87 00 lw a0, 8(a5) +80000c14: b3 46 c3 02 div a3, t1, a2 +80000c18: 33 47 18 03 div a4, a6, a7 +80000c1c: 33 66 c3 02 rem a2, t1, a2 +80000c20: 67 00 0e 00 jr t3 + +80000c24 : +80000c24: 13 01 01 ff addi sp, sp, -16 +80000c28: 23 26 11 00 sw ra, 12(sp) +80000c2c: 93 07 f0 ff li a5, -1 +80000c30: 0b 80 07 00 vx_tmc a5 +80000c34: ef f0 1f e1 jal 0x80000a44 +80000c38: 0b 00 00 00 vx_tmc zero +80000c3c: 83 20 c1 00 lw ra, 12(sp) +80000c40: 13 01 01 01 addi sp, sp, 16 +80000c44: 67 80 00 00 ret + +80000c48 : +80000c48: 13 01 01 f9 addi sp, sp, -112 +80000c4c: 23 2e 31 05 sw s3, 92(sp) +80000c50: 23 2a 51 05 sw s5, 84(sp) +80000c54: 83 29 45 00 lw s3, 4(a0) +80000c58: 83 2a 05 00 lw s5, 0(a0) +80000c5c: 03 27 85 00 lw a4, 8(a0) +80000c60: 23 26 11 06 sw ra, 108(sp) +80000c64: 23 24 81 06 sw s0, 104(sp) +80000c68: 23 22 91 06 sw s1, 100(sp) +80000c6c: 23 20 21 07 sw s2, 96(sp) +80000c70: 23 2c 41 05 sw s4, 88(sp) +80000c74: 23 28 61 05 sw s6, 80(sp) +80000c78: 23 26 71 05 sw s7, 76(sp) +80000c7c: 23 24 81 05 sw s8, 72(sp) +80000c80: 23 22 91 05 sw s9, 68(sp) +80000c84: 23 20 a1 05 sw s10, 64(sp) +80000c88: 23 2e b1 03 sw s11, 60(sp) +80000c8c: f3 26 20 fc csrr a3, nw +80000c90: f3 2c 10 fc csrr s9, nw +80000c94: 73 2d 00 fc csrr s10, nt +80000c98: f3 24 20 cc csrr s1, cid +80000c9c: 93 07 f0 3f li a5, 1023 +80000ca0: 63 c4 97 0e blt a5, s1, 0x80000d88 +80000ca4: b3 89 3a 03 mul s3, s5, s3 +80000ca8: 93 0b 06 00 mv s7, a2 +80000cac: 13 04 05 00 mv s0, a0 +80000cb0: 13 8c 05 00 mv s8, a1 +80000cb4: 93 07 10 00 li a5, 1 +80000cb8: 33 07 37 03 mul a4, a4, s3 +80000cbc: 33 86 ac 03 mul a2, s9, s10 +80000cc0: 63 54 e6 00 bge a2, a4, 0x80000cc8 +80000cc4: b3 47 c7 02 div a5, a4, a2 +80000cc8: 63 ce f6 0e blt a3, a5, 0x80000dc4 +80000ccc: 63 de f4 0a bge s1, a5, 0x80000d88 +80000cd0: 13 86 f7 ff addi a2, a5, -1 +80000cd4: b3 46 f7 02 div a3, a4, a5 +80000cd8: 13 8a 06 00 mv s4, a3 +80000cdc: 63 16 96 00 bne a2, s1, 0x80000ce8 +80000ce0: 33 67 f7 02 rem a4, a4, a5 +80000ce4: 33 0a d7 00 add s4, a4, a3 +80000ce8: b3 4d aa 03 div s11, s4, s10 +80000cec: 33 6a aa 03 rem s4, s4, s10 +80000cf0: 63 c0 9d 0f blt s11, s9, 0x80000dd0 +80000cf4: b3 e7 9d 03 rem a5, s11, s9 +80000cf8: 33 cb 9d 03 div s6, s11, s9 +80000cfc: 23 26 f1 00 sw a5, 12(sp) +80000d00: 13 85 09 00 mv a0, s3 +80000d04: 23 24 d1 00 sw a3, 8(sp) +80000d08: ef 10 90 0e jal 0x800025f0 <__clzsi2> +80000d0c: 13 09 05 00 mv s2, a0 +80000d10: 13 85 0a 00 mv a0, s5 +80000d14: ef 10 d0 0d jal 0x800025f0 <__clzsi2> +80000d18: 83 26 81 00 lw a3, 8(sp) +80000d1c: 13 07 f0 01 li a4, 31 +80000d20: 33 09 27 41 sub s2, a4, s2 +80000d24: 93 87 f9 ff addi a5, s3, -1 +80000d28: b3 f7 37 01 and a5, a5, s3 +80000d2c: 13 79 f9 0f andi s2, s2, 255 +80000d30: 13 19 89 00 slli s2, s2, 8 +80000d34: 93 b7 17 00 seqz a5, a5 +80000d38: b3 e7 27 01 or a5, a5, s2 +80000d3c: 17 36 00 00 auipc a2, 3 +80000d40: 13 06 06 29 addi a2, a2, 656 +80000d44: 33 07 a7 40 sub a4, a4, a0 +80000d48: 23 16 f1 02 sh a5, 44(sp) +80000d4c: 93 07 41 01 addi a5, sp, 20 +80000d50: 23 2a 81 00 sw s0, 20(sp) +80000d54: 23 2c 81 01 sw s8, 24(sp) +80000d58: 23 2e 71 01 sw s7, 28(sp) +80000d5c: 23 22 61 03 sw s6, 36(sp) +80000d60: 23 07 e1 02 sb a4, 46(sp) +80000d64: b3 86 96 02 mul a3, a3, s1 +80000d68: 93 94 24 00 slli s1, s1, 2 +80000d6c: 33 06 96 00 add a2, a2, s1 +80000d70: 23 20 f6 00 sw a5, 0(a2) +80000d74: 23 20 d1 02 sw a3, 32(sp) +80000d78: 83 26 c1 00 lw a3, 12(sp) +80000d7c: 23 24 d1 02 sw a3, 40(sp) +80000d80: 63 4e b0 05 bgtz s11, 0x80000ddc +80000d84: 63 16 0a 08 bnez s4, 0x80000e10 +80000d88: 83 20 c1 06 lw ra, 108(sp) +80000d8c: 03 24 81 06 lw s0, 104(sp) +80000d90: 83 24 41 06 lw s1, 100(sp) +80000d94: 03 29 01 06 lw s2, 96(sp) +80000d98: 83 29 c1 05 lw s3, 92(sp) +80000d9c: 03 2a 81 05 lw s4, 88(sp) +80000da0: 83 2a 41 05 lw s5, 84(sp) +80000da4: 03 2b 01 05 lw s6, 80(sp) +80000da8: 83 2b c1 04 lw s7, 76(sp) +80000dac: 03 2c 81 04 lw s8, 72(sp) +80000db0: 83 2c 41 04 lw s9, 68(sp) +80000db4: 03 2d 01 04 lw s10, 64(sp) +80000db8: 83 2d c1 03 lw s11, 60(sp) +80000dbc: 13 01 01 07 addi sp, sp, 112 +80000dc0: 67 80 00 00 ret +80000dc4: 93 87 06 00 mv a5, a3 +80000dc8: e3 c4 f4 f0 blt s1, a5, 0x80000cd0 +80000dcc: 6f f0 df fb j 0x80000d88 +80000dd0: 23 26 01 00 sw zero, 12(sp) +80000dd4: 13 0b 10 00 li s6, 1 +80000dd8: 6f f0 9f f2 j 0x80000d00 +80000ddc: 93 87 0d 00 mv a5, s11 +80000de0: 63 d4 bc 01 bge s9, s11, 0x80000de8 +80000de4: 93 87 0c 00 mv a5, s9 +80000de8: 17 07 00 00 auipc a4, 0 +80000dec: 13 07 c7 e3 addi a4, a4, -452 +80000df0: 0b 90 e7 00 vx_wspawn a5, a4 +80000df4: 93 07 f0 ff li a5, -1 +80000df8: 0b 80 07 00 vx_tmc a5 +80000dfc: ef f0 9f c4 jal 0x80000a44 +80000e00: 13 05 10 00 li a0, 1 +80000e04: 0b 00 05 00 vx_tmc a0 +80000e08: ef f0 9f af jal 0x80000900 +80000e0c: e3 0e 0a f6 beqz s4, 0x80000d88 +80000e10: b3 8d ad 03 mul s11, s11, s10 +80000e14: 03 27 01 02 lw a4, 32(sp) +80000e18: 93 07 10 00 li a5, 1 +80000e1c: b3 97 47 01 sll a5, a5, s4 +80000e20: 93 87 f7 ff addi a5, a5, -1 +80000e24: 33 07 b7 01 add a4, a4, s11 +80000e28: 23 20 e1 02 sw a4, 32(sp) +80000e2c: 0b 80 07 00 vx_tmc a5 +80000e30: ef f0 1f d7 jal 0x80000ba0 +80000e34: 13 05 10 00 li a0, 1 +80000e38: 0b 00 05 00 vx_tmc a0 +80000e3c: 6f f0 df f4 j 0x80000d88 + +80000e40 : +80000e40: f3 27 20 cc csrr a5, cid +80000e44: 37 47 00 ff lui a4, 1044484 +80000e48: 13 07 07 04 addi a4, a4, 64 +80000e4c: 93 97 87 00 slli a5, a5, 8 +80000e50: b3 87 e7 00 add a5, a5, a4 +80000e54: 73 27 00 b0 csrr a4, mcycle +80000e58: 23 a0 e7 00 sw a4, 0(a5) +80000e5c: 73 27 10 b0 csrr a4, 2817 +80000e60: 23 a2 e7 00 sw a4, 4(a5) +80000e64: 73 27 20 b0 csrr a4, minstret +80000e68: 23 a4 e7 00 sw a4, 8(a5) +80000e6c: 73 27 30 b0 csrr a4, mhpmcounter3 +80000e70: 23 a6 e7 00 sw a4, 12(a5) +80000e74: 73 27 40 b0 csrr a4, mhpmcounter4 +80000e78: 23 a8 e7 00 sw a4, 16(a5) +80000e7c: 73 27 50 b0 csrr a4, mhpmcounter5 +80000e80: 23 aa e7 00 sw a4, 20(a5) +80000e84: 73 27 60 b0 csrr a4, mhpmcounter6 +80000e88: 23 ac e7 00 sw a4, 24(a5) +80000e8c: 73 27 70 b0 csrr a4, mhpmcounter7 +80000e90: 23 ae e7 00 sw a4, 28(a5) +80000e94: 73 27 80 b0 csrr a4, mhpmcounter8 +80000e98: 23 a0 e7 02 sw a4, 32(a5) +80000e9c: 73 27 90 b0 csrr a4, mhpmcounter9 +80000ea0: 23 a2 e7 02 sw a4, 36(a5) +80000ea4: 73 27 a0 b0 csrr a4, mhpmcounter10 +80000ea8: 23 a4 e7 02 sw a4, 40(a5) +80000eac: 73 27 b0 b0 csrr a4, mhpmcounter11 +80000eb0: 23 a6 e7 02 sw a4, 44(a5) +80000eb4: 73 27 c0 b0 csrr a4, mhpmcounter12 +80000eb8: 23 a8 e7 02 sw a4, 48(a5) +80000ebc: 73 27 d0 b0 csrr a4, mhpmcounter13 +80000ec0: 23 aa e7 02 sw a4, 52(a5) +80000ec4: 73 27 e0 b0 csrr a4, mhpmcounter14 +80000ec8: 23 ac e7 02 sw a4, 56(a5) +80000ecc: 73 27 f0 b0 csrr a4, mhpmcounter15 +80000ed0: 23 ae e7 02 sw a4, 60(a5) +80000ed4: 73 27 00 b1 csrr a4, mhpmcounter16 +80000ed8: 23 a0 e7 04 sw a4, 64(a5) +80000edc: 73 27 10 b1 csrr a4, mhpmcounter17 +80000ee0: 23 a2 e7 04 sw a4, 68(a5) +80000ee4: 73 27 20 b1 csrr a4, mhpmcounter18 +80000ee8: 23 a4 e7 04 sw a4, 72(a5) +80000eec: 73 27 30 b1 csrr a4, mhpmcounter19 +80000ef0: 23 a6 e7 04 sw a4, 76(a5) +80000ef4: 73 27 40 b1 csrr a4, mhpmcounter20 +80000ef8: 23 a8 e7 04 sw a4, 80(a5) +80000efc: 73 27 50 b1 csrr a4, mhpmcounter21 +80000f00: 23 aa e7 04 sw a4, 84(a5) +80000f04: 73 27 60 b1 csrr a4, mhpmcounter22 +80000f08: 23 ac e7 04 sw a4, 88(a5) +80000f0c: 73 27 70 b1 csrr a4, mhpmcounter23 +80000f10: 23 ae e7 04 sw a4, 92(a5) +80000f14: 73 27 80 b1 csrr a4, mhpmcounter24 +80000f18: 23 a0 e7 06 sw a4, 96(a5) +80000f1c: 73 27 90 b1 csrr a4, mhpmcounter25 +80000f20: 23 a2 e7 06 sw a4, 100(a5) +80000f24: 73 27 a0 b1 csrr a4, mhpmcounter26 +80000f28: 23 a4 e7 06 sw a4, 104(a5) +80000f2c: 73 27 b0 b1 csrr a4, mhpmcounter27 +80000f30: 23 a6 e7 06 sw a4, 108(a5) +80000f34: 73 27 c0 b1 csrr a4, mhpmcounter28 +80000f38: 23 a8 e7 06 sw a4, 112(a5) +80000f3c: 73 27 d0 b1 csrr a4, mhpmcounter29 +80000f40: 23 aa e7 06 sw a4, 116(a5) +80000f44: 73 27 e0 b1 csrr a4, mhpmcounter30 +80000f48: 23 ac e7 06 sw a4, 120(a5) +80000f4c: 73 27 f0 b1 csrr a4, mhpmcounter31 +80000f50: 23 ae e7 06 sw a4, 124(a5) +80000f54: 73 27 00 b8 csrr a4, mcycleh +80000f58: 23 a0 e7 08 sw a4, 128(a5) +80000f5c: 73 27 10 b8 csrr a4, 2945 +80000f60: 23 a2 e7 08 sw a4, 132(a5) +80000f64: 73 27 20 b8 csrr a4, minstreth +80000f68: 23 a4 e7 08 sw a4, 136(a5) +80000f6c: 73 27 30 b8 csrr a4, mhpmcounter3h +80000f70: 23 a6 e7 08 sw a4, 140(a5) +80000f74: 73 27 40 b8 csrr a4, mhpmcounter4h +80000f78: 23 a8 e7 08 sw a4, 144(a5) +80000f7c: 73 27 50 b8 csrr a4, mhpmcounter5h +80000f80: 23 aa e7 08 sw a4, 148(a5) +80000f84: 73 27 60 b8 csrr a4, mhpmcounter6h +80000f88: 23 ac e7 08 sw a4, 152(a5) +80000f8c: 73 27 70 b8 csrr a4, mhpmcounter7h +80000f90: 23 ae e7 08 sw a4, 156(a5) +80000f94: 73 27 80 b8 csrr a4, mhpmcounter8h +80000f98: 23 a0 e7 0a sw a4, 160(a5) +80000f9c: 73 27 90 b8 csrr a4, mhpmcounter9h +80000fa0: 23 a2 e7 0a sw a4, 164(a5) +80000fa4: 73 27 a0 b8 csrr a4, mhpmcounter10h +80000fa8: 23 a4 e7 0a sw a4, 168(a5) +80000fac: 73 27 b0 b8 csrr a4, mhpmcounter11h +80000fb0: 23 a6 e7 0a sw a4, 172(a5) +80000fb4: 73 27 c0 b8 csrr a4, mhpmcounter12h +80000fb8: 23 a8 e7 0a sw a4, 176(a5) +80000fbc: 73 27 d0 b8 csrr a4, mhpmcounter13h +80000fc0: 23 aa e7 0a sw a4, 180(a5) +80000fc4: 73 27 e0 b8 csrr a4, mhpmcounter14h +80000fc8: 23 ac e7 0a sw a4, 184(a5) +80000fcc: 73 27 f0 b8 csrr a4, mhpmcounter15h +80000fd0: 23 ae e7 0a sw a4, 188(a5) +80000fd4: 73 27 00 b9 csrr a4, mhpmcounter16h +80000fd8: 23 a0 e7 0c sw a4, 192(a5) +80000fdc: 73 27 10 b9 csrr a4, mhpmcounter17h +80000fe0: 23 a2 e7 0c sw a4, 196(a5) +80000fe4: 73 27 20 b9 csrr a4, mhpmcounter18h +80000fe8: 23 a4 e7 0c sw a4, 200(a5) +80000fec: 73 27 30 b9 csrr a4, mhpmcounter19h +80000ff0: 23 a6 e7 0c sw a4, 204(a5) +80000ff4: 73 27 40 b9 csrr a4, mhpmcounter20h +80000ff8: 23 a8 e7 0c sw a4, 208(a5) +80000ffc: 73 27 50 b9 csrr a4, mhpmcounter21h +80001000: 23 aa e7 0c sw a4, 212(a5) +80001004: 73 27 60 b9 csrr a4, mhpmcounter22h +80001008: 23 ac e7 0c sw a4, 216(a5) +8000100c: 73 27 70 b9 csrr a4, mhpmcounter23h +80001010: 23 ae e7 0c sw a4, 220(a5) +80001014: 73 27 80 b9 csrr a4, mhpmcounter24h +80001018: 23 a0 e7 0e sw a4, 224(a5) +8000101c: 73 27 90 b9 csrr a4, mhpmcounter25h +80001020: 23 a2 e7 0e sw a4, 228(a5) +80001024: 73 27 a0 b9 csrr a4, mhpmcounter26h +80001028: 23 a4 e7 0e sw a4, 232(a5) +8000102c: 73 27 b0 b9 csrr a4, mhpmcounter27h +80001030: 23 a6 e7 0e sw a4, 236(a5) +80001034: 73 27 c0 b9 csrr a4, mhpmcounter28h +80001038: 23 a8 e7 0e sw a4, 240(a5) +8000103c: 73 27 d0 b9 csrr a4, mhpmcounter29h +80001040: 23 aa e7 0e sw a4, 244(a5) +80001044: 73 27 e0 b9 csrr a4, mhpmcounter30h +80001048: 23 ac e7 0e sw a4, 248(a5) +8000104c: 73 27 f0 b9 csrr a4, mhpmcounter31h +80001050: 23 ae e7 0e sw a4, 252(a5) +80001054: 67 80 00 00 ret + +80001058 : +80001058: d3 07 05 e0 fmv.x.w a5, fa0 +8000105c: b7 16 49 3f lui a3, 259217 +80001060: 93 86 86 fd addi a3, a3, -40 +80001064: 13 97 17 00 slli a4, a5, 1 +80001068: 13 57 17 00 srli a4, a4, 1 +8000106c: 63 fc e6 04 bgeu a3, a4, 0x800010c4 +80001070: b7 06 80 7f lui a3, 522240 +80001074: 63 66 d7 00 bltu a4, a3, 0x80001080 +80001078: 53 75 a5 08 fsub.s fa0, fa0, fa0 +8000107c: 67 80 00 00 ret +80001080: 13 01 01 fe addi sp, sp, -32 +80001084: 13 05 81 00 addi a0, sp, 8 +80001088: 23 2e 11 00 sw ra, 28(sp) +8000108c: ef 00 00 11 jal 0x8000119c <__ieee754_rem_pio2f> +80001090: 13 75 35 00 andi a0, a0, 3 +80001094: 93 07 10 00 li a5, 1 +80001098: 63 0a f5 02 beq a0, a5, 0x800010cc +8000109c: 93 07 20 00 li a5, 2 +800010a0: 87 25 c1 00 flw fa1, 12(sp) +800010a4: 07 25 81 00 flw fa0, 8(sp) +800010a8: 63 02 f5 04 beq a0, a5, 0x800010ec +800010ac: 63 0c 05 02 beqz a0, 0x800010e4 +800010b0: 13 05 10 00 li a0, 1 +800010b4: ef 00 10 64 jal 0x80001ef4 <__kernel_sinf> +800010b8: 83 20 c1 01 lw ra, 28(sp) +800010bc: 13 01 01 02 addi sp, sp, 32 +800010c0: 67 80 00 00 ret +800010c4: d3 05 00 f0 fmv.w.x fa1, zero +800010c8: 6f 00 00 3f j 0x800014b8 <__kernel_cosf> +800010cc: 87 25 c1 00 flw fa1, 12(sp) +800010d0: 07 25 81 00 flw fa0, 8(sp) +800010d4: 13 05 10 00 li a0, 1 +800010d8: ef 00 d0 61 jal 0x80001ef4 <__kernel_sinf> +800010dc: 53 15 a5 20 fneg.s fa0, fa0 +800010e0: 6f f0 9f fd j 0x800010b8 +800010e4: ef 00 40 3d jal 0x800014b8 <__kernel_cosf> +800010e8: 6f f0 1f fd j 0x800010b8 +800010ec: ef 00 c0 3c jal 0x800014b8 <__kernel_cosf> +800010f0: 53 15 a5 20 fneg.s fa0, fa0 +800010f4: 6f f0 5f fc j 0x800010b8 + +800010f8 : +800010f8: d3 07 05 e0 fmv.x.w a5, fa0 +800010fc: b7 16 49 3f lui a3, 259217 +80001100: 93 86 86 fd addi a3, a3, -40 +80001104: 13 97 17 00 slli a4, a5, 1 +80001108: 13 57 17 00 srli a4, a4, 1 +8000110c: 63 fc e6 04 bgeu a3, a4, 0x80001164 +80001110: b7 06 80 7f lui a3, 522240 +80001114: 63 66 d7 00 bltu a4, a3, 0x80001120 +80001118: 53 75 a5 08 fsub.s fa0, fa0, fa0 +8000111c: 67 80 00 00 ret +80001120: 13 01 01 fe addi sp, sp, -32 +80001124: 13 05 81 00 addi a0, sp, 8 +80001128: 23 2e 11 00 sw ra, 28(sp) +8000112c: ef 00 00 07 jal 0x8000119c <__ieee754_rem_pio2f> +80001130: 13 75 35 00 andi a0, a0, 3 +80001134: 93 07 10 00 li a5, 1 +80001138: 63 0c f5 02 beq a0, a5, 0x80001170 +8000113c: 93 07 20 00 li a5, 2 +80001140: 87 25 c1 00 flw fa1, 12(sp) +80001144: 07 25 81 00 flw fa0, 8(sp) +80001148: 63 02 f5 04 beq a0, a5, 0x8000118c +8000114c: 63 0a 05 02 beqz a0, 0x80001180 +80001150: ef 00 80 36 jal 0x800014b8 <__kernel_cosf> +80001154: 53 15 a5 20 fneg.s fa0, fa0 +80001158: 83 20 c1 01 lw ra, 28(sp) +8000115c: 13 01 01 02 addi sp, sp, 32 +80001160: 67 80 00 00 ret +80001164: d3 05 00 f0 fmv.w.x fa1, zero +80001168: 13 05 00 00 li a0, 0 +8000116c: 6f 00 90 58 j 0x80001ef4 <__kernel_sinf> +80001170: 87 25 c1 00 flw fa1, 12(sp) +80001174: 07 25 81 00 flw fa0, 8(sp) +80001178: ef 00 00 34 jal 0x800014b8 <__kernel_cosf> +8000117c: 6f f0 df fd j 0x80001158 +80001180: 13 05 10 00 li a0, 1 +80001184: ef 00 10 57 jal 0x80001ef4 <__kernel_sinf> +80001188: 6f f0 1f fd j 0x80001158 +8000118c: 13 05 10 00 li a0, 1 +80001190: ef 00 50 56 jal 0x80001ef4 <__kernel_sinf> +80001194: 53 15 a5 20 fneg.s fa0, fa0 +80001198: 6f f0 1f fc j 0x80001158 + +8000119c <__ieee754_rem_pio2f>: +8000119c: 13 01 01 fd addi sp, sp, -48 +800011a0: 23 22 91 02 sw s1, 36(sp) +800011a4: d3 04 05 e0 fmv.x.w s1, fa0 +800011a8: 23 20 21 03 sw s2, 32(sp) +800011ac: 37 09 00 80 lui s2, 524288 +800011b0: 23 24 81 02 sw s0, 40(sp) +800011b4: b7 17 49 3f lui a5, 259217 +800011b8: 13 44 f9 ff not s0, s2 +800011bc: 23 2e 31 01 sw s3, 28(sp) +800011c0: 23 26 11 02 sw ra, 44(sp) +800011c4: 23 2c 41 01 sw s4, 24(sp) +800011c8: 33 74 94 00 and s0, s0, s1 +800011cc: 93 87 87 fd addi a5, a5, -40 +800011d0: 93 09 05 00 mv s3, a0 +800011d4: 63 f6 87 12 bgeu a5, s0, 0x80001300 <__ieee754_rem_pio2f+0x164> +800011d8: b7 d7 16 40 lui a5, 262509 +800011dc: 93 87 37 be addi a5, a5, -1053 +800011e0: 13 8a 04 00 mv s4, s1 +800011e4: 63 e4 87 06 bltu a5, s0, 0x8000124c <__ieee754_rem_pio2f+0xb0> +800011e8: 97 37 00 00 auipc a5, 3 +800011ec: 87 a7 87 d5 flw fa5, -680(a5) +800011f0: 13 49 09 ff xori s2, s2, -16 +800011f4: b7 17 c9 3f lui a5, 261265 +800011f8: 33 79 99 00 and s2, s2, s1 +800011fc: 93 87 07 fd addi a5, a5, -48 +80001200: 63 54 90 26 blez s1, 0x80001468 <__ieee754_rem_pio2f+0x2cc> +80001204: d3 77 f5 08 fsub.s fa5, fa0, fa5 +80001208: 63 0e f9 10 beq s2, a5, 0x80001324 <__ieee754_rem_pio2f+0x188> +8000120c: 97 37 00 00 auipc a5, 3 +80001210: 87 a6 87 d3 flw fa3, -712(a5) +80001214: 53 f7 d7 08 fsub.s fa4, fa5, fa3 +80001218: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +8000121c: d3 f7 d7 08 fsub.s fa5, fa5, fa3 +80001220: 27 a0 e9 00 fsw fa4, 0(s3) +80001224: 27 a2 f9 00 fsw fa5, 4(s3) +80001228: 13 05 10 00 li a0, 1 +8000122c: 83 20 c1 02 lw ra, 44(sp) +80001230: 03 24 81 02 lw s0, 40(sp) +80001234: 83 24 41 02 lw s1, 36(sp) +80001238: 03 29 01 02 lw s2, 32(sp) +8000123c: 83 29 c1 01 lw s3, 28(sp) +80001240: 03 2a 81 01 lw s4, 24(sp) +80001244: 13 01 01 03 addi sp, sp, 48 +80001248: 67 80 00 00 ret +8000124c: b7 17 49 43 lui a5, 275601 +80001250: 93 87 07 f8 addi a5, a5, -128 +80001254: 63 fa 87 0e bgeu a5, s0, 0x80001348 <__ieee754_rem_pio2f+0x1ac> +80001258: b7 07 80 7f lui a5, 522240 +8000125c: 63 7a f4 0a bgeu s0, a5, 0x80001310 <__ieee754_rem_pio2f+0x174> +80001260: 13 56 74 41 srai a2, s0, 23 +80001264: 13 06 a6 f7 addi a2, a2, -134 +80001268: 93 17 76 01 slli a5, a2, 23 +8000126c: 33 04 f4 40 sub s0, s0, a5 +80001270: d3 07 04 f0 fmv.w.x fa5, s0 +80001274: 17 37 00 00 auipc a4, 3 +80001278: 87 26 c7 ce flw fa3, -788(a4) +8000127c: 53 06 00 f0 fmv.w.x fa2, zero +80001280: d3 97 07 c0 fcvt.w.s a5, fa5, rtz +80001284: 93 06 30 00 li a3, 3 +80001288: 53 f7 07 d0 fcvt.s.w fa4, a5 +8000128c: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001290: 27 22 e1 00 fsw fa4, 4(sp) +80001294: d3 f7 d7 10 fmul.s fa5, fa5, fa3 +80001298: d3 97 07 c0 fcvt.w.s a5, fa5, rtz +8000129c: 53 f7 07 d0 fcvt.s.w fa4, a5 +800012a0: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +800012a4: 27 24 e1 00 fsw fa4, 8(sp) +800012a8: d3 f7 d7 10 fmul.s fa5, fa5, fa3 +800012ac: d3 a7 c7 a0 feq.s a5, fa5, fa2 +800012b0: 27 26 f1 00 fsw fa5, 12(sp) +800012b4: 63 88 07 00 beqz a5, 0x800012c4 <__ieee754_rem_pio2f+0x128> +800012b8: d3 26 c7 a0 feq.s a3, fa4, fa2 +800012bc: 93 b6 16 00 seqz a3, a3 +800012c0: 93 86 16 00 addi a3, a3, 1 +800012c4: 97 17 00 00 auipc a5, 1 +800012c8: 93 87 07 40 addi a5, a5, 1024 +800012cc: 13 07 20 00 li a4, 2 +800012d0: 93 85 09 00 mv a1, s3 +800012d4: 13 05 41 00 addi a0, sp, 4 +800012d8: ef 00 c0 32 jal 0x80001604 <__kernel_rem_pio2f> +800012dc: e3 58 0a f4 bgez s4, 0x8000122c <__ieee754_rem_pio2f+0x90> +800012e0: 07 a7 09 00 flw fa4, 0(s3) +800012e4: 87 a7 49 00 flw fa5, 4(s3) +800012e8: 33 05 a0 40 neg a0, a0 +800012ec: 53 17 e7 20 fneg.s fa4, fa4 +800012f0: d3 97 f7 20 fneg.s fa5, fa5 +800012f4: 27 a0 e9 00 fsw fa4, 0(s3) +800012f8: 27 a2 f9 00 fsw fa5, 4(s3) +800012fc: 6f f0 1f f3 j 0x8000122c <__ieee754_rem_pio2f+0x90> +80001300: 27 a0 a9 00 fsw fa0, 0(s3) +80001304: 23 22 05 00 sw zero, 4(a0) +80001308: 13 05 00 00 li a0, 0 +8000130c: 6f f0 1f f2 j 0x8000122c <__ieee754_rem_pio2f+0x90> +80001310: d3 77 a5 08 fsub.s fa5, fa0, fa0 +80001314: 27 22 f5 00 fsw fa5, 4(a0) +80001318: 27 20 f5 00 fsw fa5, 0(a0) +8000131c: 13 05 00 00 li a0, 0 +80001320: 6f f0 df f0 j 0x8000122c <__ieee754_rem_pio2f+0x90> +80001324: 97 37 00 00 auipc a5, 3 +80001328: 07 a7 47 c2 flw fa4, -988(a5) +8000132c: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001330: 97 37 00 00 auipc a5, 3 +80001334: 87 a6 c7 c1 flw fa3, -996(a5) +80001338: 53 f7 d7 08 fsub.s fa4, fa5, fa3 +8000133c: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001340: d3 f7 d7 08 fsub.s fa5, fa5, fa3 +80001344: 6f f0 df ed j 0x80001220 <__ieee754_rem_pio2f+0x84> +80001348: ef 00 90 45 jal 0x80001fa0 +8000134c: 97 37 00 00 auipc a5, 3 +80001350: 87 a6 47 c0 flw fa3, -1020(a5) +80001354: 97 37 00 00 auipc a5, 3 +80001358: 07 a6 07 c0 flw fa2, -1024(a5) +8000135c: c3 76 d5 60 fmadd.s fa3, fa0, fa3, fa2 +80001360: 97 37 00 00 auipc a5, 3 +80001364: 87 a7 07 be flw fa5, -1056(a5) +80001368: 97 37 00 00 auipc a5, 3 +8000136c: 07 a7 c7 bd flw fa4, -1060(a5) +80001370: 93 07 f0 01 li a5, 31 +80001374: 53 95 06 c0 fcvt.w.s a0, fa3, rtz +80001378: d3 76 05 d0 fcvt.s.w fa3, a0 +8000137c: cb f7 f6 50 fnmsub.s fa5, fa3, fa5, fa0 +80001380: 53 f7 e6 10 fmul.s fa4, fa3, fa4 +80001384: 63 c0 a7 06 blt a5, a0, 0x800013e4 <__ieee754_rem_pio2f+0x248> +80001388: 13 07 f5 ff addi a4, a0, -1 +8000138c: 13 17 27 00 slli a4, a4, 2 +80001390: 97 17 00 00 auipc a5, 1 +80001394: 93 87 47 2b addi a5, a5, 692 +80001398: b3 87 e7 00 add a5, a5, a4 +8000139c: 83 a7 07 00 lw a5, 0(a5) +800013a0: 13 49 09 f0 xori s2, s2, -256 +800013a4: 33 79 99 00 and s2, s2, s1 +800013a8: 63 0e f9 02 beq s2, a5, 0x800013e4 <__ieee754_rem_pio2f+0x248> +800013ac: d3 f6 e7 08 fsub.s fa3, fa5, fa4 +800013b0: d3 87 06 e0 fmv.x.w a5, fa3 +800013b4: d3 86 07 f0 fmv.w.x fa3, a5 +800013b8: 23 a0 f9 00 sw a5, 0(s3) +800013bc: d3 f7 d7 08 fsub.s fa5, fa5, fa3 +800013c0: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +800013c4: 27 a2 f9 00 fsw fa5, 4(s3) +800013c8: e3 52 0a e6 bgez s4, 0x8000122c <__ieee754_rem_pio2f+0x90> +800013cc: 53 97 d6 20 fneg.s fa4, fa3 +800013d0: d3 97 f7 20 fneg.s fa5, fa5 +800013d4: 33 05 a0 40 neg a0, a0 +800013d8: 27 a0 e9 00 fsw fa4, 0(s3) +800013dc: 27 a2 f9 00 fsw fa5, 4(s3) +800013e0: 6f f0 df e4 j 0x8000122c <__ieee754_rem_pio2f+0x90> +800013e4: 53 f6 e7 08 fsub.s fa2, fa5, fa4 +800013e8: 13 54 74 41 srai s0, s0, 23 +800013ec: 93 06 80 00 li a3, 8 +800013f0: d3 07 06 e0 fmv.x.w a5, fa2 +800013f4: 13 d7 77 01 srli a4, a5, 23 +800013f8: 13 77 f7 0f andi a4, a4, 255 +800013fc: 33 07 e4 40 sub a4, s0, a4 +80001400: e3 da e6 fa bge a3, a4, 0x800013b4 <__ieee754_rem_pio2f+0x218> +80001404: 97 37 00 00 auipc a5, 3 +80001408: 87 a5 47 b4 flw fa1, -1212(a5) +8000140c: 4b f6 b6 78 fnmsub.s fa2, fa3, fa1, fa5 +80001410: 97 37 00 00 auipc a5, 3 +80001414: 07 a7 c7 b3 flw fa4, -1220(a5) +80001418: 93 06 90 01 li a3, 25 +8000141c: 53 f5 c7 08 fsub.s fa0, fa5, fa2 +80001420: d3 07 c6 20 fmv.s fa5, fa2 +80001424: cb f5 b6 50 fnmsub.s fa1, fa3, fa1, fa0 +80001428: 47 f7 e6 58 fmsub.s fa4, fa3, fa4, fa1 +8000142c: d3 75 e6 08 fsub.s fa1, fa2, fa4 +80001430: d3 87 05 e0 fmv.x.w a5, fa1 +80001434: 13 d7 77 01 srli a4, a5, 23 +80001438: 13 77 f7 0f andi a4, a4, 255 +8000143c: 33 04 e4 40 sub s0, s0, a4 +80001440: e3 da 86 f6 bge a3, s0, 0x800013b4 <__ieee754_rem_pio2f+0x218> +80001444: 97 37 00 00 auipc a5, 3 +80001448: 87 a5 47 b1 flw fa1, -1260(a5) +8000144c: cb f7 b6 60 fnmsub.s fa5, fa3, fa1, fa2 +80001450: 97 37 00 00 auipc a5, 3 +80001454: 07 a7 c7 b0 flw fa4, -1268(a5) +80001458: 53 76 f6 08 fsub.s fa2, fa2, fa5 +8000145c: cb f5 b6 60 fnmsub.s fa1, fa3, fa1, fa2 +80001460: 47 f7 e6 58 fmsub.s fa4, fa3, fa4, fa1 +80001464: 6f f0 9f f4 j 0x800013ac <__ieee754_rem_pio2f+0x210> +80001468: d3 77 f5 00 fadd.s fa5, fa0, fa5 +8000146c: 63 04 f9 02 beq s2, a5, 0x80001494 <__ieee754_rem_pio2f+0x2f8> +80001470: 97 37 00 00 auipc a5, 3 +80001474: 87 a6 47 ad flw fa3, -1324(a5) +80001478: 53 f7 d7 00 fadd.s fa4, fa5, fa3 +8000147c: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001480: d3 f7 d7 00 fadd.s fa5, fa5, fa3 +80001484: 27 a0 e9 00 fsw fa4, 0(s3) +80001488: 27 a2 f9 00 fsw fa5, 4(s3) +8000148c: 13 05 f0 ff li a0, -1 +80001490: 6f f0 df d9 j 0x8000122c <__ieee754_rem_pio2f+0x90> +80001494: 97 37 00 00 auipc a5, 3 +80001498: 07 a7 47 ab flw fa4, -1356(a5) +8000149c: d3 f7 e7 00 fadd.s fa5, fa5, fa4 +800014a0: 97 37 00 00 auipc a5, 3 +800014a4: 87 a6 c7 aa flw fa3, -1364(a5) +800014a8: 53 f7 d7 00 fadd.s fa4, fa5, fa3 +800014ac: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +800014b0: d3 f7 d7 00 fadd.s fa5, fa5, fa3 +800014b4: 6f f0 1f fd j 0x80001484 <__ieee754_rem_pio2f+0x2e8> + +800014b8 <__kernel_cosf>: +800014b8: d3 07 05 e0 fmv.x.w a5, fa0 +800014bc: b7 06 00 32 lui a3, 204800 +800014c0: 13 97 17 00 slli a4, a5, 1 +800014c4: 13 57 17 00 srli a4, a4, 1 +800014c8: 63 70 d7 08 bgeu a4, a3, 0x80001548 <__kernel_cosf+0x90> +800014cc: 53 17 05 c0 fcvt.w.s a4, fa0, rtz +800014d0: 63 04 07 12 beqz a4, 0x800015f8 <__kernel_cosf+0x140> +800014d4: 53 77 a5 10 fmul.s fa4, fa0, fa0 +800014d8: 17 37 00 00 auipc a4, 3 +800014dc: 87 26 c7 a9 flw fa3, -1380(a4) +800014e0: 17 37 00 00 auipc a4, 3 +800014e4: 87 27 07 a9 flw fa5, -1392(a4) +800014e8: 17 37 00 00 auipc a4, 3 +800014ec: 07 20 07 a9 flw ft0, -1392(a4) +800014f0: 17 37 00 00 auipc a4, 3 +800014f4: 07 25 c7 a8 flw fa0, -1396(a4) +800014f8: c3 77 f7 68 fmadd.s fa5, fa4, fa5, fa3 +800014fc: 17 37 00 00 auipc a4, 3 +80001500: 07 26 47 a8 flw fa2, -1404(a4) +80001504: 17 37 00 00 auipc a4, 3 +80001508: 87 26 07 a8 flw fa3, -1408(a4) +8000150c: c3 f7 e7 00 fmadd.s fa5, fa5, fa4, ft0 +80001510: c3 77 f7 50 fmadd.s fa5, fa4, fa5, fa0 +80001514: c3 77 f7 60 fmadd.s fa5, fa4, fa5, fa2 +80001518: c3 77 f7 68 fmadd.s fa5, fa4, fa5, fa3 +8000151c: d3 77 f7 10 fmul.s fa5, fa4, fa5 +80001520: d3 86 07 f0 fmv.w.x fa3, a5 +80001524: 97 37 00 00 auipc a5, 3 +80001528: 07 a5 87 a4 flw fa0, -1464(a5) +8000152c: d3 f5 b6 10 fmul.s fa1, fa3, fa1 +80001530: 97 37 00 00 auipc a5, 3 +80001534: 87 a6 47 a2 flw fa3, -1500(a5) +80001538: c7 77 f7 58 fmsub.s fa5, fa4, fa5, fa1 +8000153c: c7 77 d7 78 fmsub.s fa5, fa4, fa3, fa5 +80001540: 53 75 f5 08 fsub.s fa0, fa0, fa5 +80001544: 67 80 00 00 ret +80001548: 53 77 a5 10 fmul.s fa4, fa0, fa0 +8000154c: 97 36 00 00 auipc a3, 3 +80001550: 87 a6 86 a2 flw fa3, -1496(a3) +80001554: 97 36 00 00 auipc a3, 3 +80001558: 87 a7 c6 a1 flw fa5, -1508(a3) +8000155c: 97 36 00 00 auipc a3, 3 +80001560: 07 a0 c6 a1 flw ft0, -1508(a3) +80001564: 97 36 00 00 auipc a3, 3 +80001568: 07 a5 86 a1 flw fa0, -1512(a3) +8000156c: c3 77 f7 68 fmadd.s fa5, fa4, fa5, fa3 +80001570: 97 36 00 00 auipc a3, 3 +80001574: 07 a6 06 a1 flw fa2, -1520(a3) +80001578: 97 36 00 00 auipc a3, 3 +8000157c: 87 a6 c6 a0 flw fa3, -1524(a3) +80001580: b7 a6 99 3e lui a3, 256410 +80001584: 93 86 96 99 addi a3, a3, -1639 +80001588: c3 f7 e7 00 fmadd.s fa5, fa5, fa4, ft0 +8000158c: c3 f7 e7 50 fmadd.s fa5, fa5, fa4, fa0 +80001590: c3 f7 e7 60 fmadd.s fa5, fa5, fa4, fa2 +80001594: c3 f7 e7 68 fmadd.s fa5, fa5, fa4, fa3 +80001598: d3 f7 e7 10 fmul.s fa5, fa5, fa4 +8000159c: e3 f2 e6 f8 bgeu a3, a4, 0x80001520 <__kernel_cosf+0x68> +800015a0: b7 06 48 3f lui a3, 259200 +800015a4: 63 e0 e6 04 bltu a3, a4, 0x800015e4 <__kernel_cosf+0x12c> +800015a8: b7 06 00 ff lui a3, 1044480 +800015ac: 33 07 d7 00 add a4, a4, a3 +800015b0: d3 06 07 f0 fmv.w.x fa3, a4 +800015b4: 97 36 00 00 auipc a3, 3 +800015b8: 07 a5 86 9b flw fa0, -1608(a3) +800015bc: 53 75 d5 08 fsub.s fa0, fa0, fa3 +800015c0: 53 86 07 f0 fmv.w.x fa2, a5 +800015c4: d3 75 b6 10 fmul.s fa1, fa2, fa1 +800015c8: 97 37 00 00 auipc a5, 3 +800015cc: 07 a6 c7 98 flw fa2, -1652(a5) +800015d0: c7 76 c7 68 fmsub.s fa3, fa4, fa2, fa3 +800015d4: c7 77 f7 58 fmsub.s fa5, fa4, fa5, fa1 +800015d8: d3 f7 f6 08 fsub.s fa5, fa3, fa5 +800015dc: 53 75 f5 08 fsub.s fa0, fa0, fa5 +800015e0: 67 80 00 00 ret +800015e4: 17 37 00 00 auipc a4, 3 +800015e8: 07 25 07 98 flw fa0, -1664(a4) +800015ec: 17 37 00 00 auipc a4, 3 +800015f0: 87 26 c7 97 flw fa3, -1668(a4) +800015f4: 6f f0 df fc j 0x800015c0 <__kernel_cosf+0x108> +800015f8: 97 37 00 00 auipc a5, 3 +800015fc: 07 a5 47 97 flw fa0, -1676(a5) +80001600: 67 80 00 00 ret + +80001604 <__kernel_rem_pio2f>: +80001604: 13 01 01 e3 addi sp, sp, -464 +80001608: 13 18 27 00 slli a6, a4, 2 +8000160c: 23 22 e1 02 sw a4, 36(sp) +80001610: 17 17 00 00 auipc a4, 1 +80001614: 13 07 87 3f addi a4, a4, 1016 +80001618: 23 24 81 1c sw s0, 456(sp) +8000161c: 23 2e 31 1b sw s3, 444(sp) +80001620: 23 26 71 1b sw s7, 428(sp) +80001624: 33 07 07 01 add a4, a4, a6 +80001628: 23 26 11 1c sw ra, 460(sp) +8000162c: 23 22 91 1c sw s1, 452(sp) +80001630: 23 20 21 1d sw s2, 448(sp) +80001634: 23 2c 41 1b sw s4, 440(sp) +80001638: 23 2a 51 1b sw s5, 436(sp) +8000163c: 23 28 61 1b sw s6, 432(sp) +80001640: 23 24 81 1b sw s8, 424(sp) +80001644: 23 22 91 1b sw s9, 420(sp) +80001648: 23 20 a1 1b sw s10, 416(sp) +8000164c: 23 2e b1 19 sw s11, 412(sp) +80001650: 27 26 81 18 fsw fs0, 396(sp) +80001654: 27 24 91 18 fsw fs1, 392(sp) +80001658: 27 22 21 19 fsw fs2, 388(sp) +8000165c: 27 20 31 19 fsw fs3, 384(sp) +80001660: 27 2e 41 17 fsw fs4, 380(sp) +80001664: 27 2c 51 17 fsw fs5, 376(sp) +80001668: 27 2a 61 17 fsw fs6, 372(sp) +8000166c: 23 2a d1 00 sw a3, 20(sp) +80001670: 23 26 c1 02 sw a2, 44(sp) +80001674: 93 08 c0 ff li a7, -4 +80001678: 23 20 b1 02 sw a1, 32(sp) +8000167c: 23 2c f1 00 sw a5, 24(sp) +80001680: 83 2b 07 00 lw s7, 0(a4) +80001684: 93 09 05 00 mv s3, a0 +80001688: 13 84 f6 ff addi s0, a3, -1 +8000168c: 63 44 16 7b blt a2, a7, 0x80001e34 <__kernel_rem_pio2f+0x830> +80001690: 93 07 d6 ff addi a5, a2, -3 +80001694: 93 d4 f7 41 srai s1, a5, 31 +80001698: 93 f4 74 00 andi s1, s1, 7 +8000169c: b3 84 f4 00 add s1, s1, a5 +800016a0: 93 d7 34 40 srai a5, s1, 3 +800016a4: 93 8c 17 00 addi s9, a5, 1 +800016a8: 23 28 f1 00 sw a5, 16(sp) +800016ac: 93 97 3c 00 slli a5, s9, 3 +800016b0: 23 24 f1 02 sw a5, 40(sp) +800016b4: 83 27 c1 02 lw a5, 44(sp) +800016b8: 83 26 81 02 lw a3, 40(sp) +800016bc: 33 87 8b 00 add a4, s7, s0 +800016c0: 33 8a d7 40 sub s4, a5, a3 +800016c4: 83 27 01 01 lw a5, 16(sp) +800016c8: b3 87 87 40 sub a5, a5, s0 +800016cc: 63 40 07 04 bltz a4, 0x8000170c <__kernel_rem_pio2f+0x108> +800016d0: 83 26 81 01 lw a3, 24(sp) +800016d4: 13 05 17 00 addi a0, a4, 1 +800016d8: 93 95 27 00 slli a1, a5, 2 +800016dc: 13 07 01 08 addi a4, sp, 128 +800016e0: b3 85 b6 00 add a1, a3, a1 +800016e4: 33 05 f5 00 add a0, a0, a5 +800016e8: d3 07 00 f0 fmv.w.x fa5, zero +800016ec: 63 c6 07 00 bltz a5, 0x800016f8 <__kernel_rem_pio2f+0xf4> +800016f0: 03 a3 05 00 lw t1, 0(a1) +800016f4: d3 77 03 d0 fcvt.s.w fa5, t1 +800016f8: 93 87 17 00 addi a5, a5, 1 +800016fc: 27 20 f7 00 fsw fa5, 0(a4) +80001700: 13 07 47 00 addi a4, a4, 4 +80001704: 93 85 45 00 addi a1, a1, 4 +80001708: e3 90 a7 fe bne a5, a0, 0x800016e8 <__kernel_rem_pio2f+0xe4> +8000170c: 63 c2 0b 06 bltz s7, 0x80001770 <__kernel_rem_pio2f+0x16c> +80001710: 93 17 24 00 slli a5, s0, 2 +80001714: 13 07 01 08 addi a4, sp, 128 +80001718: 93 85 47 00 addi a1, a5, 4 +8000171c: 33 05 f7 00 add a0, a4, a5 +80001720: 83 27 41 01 lw a5, 20(sp) +80001724: 13 0e 01 12 addi t3, sp, 288 +80001728: 13 03 04 00 mv t1, s0 +8000172c: b3 8e fb 00 add t4, s7, a5 +80001730: b3 85 35 01 add a1, a1, s3 +80001734: d3 07 00 f0 fmv.w.x fa5, zero +80001738: 13 07 05 00 mv a4, a0 +8000173c: 93 87 09 00 mv a5, s3 +80001740: 63 4e 04 00 bltz s0, 0x8000175c <__kernel_rem_pio2f+0x158> +80001744: 87 a6 07 00 flw fa3, 0(a5) +80001748: 07 27 07 00 flw fa4, 0(a4) +8000174c: 93 87 47 00 addi a5, a5, 4 +80001750: 13 07 c7 ff addi a4, a4, -4 +80001754: c3 f7 e6 78 fmadd.s fa5, fa3, fa4, fa5 +80001758: e3 96 b7 fe bne a5, a1, 0x80001744 <__kernel_rem_pio2f+0x140> +8000175c: 27 20 fe 00 fsw fa5, 0(t3) +80001760: 13 03 13 00 addi t1, t1, 1 +80001764: 13 0e 4e 00 addi t3, t3, 4 +80001768: 13 05 45 00 addi a0, a0, 4 +8000176c: e3 14 d3 fd bne t1, t4, 0x80001734 <__kernel_rem_pio2f+0x130> +80001770: 03 27 41 01 lw a4, 20(sp) +80001774: 93 97 2b 00 slli a5, s7, 2 +80001778: 93 0a 01 03 addi s5, sp, 48 +8000177c: 13 8b 87 ff addi s6, a5, -8 +80001780: 13 1d 27 00 slli s10, a4, 2 +80001784: 13 07 c1 02 addi a4, sp, 44 +80001788: b3 04 f7 00 add s1, a4, a5 +8000178c: b3 87 6a 01 add a5, s5, s6 +80001790: 23 2e f1 00 sw a5, 28(sp) +80001794: 97 27 00 00 auipc a5, 2 +80001798: 87 a4 87 7f flw fs1, 2040(a5) +8000179c: 97 27 00 00 auipc a5, 2 +800017a0: 07 a4 47 7f flw fs0, 2036(a5) +800017a4: 97 27 00 00 auipc a5, 2 +800017a8: 07 a9 87 7c flw fs2, 1992(a5) +800017ac: b7 07 00 40 lui a5, 262144 +800017b0: 93 87 f7 ff addi a5, a5, -1 +800017b4: 13 89 fb ff addi s2, s7, -1 +800017b8: 23 26 f1 00 sw a5, 12(sp) +800017bc: 13 19 29 00 slli s2, s2, 2 +800017c0: 97 27 00 00 auipc a5, 2 +800017c4: 87 aa 87 7c flw fs5, 1992(a5) +800017c8: 97 27 00 00 auipc a5, 2 +800017cc: 07 aa 87 79 flw fs4, 1944(a5) +800017d0: 97 27 00 00 auipc a5, 2 +800017d4: 87 a9 47 78 flw fs3, 1924(a5) +800017d8: 93 07 09 14 addi a5, s2, 320 +800017dc: 33 8d a9 01 add s10, s3, s10 +800017e0: 13 8b 0b 00 mv s6, s7 +800017e4: 33 89 57 01 add s2, a5, s5 +800017e8: 93 1d 2b 00 slli s11, s6, 2 +800017ec: 93 87 0d 14 addi a5, s11, 320 +800017f0: 13 07 01 03 addi a4, sp, 48 +800017f4: b3 87 e7 00 add a5, a5, a4 +800017f8: 07 a5 07 fb flw fa0, -80(a5) +800017fc: 63 56 60 05 blez s6, 0x80001848 <__kernel_rem_pio2f+0x244> +80001800: 83 27 c1 00 lw a5, 12(sp) +80001804: 13 0f 01 12 addi t5, sp, 288 +80001808: 13 85 0a 00 mv a0, s5 +8000180c: b3 07 fb 00 add a5, s6, a5 +80001810: 93 97 27 00 slli a5, a5, 2 +80001814: b3 07 ff 00 add a5, t5, a5 +80001818: d3 77 55 11 fmul.s fa5, fa0, fs5 +8000181c: 87 a6 07 00 flw fa3, 0(a5) +80001820: 13 05 45 00 addi a0, a0, 4 +80001824: 13 8e 07 00 mv t3, a5 +80001828: 93 87 c7 ff addi a5, a5, -4 +8000182c: d3 9e 07 c0 fcvt.w.s t4, fa5, rtz +80001830: d3 f7 0e d0 fcvt.s.w fa5, t4 +80001834: 4b f7 47 51 fnmsub.s fa4, fa5, fs4, fa0 +80001838: 53 f5 d7 00 fadd.s fa0, fa5, fa3 +8000183c: d3 1e 07 c0 fcvt.w.s t4, fa4, rtz +80001840: 23 2e d5 ff sw t4, -4(a0) +80001844: e3 1a cf fd bne t5, t3, 0x80001818 <__kernel_rem_pio2f+0x214> +80001848: 13 05 0a 00 mv a0, s4 +8000184c: ef 00 90 02 jal 0x80002074 +80001850: 53 0b a5 20 fmv.s fs6, fa0 +80001854: 53 75 95 10 fmul.s fa0, fa0, fs1 +80001858: ef 00 00 75 jal 0x80001fa8 +8000185c: cb 77 85 b0 fnmsub.s fa5, fa0, fs0, fs6 +80001860: d3 9c 07 c0 fcvt.w.s s9, fa5, rtz +80001864: 53 f7 0c d0 fcvt.s.w fa4, s9 +80001868: 53 fb e7 08 fsub.s fs6, fa5, fa4 +8000186c: 63 5a 40 13 blez s4, 0x800019a0 <__kernel_rem_pio2f+0x39c> +80001870: 93 07 fb ff addi a5, s6, -1 +80001874: 93 97 27 00 slli a5, a5, 2 +80001878: 93 87 07 14 addi a5, a5, 320 +8000187c: 13 07 01 03 addi a4, sp, 48 +80001880: b3 87 e7 00 add a5, a5, a4 +80001884: 03 ae 07 ec lw t3, -320(a5) +80001888: 13 05 80 00 li a0, 8 +8000188c: 33 05 45 41 sub a0, a0, s4 +80001890: 33 5f ae 40 sra t5, t3, a0 +80001894: 33 15 af 00 sll a0, t5, a0 +80001898: 33 0e ae 40 sub t3, t3, a0 +8000189c: 13 05 70 00 li a0, 7 +800018a0: 33 05 45 41 sub a0, a0, s4 +800018a4: 23 a0 c7 ed sw t3, -320(a5) +800018a8: 33 5c ae 40 sra s8, t3, a0 +800018ac: b3 8c ec 01 add s9, s9, t5 +800018b0: 63 48 80 31 bgtz s8, 0x80001bc0 <__kernel_rem_pio2f+0x5bc> +800018b4: 53 07 00 f0 fmv.w.x fa4, zero +800018b8: d3 27 eb a0 feq.s a5, fs6, fa4 +800018bc: 63 80 07 1c beqz a5, 0x80001a7c <__kernel_rem_pio2f+0x478> +800018c0: 63 d6 6b 03 bge s7, s6, 0x800018ec <__kernel_rem_pio2f+0x2e8> +800018c4: 83 27 c1 00 lw a5, 12(sp) +800018c8: 13 05 00 00 li a0, 0 +800018cc: b3 07 fb 00 add a5, s6, a5 +800018d0: 93 97 27 00 slli a5, a5, 2 +800018d4: b3 87 fa 00 add a5, s5, a5 +800018d8: 03 af 07 00 lw t5, 0(a5) +800018dc: 93 87 c7 ff addi a5, a5, -4 +800018e0: 33 65 e5 01 or a0, a0, t5 +800018e4: e3 9a 97 fe bne a5, s1, 0x800018d8 <__kernel_rem_pio2f+0x2d4> +800018e8: 63 10 05 32 bnez a0, 0x80001c08 <__kernel_rem_pio2f+0x604> +800018ec: 83 27 09 ec lw a5, -320(s2) +800018f0: 63 94 07 30 bnez a5, 0x80001bf8 <__kernel_rem_pio2f+0x5f4> +800018f4: 83 27 c1 01 lw a5, 28(sp) +800018f8: 13 05 10 00 li a0, 1 +800018fc: 03 ae 07 00 lw t3, 0(a5) +80001900: 13 05 15 00 addi a0, a0, 1 +80001904: 93 87 c7 ff addi a5, a5, -4 +80001908: e3 0a 0e fe beqz t3, 0x800018fc <__kernel_rem_pio2f+0x2f8> +8000190c: 93 07 1b 00 addi a5, s6, 1 +80001910: 93 8f 07 00 mv t6, a5 +80001914: 33 0f ab 00 add t5, s6, a0 +80001918: 03 27 01 01 lw a4, 16(sp) +8000191c: 83 26 81 01 lw a3, 24(sp) +80001920: 33 0e f7 00 add t3, a4, a5 +80001924: 03 27 41 01 lw a4, 20(sp) +80001928: 13 1e 2e 00 slli t3, t3, 2 +8000192c: 33 8e c6 01 add t3, a3, t3 +80001930: 33 07 67 01 add a4, a4, s6 +80001934: 13 17 27 00 slli a4, a4, 2 +80001938: 93 06 01 08 addi a3, sp, 128 +8000193c: 93 97 27 00 slli a5, a5, 2 +80001940: 33 85 e6 00 add a0, a3, a4 +80001944: 13 07 01 12 addi a4, sp, 288 +80001948: b3 0e f7 00 add t4, a4, a5 +8000194c: 83 27 0e 00 lw a5, 0(t3) +80001950: d3 f7 07 d0 fcvt.s.w fa5, a5 +80001954: 27 20 f5 00 fsw fa5, 0(a0) +80001958: d3 07 00 f0 fmv.w.x fa5, zero +8000195c: 63 42 04 02 bltz s0, 0x80001980 <__kernel_rem_pio2f+0x37c> +80001960: 13 07 05 00 mv a4, a0 +80001964: 93 87 09 00 mv a5, s3 +80001968: 87 a6 07 00 flw fa3, 0(a5) +8000196c: 07 27 07 00 flw fa4, 0(a4) +80001970: 93 87 47 00 addi a5, a5, 4 +80001974: 13 07 c7 ff addi a4, a4, -4 +80001978: c3 f7 e6 78 fmadd.s fa5, fa3, fa4, fa5 +8000197c: e3 96 a7 ff bne a5, s10, 0x80001968 <__kernel_rem_pio2f+0x364> +80001980: 27 a0 fe 00 fsw fa5, 0(t4) +80001984: 93 8f 1f 00 addi t6, t6, 1 +80001988: 13 0e 4e 00 addi t3, t3, 4 +8000198c: 13 05 45 00 addi a0, a0, 4 +80001990: 93 8e 4e 00 addi t4, t4, 4 +80001994: e3 5c ff fb bge t5, t6, 0x8000194c <__kernel_rem_pio2f+0x348> +80001998: 13 0b 0f 00 mv s6, t5 +8000199c: 6f f0 df e4 j 0x800017e8 <__kernel_rem_pio2f+0x1e4> +800019a0: 63 10 0a 20 bnez s4, 0x80001ba0 <__kernel_rem_pio2f+0x59c> +800019a4: 93 07 fb ff addi a5, s6, -1 +800019a8: 93 97 27 00 slli a5, a5, 2 +800019ac: 93 87 07 14 addi a5, a5, 320 +800019b0: 13 07 01 03 addi a4, sp, 48 +800019b4: b3 87 e7 00 add a5, a5, a4 +800019b8: 03 ae 07 ec lw t3, -320(a5) +800019bc: 13 5c 7e 40 srai s8, t3, 7 +800019c0: e3 5a 80 ef blez s8, 0x800018b4 <__kernel_rem_pio2f+0x2b0> +800019c4: 93 8c 1c 00 addi s9, s9, 1 +800019c8: 63 5c 60 4d blez s6, 0x80001ea0 <__kernel_rem_pio2f+0x89c> +800019cc: 93 87 0a 00 mv a5, s5 +800019d0: 13 0f 00 00 li t5, 0 +800019d4: 93 0f 00 00 li t6, 0 +800019d8: 93 03 f0 0f li t2, 255 +800019dc: 93 02 00 10 li t0, 256 +800019e0: 03 a5 07 00 lw a0, 0(a5) +800019e4: 63 90 0f 02 bnez t6, 0x80001a04 <__kernel_rem_pio2f+0x400> +800019e8: b3 80 a2 40 sub ra, t0, a0 +800019ec: 63 02 05 02 beqz a0, 0x80001a10 <__kernel_rem_pio2f+0x40c> +800019f0: 23 a0 17 00 sw ra, 0(a5) +800019f4: 13 0f 1f 00 addi t5, t5, 1 +800019f8: 93 87 47 00 addi a5, a5, 4 +800019fc: 63 58 6f 43 bge t5, s6, 0x80001e2c <__kernel_rem_pio2f+0x828> +80001a00: 03 a5 07 00 lw a0, 0(a5) +80001a04: 33 85 a3 40 sub a0, t2, a0 +80001a08: 93 0f 10 00 li t6, 1 +80001a0c: 23 a0 a7 00 sw a0, 0(a5) +80001a10: 13 0f 1f 00 addi t5, t5, 1 +80001a14: 93 87 47 00 addi a5, a5, 4 +80001a18: e3 44 6f fd blt t5, s6, 0x800019e0 <__kernel_rem_pio2f+0x3dc> +80001a1c: 63 5a 40 03 blez s4, 0x80001a50 <__kernel_rem_pio2f+0x44c> +80001a20: 93 07 10 00 li a5, 1 +80001a24: 63 08 fa 1a beq s4, a5, 0x80001bd4 <__kernel_rem_pio2f+0x5d0> +80001a28: 93 07 20 00 li a5, 2 +80001a2c: 63 12 fa 02 bne s4, a5, 0x80001a50 <__kernel_rem_pio2f+0x44c> +80001a30: 93 07 fb ff addi a5, s6, -1 +80001a34: 93 97 27 00 slli a5, a5, 2 +80001a38: 93 87 07 14 addi a5, a5, 320 +80001a3c: 13 07 01 03 addi a4, sp, 48 +80001a40: b3 87 e7 00 add a5, a5, a4 +80001a44: 03 a5 07 ec lw a0, -320(a5) +80001a48: 13 75 f5 03 andi a0, a0, 63 +80001a4c: 23 a0 a7 ec sw a0, -320(a5) +80001a50: 93 07 20 00 li a5, 2 +80001a54: e3 10 fc e6 bne s8, a5, 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001a58: 53 7b 69 09 fsub.s fs6, fs2, fs6 +80001a5c: e3 8c 0f e4 beqz t6, 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001a60: 53 05 29 21 fmv.s fa0, fs2 +80001a64: 13 05 0a 00 mv a0, s4 +80001a68: ef 00 c0 60 jal 0x80002074 +80001a6c: 53 7b ab 08 fsub.s fs6, fs6, fa0 +80001a70: 53 07 00 f0 fmv.w.x fa4, zero +80001a74: d3 27 eb a0 feq.s a5, fs6, fa4 +80001a78: e3 94 07 e4 bnez a5, 0x800018c0 <__kernel_rem_pio2f+0x2bc> +80001a7c: 83 27 81 02 lw a5, 40(sp) +80001a80: 03 27 c1 02 lw a4, 44(sp) +80001a84: 53 05 6b 21 fmv.s fa0, fs6 +80001a88: 33 85 e7 40 sub a0, a5, a4 +80001a8c: ef 00 80 5e jal 0x80002074 +80001a90: 97 27 00 00 auipc a5, 2 +80001a94: 07 a7 07 4d flw fa4, 1232(a5) +80001a98: d3 07 a7 a0 fle.s a5, fa4, fa0 +80001a9c: 63 84 07 3a beqz a5, 0x80001e44 <__kernel_rem_pio2f+0x840> +80001aa0: 97 27 00 00 auipc a5, 2 +80001aa4: 87 a6 87 4e flw fa3, 1256(a5) +80001aa8: d3 76 d5 10 fmul.s fa3, fa0, fa3 +80001aac: 13 07 01 03 addi a4, sp, 48 +80001ab0: 93 87 0d 14 addi a5, s11, 320 +80001ab4: 13 04 1b 00 addi s0, s6, 1 +80001ab8: b3 8d e7 00 add s11, a5, a4 +80001abc: 93 17 24 00 slli a5, s0, 2 +80001ac0: 93 87 07 14 addi a5, a5, 320 +80001ac4: b3 87 e7 00 add a5, a5, a4 +80001ac8: 53 97 06 c0 fcvt.w.s a4, fa3, rtz +80001acc: 13 0a 8a 00 addi s4, s4, 8 +80001ad0: d3 76 07 d0 fcvt.s.w fa3, a4 +80001ad4: 4b f7 e6 50 fnmsub.s fa4, fa3, fa4, fa0 +80001ad8: 53 97 06 c0 fcvt.w.s a4, fa3, rtz +80001adc: 53 16 07 c0 fcvt.w.s a2, fa4, rtz +80001ae0: 23 a0 cd ec sw a2, -320(s11) +80001ae4: 23 a0 e7 ec sw a4, -320(a5) +80001ae8: 53 05 29 21 fmv.s fa0, fs2 +80001aec: 13 05 0a 00 mv a0, s4 +80001af0: ef 00 40 58 jal 0x80002074 +80001af4: 53 07 a5 20 fmv.s fa4, fa0 +80001af8: 63 42 04 16 bltz s0, 0x80001c5c <__kernel_rem_pio2f+0x658> +80001afc: 13 15 24 00 slli a0, s0, 2 +80001b00: 93 07 01 12 addi a5, sp, 288 +80001b04: 33 88 a7 00 add a6, a5, a0 +80001b08: 13 07 08 00 mv a4, a6 +80001b0c: b3 87 aa 00 add a5, s5, a0 +80001b10: 97 26 00 00 auipc a3, 2 +80001b14: 87 a6 86 47 flw fa3, 1144(a3) +80001b18: 83 a5 07 00 lw a1, 0(a5) +80001b1c: 13 07 c7 ff addi a4, a4, -4 +80001b20: 13 86 07 00 mv a2, a5 +80001b24: d3 f7 05 d0 fcvt.s.w fa5, a1 +80001b28: 93 87 c7 ff addi a5, a5, -4 +80001b2c: d3 f7 e7 10 fmul.s fa5, fa5, fa4 +80001b30: 53 77 d7 10 fmul.s fa4, fa4, fa3 +80001b34: 27 22 f7 00 fsw fa5, 4(a4) +80001b38: e3 90 ca fe bne s5, a2, 0x80001b18 <__kernel_rem_pio2f+0x514> +80001b3c: 13 03 01 0d addi t1, sp, 208 +80001b40: 93 08 03 00 mv a7, t1 +80001b44: 93 05 00 00 li a1, 0 +80001b48: d3 07 00 f0 fmv.w.x fa5, zero +80001b4c: 63 cc 0b 02 bltz s7, 0x80001b84 <__kernel_rem_pio2f+0x580> +80001b50: 17 17 00 00 auipc a4, 1 +80001b54: 13 07 c7 e8 addi a4, a4, -372 +80001b58: 13 06 08 00 mv a2, a6 +80001b5c: 93 07 00 00 li a5, 0 +80001b60: 6f 00 c0 00 j 0x80001b6c <__kernel_rem_pio2f+0x568> +80001b64: 13 06 46 00 addi a2, a2, 4 +80001b68: 63 ce f5 00 blt a1, a5, 0x80001b84 <__kernel_rem_pio2f+0x580> +80001b6c: 87 26 07 00 flw fa3, 0(a4) +80001b70: 07 27 06 00 flw fa4, 0(a2) +80001b74: 93 87 17 00 addi a5, a5, 1 +80001b78: 13 07 47 00 addi a4, a4, 4 +80001b7c: c3 f7 e6 78 fmadd.s fa5, fa3, fa4, fa5 +80001b80: e3 d2 fb fe bge s7, a5, 0x80001b64 <__kernel_rem_pio2f+0x560> +80001b84: 27 a0 f8 00 fsw fa5, 0(a7) +80001b88: 93 87 15 00 addi a5, a1, 1 +80001b8c: 93 88 48 00 addi a7, a7, 4 +80001b90: 13 08 c8 ff addi a6, a6, -4 +80001b94: 63 86 85 14 beq a1, s0, 0x80001ce0 <__kernel_rem_pio2f+0x6dc> +80001b98: 93 85 07 00 mv a1, a5 +80001b9c: 6f f0 df fa j 0x80001b48 <__kernel_rem_pio2f+0x544> +80001ba0: d3 87 69 a1 fle.s a5, fs3, fs6 +80001ba4: 13 0c 00 00 li s8, 0 +80001ba8: e3 86 07 d0 beqz a5, 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001bac: 93 8c 1c 00 addi s9, s9, 1 +80001bb0: 13 0c 20 00 li s8, 2 +80001bb4: e3 4c 60 e1 bgtz s6, 0x800019cc <__kernel_rem_pio2f+0x3c8> +80001bb8: 53 7b 69 09 fsub.s fs6, fs2, fs6 +80001bbc: 6f f0 9f cf j 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001bc0: 93 8c 1c 00 addi s9, s9, 1 +80001bc4: 93 0f 00 00 li t6, 0 +80001bc8: e3 42 60 e1 bgtz s6, 0x800019cc <__kernel_rem_pio2f+0x3c8> +80001bcc: 93 07 10 00 li a5, 1 +80001bd0: e3 1c fa e4 bne s4, a5, 0x80001a28 <__kernel_rem_pio2f+0x424> +80001bd4: 93 07 fb ff addi a5, s6, -1 +80001bd8: 93 97 27 00 slli a5, a5, 2 +80001bdc: 93 87 07 14 addi a5, a5, 320 +80001be0: 13 07 01 03 addi a4, sp, 48 +80001be4: b3 87 e7 00 add a5, a5, a4 +80001be8: 03 a5 07 ec lw a0, -320(a5) +80001bec: 13 75 f5 07 andi a0, a0, 127 +80001bf0: 23 a0 a7 ec sw a0, -320(a5) +80001bf4: 6f f0 df e5 j 0x80001a50 <__kernel_rem_pio2f+0x44c> +80001bf8: 93 07 1b 00 addi a5, s6, 1 +80001bfc: 93 8f 07 00 mv t6, a5 +80001c00: 13 8f 07 00 mv t5, a5 +80001c04: 6f f0 5f d1 j 0x80001918 <__kernel_rem_pio2f+0x314> +80001c08: 13 04 fb ff addi s0, s6, -1 +80001c0c: 93 17 24 00 slli a5, s0, 2 +80001c10: 93 87 07 14 addi a5, a5, 320 +80001c14: 13 07 01 03 addi a4, sp, 48 +80001c18: b3 87 e7 00 add a5, a5, a4 +80001c1c: 83 a7 07 ec lw a5, -320(a5) +80001c20: 13 0a 8a ff addi s4, s4, -8 +80001c24: e3 92 07 ec bnez a5, 0x80001ae8 <__kernel_rem_pio2f+0x4e4> +80001c28: 93 17 2b 00 slli a5, s6, 2 +80001c2c: 93 87 87 ff addi a5, a5, -8 +80001c30: b3 87 fa 00 add a5, s5, a5 +80001c34: 03 a7 07 00 lw a4, 0(a5) +80001c38: 13 04 f4 ff addi s0, s0, -1 +80001c3c: 93 87 c7 ff addi a5, a5, -4 +80001c40: 13 0a 8a ff addi s4, s4, -8 +80001c44: e3 08 07 fe beqz a4, 0x80001c34 <__kernel_rem_pio2f+0x630> +80001c48: 53 05 29 21 fmv.s fa0, fs2 +80001c4c: 13 05 0a 00 mv a0, s4 +80001c50: ef 00 40 42 jal 0x80002074 +80001c54: 53 07 a5 20 fmv.s fa4, fa0 +80001c58: e3 52 04 ea bgez s0, 0x80001afc <__kernel_rem_pio2f+0x4f8> +80001c5c: 03 27 41 02 lw a4, 36(sp) +80001c60: 93 07 20 00 li a5, 2 +80001c64: 63 c6 e7 24 blt a5, a4, 0x80001eb0 <__kernel_rem_pio2f+0x8ac> +80001c68: 63 4e e0 24 bgtz a4, 0x80001ec4 <__kernel_rem_pio2f+0x8c0> +80001c6c: d3 07 00 f0 fmv.w.x fa5, zero +80001c70: 63 1a 07 00 bnez a4, 0x80001c84 <__kernel_rem_pio2f+0x680> +80001c74: 63 04 0c 00 beqz s8, 0x80001c7c <__kernel_rem_pio2f+0x678> +80001c78: d3 97 f7 20 fneg.s fa5, fa5 +80001c7c: 83 27 01 02 lw a5, 32(sp) +80001c80: 27 a0 f7 00 fsw fa5, 0(a5) +80001c84: 83 20 c1 1c lw ra, 460(sp) +80001c88: 03 24 81 1c lw s0, 456(sp) +80001c8c: 83 24 41 1c lw s1, 452(sp) +80001c90: 03 29 01 1c lw s2, 448(sp) +80001c94: 83 29 c1 1b lw s3, 444(sp) +80001c98: 03 2a 81 1b lw s4, 440(sp) +80001c9c: 83 2a 41 1b lw s5, 436(sp) +80001ca0: 03 2b 01 1b lw s6, 432(sp) +80001ca4: 83 2b c1 1a lw s7, 428(sp) +80001ca8: 03 2c 81 1a lw s8, 424(sp) +80001cac: 03 2d 01 1a lw s10, 416(sp) +80001cb0: 83 2d c1 19 lw s11, 412(sp) +80001cb4: 07 24 c1 18 flw fs0, 396(sp) +80001cb8: 87 24 81 18 flw fs1, 392(sp) +80001cbc: 07 29 41 18 flw fs2, 388(sp) +80001cc0: 87 29 01 18 flw fs3, 384(sp) +80001cc4: 07 2a c1 17 flw fs4, 380(sp) +80001cc8: 87 2a 81 17 flw fs5, 376(sp) +80001ccc: 07 2b 41 17 flw fs6, 372(sp) +80001cd0: 13 f5 7c 00 andi a0, s9, 7 +80001cd4: 83 2c 41 1a lw s9, 420(sp) +80001cd8: 13 01 01 1d addi sp, sp, 464 +80001cdc: 67 80 00 00 ret +80001ce0: 03 27 41 02 lw a4, 36(sp) +80001ce4: 93 07 20 00 li a5, 2 +80001ce8: 63 c6 e7 08 blt a5, a4, 0x80001d74 <__kernel_rem_pio2f+0x770> +80001cec: d3 07 00 f0 fmv.w.x fa5, zero +80001cf0: b3 07 a3 00 add a5, t1, a0 +80001cf4: 63 42 e0 02 bgtz a4, 0x80001d18 <__kernel_rem_pio2f+0x714> +80001cf8: e3 16 07 f8 bnez a4, 0x80001c84 <__kernel_rem_pio2f+0x680> +80001cfc: 07 a7 07 00 flw fa4, 0(a5) +80001d00: 13 87 07 00 mv a4, a5 +80001d04: 93 87 c7 ff addi a5, a5, -4 +80001d08: d3 f7 e7 00 fadd.s fa5, fa5, fa4 +80001d0c: e3 18 e3 fe bne t1, a4, 0x80001cfc <__kernel_rem_pio2f+0x6f8> +80001d10: e3 06 0c f6 beqz s8, 0x80001c7c <__kernel_rem_pio2f+0x678> +80001d14: 6f f0 5f f6 j 0x80001c78 <__kernel_rem_pio2f+0x674> +80001d18: 07 a7 07 00 flw fa4, 0(a5) +80001d1c: 13 87 07 00 mv a4, a5 +80001d20: 93 87 c7 ff addi a5, a5, -4 +80001d24: d3 f7 e7 00 fadd.s fa5, fa5, fa4 +80001d28: e3 18 e3 fe bne t1, a4, 0x80001d18 <__kernel_rem_pio2f+0x714> +80001d2c: 63 1a 0c 12 bnez s8, 0x80001e60 <__kernel_rem_pio2f+0x85c> +80001d30: 83 27 01 02 lw a5, 32(sp) +80001d34: 07 27 01 0d flw fa4, 208(sp) +80001d38: 27 a0 f7 00 fsw fa5, 0(a5) +80001d3c: d3 77 f7 08 fsub.s fa5, fa4, fa5 +80001d40: 63 04 04 02 beqz s0, 0x80001d68 <__kernel_rem_pio2f+0x764> +80001d44: 13 07 41 0d addi a4, sp, 212 +80001d48: 93 07 10 00 li a5, 1 +80001d4c: 07 27 07 00 flw fa4, 0(a4) +80001d50: 93 87 17 00 addi a5, a5, 1 +80001d54: 13 07 47 00 addi a4, a4, 4 +80001d58: d3 f7 e7 00 fadd.s fa5, fa5, fa4 +80001d5c: e3 58 f4 fe bge s0, a5, 0x80001d4c <__kernel_rem_pio2f+0x748> +80001d60: 63 04 0c 00 beqz s8, 0x80001d68 <__kernel_rem_pio2f+0x764> +80001d64: d3 97 f7 20 fneg.s fa5, fa5 +80001d68: 83 27 01 02 lw a5, 32(sp) +80001d6c: 27 a2 f7 00 fsw fa5, 4(a5) +80001d70: 6f f0 5f f1 j 0x80001c84 <__kernel_rem_pio2f+0x680> +80001d74: 03 27 41 02 lw a4, 36(sp) +80001d78: 93 07 30 00 li a5, 3 +80001d7c: e3 14 f7 f0 bne a4, a5, 0x80001c84 <__kernel_rem_pio2f+0x680> +80001d80: 63 0e 04 12 beqz s0, 0x80001ebc <__kernel_rem_pio2f+0x8b8> +80001d84: b3 06 a3 00 add a3, t1, a0 +80001d88: 93 07 c5 ff addi a5, a0, -4 +80001d8c: 07 a7 06 00 flw fa4, 0(a3) +80001d90: b3 07 f3 00 add a5, t1, a5 +80001d94: 13 87 07 00 mv a4, a5 +80001d98: 87 27 07 00 flw fa5, 0(a4) +80001d9c: d3 06 e7 20 fmv.s fa3, fa4 +80001da0: 13 06 07 00 mv a2, a4 +80001da4: 53 77 f7 00 fadd.s fa4, fa4, fa5 +80001da8: 13 07 c7 ff addi a4, a4, -4 +80001dac: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001db0: 27 22 e7 00 fsw fa4, 4(a4) +80001db4: d3 f7 d7 00 fadd.s fa5, fa5, fa3 +80001db8: 27 24 f7 00 fsw fa5, 8(a4) +80001dbc: e3 1e 66 fc bne a2, t1, 0x80001d98 <__kernel_rem_pio2f+0x794> +80001dc0: 13 07 10 00 li a4, 1 +80001dc4: 63 0c e4 0e beq s0, a4, 0x80001ebc <__kernel_rem_pio2f+0x8b8> +80001dc8: 07 a7 06 00 flw fa4, 0(a3) +80001dcc: 87 a7 07 00 flw fa5, 0(a5) +80001dd0: d3 06 e7 20 fmv.s fa3, fa4 +80001dd4: 13 87 07 00 mv a4, a5 +80001dd8: 53 77 f7 00 fadd.s fa4, fa4, fa5 +80001ddc: 93 87 c7 ff addi a5, a5, -4 +80001de0: d3 f7 e7 08 fsub.s fa5, fa5, fa4 +80001de4: 27 a2 e7 00 fsw fa4, 4(a5) +80001de8: d3 f7 d7 00 fadd.s fa5, fa5, fa3 +80001dec: 27 a4 f7 00 fsw fa5, 8(a5) +80001df0: e3 1e f3 fc bne t1, a5, 0x80001dcc <__kernel_rem_pio2f+0x7c8> +80001df4: d3 07 00 f0 fmv.w.x fa5, zero +80001df8: 93 87 06 00 mv a5, a3 +80001dfc: 07 a7 07 00 flw fa4, 0(a5) +80001e00: 93 87 c7 ff addi a5, a5, -4 +80001e04: d3 f7 e7 00 fadd.s fa5, fa5, fa4 +80001e08: e3 1a f7 fe bne a4, a5, 0x80001dfc <__kernel_rem_pio2f+0x7f8> +80001e0c: 87 26 01 0d flw fa3, 208(sp) +80001e10: 07 27 41 0d flw fa4, 212(sp) +80001e14: 63 16 0c 06 bnez s8, 0x80001e80 <__kernel_rem_pio2f+0x87c> +80001e18: 83 27 01 02 lw a5, 32(sp) +80001e1c: 27 a0 d7 00 fsw fa3, 0(a5) +80001e20: 27 a2 e7 00 fsw fa4, 4(a5) +80001e24: 27 a4 f7 00 fsw fa5, 8(a5) +80001e28: 6f f0 df e5 j 0x80001c84 <__kernel_rem_pio2f+0x680> +80001e2c: 93 0f 10 00 li t6, 1 +80001e30: 6f f0 df be j 0x80001a1c <__kernel_rem_pio2f+0x418> +80001e34: 93 07 80 00 li a5, 8 +80001e38: 23 24 f1 02 sw a5, 40(sp) +80001e3c: 23 28 01 00 sw zero, 16(sp) +80001e40: 6f f0 5f 87 j 0x800016b4 <__kernel_rem_pio2f+0xb0> +80001e44: d3 17 05 c0 fcvt.w.s a5, fa0, rtz +80001e48: 13 87 0d 14 addi a4, s11, 320 +80001e4c: 93 06 01 03 addi a3, sp, 48 +80001e50: b3 0d d7 00 add s11, a4, a3 +80001e54: 13 04 0b 00 mv s0, s6 +80001e58: 23 a0 fd ec sw a5, -320(s11) +80001e5c: 6f f0 df c8 j 0x80001ae8 <__kernel_rem_pio2f+0x4e4> +80001e60: 53 97 f7 20 fneg.s fa4, fa5 +80001e64: 83 27 01 02 lw a5, 32(sp) +80001e68: 27 a0 e7 00 fsw fa4, 0(a5) +80001e6c: 07 27 01 0d flw fa4, 208(sp) +80001e70: d3 77 f7 08 fsub.s fa5, fa4, fa5 +80001e74: e3 18 04 ec bnez s0, 0x80001d44 <__kernel_rem_pio2f+0x740> +80001e78: d3 97 f7 20 fneg.s fa5, fa5 +80001e7c: 6f f0 df ee j 0x80001d68 <__kernel_rem_pio2f+0x764> +80001e80: 83 27 01 02 lw a5, 32(sp) +80001e84: d3 96 d6 20 fneg.s fa3, fa3 +80001e88: 53 17 e7 20 fneg.s fa4, fa4 +80001e8c: d3 97 f7 20 fneg.s fa5, fa5 +80001e90: 27 a0 d7 00 fsw fa3, 0(a5) +80001e94: 27 a2 e7 00 fsw fa4, 4(a5) +80001e98: 27 a4 f7 00 fsw fa5, 8(a5) +80001e9c: 6f f0 9f de j 0x80001c84 <__kernel_rem_pio2f+0x680> +80001ea0: 93 07 20 00 li a5, 2 +80001ea4: e3 18 fc a0 bne s8, a5, 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001ea8: 53 7b 69 09 fsub.s fs6, fs2, fs6 +80001eac: 6f f0 9f a0 j 0x800018b4 <__kernel_rem_pio2f+0x2b0> +80001eb0: 03 27 41 02 lw a4, 36(sp) +80001eb4: 93 07 30 00 li a5, 3 +80001eb8: e3 16 f7 dc bne a4, a5, 0x80001c84 <__kernel_rem_pio2f+0x680> +80001ebc: d3 07 00 f0 fmv.w.x fa5, zero +80001ec0: 6f f0 df f4 j 0x80001e0c <__kernel_rem_pio2f+0x808> +80001ec4: 63 1a 0c 00 bnez s8, 0x80001ed8 <__kernel_rem_pio2f+0x8d4> +80001ec8: 83 27 01 02 lw a5, 32(sp) +80001ecc: 87 27 01 0d flw fa5, 208(sp) +80001ed0: 23 a0 07 00 sw zero, 0(a5) +80001ed4: 6f f0 5f e9 j 0x80001d68 <__kernel_rem_pio2f+0x764> +80001ed8: 97 27 00 00 auipc a5, 2 +80001edc: 07 a7 c7 0b flw fa4, 188(a5) +80001ee0: 87 27 01 0d flw fa5, 208(sp) +80001ee4: 83 27 01 02 lw a5, 32(sp) +80001ee8: d3 97 f7 20 fneg.s fa5, fa5 +80001eec: 27 a0 e7 00 fsw fa4, 0(a5) +80001ef0: 6f f0 9f e7 j 0x80001d68 <__kernel_rem_pio2f+0x764> + +80001ef4 <__kernel_sinf>: +80001ef4: d3 07 05 e0 fmv.x.w a5, fa0 +80001ef8: b7 06 00 32 lui a3, 204800 +80001efc: 13 97 17 00 slli a4, a5, 1 +80001f00: 13 57 17 00 srli a4, a4, 1 +80001f04: 63 76 d7 00 bgeu a4, a3, 0x80001f10 <__kernel_sinf+0x1c> +80001f08: 53 17 05 c0 fcvt.w.s a4, fa0, rtz +80001f0c: 63 08 07 08 beqz a4, 0x80001f9c <__kernel_sinf+0xa8> +80001f10: d3 87 07 f0 fmv.w.x fa5, a5 +80001f14: 17 27 00 00 auipc a4, 2 +80001f18: 87 26 87 08 flw fa3, 136(a4) +80001f1c: 17 27 00 00 auipc a4, 2 +80001f20: 07 20 47 08 flw ft0, 132(a4) +80001f24: 53 f7 f7 10 fmul.s fa4, fa5, fa5 +80001f28: 17 27 00 00 auipc a4, 2 +80001f2c: 87 27 07 07 flw fa5, 112(a4) +80001f30: 17 27 00 00 auipc a4, 2 +80001f34: 07 26 47 07 flw fa2, 116(a4) +80001f38: 53 85 07 f0 fmv.w.x fa0, a5 +80001f3c: c3 77 f7 68 fmadd.s fa5, fa4, fa5, fa3 +80001f40: 17 27 00 00 auipc a4, 2 +80001f44: 87 26 87 06 flw fa3, 104(a4) +80001f48: 53 75 e5 10 fmul.s fa0, fa0, fa4 +80001f4c: c3 f7 e7 00 fmadd.s fa5, fa5, fa4, ft0 +80001f50: c3 f7 e7 60 fmadd.s fa5, fa5, fa4, fa2 +80001f54: c3 f7 e7 68 fmadd.s fa5, fa5, fa4, fa3 +80001f58: 63 1e 05 00 bnez a0, 0x80001f74 <__kernel_sinf+0x80> +80001f5c: 17 27 00 00 auipc a4, 2 +80001f60: 87 26 07 05 flw fa3, 80(a4) +80001f64: 43 77 f7 68 fmadd.s fa4, fa4, fa5, fa3 +80001f68: d3 87 07 f0 fmv.w.x fa5, a5 +80001f6c: 43 75 a7 78 fmadd.s fa0, fa4, fa0, fa5 +80001f70: 67 80 00 00 ret +80001f74: d3 77 f5 10 fmul.s fa5, fa0, fa5 +80001f78: 17 27 00 00 auipc a4, 2 +80001f7c: 87 26 c7 fd flw fa3, -36(a4) +80001f80: 17 27 00 00 auipc a4, 2 +80001f84: 07 26 07 03 flw fa2, 48(a4) +80001f88: c7 f7 d5 78 fmsub.s fa5, fa1, fa3, fa5 +80001f8c: c7 f7 e7 58 fmsub.s fa5, fa5, fa4, fa1 +80001f90: 43 75 c5 78 fmadd.s fa0, fa0, fa2, fa5 +80001f94: d3 87 07 f0 fmv.w.x fa5, a5 +80001f98: 53 f5 a7 08 fsub.s fa0, fa5, fa0 +80001f9c: 67 80 00 00 ret + +80001fa0 : +80001fa0: 53 25 a5 20 fabs.s fa0, fa0 +80001fa4: 67 80 00 00 ret + +80001fa8 : +80001fa8: d3 07 05 e0 fmv.x.w a5, fa0 +80001fac: 13 06 60 01 li a2, 22 +80001fb0: 93 96 17 00 slli a3, a5, 1 +80001fb4: 13 d7 86 01 srli a4, a3, 24 +80001fb8: 13 07 17 f8 addi a4, a4, -127 +80001fbc: 93 d6 16 00 srli a3, a3, 1 +80001fc0: 63 46 e6 08 blt a2, a4, 0x8000204c +80001fc4: 13 85 07 00 mv a0, a5 +80001fc8: 63 48 07 04 bltz a4, 0x80002018 +80001fcc: b7 05 80 00 lui a1, 2048 +80001fd0: 93 86 f5 ff addi a3, a1, -1 +80001fd4: b3 d6 e6 40 sra a3, a3, a4 +80001fd8: 33 f8 f6 00 and a6, a3, a5 +80001fdc: 53 06 05 e0 fmv.x.w a2, fa0 +80001fe0: 63 08 08 02 beqz a6, 0x80002010 +80001fe4: 17 28 00 00 auipc a6, 2 +80001fe8: 87 27 48 fd flw fa5, -44(a6) +80001fec: d3 77 f5 00 fadd.s fa5, fa0, fa5 +80001ff0: 53 07 00 f0 fmv.w.x fa4, zero +80001ff4: 53 18 f7 a0 flt.s a6, fa4, fa5 +80001ff8: 63 0c 08 00 beqz a6, 0x80002010 +80001ffc: 63 d6 07 00 bgez a5, 0x80002008 +80002000: b3 d5 e5 40 sra a1, a1, a4 +80002004: 33 85 f5 00 add a0, a1, a5 +80002008: 93 c6 f6 ff not a3, a3 +8000200c: 33 f6 a6 00 and a2, a3, a0 +80002010: 53 05 06 f0 fmv.w.x fa0, a2 +80002014: 67 80 00 00 ret +80002018: 17 27 00 00 auipc a4, 2 +8000201c: 87 27 07 fa flw fa5, -96(a4) +80002020: d3 77 f5 00 fadd.s fa5, fa0, fa5 +80002024: 53 07 00 f0 fmv.w.x fa4, zero +80002028: 53 06 05 e0 fmv.x.w a2, fa0 +8000202c: 53 17 f7 a0 flt.s a4, fa4, fa5 +80002030: e3 00 07 fe beqz a4, 0x80002010 +80002034: 53 06 07 e0 fmv.x.w a2, fa4 +80002038: e3 dc 07 fc bgez a5, 0x80002010 +8000203c: 63 96 06 02 bnez a3, 0x80002068 +80002040: 17 26 00 00 auipc a2, 2 +80002044: 03 26 46 f5 lw a2, -172(a2) +80002048: 6f f0 9f fc j 0x80002010 +8000204c: 37 07 80 7f lui a4, 522240 +80002050: 53 06 05 e0 fmv.x.w a2, fa0 +80002054: e3 ee e6 fa bltu a3, a4, 0x80002010 +80002058: d3 77 a5 00 fadd.s fa5, fa0, fa0 +8000205c: 53 86 07 e0 fmv.x.w a2, fa5 +80002060: 53 05 06 f0 fmv.w.x fa0, a2 +80002064: 67 80 00 00 ret +80002068: 17 26 00 00 auipc a2, 2 +8000206c: 03 26 c6 f4 lw a2, -180(a2) +80002070: 6f f0 1f fa j 0x80002010 + +80002074 : +80002074: d3 07 05 e0 fmv.x.w a5, fa0 +80002078: 93 96 17 00 slli a3, a5, 1 +8000207c: 13 d7 16 00 srli a4, a3, 1 +80002080: 63 82 06 06 beqz a3, 0x800020e4 +80002084: b7 06 80 7f lui a3, 522240 +80002088: 63 72 d7 06 bgeu a4, a3, 0x800020ec +8000208c: 33 f6 d7 00 and a2, a5, a3 +80002090: 63 16 06 06 bnez a2, 0x800020fc +80002094: 17 27 00 00 auipc a4, 2 +80002098: 87 27 87 f2 flw fa5, -216(a4) +8000209c: d3 77 f5 10 fmul.s fa5, fa0, fa5 +800020a0: 37 47 ff ff lui a4, 1048564 +800020a4: 13 07 07 cb addi a4, a4, -848 +800020a8: d3 87 07 e0 fmv.x.w a5, fa5 +800020ac: 63 4e e5 0a blt a0, a4, 0x80002168 +800020b0: 13 d7 77 41 srai a4, a5, 23 +800020b4: 13 77 f7 0f andi a4, a4, 255 +800020b8: 13 07 77 fe addi a4, a4, -25 +800020bc: 33 05 a7 00 add a0, a4, a0 +800020c0: 13 07 e0 0f li a4, 254 +800020c4: 93 86 07 00 mv a3, a5 +800020c8: 63 54 a7 04 bge a4, a0, 0x80002110 +800020cc: d3 87 07 f0 fmv.w.x fa5, a5 +800020d0: 17 27 00 00 auipc a4, 2 +800020d4: 07 27 87 ee flw fa4, -280(a4) +800020d8: d3 07 f7 20 fsgnj.s fa5, fa4, fa5 +800020dc: d3 f7 e7 10 fmul.s fa5, fa5, fa4 +800020e0: d3 87 07 e0 fmv.x.w a5, fa5 +800020e4: 53 85 07 f0 fmv.w.x fa0, a5 +800020e8: 67 80 00 00 ret +800020ec: d3 77 a5 00 fadd.s fa5, fa0, fa0 +800020f0: d3 87 07 e0 fmv.x.w a5, fa5 +800020f4: 53 85 07 f0 fmv.w.x fa0, a5 +800020f8: 67 80 00 00 ret +800020fc: 13 57 77 01 srli a4, a4, 23 +80002100: 33 05 a7 00 add a0, a4, a0 +80002104: 13 07 e0 0f li a4, 254 +80002108: 93 86 07 00 mv a3, a5 +8000210c: e3 40 a7 fc blt a4, a0, 0x800020cc +80002110: 63 4e a0 02 bgtz a0, 0x8000214c +80002114: 13 07 a0 fe li a4, -22 +80002118: 63 44 e5 06 blt a0, a4, 0x80002180 +8000211c: b7 07 80 80 lui a5, 526336 +80002120: 93 87 f7 ff addi a5, a5, -1 +80002124: 13 05 95 01 addi a0, a0, 25 +80002128: b3 f6 f6 00 and a3, a3, a5 +8000212c: 13 15 75 01 slli a0, a0, 23 +80002130: 33 65 d5 00 or a0, a0, a3 +80002134: 53 07 05 f0 fmv.w.x fa4, a0 +80002138: 97 27 00 00 auipc a5, 2 +8000213c: 87 a7 c7 e8 flw fa5, -372(a5) +80002140: d3 77 f7 10 fmul.s fa5, fa4, fa5 +80002144: d3 87 07 e0 fmv.x.w a5, fa5 +80002148: 6f f0 df f9 j 0x800020e4 +8000214c: b7 07 80 80 lui a5, 526336 +80002150: 93 87 f7 ff addi a5, a5, -1 +80002154: 13 15 75 01 slli a0, a0, 23 +80002158: b3 f6 f6 00 and a3, a3, a5 +8000215c: b3 67 d5 00 or a5, a0, a3 +80002160: 53 85 07 f0 fmv.w.x fa0, a5 +80002164: 67 80 00 00 ret +80002168: 53 87 07 f0 fmv.w.x fa4, a5 +8000216c: 17 27 00 00 auipc a4, 2 +80002170: 87 27 47 e5 flw fa5, -428(a4) +80002174: d3 77 f7 10 fmul.s fa5, fa4, fa5 +80002178: d3 87 07 e0 fmv.x.w a5, fa5 +8000217c: 6f f0 9f f6 j 0x800020e4 +80002180: d3 87 07 f0 fmv.w.x fa5, a5 +80002184: 17 27 00 00 auipc a4, 2 +80002188: 07 27 c7 e3 flw fa4, -452(a4) +8000218c: d3 07 f7 20 fsgnj.s fa5, fa4, fa5 +80002190: d3 f7 e7 10 fmul.s fa5, fa5, fa4 +80002194: d3 87 07 e0 fmv.x.w a5, fa5 +80002198: 6f f0 df f4 j 0x800020e4 + +8000219c : +8000219c: 93 05 05 00 mv a1, a0 +800021a0: 93 06 00 00 li a3, 0 +800021a4: 13 06 00 00 li a2, 0 +800021a8: 13 05 00 00 li a0, 0 +800021ac: 6f 00 40 28 j 0x80002430 <__register_exitproc> + +800021b0 : +800021b0: b3 47 b5 00 xor a5, a0, a1 +800021b4: 93 f7 37 00 andi a5, a5, 3 +800021b8: b3 08 c5 00 add a7, a0, a2 +800021bc: 63 94 07 06 bnez a5, 0x80002224 +800021c0: 93 07 30 00 li a5, 3 +800021c4: 63 f0 c7 06 bgeu a5, a2, 0x80002224 +800021c8: 93 77 35 00 andi a5, a0, 3 +800021cc: 13 07 05 00 mv a4, a0 +800021d0: 63 9a 07 06 bnez a5, 0x80002244 +800021d4: 13 f6 c8 ff andi a2, a7, -4 +800021d8: b3 06 e6 40 sub a3, a2, a4 +800021dc: 93 07 00 02 li a5, 32 +800021e0: 63 ce d7 08 blt a5, a3, 0x8000227c +800021e4: 93 86 05 00 mv a3, a1 +800021e8: 93 07 07 00 mv a5, a4 +800021ec: 63 78 c7 02 bgeu a4, a2, 0x8000221c +800021f0: 03 a8 06 00 lw a6, 0(a3) +800021f4: 93 87 47 00 addi a5, a5, 4 +800021f8: 93 86 46 00 addi a3, a3, 4 +800021fc: 23 ae 07 ff sw a6, -4(a5) +80002200: e3 e8 c7 fe bltu a5, a2, 0x800021f0 +80002204: 93 07 f6 ff addi a5, a2, -1 +80002208: b3 87 e7 40 sub a5, a5, a4 +8000220c: 93 f7 c7 ff andi a5, a5, -4 +80002210: 93 87 47 00 addi a5, a5, 4 +80002214: 33 07 f7 00 add a4, a4, a5 +80002218: b3 85 f5 00 add a1, a1, a5 +8000221c: 63 68 17 01 bltu a4, a7, 0x8000222c +80002220: 67 80 00 00 ret +80002224: 13 07 05 00 mv a4, a0 +80002228: 63 78 15 05 bgeu a0, a7, 0x80002278 +8000222c: 83 c7 05 00 lbu a5, 0(a1) +80002230: 13 07 17 00 addi a4, a4, 1 +80002234: 93 85 15 00 addi a1, a1, 1 +80002238: a3 0f f7 fe sb a5, -1(a4) +8000223c: e3 98 e8 fe bne a7, a4, 0x8000222c +80002240: 67 80 00 00 ret +80002244: 83 c6 05 00 lbu a3, 0(a1) +80002248: 13 07 17 00 addi a4, a4, 1 +8000224c: 93 77 37 00 andi a5, a4, 3 +80002250: a3 0f d7 fe sb a3, -1(a4) +80002254: 93 85 15 00 addi a1, a1, 1 +80002258: e3 8e 07 f6 beqz a5, 0x800021d4 +8000225c: 83 c6 05 00 lbu a3, 0(a1) +80002260: 13 07 17 00 addi a4, a4, 1 +80002264: 93 77 37 00 andi a5, a4, 3 +80002268: a3 0f d7 fe sb a3, -1(a4) +8000226c: 93 85 15 00 addi a1, a1, 1 +80002270: e3 9a 07 fc bnez a5, 0x80002244 +80002274: 6f f0 1f f6 j 0x800021d4 +80002278: 67 80 00 00 ret +8000227c: 13 01 01 ff addi sp, sp, -16 +80002280: 23 26 81 00 sw s0, 12(sp) +80002284: 13 04 00 02 li s0, 32 +80002288: 83 a3 05 00 lw t2, 0(a1) +8000228c: 83 a2 45 00 lw t0, 4(a1) +80002290: 83 af 85 00 lw t6, 8(a1) +80002294: 03 af c5 00 lw t5, 12(a1) +80002298: 83 ae 05 01 lw t4, 16(a1) +8000229c: 03 ae 45 01 lw t3, 20(a1) +800022a0: 03 a3 85 01 lw t1, 24(a1) +800022a4: 03 a8 c5 01 lw a6, 28(a1) +800022a8: 83 a6 05 02 lw a3, 32(a1) +800022ac: 13 07 47 02 addi a4, a4, 36 +800022b0: b3 07 e6 40 sub a5, a2, a4 +800022b4: 23 2e 77 fc sw t2, -36(a4) +800022b8: 23 20 57 fe sw t0, -32(a4) +800022bc: 23 22 f7 ff sw t6, -28(a4) +800022c0: 23 24 e7 ff sw t5, -24(a4) +800022c4: 23 26 d7 ff sw t4, -20(a4) +800022c8: 23 28 c7 ff sw t3, -16(a4) +800022cc: 23 2a 67 fe sw t1, -12(a4) +800022d0: 23 2c 07 ff sw a6, -8(a4) +800022d4: 23 2e d7 fe sw a3, -4(a4) +800022d8: 93 85 45 02 addi a1, a1, 36 +800022dc: e3 46 f4 fa blt s0, a5, 0x80002288 +800022e0: 93 86 05 00 mv a3, a1 +800022e4: 93 07 07 00 mv a5, a4 +800022e8: 63 78 c7 02 bgeu a4, a2, 0x80002318 +800022ec: 03 a8 06 00 lw a6, 0(a3) +800022f0: 93 87 47 00 addi a5, a5, 4 +800022f4: 93 86 46 00 addi a3, a3, 4 +800022f8: 23 ae 07 ff sw a6, -4(a5) +800022fc: e3 e8 c7 fe bltu a5, a2, 0x800022ec +80002300: 93 07 f6 ff addi a5, a2, -1 +80002304: b3 87 e7 40 sub a5, a5, a4 +80002308: 93 f7 c7 ff andi a5, a5, -4 +8000230c: 93 87 47 00 addi a5, a5, 4 +80002310: 33 07 f7 00 add a4, a4, a5 +80002314: b3 85 f5 00 add a1, a1, a5 +80002318: 63 68 17 01 bltu a4, a7, 0x80002328 +8000231c: 03 24 c1 00 lw s0, 12(sp) +80002320: 13 01 01 01 addi sp, sp, 16 +80002324: 67 80 00 00 ret +80002328: 83 c7 05 00 lbu a5, 0(a1) +8000232c: 13 07 17 00 addi a4, a4, 1 +80002330: 93 85 15 00 addi a1, a1, 1 +80002334: a3 0f f7 fe sb a5, -1(a4) +80002338: e3 82 e8 fe beq a7, a4, 0x8000231c +8000233c: 83 c7 05 00 lbu a5, 0(a1) +80002340: 13 07 17 00 addi a4, a4, 1 +80002344: 93 85 15 00 addi a1, a1, 1 +80002348: a3 0f f7 fe sb a5, -1(a4) +8000234c: e3 9e e8 fc bne a7, a4, 0x80002328 +80002350: 6f f0 df fc j 0x8000231c + +80002354 : +80002354: 13 03 f0 00 li t1, 15 +80002358: 13 07 05 00 mv a4, a0 +8000235c: 63 7e c3 02 bgeu t1, a2, 0x80002398 +80002360: 93 77 f7 00 andi a5, a4, 15 +80002364: 63 90 07 0a bnez a5, 0x80002404 +80002368: 63 92 05 08 bnez a1, 0x800023ec +8000236c: 93 76 06 ff andi a3, a2, -16 +80002370: 13 76 f6 00 andi a2, a2, 15 +80002374: b3 86 e6 00 add a3, a3, a4 +80002378: 23 20 b7 00 sw a1, 0(a4) +8000237c: 23 22 b7 00 sw a1, 4(a4) +80002380: 23 24 b7 00 sw a1, 8(a4) +80002384: 23 26 b7 00 sw a1, 12(a4) +80002388: 13 07 07 01 addi a4, a4, 16 +8000238c: e3 66 d7 fe bltu a4, a3, 0x80002378 +80002390: 63 14 06 00 bnez a2, 0x80002398 +80002394: 67 80 00 00 ret +80002398: b3 06 c3 40 sub a3, t1, a2 +8000239c: 93 96 26 00 slli a3, a3, 2 +800023a0: 97 02 00 00 auipc t0, 0 +800023a4: b3 86 56 00 add a3, a3, t0 +800023a8: 67 80 c6 00 jr 12(a3) +800023ac: 23 07 b7 00 sb a1, 14(a4) +800023b0: a3 06 b7 00 sb a1, 13(a4) +800023b4: 23 06 b7 00 sb a1, 12(a4) +800023b8: a3 05 b7 00 sb a1, 11(a4) +800023bc: 23 05 b7 00 sb a1, 10(a4) +800023c0: a3 04 b7 00 sb a1, 9(a4) +800023c4: 23 04 b7 00 sb a1, 8(a4) +800023c8: a3 03 b7 00 sb a1, 7(a4) +800023cc: 23 03 b7 00 sb a1, 6(a4) +800023d0: a3 02 b7 00 sb a1, 5(a4) +800023d4: 23 02 b7 00 sb a1, 4(a4) +800023d8: a3 01 b7 00 sb a1, 3(a4) +800023dc: 23 01 b7 00 sb a1, 2(a4) +800023e0: a3 00 b7 00 sb a1, 1(a4) +800023e4: 23 00 b7 00 sb a1, 0(a4) +800023e8: 67 80 00 00 ret +800023ec: 93 f5 f5 0f andi a1, a1, 255 +800023f0: 93 96 85 00 slli a3, a1, 8 +800023f4: b3 e5 d5 00 or a1, a1, a3 +800023f8: 93 96 05 01 slli a3, a1, 16 +800023fc: b3 e5 d5 00 or a1, a1, a3 +80002400: 6f f0 df f6 j 0x8000236c +80002404: 93 96 27 00 slli a3, a5, 2 +80002408: 97 02 00 00 auipc t0, 0 +8000240c: b3 86 56 00 add a3, a3, t0 +80002410: 93 82 00 00 mv t0, ra +80002414: e7 80 06 fa jalr -96(a3) +80002418: 93 80 02 00 mv ra, t0 +8000241c: 93 87 07 ff addi a5, a5, -16 +80002420: 33 07 f7 40 sub a4, a4, a5 +80002424: 33 06 f6 00 add a2, a2, a5 +80002428: e3 78 c3 f6 bgeu t1, a2, 0x80002398 +8000242c: 6f f0 df f3 j 0x80002368 + +80002430 <__register_exitproc>: +80002430: 17 27 00 00 auipc a4, 2 +80002434: 03 27 87 b9 lw a4, -1128(a4) +80002438: 83 27 87 14 lw a5, 328(a4) +8000243c: 63 8c 07 04 beqz a5, 0x80002494 <__register_exitproc+0x64> +80002440: 03 a7 47 00 lw a4, 4(a5) +80002444: 13 08 f0 01 li a6, 31 +80002448: 63 4e e8 06 blt a6, a4, 0x800024c4 <__register_exitproc+0x94> +8000244c: 13 18 27 00 slli a6, a4, 2 +80002450: 63 06 05 02 beqz a0, 0x8000247c <__register_exitproc+0x4c> +80002454: 33 83 07 01 add t1, a5, a6 +80002458: 23 24 c3 08 sw a2, 136(t1) +8000245c: 83 a8 87 18 lw a7, 392(a5) +80002460: 13 06 10 00 li a2, 1 +80002464: 33 16 e6 00 sll a2, a2, a4 +80002468: b3 e8 c8 00 or a7, a7, a2 +8000246c: 23 a4 17 19 sw a7, 392(a5) +80002470: 23 24 d3 10 sw a3, 264(t1) +80002474: 93 06 20 00 li a3, 2 +80002478: 63 04 d5 02 beq a0, a3, 0x800024a0 <__register_exitproc+0x70> +8000247c: 13 07 17 00 addi a4, a4, 1 +80002480: 23 a2 e7 00 sw a4, 4(a5) +80002484: b3 87 07 01 add a5, a5, a6 +80002488: 23 a4 b7 00 sw a1, 8(a5) +8000248c: 13 05 00 00 li a0, 0 +80002490: 67 80 00 00 ret +80002494: 93 07 c7 14 addi a5, a4, 332 +80002498: 23 24 f7 14 sw a5, 328(a4) +8000249c: 6f f0 5f fa j 0x80002440 <__register_exitproc+0x10> +800024a0: 83 a6 c7 18 lw a3, 396(a5) +800024a4: 13 07 17 00 addi a4, a4, 1 +800024a8: 23 a2 e7 00 sw a4, 4(a5) +800024ac: b3 e6 c6 00 or a3, a3, a2 +800024b0: 23 a6 d7 18 sw a3, 396(a5) +800024b4: b3 87 07 01 add a5, a5, a6 +800024b8: 23 a4 b7 00 sw a1, 8(a5) +800024bc: 13 05 00 00 li a0, 0 +800024c0: 67 80 00 00 ret +800024c4: 13 05 f0 ff li a0, -1 +800024c8: 67 80 00 00 ret + +800024cc <__call_exitprocs>: +800024cc: 13 01 01 fd addi sp, sp, -48 +800024d0: 23 2c 41 01 sw s4, 24(sp) +800024d4: 17 2a 00 00 auipc s4, 2 +800024d8: 03 2a 4a af lw s4, -1292(s4) +800024dc: 23 20 21 03 sw s2, 32(sp) +800024e0: 03 29 8a 14 lw s2, 328(s4) +800024e4: 23 26 11 02 sw ra, 44(sp) +800024e8: 23 24 81 02 sw s0, 40(sp) +800024ec: 23 22 91 02 sw s1, 36(sp) +800024f0: 23 2e 31 01 sw s3, 28(sp) +800024f4: 23 2a 51 01 sw s5, 20(sp) +800024f8: 23 28 61 01 sw s6, 16(sp) +800024fc: 23 26 71 01 sw s7, 12(sp) +80002500: 23 24 81 01 sw s8, 8(sp) +80002504: 63 00 09 04 beqz s2, 0x80002544 <__call_exitprocs+0x78> +80002508: 13 0b 05 00 mv s6, a0 +8000250c: 93 8b 05 00 mv s7, a1 +80002510: 93 0a 10 00 li s5, 1 +80002514: 93 09 f0 ff li s3, -1 +80002518: 83 24 49 00 lw s1, 4(s2) +8000251c: 13 84 f4 ff addi s0, s1, -1 +80002520: 63 42 04 02 bltz s0, 0x80002544 <__call_exitprocs+0x78> +80002524: 93 94 24 00 slli s1, s1, 2 +80002528: b3 04 99 00 add s1, s2, s1 +8000252c: 63 84 0b 04 beqz s7, 0x80002574 <__call_exitprocs+0xa8> +80002530: 83 a7 44 10 lw a5, 260(s1) +80002534: 63 80 77 05 beq a5, s7, 0x80002574 <__call_exitprocs+0xa8> +80002538: 13 04 f4 ff addi s0, s0, -1 +8000253c: 93 84 c4 ff addi s1, s1, -4 +80002540: e3 16 34 ff bne s0, s3, 0x8000252c <__call_exitprocs+0x60> +80002544: 83 20 c1 02 lw ra, 44(sp) +80002548: 03 24 81 02 lw s0, 40(sp) +8000254c: 83 24 41 02 lw s1, 36(sp) +80002550: 03 29 01 02 lw s2, 32(sp) +80002554: 83 29 c1 01 lw s3, 28(sp) +80002558: 03 2a 81 01 lw s4, 24(sp) +8000255c: 83 2a 41 01 lw s5, 20(sp) +80002560: 03 2b 01 01 lw s6, 16(sp) +80002564: 83 2b c1 00 lw s7, 12(sp) +80002568: 03 2c 81 00 lw s8, 8(sp) +8000256c: 13 01 01 03 addi sp, sp, 48 +80002570: 67 80 00 00 ret +80002574: 83 27 49 00 lw a5, 4(s2) +80002578: 83 a6 44 00 lw a3, 4(s1) +8000257c: 93 87 f7 ff addi a5, a5, -1 +80002580: 63 8e 87 04 beq a5, s0, 0x800025dc <__call_exitprocs+0x110> +80002584: 23 a2 04 00 sw zero, 4(s1) +80002588: e3 88 06 fa beqz a3, 0x80002538 <__call_exitprocs+0x6c> +8000258c: 83 27 89 18 lw a5, 392(s2) +80002590: 33 97 8a 00 sll a4, s5, s0 +80002594: 03 2c 49 00 lw s8, 4(s2) +80002598: b3 77 f7 00 and a5, a4, a5 +8000259c: 63 92 07 02 bnez a5, 0x800025c0 <__call_exitprocs+0xf4> +800025a0: e7 80 06 00 jalr a3 +800025a4: 03 27 49 00 lw a4, 4(s2) +800025a8: 83 27 8a 14 lw a5, 328(s4) +800025ac: 63 14 87 01 bne a4, s8, 0x800025b4 <__call_exitprocs+0xe8> +800025b0: e3 84 27 f9 beq a5, s2, 0x80002538 <__call_exitprocs+0x6c> +800025b4: e3 88 07 f8 beqz a5, 0x80002544 <__call_exitprocs+0x78> +800025b8: 13 89 07 00 mv s2, a5 +800025bc: 6f f0 df f5 j 0x80002518 <__call_exitprocs+0x4c> +800025c0: 83 27 c9 18 lw a5, 396(s2) +800025c4: 83 a5 44 08 lw a1, 132(s1) +800025c8: 33 77 f7 00 and a4, a4, a5 +800025cc: 63 1c 07 00 bnez a4, 0x800025e4 <__call_exitprocs+0x118> +800025d0: 13 05 0b 00 mv a0, s6 +800025d4: e7 80 06 00 jalr a3 +800025d8: 6f f0 df fc j 0x800025a4 <__call_exitprocs+0xd8> +800025dc: 23 22 89 00 sw s0, 4(s2) +800025e0: 6f f0 9f fa j 0x80002588 <__call_exitprocs+0xbc> +800025e4: 13 85 05 00 mv a0, a1 +800025e8: e7 80 06 00 jalr a3 +800025ec: 6f f0 9f fb j 0x800025a4 <__call_exitprocs+0xd8> + +800025f0 <__clzsi2>: +800025f0: b7 07 01 00 lui a5, 16 +800025f4: 63 7a f5 02 bgeu a0, a5, 0x80002628 <__clzsi2+0x38> +800025f8: 93 37 05 10 sltiu a5, a0, 256 +800025fc: 93 c7 17 00 xori a5, a5, 1 +80002600: 93 97 37 00 slli a5, a5, 3 +80002604: 13 07 00 02 li a4, 32 +80002608: 33 07 f7 40 sub a4, a4, a5 +8000260c: 33 55 f5 00 srl a0, a0, a5 +80002610: 97 07 00 00 auipc a5, 0 +80002614: 93 87 47 40 addi a5, a5, 1028 +80002618: b3 87 a7 00 add a5, a5, a0 +8000261c: 03 c5 07 00 lbu a0, 0(a5) +80002620: 33 05 a7 40 sub a0, a4, a0 +80002624: 67 80 00 00 ret +80002628: 37 07 00 01 lui a4, 4096 +8000262c: 93 07 00 01 li a5, 16 +80002630: e3 6a e5 fc bltu a0, a4, 0x80002604 <__clzsi2+0x14> +80002634: 93 07 80 01 li a5, 24 +80002638: 6f f0 df fc j 0x80002604 <__clzsi2+0x14> + +Disassembly of section .rodata: + +8000263c <.rodata>: +8000263c: db 0f c9 c0 +80002640: 00 00 +80002642: 80 3d + +80002644 : +80002644: 00 0f +80002646: c9 3f +80002648: 00 0f +8000264a: 49 40 +8000264c: 00 cb +8000264e: 96 40 +80002650: 00 0f +80002652: c9 40 +80002654: 00 53 +80002656: fb 40 00 cb +8000265a: 16 41 +8000265c: 00 ed +8000265e: 2f 41 00 0f +80002662: 49 41 +80002664: 00 31 +80002666: 62 41 +80002668: 00 53 +8000266a: 7b 41 00 3a +8000266e: 8a 41 +80002670: 00 cb +80002672: 96 41 +80002674: 00 5c +80002676: a3 41 00 ed +8000267a: af 41 00 7e +8000267e: bc 41 +80002680: 00 0f +80002682: c9 41 +80002684: 00 a0 +80002686: d5 41 +80002688: 00 31 +8000268a: e2 41 +8000268c: 00 c2 +8000268e: ee 41 +80002690: 00 53 +80002692: fb 41 00 f2 +80002696: 03 42 00 3a lbu tp, 928(zero) +8000269a: 0a 42 +8000269c: 00 83 +8000269e: 10 42 +800026a0: 00 cb +800026a2: 16 42 +800026a4: 00 14 +800026a6: 1d 42 +800026a8: 00 5c +800026aa: 23 42 00 a5 +800026ae: 29 42 +800026b0: 00 ed +800026b2: 2f 42 00 36 +800026b6: 36 42 +800026b8: 00 7e +800026ba: 3c 42 +800026bc: 00 c7 +800026be: 42 42 +800026c0: 00 0f +800026c2: 49 42 + +800026c4 : +800026c4: a2 00 +800026c6: 00 00 +800026c8: f9 00 +800026ca: 00 00 +800026cc: 83 00 00 00 lb ra, 0(zero) +800026d0: 6e 00 +800026d2: 00 00 +800026d4: 4e 00 +800026d6: 00 00 +800026d8: 44 00 +800026da: 00 00 +800026dc: 15 00 +800026de: 00 00 +800026e0: 29 00 +800026e2: 00 00 +800026e4: fc 00 +800026e6: 00 00 +800026e8: 27 00 00 00 +800026ec: 57 00 00 00 +800026f0: d1 00 +800026f2: 00 00 +800026f4: f5 00 +800026f6: 00 00 +800026f8: 34 00 +800026fa: 00 00 +800026fc: dd 00 +800026fe: 00 00 +80002700: c0 00 +80002702: 00 00 +80002704: db 00 00 00 +80002708: 62 00 +8000270a: 00 00 +8000270c: 95 00 +8000270e: 00 00 +80002710: 99 00 +80002712: 00 00 +80002714: 3c 00 +80002716: 00 00 +80002718: 43 00 00 00 fmadd.s ft0, ft0, ft0, ft0, rne +8000271c: 90 00 +8000271e: 00 00 +80002720: 41 00 +80002722: 00 00 +80002724: fe 00 +80002726: 00 00 +80002728: 51 00 +8000272a: 00 00 +8000272c: 63 00 00 00 beqz zero, 0x8000272c +80002730: ab 00 00 00 vx_tex ra, 0, zero, zero, zero +80002734: de 00 +80002736: 00 00 +80002738: bb 00 00 00 +8000273c: c5 00 +8000273e: 00 00 +80002740: 61 00 +80002742: 00 00 +80002744: b7 00 00 00 lui ra, 0 +80002748: 24 00 +8000274a: 00 00 +8000274c: 6e 00 +8000274e: 00 00 +80002750: 3a 00 +80002752: 00 00 +80002754: 42 00 +80002756: 00 00 +80002758: 4d 00 +8000275a: 00 00 +8000275c: d2 00 +8000275e: 00 00 +80002760: e0 00 +80002762: 00 00 +80002764: 06 00 +80002766: 00 00 +80002768: 49 00 +8000276a: 00 00 +8000276c: 2e 00 +8000276e: 00 00 +80002770: ea 00 +80002772: 00 00 +80002774: 09 00 +80002776: 00 00 +80002778: d1 00 +8000277a: 00 00 +8000277c: 92 00 +8000277e: 00 00 +80002780: 1c 00 +80002782: 00 00 +80002784: fe 00 +80002786: 00 00 +80002788: 1d 00 +8000278a: 00 00 +8000278c: eb 00 00 00 +80002790: 1c 00 +80002792: 00 00 +80002794: b1 00 +80002796: 00 00 +80002798: 29 00 +8000279a: 00 00 +8000279c: a7 00 00 00 +800027a0: 3e 00 +800027a2: 00 00 +800027a4: e8 00 +800027a6: 00 00 +800027a8: 82 00 +800027aa: 00 00 +800027ac: 35 00 +800027ae: 00 00 +800027b0: f5 00 +800027b2: 00 00 +800027b4: 2e 00 +800027b6: 00 00 +800027b8: bb 00 00 00 +800027bc: 44 00 +800027be: 00 00 +800027c0: 84 00 +800027c2: 00 00 +800027c4: e9 00 +800027c6: 00 00 +800027c8: 9c 00 +800027ca: 00 00 +800027cc: 70 00 +800027ce: 00 00 +800027d0: 26 00 +800027d2: 00 00 +800027d4: b4 00 +800027d6: 00 00 +800027d8: 5f 00 00 00 +800027dc: 7e 00 +800027de: 00 00 +800027e0: 41 00 +800027e2: 00 00 +800027e4: 39 00 +800027e6: 00 00 +800027e8: 91 00 +800027ea: 00 00 +800027ec: d6 00 +800027ee: 00 00 +800027f0: 39 00 +800027f2: 00 00 +800027f4: 83 00 00 00 lb ra, 0(zero) +800027f8: 53 00 00 00 fadd.s ft0, ft0, ft0, rne +800027fc: 39 00 +800027fe: 00 00 +80002800: f4 00 +80002802: 00 00 +80002804: 9c 00 +80002806: 00 00 +80002808: 84 00 +8000280a: 00 00 +8000280c: 5f 00 00 00 +80002810: 8b 00 00 00 +80002814: bd 00 +80002816: 00 00 +80002818: f9 00 +8000281a: 00 00 +8000281c: 28 00 +8000281e: 00 00 +80002820: 3b 00 00 00 +80002824: 1f 00 00 00 +80002828: f8 00 +8000282a: 00 00 +8000282c: 97 00 00 00 auipc ra, 0 +80002830: ff 00 00 00 +80002834: de 00 +80002836: 00 00 +80002838: 05 00 +8000283a: 00 00 +8000283c: 98 00 +8000283e: 00 00 +80002840: 0f 00 00 00 fence 0, 0 +80002844: ef 00 00 00 jal 0x80002844 +80002848: 2f 00 00 00 +8000284c: 11 00 +8000284e: 00 00 +80002850: 8b 00 00 00 +80002854: 5a 00 +80002856: 00 00 +80002858: 0a 00 +8000285a: 00 00 +8000285c: 6d 00 +8000285e: 00 00 +80002860: 1f 00 00 00 +80002864: 6d 00 +80002866: 00 00 +80002868: 36 00 +8000286a: 00 00 +8000286c: 7e 00 +8000286e: 00 00 +80002870: cf 00 00 00 fnmadd.s ft1, ft0, ft0, ft0, rne +80002874: 27 00 00 00 +80002878: cb 00 00 00 fnmsub.s ft1, ft0, ft0, ft0, rne +8000287c: 09 00 +8000287e: 00 00 +80002880: b7 00 00 00 lui ra, 0 +80002884: 4f 00 00 00 fnmadd.s ft0, ft0, ft0, ft0, rne +80002888: 46 00 +8000288a: 00 00 +8000288c: 3f 00 00 00 +80002890: 66 00 +80002892: 00 00 +80002894: 9e 00 +80002896: 00 00 +80002898: 5f 00 00 00 +8000289c: ea 00 +8000289e: 00 00 +800028a0: 2d 00 +800028a2: 00 00 +800028a4: 75 00 +800028a6: 00 00 +800028a8: 27 00 00 00 +800028ac: ba 00 +800028ae: 00 00 +800028b0: c7 00 00 00 fmsub.s ft1, ft0, ft0, ft0, rne +800028b4: eb 00 00 00 +800028b8: e5 00 +800028ba: 00 00 +800028bc: f1 00 +800028be: 00 00 +800028c0: 7b 00 00 00 +800028c4: 3d 00 +800028c6: 00 00 +800028c8: 07 00 00 00 +800028cc: 39 00 +800028ce: 00 00 +800028d0: f7 00 00 00 +800028d4: 8a 00 +800028d6: 00 00 +800028d8: 52 00 +800028da: 00 00 +800028dc: 92 00 +800028de: 00 00 +800028e0: ea 00 +800028e2: 00 00 +800028e4: 6b 00 00 00 +800028e8: fb 00 00 00 +800028ec: 5f 00 00 00 +800028f0: b1 00 +800028f2: 00 00 +800028f4: 1f 00 00 00 +800028f8: 8d 00 +800028fa: 00 00 +800028fc: 5d 00 +800028fe: 00 00 +80002900: 08 00 +80002902: 00 00 +80002904: 56 00 +80002906: 00 00 +80002908: 03 00 00 00 lb zero, 0(zero) +8000290c: 30 00 +8000290e: 00 00 +80002910: 46 00 +80002912: 00 00 +80002914: fc 00 +80002916: 00 00 +80002918: 7b 00 00 00 +8000291c: 6b 00 00 00 +80002920: ab 00 00 00 vx_tex ra, 0, zero, zero, zero +80002924: f0 00 +80002926: 00 00 +80002928: cf 00 00 00 fnmadd.s ft1, ft0, ft0, ft0, rne +8000292c: bc 00 +8000292e: 00 00 +80002930: 20 00 +80002932: 00 00 +80002934: 9a 00 +80002936: 00 00 +80002938: f4 00 +8000293a: 00 00 +8000293c: 36 00 +8000293e: 00 00 +80002940: 1d 00 +80002942: 00 00 +80002944: a9 00 +80002946: 00 00 +80002948: e3 00 00 00 beqz zero, 0x80003148 <__clz_tab+0x734> +8000294c: 91 00 +8000294e: 00 00 +80002950: 61 00 +80002952: 00 00 +80002954: 5e 00 +80002956: 00 00 +80002958: e6 00 +8000295a: 00 00 +8000295c: 1b 00 00 00 +80002960: 08 00 +80002962: 00 00 +80002964: 65 00 +80002966: 00 00 +80002968: 99 00 +8000296a: 00 00 +8000296c: 85 00 +8000296e: 00 00 +80002970: 5f 00 00 00 +80002974: 14 00 +80002976: 00 00 +80002978: a0 00 +8000297a: 00 00 +8000297c: 68 00 +8000297e: 00 00 +80002980: 40 00 +80002982: 00 00 +80002984: 8d 00 +80002986: 00 00 +80002988: ff 00 00 00 +8000298c: d8 00 +8000298e: 00 00 +80002990: 80 00 +80002992: 00 00 +80002994: 4d 00 +80002996: 00 00 +80002998: 73 00 00 00 ecall +8000299c: 27 00 00 00 +800029a0: 31 00 +800029a2: 00 00 +800029a4: 06 00 +800029a6: 00 00 +800029a8: 06 00 +800029aa: 00 00 +800029ac: 15 00 +800029ae: 00 00 +800029b0: 56 00 +800029b2: 00 00 +800029b4: ca 00 +800029b6: 00 00 +800029b8: 73 00 00 00 ecall +800029bc: a8 00 +800029be: 00 00 +800029c0: c9 00 +800029c2: 00 00 +800029c4: 60 00 +800029c6: 00 00 +800029c8: e2 00 +800029ca: 00 00 +800029cc: 7b 00 00 00 +800029d0: c0 00 +800029d2: 00 00 +800029d4: 8c 00 +800029d6: 00 00 +800029d8: 6b 00 00 00 + +800029dc : +800029dc: 00 00 +800029de: c9 3f +800029e0: 00 00 +800029e2: f0 39 +800029e4: 00 00 +800029e6: da 37 +800029e8: 00 00 +800029ea: a2 33 +800029ec: 00 00 +800029ee: 84 2e +800029f0: 00 00 +800029f2: 50 2b +800029f4: 00 00 +800029f6: c2 27 +800029f8: 00 00 +800029fa: d0 22 +800029fc: 00 00 +800029fe: c4 1f +80002a00: 00 00 +80002a02: c6 1b +80002a04: 00 00 +80002a06: 44 17 + +80002a08 : +80002a08: 04 00 +80002a0a: 00 00 +80002a0c: 07 00 00 00 +80002a10: 09 00 +80002a12: 00 00 + +80002a14 <__clz_tab>: +80002a14: 00 01 +80002a16: 02 02 +80002a18: 03 03 03 03 lb t1, 48(t1) +80002a1c: 04 04 +80002a1e: 04 04 +80002a20: 04 04 +80002a22: 04 04 +80002a24: 05 05 +80002a26: 05 05 +80002a28: 05 05 +80002a2a: 05 05 +80002a2c: 05 05 +80002a2e: 05 05 +80002a30: 05 05 +80002a32: 05 05 +80002a34: 06 06 +80002a36: 06 06 +80002a38: 06 06 +80002a3a: 06 06 +80002a3c: 06 06 +80002a3e: 06 06 +80002a40: 06 06 +80002a42: 06 06 +80002a44: 06 06 +80002a46: 06 06 +80002a48: 06 06 +80002a4a: 06 06 +80002a4c: 06 06 +80002a4e: 06 06 +80002a50: 06 06 +80002a52: 06 06 +80002a54: 07 07 07 07 +80002a58: 07 07 07 07 +80002a5c: 07 07 07 07 +80002a60: 07 07 07 07 +80002a64: 07 07 07 07 +80002a68: 07 07 07 07 +80002a6c: 07 07 07 07 +80002a70: 07 07 07 07 +80002a74: 07 07 07 07 +80002a78: 07 07 07 07 +80002a7c: 07 07 07 07 +80002a80: 07 07 07 07 +80002a84: 07 07 07 07 +80002a88: 07 07 07 07 +80002a8c: 07 07 07 07 +80002a90: 07 07 07 07 +80002a94: 08 08 +80002a96: 08 08 +80002a98: 08 08 +80002a9a: 08 08 +80002a9c: 08 08 +80002a9e: 08 08 +80002aa0: 08 08 +80002aa2: 08 08 +80002aa4: 08 08 +80002aa6: 08 08 +80002aa8: 08 08 +80002aaa: 08 08 +80002aac: 08 08 +80002aae: 08 08 +80002ab0: 08 08 +80002ab2: 08 08 +80002ab4: 08 08 +80002ab6: 08 08 +80002ab8: 08 08 +80002aba: 08 08 +80002abc: 08 08 +80002abe: 08 08 +80002ac0: 08 08 +80002ac2: 08 08 +80002ac4: 08 08 +80002ac6: 08 08 +80002ac8: 08 08 +80002aca: 08 08 +80002acc: 08 08 +80002ace: 08 08 +80002ad0: 08 08 +80002ad2: 08 08 +80002ad4: 08 08 +80002ad6: 08 08 +80002ad8: 08 08 +80002ada: 08 08 +80002adc: 08 08 +80002ade: 08 08 +80002ae0: 08 08 +80002ae2: 08 08 +80002ae4: 08 08 +80002ae6: 08 08 +80002ae8: 08 08 +80002aea: 08 08 +80002aec: 08 08 +80002aee: 08 08 +80002af0: 08 08 +80002af2: 08 08 +80002af4: 08 08 +80002af6: 08 08 +80002af8: 08 08 +80002afa: 08 08 +80002afc: 08 08 +80002afe: 08 08 +80002b00: 08 08 +80002b02: 08 08 +80002b04: 08 08 +80002b06: 08 08 +80002b08: 08 08 +80002b0a: 08 08 +80002b0c: 08 08 +80002b0e: 08 08 +80002b10: 08 08 +80002b12: 08 08 + +Disassembly of section .init_array: + +80003b14 <__tdata_start>: +80003b14: b8 00 +80003b16: 00 80 + +Disassembly of section .data: + +80003b18 : +80003b18: 00 00 +80003b1a: 00 00 +80003b1c: 04 3e +80003b1e: 00 80 +80003b20: 6c 3e +80003b22: 00 80 +80003b24: d4 3e +80003b26: 00 80 + ... +80003bc0: 01 00 +80003bc2: 00 00 +80003bc4: 00 00 +80003bc6: 00 00 +80003bc8: 0e 33 +80003bca: cd ab +80003bcc: 34 12 +80003bce: 6d e6 +80003bd0: ec de +80003bd2: 05 00 +80003bd4: 0b 00 00 00 vx_tmc zero + ... + +Disassembly of section .sdata: + +80003f40 <__SDATA_BEGIN__>: +80003f40: 80 0f +80003f42: c9 3f +80003f44: 43 44 35 37 +80003f48: 00 44 +80003f4a: 35 37 +80003f4c: 08 a3 +80003f4e: 85 2e +80003f50: 84 f9 +80003f52: 22 3f +80003f54: 00 00 +80003f56: 00 3f +80003f58: 00 a3 +80003f5a: 85 2e +80003f5c: 32 31 +80003f5e: 8d 24 +80003f60: 00 00 +80003f62: 80 43 +80003f64: 00 00 +80003f66: 38 3f +80003f68: 00 00 +80003f6a: 90 3e +80003f6c: 00 00 +80003f6e: 80 3f +80003f70: 4e d7 +80003f72: 47 ad f6 74 +80003f76: 0f 31 7c f2 +80003f7a: 93 b4 01 0d sltiu s1, gp, 208 +80003f7e: d0 37 +80003f80: 61 0b +80003f82: b6 ba +80003f84: ab aa 2a 3d +80003f88: 00 00 +80003f8a: 80 3b +80003f8c: 00 00 +80003f8e: 00 3e +80003f90: 00 00 +80003f92: 00 41 +80003f94: 00 00 +80003f96: 00 80 +80003f98: d3 c9 2e 2f +80003f9c: 34 2f +80003f9e: d7 b2 1b ef +80003fa2: 38 36 +80003fa4: 01 0d +80003fa6: 50 b9 +80003fa8: 89 88 +80003faa: 08 3c +80003fac: ab aa 2a be +80003fb0: ab aa 2a 3e +80003fb4: 00 00 +80003fb6: 80 bf +80003fb8: ca f2 +80003fba: 49 71 +80003fbc: 00 00 +80003fbe: 00 4c +80003fc0: 60 42 +80003fc2: a2 0d +80003fc4: 00 00 +80003fc6: 00 33 + +80003fc8 <_global_impure_ptr>: +80003fc8: 18 3b +80003fca: 00 80 + +Disassembly of section .bss: + +80003fcc : +... + +Disassembly of section .comment: + +00000000 <.comment>: + 0: 63 6c 61 6e bltu sp, t1, 0x6f8 <.comment+0x6f8> + 4: 67 20 76 65 + 8: 72 73 + a: 69 6f + c: 6e 20 + e: 31 36 + 10: 2e 30 + 12: 2e 36 + 14: 20 28 + 16: 68 74 + 18: 74 70 + 1a: 73 3a 2f 2f csrrc s4, 754, t5 + 1e: 67 69 74 68 + 22: 75 62 + 24: 2e 63 + 26: 6f 6d 2f 76 jal s10, 0xf6788 <.comment+0xf6788> + 2a: 6f 72 74 65 jal tp, 0x47e80 <.comment+0x47e80> + 2e: 78 67 + 30: 70 67 + 32: 70 75 + 34: 2f 6c 6c 76 + 38: 6d 2e + 3a: 67 69 74 20 + 3e: 35 38 + 40: 38 31 + 42: 31 62 + 44: 66 61 + 46: 36 31 + 48: 61 35 + 4a: 30 33 + 4c: 66 64 + 4e: 34 61 + 50: 35 66 + 52: 30 64 + 54: 63 37 62 35 + 58: 37 38 30 32 lui a6, 205571 + 5c: 66 61 + 5e: 65 35 + 60: 31 63 + 62: 33 66 35 64 + 66: 29 00 + 68: 47 43 43 3a + 6c: 20 28 + 6e: 67 32 65 65 + 72: 35 65 + 74: 34 33 + 76: 30 30 + 78: 31 38 + 7a: 2d 64 + 7c: 69 72 + 7e: 74 79 + 80: 29 20 + 82: 31 32 + 84: 2e 32 + 86: 2e 30 + 88: 00 47 + 8a: 43 43 3a 20 fmadd.s ft6, fs4, ft3, ft4, rmm + 8e: 28 47 + 90: 4e 55 + 92: 29 20 + 94: 31 32 + 96: 2e 32 + 98: 2e 30 + 9a: 00 + +Disassembly of section .riscv.attributes: + +00000000 <.riscv.attributes>: + 0: 41 40 + 2: 00 00 + 4: 00 72 + 6: 69 73 + 8: 63 76 00 01 bgeu zero, a6, 0x14 <.comment+0x14> + c: 36 00 + e: 00 00 + 10: 04 10 + 12: 05 72 + 14: 76 33 + 16: 32 69 + 18: 32 70 + 1a: 31 5f + 1c: 6d 32 + 1e: 70 30 + 20: 5f 61 32 70 + 24: 31 5f + 26: 66 32 + 28: 70 32 + 2a: 5f 7a 69 63 + 2e: 73 72 32 70 csrrci tp, 1795, 4 + 32: 30 5f + 34: 7a 6d + 36: 6d 75 + 38: 6c 31 + 3a: 70 30 + 3c: 00 08 + 3e: 01 0a + 40: 0b + +Disassembly of section .debug_aranges: + +00000000 <.debug_aranges>: + 0: 1c 00 + 2: 00 00 + 4: 02 00 + 6: 00 00 + 8: 00 00 + a: 04 00 + c: 00 00 + e: 00 00 + 10: f0 25 + 12: 00 80 + 14: 4c 00 + ... + 1e: 00 00 + 20: 14 00 + 22: 00 00 + 24: 02 00 + 26: 42 01 + 28: 00 00 + 2a: 04 00 + ... + +Disassembly of section .debug_info: + +00000000 <.debug_info>: + 0: 3e 01 + 2: 00 00 + 4: 05 00 + 6: 01 04 + 8: 00 00 + a: 00 00 + c: 04 2b + e: 00 00 + 10: 00 1d + 12: 00 00 + 14: 00 00 + 16: 21 00 + 18: 00 00 + 1a: f0 25 + 1c: 00 80 + 1e: 4c 00 + 20: 00 00 + 22: 00 00 + 24: 00 00 + 26: 05 04 + 28: 05 69 + 2a: 6e 74 + 2c: 00 01 + 2e: 04 07 + 30: f2 00 + 32: 00 00 + 34: 01 08 + 36: 05 00 + 38: 00 00 + 3a: 00 01 + 3c: 10 04 + 3e: 1f 01 00 00 + 42: 01 01 + 44: 06 01 + 46: 01 00 + 48: 00 01 + 4a: 01 08 + 4c: ff 00 00 00 + 50: 01 02 + 52: 05 5c + 54: 01 00 + 56: 00 01 + 58: 02 07 + 5a: 2b 01 00 00 vx_tex sp, 0, zero, zero, zero + 5e: 01 04 + 60: 05 05 + 62: 00 00 + 64: 00 01 + 66: 04 07 + 68: ed 00 + 6a: 00 00 + 6c: 01 08 + 6e: 07 e8 00 00 + 72: 00 01 + 74: 01 08 + 76: 08 01 + 78: 00 00 + 7a: 02 4c + 7c: 01 00 + 7e: 00 7b + 80: 16 49 + 82: 00 00 + 84: 00 03 + 86: 7a 00 + 88: 00 00 + 8a: 02 55 + 8c: 01 00 + 8e: 00 80 + 90: 0f 26 00 00 + 94: 00 02 + 96: 54 01 + 98: 00 00 + 9a: 81 16 + 9c: 2d 00 + 9e: 00 00 + a0: 01 04 + a2: 04 46 + a4: 01 00 + a6: 00 01 + a8: 08 03 + aa: 3e 01 + ac: 00 00 + ae: 01 08 + b0: 04 24 + b2: 01 00 + b4: 00 01 + b6: 10 03 + b8: 17 00 00 00 auipc zero, 0 + bc: 01 20 + be: 03 17 01 00 lh a4, 0(sp) + c2: 00 06 + c4: 85 00 + c6: 00 00 + c8: d3 00 00 00 fadd.s ft1, ft0, ft0, rne + cc: 07 2d 00 00 flw fs10, 0(zero) + d0: 00 ff + d2: 00 03 + d4: c3 00 00 00 fmadd.s ft1, ft0, ft0, ft0, rne + d8: 08 0d + da: 01 00 + dc: 00 02 + de: 02 02 + e0: 16 d3 + e2: 00 00 + e4: 00 09 + e6: 0e 00 + e8: 00 00 + ea: 01 ae + ec: 02 01 + ee: 26 00 + f0: 00 00 + f2: f0 25 + f4: 00 80 + f6: 4c 00 + f8: 00 00 + fa: 01 9c + fc: 0a 78 + fe: 00 01 + 100: ae 02 + 102: 12 95 + 104: 00 00 + 106: 00 0c + 108: 00 00 + 10a: 00 0b + 10c: 72 65 + 10e: 74 00 + 110: 01 b0 + 112: 02 09 + 114: 8a 00 + 116: 00 00 + 118: 0c 0c + 11a: 00 00 + 11c: 00 0d + 11e: 26 00 + 120: 00 00 + 122: 01 b2 + 124: 02 03 + 126: 95 00 + 128: 00 00 + 12a: 31 00 + 12c: 00 00 + 12e: 0e 5f + 130: 5f 61 00 01 + 134: b2 02 + 136: 03 95 00 00 lh a0, 0(ra) + 13a: 00 56 + 13c: 00 00 + 13e: 00 00 + 140: 00 00 + 142: d4 00 + 144: 00 00 + 146: 05 00 + 148: 01 04 + 14a: ca 00 + 14c: 00 00 + 14e: 03 2b 00 00 lw s6, 0(zero) + 152: 00 1d + 154: 00 00 + 156: 00 00 + 158: 21 00 + 15a: 00 00 + 15c: cb 00 00 00 fnmsub.s ft1, ft0, ft0, ft0, rne + 160: 04 04 + 162: 05 69 + 164: 6e 74 + 166: 00 01 + 168: 04 07 + 16a: f2 00 + 16c: 00 00 + 16e: 01 08 + 170: 05 00 + 172: 00 00 + 174: 00 01 + 176: 10 04 + 178: 1f 01 00 00 + 17c: 01 01 + 17e: 06 01 + 180: 01 00 + 182: 00 01 + 184: 01 08 + 186: ff 00 00 00 + 18a: 01 02 + 18c: 05 5c + 18e: 01 00 + 190: 00 01 + 192: 02 07 + 194: 2b 01 00 00 vx_tex sp, 0, zero, zero, zero + 198: 01 04 + 19a: 05 05 + 19c: 00 00 + 19e: 00 01 + 1a0: 04 07 + 1a2: ed 00 + 1a4: 00 00 + 1a6: 01 08 + 1a8: 07 e8 00 00 + 1ac: 00 01 + 1ae: 01 08 + 1b0: 08 01 + 1b2: 00 00 + 1b4: 05 4c + 1b6: 01 00 + 1b8: 00 01 + 1ba: 7b 16 41 00 + 1be: 00 00 + 1c0: 02 72 + 1c2: 00 00 + 1c4: 00 01 + 1c6: 04 04 + 1c8: 46 01 + 1ca: 00 00 + 1cc: 01 08 + 1ce: 03 3e 01 00 + 1d2: 00 01 + 1d4: 08 04 + 1d6: 24 01 + 1d8: 00 00 + 1da: 01 10 + 1dc: 03 17 00 00 lh a4, 0(zero) + 1e0: 00 01 + 1e2: 20 03 + 1e4: 17 01 00 00 auipc sp, 0 + 1e8: 06 7e + 1ea: 00 00 + 1ec: 00 b6 + 1ee: 00 00 + 1f0: 00 07 + 1f2: 25 00 + 1f4: 00 00 + 1f6: ff 00 02 a6 + 1fa: 00 00 + 1fc: 00 08 + 1fe: 0d 01 + 200: 00 00 + 202: 01 02 + 204: 02 16 + 206: b6 00 + 208: 00 00 + 20a: 09 bb + 20c: 00 00 + 20e: 00 02 + 210: 9e 02 + 212: 0f 05 03 14 + 216: 2a 00 + 218: 80 00 + +Disassembly of section .debug_abbrev: + +00000000 <.debug_abbrev>: + 0: 01 24 + 2: 00 0b + 4: 0b 3e 0b 03 + 8: 0e 00 + a: 00 02 + c: 16 00 + e: 03 0e 3a 21 lb t3, 531(s4) + 12: 02 3b + 14: 0b 39 0b 49 + 18: 13 00 00 03 li zero, 48 + 1c: 26 00 + 1e: 49 13 + 20: 00 00 + 22: 04 11 + 24: 01 25 + 26: 0e 13 + 28: 0b 03 1f 1b + 2c: 1f 11 01 12 + 30: 06 10 + 32: 17 00 00 05 auipc zero, 20480 + 36: 24 00 + 38: 0b 0b 3e 0b + 3c: 03 08 00 00 lb a6, 0(zero) + 40: 06 01 + 42: 01 49 + 44: 13 01 13 00 addi sp, t1, 1 + 48: 00 07 + 4a: 21 00 + 4c: 49 13 + 4e: 2f 0b 00 00 + 52: 08 34 + 54: 00 03 + 56: 0e 3a + 58: 0b 3b 05 39 + 5c: 0b 49 13 3f + 60: 19 3c + 62: 19 00 + 64: 00 09 + 66: 2e 01 + 68: 3f 19 03 0e + 6c: 3a 0b + 6e: 3b 05 39 0b + 72: 27 19 49 13 + 76: 11 01 + 78: 12 06 + 7a: 40 18 + 7c: 7a 19 + 7e: 00 00 + 80: 0a 05 + 82: 00 03 + 84: 08 3a + 86: 0b 3b 05 39 + 8a: 0b 49 13 02 + 8e: 17 00 00 0b auipc zero, 45056 + 92: 34 00 + 94: 03 08 3a 0b lb a6, 179(s4) + 98: 3b 05 39 0b + 9c: 49 13 + 9e: 00 00 + a0: 0c 0b + a2: 01 55 + a4: 17 00 00 0d auipc zero, 53248 + a8: 34 00 + aa: 03 0e 3a 0b lb t3, 179(s4) + ae: 3b 05 39 0b + b2: 49 13 + b4: 02 17 + b6: 00 00 + b8: 0e 34 + ba: 00 03 + bc: 08 3a + be: 0b 3b 05 39 + c2: 0b 49 13 02 + c6: 17 00 00 00 auipc zero, 0 + ca: 01 24 + cc: 00 0b + ce: 0b 3e 0b 03 + d2: 0e 00 + d4: 00 02 + d6: 26 00 + d8: 49 13 + da: 00 00 + dc: 03 11 01 25 lh sp, 592(sp) + e0: 0e 13 + e2: 0b 03 1f 1b + e6: 1f 10 17 00 + ea: 00 04 + ec: 24 00 + ee: 0b 0b 3e 0b + f2: 03 08 00 00 lb a6, 0(zero) + f6: 05 16 + f8: 00 03 + fa: 0e 3a + fc: 0b 3b 0b 39 + 100: 0b 49 13 00 + 104: 00 06 + 106: 01 01 + 108: 49 13 + 10a: 01 13 + 10c: 00 00 + 10e: 07 21 00 49 flw ft2, 1168(zero) + 112: 13 2f 0b 00 slti t5, s6, 0 + 116: 00 08 + 118: 34 00 + 11a: 03 0e 3a 0b lb t3, 179(s4) + 11e: 3b 05 39 0b + 122: 49 13 + 124: 3f 19 3c 19 + 128: 00 00 + 12a: 09 34 + 12c: 00 47 + 12e: 13 3a 0b 3b sltiu s4, s6, 944 + 132: 05 39 + 134: 0b 02 18 00 + 138: 00 00 + +Disassembly of section .debug_line: + +00000000 <.debug_line>: + 0: c7 00 00 00 fmsub.s ft1, ft0, ft0, ft0, rne + 4: 05 00 + 6: 04 00 + 8: 33 00 00 00 add zero, zero, zero + c: 01 01 + e: 01 fb + 10: 0e 0d + 12: 00 01 + 14: 01 01 + 16: 01 00 + 18: 00 00 + 1a: 01 00 + 1c: 00 01 + 1e: 01 01 + 20: 1f 02 21 00 + 24: 00 00 + 26: 81 00 + 28: 00 00 + 2a: 02 01 + 2c: 1f 02 0f 03 + 30: 17 00 00 00 auipc zero, 0 + 34: 01 17 + 36: 00 00 + 38: 00 01 + 3a: 98 00 + 3c: 00 00 + 3e: 01 05 + 40: 01 00 + 42: 05 02 + 44: f0 25 + 46: 00 80 + 48: 03 ae 05 01 lw t3, 16(a1) + 4c: 05 03 + 4e: 03 01 09 00 lb sp, 0(s2) + 52: 00 01 + 54: 03 02 09 00 lb tp, 0(s2) + 58: 00 01 + 5a: 03 00 09 00 lb zero, 0(s2) + 5e: 00 01 + 60: 03 00 09 00 lb zero, 0(s2) + 64: 00 01 + 66: 03 00 09 00 lb zero, 0(s2) + 6a: 00 01 + 6c: 03 00 09 00 lb zero, 0(s2) + 70: 00 01 + 72: 00 02 + 74: 04 03 + 76: 06 03 + 78: 00 09 + 7a: 08 00 + 7c: 01 00 + 7e: 02 04 + 80: 0e 06 + 82: 03 00 09 0c lb zero, 192(s2) + 86: 00 01 + 88: 00 02 + 8a: 04 0e + 8c: 03 00 09 00 lb zero, 0(s2) + 90: 00 01 + 92: 00 02 + 94: 04 0e + 96: 03 02 09 00 lb tp, 0(s2) + 9a: 00 01 + 9c: 00 02 + 9e: 04 0e + a0: 06 03 + a2: 7e 09 + a4: 00 00 + a6: 01 05 + a8: 01 00 + aa: 02 04 + ac: 0e 03 + ae: 03 09 1c 00 lb s2, 1(s8) + b2: 01 05 + b4: 03 00 02 04 lb zero, 64(tp) + b8: 04 03 + ba: 7d 09 + bc: 08 00 + be: 01 03 + c0: 00 09 + c2: 0c 00 + c4: 01 09 + c6: 08 00 + c8: 00 01 + ca: 01 3b + cc: 00 00 + ce: 00 05 + d0: 00 04 + d2: 00 33 + d4: 00 00 + d6: 00 01 + d8: 01 01 + da: fb 0e 0d 00 + de: 01 01 + e0: 01 01 + e2: 00 00 + e4: 00 01 + e6: 00 00 + e8: 01 01 + ea: 01 1f + ec: 02 21 + ee: 00 00 + f0: 00 81 + f2: 00 00 + f4: 00 02 + f6: 01 1f + f8: 02 0f + fa: 03 17 00 00 lh a4, 0(zero) + fe: 00 01 + 100: 98 00 + 102: 00 00 + 104: 01 17 + 106: 00 00 + 108: 00 01 + +Disassembly of section .debug_frame: + +00000000 <.debug_frame>: + 0: 0c 00 + 2: 00 00 + 4: ff ff ff ff + 8: 03 00 01 7c lb zero, 1984(sp) + c: 01 0d + e: 02 00 + 10: 0c 00 + 12: 00 00 + 14: 00 00 + 16: 00 00 + 18: f0 25 + 1a: 00 80 + 1c: 4c 00 + 1e: 00 00 + +Disassembly of section .debug_str: + +00000000 <.debug_str>: + 0: 6c 6f + 2: 6e 67 + 4: 20 6c + 6: 6f 6e 67 20 jal t3, 0x7620c <.debug_info+0x7620c> + a: 69 6e + c: 74 00 + e: 5f 5f 63 6c + 12: 7a 73 + 14: 69 32 + 16: 00 63 + 18: 6f 6d 70 6c jal s10, 0x6ede <.debug_info+0x6ede> + 1c: 65 78 + 1e: 20 64 + 20: 6f 75 62 6c jal a0, 0x276e6 <.debug_info+0x276e6> + 24: 65 00 + 26: 5f 5f 78 72 + 2a: 00 47 + 2c: 4e 55 + 2e: 20 43 + 30: 31 37 + 32: 20 31 + 34: 32 2e + 36: 32 2e + 38: 30 20 + 3a: 2d 6d + 3c: 63 6d 6f 64 bltu t5, t1, 0x696 <.debug_info+0x696> + 40: 65 6c + 42: 3d 6d + 44: 65 64 + 46: 61 6e + 48: 79 20 + 4a: 2d 6d + 4c: 63 6d 6f 64 bltu t5, t1, 0x6a6 <.debug_info+0x6a6> + 50: 65 6c + 52: 3d 6d + 54: 65 64 + 56: 61 6e + 58: 79 20 + 5a: 2d 6d + 5c: 74 75 + 5e: 6e 65 + 60: 3d 72 + 62: 6f 63 6b 65 jal t1, 0xb66b8 <.debug_info+0xb66b8> + 66: 74 20 + 68: 2d 6d + 6a: 61 62 + 6c: 69 3d + 6e: 69 6c + 70: 70 33 + 72: 32 66 + 74: 20 2d + 76: 6d 69 + 78: 73 61 2d 73 csrrsi sp, mhpmevent18h, 26 + 7c: 70 65 + 7e: 63 3d 32 30 + 82: 31 39 + 84: 31 32 + 86: 31 33 + 88: 20 2d + 8a: 6d 61 + 8c: 72 63 + 8e: 68 3d + 90: 72 76 + 92: 33 32 69 6d + 96: 66 5f + 98: 7a 69 + 9a: 63 73 72 20 bgeu tp, t2, 0x2a0 <.debug_info+0x2a0> + 9e: 2d 67 + a0: 20 2d + a2: 4f 73 20 2d + a6: 4f 32 20 2d + aa: 4f 73 20 2d + ae: 66 62 + b0: 75 69 + b2: 6c 64 + b4: 69 6e + b6: 67 2d 6c 69 + ba: 62 67 + bc: 63 63 20 2d bltu zero, s2, 0x382 <.debug_info+0x382> + c0: 66 6e + c2: 6f 2d 73 74 jal s10, 0x33008 <.debug_info+0x33008> + c6: 61 63 + c8: 6b 2d 70 72 + cc: 6f 74 65 63 jal s0, 0x57702 <.debug_info+0x57702> + d0: 74 6f + d2: 72 20 + d4: 2d 66 + d6: 76 69 + d8: 73 69 62 69 csrrsi s2, 1686, 4 + dc: 6c 69 + de: 74 79 + e0: 3d 68 + e2: 69 64 + e4: 64 65 + e6: 6e 00 + e8: 6c 6f + ea: 6e 67 + ec: 20 6c + ee: 6f 6e 67 20 jal t3, 0x762f4 <.debug_info+0x762f4> + f2: 75 6e + f4: 73 69 67 6e csrrsi s2, 1766, 14 + f8: 65 64 + fa: 20 69 + fc: 6e 74 + fe: 00 75 + 100: 6e 73 + 102: 69 67 + 104: 6e 65 + 106: 64 20 + 108: 63 68 61 72 bltu sp, t1, 0x838 <.debug_info+0x838> + 10c: 00 5f + 10e: 5f 63 6c 7a + 112: 5f 74 61 62 + 116: 00 63 + 118: 6f 6d 70 6c jal s10, 0x6fde <.debug_info+0x6fde> + 11c: 65 78 + 11e: 20 6c + 120: 6f 6e 67 20 jal t3, 0x76326 <.debug_info+0x76326> + 124: 64 6f + 126: 75 62 + 128: 6c 65 + 12a: 00 73 + 12c: 68 6f + 12e: 72 74 + 130: 20 75 + 132: 6e 73 + 134: 69 67 + 136: 6e 65 + 138: 64 20 + 13a: 69 6e + 13c: 74 00 + 13e: 63 6f 6d 70 bltu s10, t1, 0x85c <.debug_info+0x85c> + 142: 6c 65 + 144: 78 20 + 146: 66 6c + 148: 6f 61 74 00 jal sp, 0x4694e <.debug_info+0x4694e> + 14c: 55 51 + 14e: 49 74 + 150: 79 70 + 152: 65 00 + 154: 55 53 + 156: 49 74 + 158: 79 70 + 15a: 65 00 + 15c: 73 68 6f 72 csrrsi a6, mhpmevent6h, 30 + 160: 74 20 + 162: 69 6e + 164: 74 00 + +Disassembly of section .debug_loclists: + +00000000 <.debug_loclists>: + 0: 5e 00 + 2: 00 00 + 4: 05 00 + 6: 04 00 + 8: 00 00 + a: 00 00 + c: 07 f0 25 00 + 10: 80 10 + 12: 26 00 + 14: 80 01 + 16: 5a 07 + 18: 10 26 + 1a: 00 80 + 1c: 28 26 + 1e: 00 80 + 20: 04 a3 + 22: 01 5a + 24: 9f 07 28 26 + 28: 00 80 + 2a: 3c 26 + 2c: 00 80 + 2e: 01 5a + 30: 00 07 + 32: f0 25 + 34: 00 80 + 36: 10 26 + 38: 00 80 + 3a: 01 5a + 3c: 07 10 26 00 + 40: 80 28 + 42: 26 00 + 44: 80 04 + 46: a3 01 5a 9f sb s5, -1565(s4) + 4a: 07 28 26 00 flw fa6, 2(a2) + 4e: 80 3c + 50: 26 00 + 52: 80 01 + 54: 5a 00 + 56: 07 04 26 00 + 5a: 80 18 + 5c: 26 00 + 5e: 80 01 + 60: 5f + 61: 00 + +Disassembly of section .debug_rnglists: + +00000000 <.debug_rnglists>: + 0: 24 00 + 2: 00 00 + 4: 05 00 + 6: 04 00 + 8: 00 00 + a: 00 00 + c: 06 f0 + e: 25 00 + 10: 80 04 + 12: 26 00 + 14: 80 06 + 16: 04 26 + 18: 00 80 + 1a: 20 26 + 1c: 00 80 + 1e: 06 28 + 20: 26 00 + 22: 80 3c + 24: 26 00 + 26: 80 00 + +Disassembly of section .debug_line_str: + +00000000 <.debug_line_str>: + 0: 2e 2e + 2: 2f 2e 2e 2f + 6: 2e 2e + 8: 2f 2e 2e 2f + c: 67 63 63 2f + 10: 6c 69 + 12: 62 67 + 14: 63 63 2f 6c bltu t5, sp, 0x6da <.debug_info+0x6da> + 18: 69 62 + 1a: 67 63 63 32 + 1e: 2e 63 + 20: 00 2f + 22: 68 6f + 24: 6d 65 + 26: 2f 62 6c 61 + 2a: 69 73 + 2c: 65 2f + 2e: 64 65 + 30: 76 2f + 32: 72 69 + 34: 73 63 76 2d csrrsi t1, 727, 12 + 38: 67 6e 75 2d + 3c: 74 6f + 3e: 6f 6c 63 68 jal s8, 0x366c4 <.debug_info+0x366c4> + 42: 61 69 + 44: 6e 2f + 46: 62 75 + 48: 69 6c + 4a: 64 33 + 4c: 32 2f + 4e: 62 75 + 50: 69 6c + 52: 64 2d + 54: 67 63 63 2d + 58: 6e 65 + 5a: 77 6c 69 62 + 5e: 2d 73 + 60: 74 61 + 62: 67 65 32 2f + 66: 72 69 + 68: 73 63 76 33 csrrsi t1, mhpmevent23, 12 + 6c: 32 2d + 6e: 75 6e + 70: 6b 6e 6f 77 + 74: 6e 2d + 76: 65 6c + 78: 66 2f + 7a: 6c 69 + 7c: 62 67 + 7e: 63 63 00 2e bltu zero, zero, 0x364 <.debug_info+0x364> + 82: 2e 2f + 84: 2e 2e + 86: 2f 2e 2e 2f + 8a: 2e 2e + 8c: 2f 67 63 63 + 90: 2f 6c 69 62 + 94: 67 63 63 00 + 98: 6c 69 + 9a: 62 67 + 9c: 63 63 32 2e bltu tp, gp, 0x382 <.debug_info+0x382> + a0: 68 00 + +Disassembly of section .symtab: + +00000000 <.symtab>: + ... + 14: 00 00 + 16: 00 80 + 18: 00 00 + 1a: 00 00 + 1c: 03 00 01 00 lb zero, 0(sp) + 20: 00 00 + 22: 00 00 + 24: 84 00 + 26: 00 80 + 28: 00 00 + 2a: 00 00 + 2c: 03 00 02 00 lb zero, 0(tp) + 30: 00 00 + 32: 00 00 + 34: 3c 26 + 36: 00 80 + 38: 00 00 + 3a: 00 00 + 3c: 03 00 03 00 lb zero, 0(t1) + 40: 00 00 + 42: 00 00 + 44: 14 3b + 46: 00 80 + 48: 00 00 + 4a: 00 00 + 4c: 03 00 04 00 lb zero, 0(s0) + 50: 00 00 + 52: 00 00 + 54: 18 3b + 56: 00 80 + 58: 00 00 + 5a: 00 00 + 5c: 03 00 05 00 lb zero, 0(a0) + 60: 00 00 + 62: 00 00 + 64: 40 3f + 66: 00 80 + 68: 00 00 + 6a: 00 00 + 6c: 03 00 06 00 lb zero, 0(a2) + 70: 00 00 + 72: 00 00 + 74: cc 3f + 76: 00 80 + 78: 00 00 + 7a: 00 00 + 7c: 03 00 07 00 lb zero, 0(a4) + ... + 8c: 03 00 08 00 lb zero, 0(a6) + ... + 9c: 03 00 09 00 lb zero, 0(s2) + ... + ac: 03 00 0a 00 lb zero, 0(s4) + ... + bc: 03 00 0b 00 lb zero, 0(s6) + ... + cc: 03 00 0c 00 lb zero, 0(s8) + ... + dc: 03 00 0d 00 lb zero, 0(s10) + ... + ec: 03 00 0e 00 lb zero, 0(t3) + ... + fc: 03 00 0f 00 lb zero, 0(t5) + ... + 10c: 03 00 10 00 lb zero, 1(zero) + ... + 11c: 03 00 11 00 lb zero, 1(sp) + ... + 12c: 03 00 12 00 lb zero, 1(tp) + 130: 01 00 + ... + 13a: 00 00 + 13c: 04 00 + 13e: f1 ff + 140: 0e 00 + 142: 00 00 + 144: 00 00 + 146: 00 80 + 148: 00 00 + 14a: 00 00 + 14c: 00 00 + 14e: 01 00 + 150: 3a 00 + 152: 00 00 + 154: d8 08 + 156: 00 80 + 158: 00 00 + 15a: 00 00 + 15c: 02 00 + 15e: 02 00 + 160: 48 00 + 162: 00 00 + 164: a4 08 + 166: 00 80 + 168: 00 00 + 16a: 00 00 + 16c: 02 00 + 16e: 02 00 + 170: 52 00 + 172: 00 00 + 174: ec 08 + 176: 00 80 + 178: 00 00 + 17a: 00 00 + 17c: 02 00 + 17e: 02 00 + 180: 0e 00 + 182: 00 00 + 184: 94 08 + 186: 00 80 + 188: 00 00 + 18a: 00 00 + 18c: 00 00 + 18e: 02 00 + 190: e6 01 + ... + 19a: 00 00 + 19c: 04 00 + 19e: f1 ff + 1a0: 5f 00 00 00 + 1a4: 84 00 + 1a6: 00 80 + 1a8: 00 00 + 1aa: 00 00 + 1ac: 00 00 + 1ae: 02 00 + 1b0: 86 00 + ... + 1ba: 00 00 + 1bc: 04 00 + 1be: f1 ff + 1c0: 96 00 + 1c2: 00 00 + 1c4: b8 00 + 1c6: 00 80 + 1c8: 18 00 + 1ca: 00 00 + 1cc: 02 00 + 1ce: 02 00 + 1d0: 5f 00 00 00 + 1d4: b8 00 + 1d6: 00 80 + 1d8: 00 00 + 1da: 00 00 + 1dc: 00 00 + 1de: 02 00 + 1e0: 5f 00 00 00 + 1e4: cc 24 + 1e6: 00 80 + 1e8: 00 00 + 1ea: 00 00 + 1ec: 00 00 + 1ee: 02 00 + 1f0: a4 00 + ... + 1fa: 00 00 + 1fc: 04 00 + 1fe: f1 ff + 200: c0 00 + ... + 20a: 00 00 + 20c: 04 00 + 20e: f1 ff + 210: cc 00 + 212: 00 00 + 214: fc 00 + 216: 00 80 + 218: 24 00 + 21a: 00 00 + 21c: 02 00 + 21e: 02 00 + 220: d8 00 + 222: 00 00 + 224: 20 01 + 226: 00 80 + 228: 24 00 + 22a: 00 00 + 22c: 02 00 + 22e: 02 00 + 230: e4 00 + ... + 23a: 00 00 + 23c: 04 00 + 23e: f1 ff + 240: 0e 00 + 242: 00 00 + 244: 10 09 + 246: 00 80 + 248: 00 00 + 24a: 00 00 + 24c: 00 00 + 24e: 02 00 + 250: 0e 00 + 252: 00 00 + 254: 54 09 + 256: 00 80 + 258: 00 00 + 25a: 00 00 + 25c: 00 00 + 25e: 02 00 + 260: 0e 00 + 262: 00 00 + 264: e8 09 + 266: 00 80 + 268: 00 00 + 26a: 00 00 + 26c: 00 00 + 26e: 02 00 + 270: f2 00 + ... + 27a: 00 00 + 27c: 04 00 + 27e: f1 ff + 280: fd 00 + 282: 00 00 + 284: 44 0a + 286: 00 80 + 288: 5c 01 + 28a: 00 00 + 28c: 02 00 + 28e: 02 00 + 290: 0e 00 + 292: 00 00 + 294: 44 0a + 296: 00 80 + 298: 00 00 + 29a: 00 00 + 29c: 00 00 + 29e: 02 00 + 2a0: 13 01 00 00 li sp, 0 + 2a4: a0 0b + 2a6: 00 80 + 2a8: 84 00 + 2aa: 00 00 + 2ac: 02 00 + 2ae: 02 00 + 2b0: 0e 00 + 2b2: 00 00 + 2b4: a0 0b + 2b6: 00 80 + 2b8: 00 00 + 2ba: 00 00 + 2bc: 00 00 + 2be: 02 00 + 2c0: 29 01 + 2c2: 00 00 + 2c4: 24 0c + 2c6: 00 80 + 2c8: 24 00 + 2ca: 00 00 + 2cc: 02 00 + 2ce: 02 00 + 2d0: 0e 00 + 2d2: 00 00 + 2d4: 24 0c + 2d6: 00 80 + 2d8: 00 00 + 2da: 00 00 + 2dc: 00 00 + 2de: 02 00 + 2e0: 0e 00 + 2e2: 00 00 + 2e4: 48 0c + 2e6: 00 80 + 2e8: 00 00 + 2ea: 00 00 + 2ec: 00 00 + 2ee: 02 00 + 2f0: 3d 01 + ... + 2fa: 00 00 + 2fc: 04 00 + 2fe: f1 ff + 300: 0e 00 + 302: 00 00 + 304: 40 0e + 306: 00 80 + 308: 00 00 + 30a: 00 00 + 30c: 00 00 + 30e: 02 00 + 310: 47 01 00 00 fmsub.s ft2, ft0, ft0, ft0, rne + ... + 31c: 04 00 + 31e: f1 ff + 320: 5f 00 00 00 + 324: 58 10 + 326: 00 80 + 328: 00 00 + 32a: 00 00 + 32c: 00 00 + 32e: 02 00 + 330: 50 01 + ... + 33a: 00 00 + 33c: 04 00 + 33e: f1 ff + 340: 5f 00 00 00 + 344: f8 10 + 346: 00 80 + 348: 00 00 + 34a: 00 00 + 34c: 00 00 + 34e: 02 00 + 350: 59 01 + ... + 35a: 00 00 + 35c: 04 00 + 35e: f1 ff + 360: 5f 00 00 00 + 364: 9c 11 + 366: 00 80 + 368: 00 00 + 36a: 00 00 + 36c: 00 00 + 36e: 02 00 + 370: 67 01 00 00 jalr sp, zero + 374: c4 26 + 376: 00 80 + 378: 18 03 + 37a: 00 00 + 37c: 01 00 + 37e: 03 00 73 01 lb zero, 23(t1) + 382: 00 00 + 384: 44 26 + 386: 00 80 + 388: 80 00 + 38a: 00 00 + 38c: 01 00 + 38e: 03 00 7c 01 lb zero, 23(s8) + ... + 39a: 00 00 + 39c: 04 00 + 39e: f1 ff + 3a0: 5f 00 00 00 + 3a4: b8 14 + 3a6: 00 80 + 3a8: 00 00 + 3aa: 00 00 + 3ac: 00 00 + 3ae: 02 00 + 3b0: 85 01 + ... + 3ba: 00 00 + 3bc: 04 00 + 3be: f1 ff + 3c0: 5f 00 00 00 + 3c4: 04 16 + 3c6: 00 80 + 3c8: 00 00 + 3ca: 00 00 + 3cc: 00 00 + 3ce: 02 00 + 3d0: 93 01 00 00 li gp, 0 + 3d4: 08 2a + 3d6: 00 80 + 3d8: 0c 00 + 3da: 00 00 + 3dc: 01 00 + 3de: 03 00 9b 01 lb zero, 25(s6) + 3e2: 00 00 + 3e4: dc 29 + 3e6: 00 80 + 3e8: 2c 00 + 3ea: 00 00 + 3ec: 01 00 + 3ee: 03 00 a0 01 lb zero, 26(zero) + ... + 3fa: 00 00 + 3fc: 04 00 + 3fe: f1 ff + 400: 5f 00 00 00 + 404: f4 1e + 406: 00 80 + 408: 00 00 + 40a: 00 00 + 40c: 00 00 + 40e: 02 00 + 410: a9 01 + ... + 41a: 00 00 + 41c: 04 00 + 41e: f1 ff + 420: 5f 00 00 00 + 424: a0 1f + 426: 00 80 + 428: 00 00 + 42a: 00 00 + 42c: 00 00 + 42e: 02 00 + 430: b3 01 00 00 add gp, zero, zero + ... + 43c: 04 00 + 43e: f1 ff + 440: 5f 00 00 00 + 444: a8 1f + 446: 00 80 + 448: 00 00 + 44a: 00 00 + 44c: 00 00 + 44e: 02 00 + 450: be 01 + ... + 45a: 00 00 + 45c: 04 00 + 45e: f1 ff + 460: 5f 00 00 00 + 464: 74 20 + 466: 00 80 + 468: 00 00 + 46a: 00 00 + 46c: 00 00 + 46e: 02 00 + 470: e4 01 + ... + 47a: 00 00 + 47c: 04 00 + 47e: f1 ff + 480: 5f 00 00 00 + 484: 9c 21 + 486: 00 80 + 488: 00 00 + 48a: 00 00 + 48c: 00 00 + 48e: 02 00 + 490: ca 01 + ... + 49a: 00 00 + 49c: 04 00 + 49e: f1 ff + 4a0: 5f 00 00 00 + 4a4: b0 21 + 4a6: 00 80 + 4a8: 00 00 + 4aa: 00 00 + 4ac: 00 00 + 4ae: 02 00 + 4b0: d3 01 00 00 fadd.s ft3, ft0, ft0, rne + ... + 4bc: 04 00 + 4be: f1 ff + 4c0: 5f 00 00 00 + 4c4: 54 23 + 4c6: 00 80 + 4c8: 00 00 + 4ca: 00 00 + 4cc: 00 00 + 4ce: 02 00 + 4d0: e2 01 + ... + 4da: 00 00 + 4dc: 04 00 + 4de: f1 ff + 4e0: 5f 00 00 00 + 4e4: 30 24 + 4e6: 00 80 + 4e8: 00 00 + 4ea: 00 00 + 4ec: 00 00 + 4ee: 02 00 + 4f0: ed 01 + ... + 4fa: 00 00 + 4fc: 04 00 + 4fe: f1 ff + 500: 5f 00 00 00 + 504: f0 25 + 506: 00 80 + 508: 00 00 + 50a: 00 00 + 50c: 00 00 + 50e: 02 00 + 510: ed 01 + ... + 51a: 00 00 + 51c: 04 00 + 51e: f1 ff + 520: f7 01 00 00 + ... + 52c: 04 00 + 52e: f1 ff + 530: 00 02 + 532: 00 00 + 534: 18 3b + 536: 00 80 + 538: 28 04 + 53a: 00 00 + 53c: 01 00 + 53e: 05 00 + ... + 54c: 04 00 + 54e: f1 ff + 550: 0c 02 + 552: 00 00 + 554: 18 3b + 556: 00 80 + 558: 00 00 + 55a: 00 00 + 55c: 00 00 + 55e: 05 00 + 560: 1d 02 + 562: 00 00 + 564: 14 3b + 566: 00 80 + 568: 00 00 + 56a: 00 00 + 56c: 00 00 + 56e: 04 00 + 570: 2a 02 + 572: 00 00 + 574: 18 3b + 576: 00 80 + 578: 00 00 + 57a: 00 00 + 57c: 00 00 + 57e: 05 00 + 580: 3d 02 + 582: 00 00 + 584: 14 3b + 586: 00 80 + 588: 00 00 + 58a: 00 00 + 58c: 00 00 + 58e: 04 00 + 590: 4b 02 00 00 fnmsub.s ft4, ft0, ft0, ft0, rne + 594: 18 3b + 596: 00 80 + 598: 00 00 + 59a: 00 00 + 59c: 00 00 + 59e: 04 00 + 5a0: 5c 02 + ... + 5ae: f1 ff + 5b0: 6a 02 + 5b2: 00 00 + 5b4: 14 3b + 5b6: 00 80 + 5b8: 00 00 + 5ba: 00 00 + 5bc: 00 00 + 5be: 04 00 + 5c0: 7e 02 + 5c2: 00 00 + 5c4: 14 3b + 5c6: 00 80 + 5c8: 00 00 + 5ca: 00 00 + 5cc: 00 00 + 5ce: 04 00 + 5d0: 89 02 + 5d2: 00 00 + 5d4: 14 3b + 5d6: 00 80 + 5d8: 00 00 + 5da: 00 00 + 5dc: 00 00 + 5de: 04 00 + 5e0: 9c 02 + 5e2: 00 00 + 5e4: 14 3b + 5e6: 00 80 + 5e8: 00 00 + 5ea: 00 00 + 5ec: 00 00 + 5ee: 04 00 + 5f0: b2 02 + 5f2: 00 00 + 5f4: 9c 11 + 5f6: 00 80 + 5f8: 1c 03 + 5fa: 00 00 + 5fc: 12 00 + 5fe: 02 00 + 600: c6 02 + 602: 00 00 + 604: cc 3f + 606: 00 80 + 608: 00 10 + 60a: 00 00 + 60c: 11 00 + 60e: 07 00 d4 02 + 612: 00 00 + 614: 40 3f + 616: 00 80 + 618: 00 00 + 61a: 00 00 + 61c: 10 00 + 61e: 06 00 + 620: e4 02 + 622: 00 00 + 624: 00 09 + 626: 00 80 + 628: 00 00 + 62a: 00 00 + 62c: 12 00 + 62e: 02 00 + 630: f3 02 00 00 + 634: b0 21 + 636: 00 80 + 638: a4 01 + 63a: 00 00 + 63c: 12 00 + 63e: 02 00 + 640: fa 02 + 642: 00 00 + 644: 40 47 + 646: 00 80 + 648: 00 00 + 64a: 00 00 + 64c: 10 00 + 64e: f1 ff + 650: 0b 03 00 00 + 654: 44 01 + 656: 00 80 + 658: 50 07 + 65a: 00 00 + 65c: 12 00 + 65e: 02 00 + 660: 2d 03 + 662: 00 00 + 664: a0 1f + 666: 00 80 + 668: 08 00 + 66a: 00 00 + 66c: 12 00 + 66e: 02 00 + 670: 33 03 00 00 add t1, zero, zero + 674: c8 3f + 676: 00 80 + 678: 04 00 + 67a: 00 00 + 67c: 11 00 + 67e: 06 00 + 680: 46 03 + 682: 00 00 + 684: 54 09 + 686: 00 80 + 688: 94 00 + 68a: 00 00 + 68c: 12 00 + 68e: 02 00 + 690: 58 03 + 692: 00 00 + 694: f4 1e + 696: 00 80 + 698: ac 00 + 69a: 00 00 + 69c: 12 00 + 69e: 02 00 + 6a0: 66 03 + 6a2: 00 00 + 6a4: 10 09 + 6a6: 00 80 + 6a8: 44 00 + 6aa: 00 00 + 6ac: 12 00 + 6ae: 02 00 + 6b0: d3 00 00 00 fadd.s ft1, ft0, ft0, rne + 6b4: 58 10 + 6b6: 00 80 + 6b8: a0 00 + 6ba: 00 00 + 6bc: 12 00 + 6be: 02 00 + 6c0: 71 03 + 6c2: 00 00 + 6c4: e8 09 + 6c6: 00 80 + 6c8: 5c 00 + 6ca: 00 00 + 6cc: 12 00 + 6ce: 02 00 + 6d0: 83 03 00 00 lb t2, 0(zero) + 6d4: b8 14 + 6d6: 00 80 + 6d8: 4c 01 + 6da: 00 00 + 6dc: 12 00 + 6de: 02 00 + 6e0: 91 03 + ... + 6ea: 00 00 + 6ec: 10 00 + 6ee: f1 ff + 6f0: 9e 03 + ... + 6fa: 00 00 + 6fc: 10 00 + 6fe: f1 ff + 700: aa 03 + 702: 00 00 + 704: f0 25 + 706: 00 80 + 708: 4c 00 + 70a: 00 00 + 70c: 12 02 + 70e: 02 00 + 710: b3 03 00 00 add t2, zero, zero + 714: cc 24 + 716: 00 80 + 718: 24 01 + 71a: 00 00 + 71c: 12 00 + 71e: 02 00 + 720: 44 02 + 722: 00 00 + 724: 00 00 + 726: 00 80 + 728: 84 00 + 72a: 00 00 + 72c: 12 00 + 72e: 01 00 + 730: c4 03 + 732: 00 00 + 734: 30 24 + 736: 00 80 + 738: 9c 00 + 73a: 00 00 + 73c: 12 00 + 73e: 02 00 + 740: d8 03 + 742: 00 00 + 744: cc 4f + 746: 00 80 + 748: 00 00 + 74a: 00 00 + 74c: 10 00 + 74e: 07 00 e4 03 + 752: 00 00 + 754: 74 20 + 756: 00 80 + 758: 28 01 + 75a: 00 00 + 75c: 12 00 + 75e: 02 00 + 760: ec 03 + 762: 00 00 + 764: cc 3f + 766: 00 80 + 768: 00 00 + 76a: 00 00 + 76c: 10 00 + 76e: 07 00 f8 03 + 772: 00 00 + 774: 54 23 + 776: 00 80 + 778: dc 00 + 77a: 00 00 + 77c: 12 00 + 77e: 02 00 + 780: ff 03 00 00 + 784: d0 00 + 786: 00 80 + 788: 2c 00 + 78a: 00 00 + 78c: 12 00 + 78e: 02 00 + 790: 04 04 + 792: 00 00 + 794: 14 2a + 796: 00 80 + 798: 00 01 + 79a: 00 00 + 79c: 11 02 + 79e: 03 00 0e 04 lb zero, 64(t3) + 7a2: 00 00 + 7a4: 9c 21 + 7a6: 00 80 + 7a8: 14 00 + 7aa: 00 00 + 7ac: 12 00 + 7ae: 02 00 + 7b0: 15 04 + ... + 7ba: 00 00 + 7bc: 10 00 + 7be: f1 ff + 7c0: 28 04 + 7c2: 00 00 + 7c4: 00 00 + 7c6: 00 80 + 7c8: 00 00 + 7ca: 00 00 + 7cc: 10 00 + 7ce: f1 ff + 7d0: df 00 00 00 + 7d4: f8 10 + 7d6: 00 80 + 7d8: a4 00 + 7da: 00 00 + 7dc: 12 00 + 7de: 02 00 + 7e0: 35 04 + 7e2: 00 00 + 7e4: 18 3b + 7e6: 00 80 + 7e8: 00 00 + 7ea: 00 00 + 7ec: 10 00 + 7ee: 05 00 + 7f0: 44 04 + 7f2: 00 00 + 7f4: cc 3f + 7f6: 00 80 + 7f8: 00 00 + 7fa: 00 00 + 7fc: 10 00 + 7fe: 06 00 + 800: 84 02 + 802: 00 00 + 804: cc 4f + 806: 00 80 + 808: 00 00 + 80a: 00 00 + 80c: 10 00 + 80e: 07 00 59 04 + 812: 00 00 + 814: 84 00 + 816: 00 80 + 818: 34 00 + 81a: 00 00 + 81c: 12 00 + 81e: 02 00 + 820: 4b 04 00 00 fnmsub.s fs0, ft0, ft0, ft0, rne + 824: 40 0e + 826: 00 80 + 828: 18 02 + 82a: 00 00 + 82c: 12 00 + 82e: 02 00 + 830: 58 04 + 832: 00 00 + 834: 94 08 + 836: 00 80 + 838: 00 00 + 83a: 00 00 + 83c: 12 00 + 83e: 02 00 + 840: 5e 04 + 842: 00 00 + 844: 04 16 + 846: 00 80 + 848: f0 08 + 84a: 00 00 + 84c: 12 00 + 84e: 02 00 + 850: 71 04 + 852: 00 00 + 854: a8 1f + 856: 00 80 + 858: cc 00 + 85a: 00 00 + 85c: 12 00 + 85e: 02 00 + 860: 78 04 + 862: 00 00 + 864: 48 0c + 866: 00 80 + 868: f8 01 + 86a: 00 00 + 86c: 12 00 + 86e: 02 00 + +Disassembly of section .strtab: + +00000000 <.strtab>: + 0: 00 76 + 2: 78 5f + 4: 73 74 61 72 csrrci s0, mhpmevent6h, 2 + 8: 74 2e + a: 53 2e 6f 00 fadd.s ft8, ft10, ft6, rdn + e: 24 78 + 10: 72 76 + 12: 33 32 69 32 + 16: 70 31 + 18: 5f 6d 32 70 + 1c: 30 5f + 1e: 61 32 + 20: 70 31 + 22: 5f 66 32 70 + 26: 32 5f + 28: 7a 69 + 2a: 63 73 72 32 bgeu tp, t2, 0x350 <.symtab+0x350> + 2e: 70 30 + 30: 5f 7a 6d 6d + 34: 75 6c + 36: 31 70 + 38: 30 00 + 3a: 69 6e + 3c: 69 74 + 3e: 5f 72 65 67 + 42: 73 5f 61 6c csrrwi t5, 1734, 2 + 46: 6c 00 + 48: 69 6e + 4a: 69 74 + 4c: 5f 72 65 67 + 50: 73 00 69 6e + 54: 69 74 + 56: 5f 74 6c 73 + 5a: 5f 61 6c 6c + 5e: 00 24 + 60: 78 72 + 62: 76 33 + 64: 32 69 + 66: 32 70 + 68: 31 5f + 6a: 6d 32 + 6c: 70 30 + 6e: 5f 66 32 70 + 72: 32 5f + 74: 7a 69 + 76: 63 73 72 32 bgeu tp, t2, 0x39c <.symtab+0x39c> + 7a: 70 30 + 7c: 5f 7a 6d 6d + 80: 75 6c + 82: 31 70 + 84: 30 00 + 86: 5f 5f 63 61 + 8a: 6c 6c + 8c: 5f 61 74 65 + 90: 78 69 + 92: 74 2e + 94: 63 00 72 65 beq tp, s7, 0x6d4 <.symtab+0x6d4> + 98: 67 69 73 74 + 9c: 65 72 + 9e: 5f 66 69 6e + a2: 69 00 + a4: 70 6f + a6: 63 6c 5f 76 bltu t5, t0, 0x81e <.symtab+0x81e> + aa: 6f 72 74 65 jal tp, 0x47f00 <.symtab+0x47f00> + ae: 78 5f + b0: 6b 65 72 6e + b4: 65 6c + b6: 5f 33 69 37 + ba: 4d 30 + bc: 62 2e + be: 63 00 70 61 beq zero, s7, 0x6be <.symtab+0x6be> + c2: 72 61 + c4: 6c 6c + c6: 65 6c + c8: 5f 62 63 00 + cc: 5f 5a 37 5f + d0: 63 6c 5f 63 bltu t5, s5, 0x708 <.symtab+0x708> + d4: 6f 73 66 00 jal t1, 0x670da <.symtab+0x670da> + d8: 5f 5a 37 5f + dc: 63 6c 5f 73 bltu t5, s5, 0x814 <.symtab+0x814> + e0: 69 6e + e2: 66 00 + e4: 76 78 + e6: 5f 73 79 73 + ea: 63 61 6c 6c bltu s8, t1, 0x7ac <.symtab+0x7ac> + ee: 73 2e 63 00 csrrs t3, 6, t1 + f2: 76 78 + f4: 5f 73 70 61 + f8: 77 6e 2e 63 + fc: 00 73 + fe: 70 61 + 100: 77 6e 5f 6b + 104: 65 72 + 106: 6e 65 + 108: 6c 5f + 10a: 61 6c + 10c: 6c 5f + 10e: 73 74 75 62 csrrci s0, 1575, 10 + 112: 00 73 + 114: 70 61 + 116: 77 6e 5f 6b + 11a: 65 72 + 11c: 6e 65 + 11e: 6c 5f + 120: 72 65 + 122: 6d 5f + 124: 73 74 75 62 csrrci s0, 1575, 10 + 128: 00 73 + 12a: 70 61 + 12c: 77 6e 5f 6b + 130: 65 72 + 132: 6e 65 + 134: 6c 5f + 136: 61 6c + 138: 6c 5f + 13a: 63 62 00 76 bltu zero, zero, 0x89e <.symtab+0x89e> + 13e: 78 5f + 140: 70 65 + 142: 72 66 + 144: 2e 63 + 146: 00 73 + 148: 66 5f + 14a: 63 6f 73 2e bltu t1, t2, 0x448 <.symtab+0x448> + 14e: 63 00 73 66 beq t1, t2, 0x7ae <.symtab+0x7ae> + 152: 5f 73 69 6e + 156: 2e 63 + 158: 00 65 + 15a: 66 5f + 15c: 72 65 + 15e: 6d 5f + 160: 70 69 + 162: 6f 32 2e 63 jal tp, 0xe3794 <.symtab+0xe3794> + 166: 00 74 + 168: 77 6f 5f 6f + 16c: 76 65 + 16e: 72 5f + 170: 70 69 + 172: 00 6e + 174: 70 69 + 176: 6f 32 5f 68 jal tp, 0xf3ffa <.symtab+0xf3ffa> + 17a: 77 00 6b 66 + 17e: 5f 63 6f 73 + 182: 2e 63 + 184: 00 6b + 186: 66 5f + 188: 72 65 + 18a: 6d 5f + 18c: 70 69 + 18e: 6f 32 2e 63 jal tp, 0xe37c0 <.symtab+0xe37c0> + 192: 00 69 + 194: 6e 69 + 196: 74 5f + 198: 6a 6b + 19a: 00 50 + 19c: 49 6f + 19e: 32 00 + 1a0: 6b 66 5f 73 + 1a4: 69 6e + 1a6: 2e 63 + 1a8: 00 73 + 1aa: 66 5f + 1ac: 66 61 + 1ae: 62 73 + 1b0: 2e 63 + 1b2: 00 73 + 1b4: 66 5f + 1b6: 66 6c + 1b8: 6f 6f 72 2e jal t5, 0x26c9e <.symtab+0x26c9e> + 1bc: 63 00 73 66 beq t1, t2, 0x81c <.symtab+0x81c> + 1c0: 5f 73 63 61 + 1c4: 6c 62 + 1c6: 6e 2e + 1c8: 63 00 6d 65 beq s10, s6, 0x808 <.symtab+0x808> + 1cc: 6d 63 + 1ce: 70 79 + 1d0: 2e 63 + 1d2: 00 6c + 1d4: 69 62 + 1d6: 5f 61 2d 6d + 1da: 65 6d + 1dc: 73 65 74 2e csrrsi a0, 743, 8 + 1e0: 6f 00 5f 5f j 0xf0fd4 <.symtab+0xf0fd4> + 1e4: 61 74 + 1e6: 65 78 + 1e8: 69 74 + 1ea: 2e 63 + 1ec: 00 6c + 1ee: 69 62 + 1f0: 67 63 63 32 + 1f4: 2e 63 + 1f6: 00 69 + 1f8: 6d 70 + 1fa: 75 72 + 1fc: 65 2e + 1fe: 63 00 69 6d beq s2, s6, 0x8be <.symtab+0x8be> + 202: 70 75 + 204: 72 65 + 206: 5f 64 61 74 + 20a: 61 00 + 20c: 5f 5f 66 69 + 210: 6e 69 + 212: 5f 61 72 72 + 216: 61 79 + 218: 5f 65 6e 64 + 21c: 00 5f + 21e: 5f 74 62 73 + 222: 73 5f 73 74 csrrwi t5, mseccfg, 6 + 226: 61 72 + 228: 74 00 + 22a: 5f 5f 66 69 + 22e: 6e 69 + 230: 5f 61 72 72 + 234: 61 79 + 236: 5f 73 74 61 + 23a: 72 74 + 23c: 00 5f + 23e: 5f 74 64 61 + 242: 74 61 + 244: 5f 73 74 61 + 248: 72 74 + 24a: 00 5f + 24c: 5f 69 6e 69 + 250: 74 5f + 252: 61 72 + 254: 72 61 + 256: 79 5f + 258: 65 6e + 25a: 64 00 + 25c: 5f 5f 74 62 + 260: 73 73 5f 6f csrrci t1, 1781, 30 + 264: 66 66 + 266: 73 65 74 00 csrrsi a0, 7, 8 + 26a: 5f 5f 70 72 + 26e: 65 69 + 270: 6e 69 + 272: 74 5f + 274: 61 72 + 276: 72 61 + 278: 79 5f + 27a: 65 6e + 27c: 64 00 + 27e: 5f 5f 74 62 + 282: 73 73 5f 65 csrrci t1, 1621, 30 + 286: 6e 64 + 288: 00 5f + 28a: 5f 69 6e 69 + 28e: 74 5f + 290: 61 72 + 292: 72 61 + 294: 79 5f + 296: 73 74 61 72 csrrci s0, mhpmevent6h, 2 + 29a: 74 00 + 29c: 5f 5f 70 72 + 2a0: 65 69 + 2a2: 6e 69 + 2a4: 74 5f + 2a6: 61 72 + 2a8: 72 61 + 2aa: 79 5f + 2ac: 73 74 61 72 csrrci s0, mhpmevent6h, 2 + 2b0: 74 00 + 2b2: 5f 5f 69 65 + 2b6: 65 65 + 2b8: 37 35 34 5f lui a0, 389955 + 2bc: 72 65 + 2be: 6d 5f + 2c0: 70 69 + 2c2: 6f 32 66 00 jal tp, 0x632c8 <.symtab+0x632c8> + 2c6: 67 5f 77 73 + 2ca: 70 61 + 2cc: 77 6e 5f 61 + 2d0: 72 67 + 2d2: 73 00 5f 5f + 2d6: 53 44 41 54 + 2da: 41 5f + 2dc: 42 45 + 2de: 47 49 4e 5f + 2e2: 5f 00 76 78 + 2e6: 5f 77 73 70 + 2ea: 61 77 + 2ec: 6e 5f + 2ee: 77 61 69 74 + 2f2: 00 6d + 2f4: 65 6d + 2f6: 63 70 79 00 bgeu s2, t2, 0x2f6 <.symtab+0x2f6> + 2fa: 5f 5f 67 6c + 2fe: 6f 62 61 6c jal tp, 0x169c4 <.symtab+0x169c4> + 302: 5f 70 6f 69 + 306: 6e 74 + 308: 65 72 + 30a: 00 5f + 30c: 70 6f + 30e: 63 6c 5f 6b bltu t5, s5, 0x9c6 <.symtab+0x9c6> + 312: 65 72 + 314: 6e 65 + 316: 6c 5f + 318: 66 66 + 31a: 74 5f + 31c: 72 61 + 31e: 64 69 + 320: 78 34 + 322: 5f 77 6f 72 + 326: 6b 67 72 6f + 32a: 75 70 + 32c: 00 66 + 32e: 61 62 + 330: 73 66 00 5f csrrsi a2, 1520, 0 + 334: 67 6c 6f 62 + 338: 61 6c + 33a: 5f 69 6d 70 + 33e: 75 72 + 340: 65 5f + 342: 70 74 + 344: 72 00 + 346: 5f 5f 6c 69 + 34a: 62 63 + 34c: 5f 69 6e 69 + 350: 74 5f + 352: 61 72 + 354: 72 61 + 356: 79 00 + 358: 5f 5f 6b 65 + 35c: 72 6e + 35e: 65 6c + 360: 5f 73 69 6e + 364: 66 00 + 366: 5f 5f 69 6e + 36a: 69 74 + 36c: 5f 74 6c 73 + 370: 00 5f + 372: 5f 6c 69 62 + 376: 63 5f 66 69 bge a2, s6, 0xa14 <.symtab+0xa14> + 37a: 6e 69 + 37c: 5f 61 72 72 + 380: 61 79 + 382: 00 5f + 384: 5f 6b 65 72 + 388: 6e 65 + 38a: 6c 5f + 38c: 63 6f 73 66 bltu t1, t2, 0xa0a <.symtab+0xa0a> + 390: 00 5f + 392: 5f 74 64 61 + 396: 74 61 + 398: 5f 73 69 7a + 39c: 65 00 + 39e: 5f 5f 74 62 + 3a2: 73 73 5f 73 csrrci t1, mhpmevent21h, 30 + 3a6: 69 7a + 3a8: 65 00 + 3aa: 5f 5f 63 6c + 3ae: 7a 73 + 3b0: 69 32 + 3b2: 00 5f + 3b4: 5f 63 61 6c + 3b8: 6c 5f + 3ba: 65 78 + 3bc: 69 74 + 3be: 70 72 + 3c0: 6f 63 73 00 jal t1, 0x36bc6 <.symtab+0x36bc6> + 3c4: 5f 5f 72 65 + 3c8: 67 69 73 74 + 3cc: 65 72 + 3ce: 5f 65 78 69 + 3d2: 74 70 + 3d4: 72 6f + 3d6: 63 00 5f 5f beq t5, s5, 0x9b6 <.symtab+0x9b6> + 3da: 42 53 + 3dc: 53 5f 45 4e + 3e0: 44 5f + 3e2: 5f 00 73 63 + 3e6: 61 6c + 3e8: 62 6e + 3ea: 66 00 + 3ec: 5f 5f 62 73 + 3f0: 73 5f 73 74 csrrwi t5, mseccfg, 6 + 3f4: 61 72 + 3f6: 74 00 + 3f8: 6d 65 + 3fa: 6d 73 + 3fc: 65 74 + 3fe: 00 6d + 400: 61 69 + 402: 6e 00 + 404: 5f 5f 63 6c + 408: 7a 5f + 40a: 74 61 + 40c: 62 00 + 40e: 61 74 + 410: 65 78 + 412: 69 74 + 414: 00 5f + 416: 5f 74 63 62 + 41a: 5f 61 6c 69 + 41e: 67 6e 65 64 + 422: 5f 73 69 7a + 426: 65 00 + 428: 53 54 41 52 + 42c: 54 55 + 42e: 50 5f + 430: 41 44 + 432: 44 52 + 434: 00 5f + 436: 5f 44 41 54 + 43a: 41 5f + 43c: 42 45 + 43e: 47 49 4e 5f + 442: 5f 00 5f 65 + 446: 64 61 + 448: 74 61 + 44a: 00 76 + 44c: 78 5f + 44e: 70 65 + 450: 72 66 + 452: 5f 64 75 6d + 456: 70 00 + 458: 5f 65 78 69 + 45c: 74 00 + 45e: 5f 5f 6b 65 + 462: 72 6e + 464: 65 6c + 466: 5f 72 65 6d + 46a: 5f 70 69 6f + 46e: 32 66 + 470: 00 66 + 472: 6c 6f + 474: 6f 72 66 00 jal tp, 0x6747a <.symtab+0x6747a> + 478: 76 78 + 47a: 5f 73 70 61 + 47e: 77 6e 5f 6b + 482: 65 72 + 484: 6e 65 + 486: 6c 00 + +Disassembly of section .shstrtab: + +00000000 <.shstrtab>: + 0: 00 2e + 2: 73 79 6d 74 csrrci s2, 1862, 26 + 6: 61 62 + 8: 00 2e + a: 73 74 72 74 csrrci s0, mseccfg, 4 + e: 61 62 + 10: 00 2e + 12: 73 68 73 74 csrrsi a6, mseccfg, 6 + 16: 72 74 + 18: 61 62 + 1a: 00 2e + 1c: 69 6e + 1e: 69 74 + 20: 00 2e + 22: 74 65 + 24: 78 74 + 26: 00 2e + 28: 72 6f + 2a: 64 61 + 2c: 74 61 + 2e: 00 2e + 30: 69 6e + 32: 69 74 + 34: 5f 61 72 72 + 38: 61 79 + 3a: 00 2e + 3c: 64 61 + 3e: 74 61 + 40: 00 2e + 42: 73 64 61 74 csrrsi s0, 1862, 2 + 46: 61 00 + 48: 2e 62 + 4a: 73 73 00 2e csrrci t1, 736, 0 + 4e: 63 6f 6d 6d bltu s10, s6, 0x72c <.symtab+0x72c> + 52: 65 6e + 54: 74 00 + 56: 2e 72 + 58: 69 73 + 5a: 63 76 2e 61 bgeu t3, s2, 0x666 <.symtab+0x666> + 5e: 74 74 + 60: 72 69 + 62: 62 75 + 64: 74 65 + 66: 73 00 2e 64 + 6a: 65 62 + 6c: 75 67 + 6e: 5f 61 72 61 + 72: 6e 67 + 74: 65 73 + 76: 00 2e + 78: 64 65 + 7a: 62 75 + 7c: 67 5f 69 6e + 80: 66 6f + 82: 00 2e + 84: 64 65 + 86: 62 75 + 88: 67 5f 61 62 + 8c: 62 72 + 8e: 65 76 + 90: 00 2e + 92: 64 65 + 94: 62 75 + 96: 67 5f 6c 69 + 9a: 6e 65 + 9c: 00 2e + 9e: 64 65 + a0: 62 75 + a2: 67 5f 66 72 + a6: 61 6d + a8: 65 00 + aa: 2e 64 + ac: 65 62 + ae: 75 67 + b0: 5f 73 74 72 + b4: 00 2e + b6: 64 65 + b8: 62 75 + ba: 67 5f 6c 6f + be: 63 6c 69 73 bltu s2, s6, 0x7f6 <.symtab+0x7f6> + c2: 74 73 + c4: 00 2e + c6: 64 65 + c8: 62 75 + ca: 67 5f 72 6e + ce: 67 6c 69 73 + d2: 74 73 + d4: 00 2e + d6: 64 65 + d8: 62 75 + da: 67 5f 6c 69 + de: 6e 65 + e0: 5f 73 74 72 + e4: 00 diff --git a/tests/opencl/fft/kernel.cl b/tests/opencl/fft/kernel.cl new file mode 100644 index 00000000..3e47282c --- /dev/null +++ b/tests/opencl/fft/kernel.cl @@ -0,0 +1,63 @@ +#include "common.h" + +__kernel void fft_radix4(__global float2* input, __global float2* output, const unsigned int N) { + int globalId = get_global_id(0); + int localId = get_local_id(0); + int groupId = get_group_id(0); + + // Allocate local memory to store intermediate results and twiddle factors + __local float2 localData[LOCAL_SIZE]; + __local float2 twiddleFactors[LOCAL_SIZE / 4]; + + // Calculate twiddle factors for this FFT stage and store in local memory + if (localId < LOCAL_SIZE / 4) { + float angle = -2 * M_PI * localId / LOCAL_SIZE; + twiddleFactors[localId] = (float2)(cos(angle), sin(angle)); + } + barrier(CLK_LOCAL_MEM_FENCE); + + // Calculate the offset for the data this work-group will process + int offset = groupId * LOCAL_SIZE; + + // Load a chunk of input into local memory for faster access + if (globalId < N) { + localData[localId] = input[globalId]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + // Perform the Radix-4 FFT on the data chunk in local memory + for (unsigned int stride = 1; stride < LOCAL_SIZE; stride *= 4) { + int twiddleIndex = (localId / stride) % 4; + float2 twiddle = twiddleFactors[twiddleIndex * (LOCAL_SIZE / (4 * stride))]; + + // Load data + float2 data0 = localData[localId]; + float2 data1 = localData[localId + stride]; + float2 data2 = localData[localId + 2 * stride]; + float2 data3 = localData[localId + 3 * stride]; + + // Apply twiddle factors + data1 *= twiddle; + data2 *= twiddle * twiddle; + data3 *= twiddle * twiddle * twiddle; + + // Radix-4 butterfly operations + float2 t0 = data0 + data2; + float2 t1 = data0 - data2; + float2 t2 = data1 + data3; + float2 t3 = (data1 - data3) * (float2)(0, -1); + + // Store results + localData[localId] = t0 + t2; + localData[localId + stride] = t1 + t3; + localData[localId + 2 * stride] = t0 - t2; + localData[localId + 3 * stride] = t1 - t3; + + barrier(CLK_LOCAL_MEM_FENCE); + } + + // Write the results back to global memory + if (globalId < N) { + output[globalId] = localData[localId]; + } +} diff --git a/tests/opencl/fft/kernel.pocl b/tests/opencl/fft/kernel.pocl new file mode 100644 index 0000000000000000000000000000000000000000..0923f2cd6835a2c775e4c5fdb2d8d384415153fb GIT binary patch literal 74401 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 H05JRy;4_00 literal 0 HcmV?d00001 diff --git a/tests/opencl/sgemm2/main.cc b/tests/opencl/fft/main.cc similarity index 61% rename from tests/opencl/sgemm2/main.cc rename to tests/opencl/fft/main.cc index 21ec3a54..b10b225a 100644 --- a/tests/opencl/sgemm2/main.cc +++ b/tests/opencl/fft/main.cc @@ -7,12 +7,31 @@ #include #include #include +#include +#include "common.h" -#define LOCAL_SIZE 16 +#define KERNEL_NAME "fft_radix4" #define FLOAT_ULP 6 -#define KERNEL_NAME "sgemm2" +struct float2 { + float x; + float y; + + float2(float real = 0.0f, float imag = 0.0f) : x(real), y(imag) {} + + float2 operator+(const float2& other) const { + return {x + other.x, y + other.y}; + } + + float2 operator-(const float2& other) const { + return {x - other.x, y - other.y}; + } + + float2 operator*(const float2& other) const { + return {x * other.x - y * other.y, x * other.y + y * other.x}; + } +}; #define CL_CHECK(_expr) \ do { \ @@ -45,7 +64,6 @@ static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) fprintf(stderr, "Failed to load kernel."); return -1; } - fseek(fp , 0 , SEEK_END); long fsize = ftell(fp); rewind(fp); @@ -58,25 +76,33 @@ static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) return 0; } -static bool compare_equal(float a, float b) { - union fi_t { float f; int32_t i; }; - fi_t fa, fb; - fa.f = a; - fb.f = b; - auto d = std::abs(fa.i - fb.i); - return d <= FLOAT_ULP; +static std::vector referenceDFT(const std::vector& input) { + std::vector output(input.size()); + for (unsigned int k = 0; k < input.size(); ++k) { // For each output element + output[k] = {0, 0}; // Initialize to zero + for (unsigned int n = 0; n < input.size(); ++n) { // For each input element + float angle = -2 * M_PI * k * n / input.size(); + float2 twiddle = {cos(angle), sin(angle)}; + output[k].x += input[n].x * twiddle.x - input[n].y * twiddle.y; + output[k].y += input[n].x * twiddle.y + input[n].y * twiddle.x; + } + } + return output; } -static void matmul_cpu(float *C, float *A, float *B, int N) { - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - float sum = 0.0f; - for (int k = 0; k < N; k++) { - sum += A[i * N + k] * B[k * N + j]; - } - C[i * N + j] = sum; - } +static int verifyOutput(const std::vector& output, + const std::vector& reference, + unsigned int N) { + int errors = 0; + for (unsigned int i = 0; i < N; ++i) { + float2 diff = {output[i].x - reference[i].x, output[i].y - reference[i].y}; + float error = sqrt(diff.x * diff.x + diff.y * diff.y); + if (error > 1e-5) { + printf("*** error: [%d] expected=(%f,%f), actual=(%f,%f)\n", i, reference[i].x, reference[i].y, output[i].x, output[i].y); + ++errors; } + } + return errors; } cl_device_id device_id = NULL; @@ -84,24 +110,22 @@ cl_context context = NULL; cl_command_queue commandQueue = NULL; cl_program program = NULL; cl_kernel kernel = NULL; -cl_mem a_memobj = NULL; -cl_mem b_memobj = NULL; -cl_mem c_memobj = NULL; +cl_mem i_memobj = NULL; +cl_mem o_memobj = NULL; uint8_t *kernel_bin = NULL; static void cleanup() { if (commandQueue) clReleaseCommandQueue(commandQueue); if (kernel) clReleaseKernel(kernel); if (program) clReleaseProgram(program); - if (a_memobj) clReleaseMemObject(a_memobj); - if (b_memobj) clReleaseMemObject(b_memobj); - if (c_memobj) clReleaseMemObject(c_memobj); + if (i_memobj) clReleaseMemObject(i_memobj); + if (o_memobj) clReleaseMemObject(o_memobj); if (context) clReleaseContext(context); if (device_id) clReleaseDevice(device_id); if (kernel_bin) free(kernel_bin); } -int size = 32; +int size = 64; static void show_usage() { printf("Usage: [-n size] [-h: help]\n"); @@ -124,19 +148,13 @@ static void parse_args(int argc, char **argv) { exit(-1); } } + + printf("Workload size=%d\n", size); } int main (int argc, char **argv) { // parse command arguments parse_args(argc, argv); - - uint32_t num_points = size * size; - - printf("Matrix size=%d\n", size); - if ((size / LOCAL_SIZE) * LOCAL_SIZE != size) { - printf("Error: matrix size must be a multiple of %d\n", LOCAL_SIZE); - return -1; - } cl_platform_id platform_id; size_t kernel_size; @@ -148,15 +166,10 @@ int main (int argc, char **argv) { printf("Create context\n"); context = CL_CHECK2(clCreateContext(NULL, 1, &device_id, NULL, NULL, &_err)); - char device_string[1024]; - clGetDeviceInfo(device_id, CL_DEVICE_NAME, sizeof(device_string), &device_string, NULL); - printf("Using device: %s\n", device_string); - printf("Allocate device buffers\n"); - size_t nbytes = num_points * sizeof(float); - a_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_READ_ONLY, nbytes, NULL, &_err)); - b_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_READ_ONLY, nbytes, NULL, &_err)); - c_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_WRITE_ONLY, nbytes, NULL, &_err)); + size_t nbytes = size * sizeof(float2); + i_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_READ_ONLY, nbytes, NULL, &_err)); + o_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_WRITE_ONLY, nbytes, NULL, &_err)); printf("Create program from kernel source\n"); #ifdef HOSTGPU @@ -169,11 +182,7 @@ int main (int argc, char **argv) { return -1; program = CL_CHECK2(clCreateProgramWithBinary( context, 1, &device_id, &kernel_size, (const uint8_t**)&kernel_bin, NULL, &_err)); -#endif - if (program == NULL) { - cleanup(); - return -1; - } +#endif // Build program CL_CHECK(clBuildProgram(program, 1, &device_id, NULL, NULL, NULL)); @@ -181,61 +190,47 @@ int main (int argc, char **argv) { // Create kernel kernel = CL_CHECK2(clCreateKernel(program, KERNEL_NAME, &_err)); - size_t global_size[2] = {size, size}; - size_t local_size[2] = {LOCAL_SIZE, LOCAL_SIZE}; - // Set kernel arguments - CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&a_memobj)); - CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&b_memobj)); - CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&c_memobj)); - CL_CHECK(clSetKernelArg(kernel, 3, sizeof(uint32_t), &size)); - CL_CHECK(clSetKernelArg(kernel, 4, local_size[0]*local_size[1]*sizeof(float), NULL)); - CL_CHECK(clSetKernelArg(kernel, 5, local_size[0]*local_size[1]*sizeof(float), NULL)); + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&i_memobj)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&o_memobj)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), (void *)&size)); - // Allocate memories for input arrays and output arrays. - std::vector h_a(num_points); - std::vector h_b(num_points); - std::vector h_c(num_points); + // Allocate memories for input arrays and output arrays. + std::vector h_i(size); + std::vector h_o(size); // Generate input values - for (uint32_t i = 0; i < num_points; ++i) { - h_a[i] = static_cast(rand()) / RAND_MAX; - h_b[i] = static_cast(rand()) / RAND_MAX; + for (int i = 0; i < size; ++i) { + h_i[i].x = sin(2 * M_PI * i / size); // Sine wave as an example + h_i[i].y = 0.0f; // Zero imaginary part } // Creating command queue commandQueue = CL_CHECK2(clCreateCommandQueue(context, device_id, 0, &_err)); printf("Upload source buffers\n"); - CL_CHECK(clEnqueueWriteBuffer(commandQueue, a_memobj, CL_TRUE, 0, nbytes, h_a.data(), 0, NULL, NULL)); - CL_CHECK(clEnqueueWriteBuffer(commandQueue, b_memobj, CL_TRUE, 0, nbytes, h_b.data(), 0, NULL, NULL)); + CL_CHECK(clEnqueueWriteBuffer(commandQueue, i_memobj, CL_TRUE, 0, nbytes, h_i.data(), 0, NULL, NULL)); printf("Execute the kernel\n"); + size_t global_work_size[1] = {size}; + size_t local_work_size[1] = {LOCAL_SIZE}; auto time_start = std::chrono::high_resolution_clock::now(); - CL_CHECK(clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL, global_size, local_size, 0, NULL, NULL)); + CL_CHECK(clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL)); CL_CHECK(clFinish(commandQueue)); auto time_end = std::chrono::high_resolution_clock::now(); double elapsed = std::chrono::duration_cast(time_end - time_start).count(); printf("Elapsed time: %lg ms\n", elapsed); printf("Download destination buffer\n"); - CL_CHECK(clEnqueueReadBuffer(commandQueue, c_memobj, CL_TRUE, 0, nbytes, h_c.data(), 0, NULL, NULL)); + CL_CHECK(clEnqueueReadBuffer(commandQueue, o_memobj, CL_TRUE, 0, nbytes, h_o.data(), 0, NULL, NULL)); printf("Verify result\n"); - std::vector ref_vec(num_points); - matmul_cpu(ref_vec.data(), h_a.data(), h_b.data(), size); - int errors = 0; - for (uint32_t i = 0; i < num_points; ++i) { - if (!compare_equal(h_c[i], ref_vec[i])) { - if (errors < 100) - printf("*** error: [%d] expected=%f, actual=%f\n", i, ref_vec[i], h_c[i]); - ++errors; - } - } - if (errors != 0) { - printf("FAILED! - %d errors\n", errors); - } else { + std::vector reference = referenceDFT(h_i); + auto errors = verifyOutput(h_o, reference, size); + if (0 == errors) { printf("PASSED!\n"); + } else { + printf("FAILED! - %d errors\n", errors); } // Clean up diff --git a/tests/opencl/fft/main.cc.o b/tests/opencl/fft/main.cc.o new file mode 100644 index 0000000000000000000000000000000000000000..e3f30c90822ce9fddb7745f61c868737af43a331 GIT binary patch literal 15368 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 z_RY;@%HeqJmnp=t@MV=E@E{eavv-J@@7Zd2osn-sF^8qFpjc9@cC9H0wR_EPCnyC}8m4r*U| zD^>2gi4tb6r*8+=(34v$X~oZFRK|A+9SmAXr5*F=aP8UDqFF5EY&(szc8H2lg<}iH7LF|(TR66GEO0DvEO0Dv zEO0DvEO0DvEO0DvjNGdua4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{v za4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c}F zaIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2w zaIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2w zaIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2w zaIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2waIA2w zaIA1Fa4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{v za4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{va4c{v za4c{va4c{va4c{va4c{va4c{v|8wl!&KWvs&9bn-*##W!%w$JEDeL$c_{GsS*4I>; zQq&ZhP|J9Y?rMI-k22vErklG57MuE|H=3in_nA_~j+yn_E|_eE@0qC^Uz>jgewuO@ z-RNViCvC2mo;s(^LOGIh(zPl1DYj-|s*$P$xt=UXaTACls#K#8_qz1#NMl+tx)rsg zj^y*NJ0-^VrSZcf$x&eh{r)|gnztTLdk;^d4B4krpP@78%#B%8sN6gnw_qVX__lU@P}zRRY3{j`^dTgX z>P|mLo8DZc6m_mr=Pfr#Qs1E*;rD6i=|^-m;2D*e{E}uoe?zaUeV`iaKhxUe-zg^V zFFKs&FYWA_jKA)2;WZy!`9f}YZcQHiw?T4l)HDS@u9Nb=?3kIwlZU?cWV1Il7ay30 zmlp8i6X(46L!Y$V+&vwaicQDP4Bni7sy8qB?alQ%r|0ma={ZZb3>@7(10Ua(fz!Rg z-+6twOhX@TKE#Jz7W#1goj%;*hz~bJriGouea45w#fKkk^WpvTeAs=k58ub-1WL})qdfTJ zVRzo~(TywScjIY|TzTmT7mi+?jH6@z(Y51$D94Xq6rS%V-Kh4RMs@m1kx`%N(%6r* zebRgKpYWDw_-o1&{*vxCd`>YXo>G|CWAeKHfYNTcN6q`+p}$3LQRe5@Y5&5j^r`Y? zdhp@`&6#wL{QZ+?$?nsXjZV_`gyYn^+EMCxL}-5*Cxx#+O!Lwoq}q}DXyujNw7$qr z>OXE9rN6wH7U$eZxjV0;-D_4;*ZV7|R_0|isK#RY6uE$IET2ndkIkYyk7v+^e^cpJ zrWi^Lm`KyHZd0VvXc{|vIBi`JNx$dzqnT5B(u^UU$+vx5s%)B5SmuV5`*|%&y{iiO zM;MAOR*tGYD^By~6{e}C0M&Syi(Zb*N;7N zop9`gV<#M2IJR(X;n>2lg<}iH7LF|(TR66GY~k3#v4vv`#{$O!#{$O!#{$O!#{$O! z#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O! z#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O!#{$O+#|p;^ z#|p;^#|p;^$Nyyq94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v z94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v z94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0v94j0P919!^919!^ z919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^ z919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^919!^ z919!^919!^919!^919!^919!^919!^919!^919!^99uZHaBSh&!m)*83&$3YEgV}o zws36W*ut@eV++Uje~zyw+Y`DY*}SkrqjESd9UtweerAuudH$IrTez3G@}_{9(T_~c zPc4i`?xwIVbv2@8@|adyN1(y|D-l@hnXR!$axnnTj;Na1AOstsXsm(}ZT$ZB4Yj zBfU-6gO>K|OSLaV(63^{sY#8|v}MRRa@#bKTHTDHU7ph^RfU<ggmV7 z;lfuZB;#1uWSsHCU)q1+4;5ekn|Ad7MJ?t*#{+MpZJ*1-#?^B^<_b9;k4n6X}MG*yV z(62n#Xm;i+)Xe=7b$)T4t|gqMQ%e%5Y4~YcSo|by{&<`=Y(7dG+9(}QX({X0IEt%z zh)z7%PYnm`rO4mAsOG30^z_eG>KL(^t~}j9O&YGFpZizSt;{RQYrryEm#~d^UBY zjr&^DnL|x!`M&y8Yg0}7Jhw8*5C>gpQkI$p7N_uUK~yR}KiwRbi$;{lN);bxpxV>Z zkVS3|UHZ>lJpIv}dG*9>NOr?)PnBr=Q&>~w$4=Ao{u;9?ZocU_J;vh=y7-$aV^)_qPy>x7RxX1DF`v^yYm+2j)!ZU?cdpa%tTzm=V#tyO0C&^AYHy{4v zoKiiT%`T;Ey2=ggw@bb3wld@FQ_oqp=cDD;MYr0>)ral$m{T@G;Ml;ifnx*5296CJ|2M9lmbf;we_%}5_YCPB(cXO>ZWGrzPK>|es8Z3@ ztknKaAxnYcDbOz#|LP0l+v%(*2` z%&68MOfkPd=0k6HI#tJ$Rt0<0P_InX=uLJCO7bW7tp(}!)L`1vs{~D}U5>gGHsnZC zg)+UaN$<|orxTl-(uygqX>fQ)YEY{?1qAgWm(+vk=F1_p>vS|#xiW@|A0JOS_f8_u zwNvQpoayv%+)O$*Xbv6jJfGG#UPQAiFQri>S5U8ftEqX$byV4XBNh9+nQ}bdMyW3E zq%TMJ(1YFk>Fnx5bZB-wts5&eYv56e?vy~`jZRUsN{Ljd#5pRG_agcET%nY1*Xiu| zn-my-n=Z!RrIj=8)2cELY52iMHGMhonlkl&P3g0|rh406QOT08 zDA%T!)YBV#+TC7YEb*M~KYvE=eV);WqE9J^p3q}{Ol?a)q8m9L(wy)2DKX(59iDWT z7CG+Fs^_;T`NW&_H|q^LwDKDD$$6D(#$Kk8-!4*_#usSyx^wjIZ4y-tPNYj6PLp%$ zNh-E2ff^?qqdHfPP~}@f?XEjX6XPiMz#)3K_yD;@?W5N<_R!gkyXe%l?UZcxR+?FL zGcEhLfvV15N9#+jp@*kel26O!)Z*b1I^Ss#&A&UJPBolMV`UaSC>TrsCQYNSk7DR? z*-7+Z;&@7RVGKoN97WM5Z@=9H4q9b?44rFcM@%vkPez)}(_5QBM@6&vT0t|Tm6s_x_lYC6 z<_?E*M}(taw5OwA_V1x3#w?6~ex|Im|Fl`ow^vR&+dBR^uRY9W!%LO69p*K#{)=8lJLCOI))fvOcjH+&|eFLy}3cfhpudpS04jm#@qV z_mk*edF6edKshs@n0$#UEA>YjvE!>sf$4Rm=lsUfXJsqNyrrX5-`_)?AL%DI&qj&I zt&y_s6MnC7!EqcM$HTD`j-7DqgkvWhTR66GY~k3#v4vv`#}!&Y7P1h1yoV1KG^-nVQL6DtG^BA74NIFur*|h(rYeb)?C2TF9dd>|CZ48JXHQX4 z_fyn6;3TzkoS^=d5-4@K;}o0g7`6F!gpx$5)NrAf0hTJ9j;BFw;^_V(%q!a*q+VzC zQ^w$Z^moi2>Y22Q=A_w42WUH`?YWiCPTEXGmTsi3>(|p-?6v1!wwjVpSxJ-oET^m0 zmy%z$#WdmJ0^(KkXmE=;)HvlV`nzogEvqw)+B}Y-_5&x;*`MPnap+iz{xpg*o*qvA z%cH1Q*8x;6cW*kA*p0gM>PS`pwWb~8o6)0x4Jdn`+BE-sRhnIpsph~6^lf)3y7Hn3 zXpuQleKP1Devs>w-%lTo@XpH0c5&rH)cx6JjY7~i!&VkV#3 zYlh_AXlnOaV%l$-VKQDHW5&D-H&c8Xn$Lb^O}{ib&9;Yb#?mE6o2knjK8+eVBD!7- ztCM}zq3ZtE<3|>0=FDDir86M-nzPY@;Ml;ifnx*5296CJ8#p#_Y~YySnBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV; znBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nBbV;nEvN@ zUXzib-##=7yBBjeY+~y&j%5R*9j%V9c04if z-`w%;XjWw!WJ;zTYci*wYJU36HFq*CGm>?^S?#yOOvrW6^vH9>)Xsm#6e)DsWC*%r zz63ut*NVO~he~`m^%f^1@$;bK%Tm$mTxrR7Wd@p%Co_Ftot=8*&rLVi<)hk#0w{iC zFck?ZPAj&QrVJq!XzX@FUy4?yuDhz!^%8Zc#@+^WxO7u0e4r&QE7y+F9qvS^rtHlK~*abr2|Jt(%e;}sm`OZlsw-AvYjW<;I%PS^yyT3QD6qG>Nb;FZJ13y zFXm#8Z~=|)xro9xFQKommeF>sfp_n{nsRSjOV!%1r=5E@(1X((DPq$mD%5H-oqDjD zQdQhSw?}TFy^FTchWT4)RMZwqs<4GVKG{qmQJ6oz-$d0LZK5nIHqy&$8))LM^|UGV zdU8p%j*5I5%j#&5Q<(th@!vt zr6v`^DZEct3XJVQUstrI;wzhxV`f8&>R*Q{RIE-9+$z!0ePL9pRau()p*Uq58cfB$ z6r>!T@=)+GKiZZhGree^o&uJprrk*%wBpG>Gdb&Lv$4!`Gl6cKH6_oR@fnYqjraGP zX$v=-t!B9yeQA~%+hl^NJ9VHrQLCkC@{-K;?gdSelU`;}hUbnYE%rFZcN^u{G%Smw z+y_Tk_U&EbBYxy@o*Xp6IcCXW=l|Z%|9Ac0KY@_;n?f(#ZygrY?MPUSIq4l!8dP)4 zygtfN$7h9OioZHiUVY>k?BQo6YvQ`%Uu^M~%zWbEdz&WoGz3H{GXxHW_9nqp>fO)9wadbmzDaRjQheie1c2 zf4UbWSI-byzo#TM>0W_GT!)Z&J0hIpNU`l)w zO^yL$sr|bNl&en+)pbhRhfsFQ~8eDUIUOVV*P+HL*$$@@IKcyvDQ=3Rg*EiK4}3I(wD&OrWBrZAt63+5%J2sf6Z{N7QVdmk>r zM@yCBw_8i|^Sotw>-=(DCRGIBnn7_U8(32Jrv=8~p!1`M)Os$8m5R z56AIv?1W<{96RCI3CB)2cEYiRV++R?jx8KpIJR(X;n>2lg<}iH7LF|(TR66GY~k3# zv4vxSV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCV zV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCVV}WCV zV}WCVV}WCVV}WCZV})adV})adV})adV})adV})adV})adV})adV})adV})adV})ad zV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})ad zV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})adV})ad zV})adV})adV})adV})adV})adWBuQ|86MlMLgVig+H%?HP}h$I!miKh9(FDJ+^~vo z_J(b7UJc6}`z=h1rg20r^m7z;4R$=}8RnROsg9#|Xj_NN+CGl`UeS)yhbKB_zMJ8A zm3M)oYV#G2l~Xr3u=D0<`sILQXMj4=v_0kMI_rW%6K**Cem!tR7J2Eo(CMS2@PeO? zN?lz{|4|-h*`ieD%pNcE<7|3U;DxVgkU#&Hd`5%(o_EOxjN4O#XfoOob7XOv9KM(_{Wr6TN1-nYT06 zY<12uN6*YLH?Pk#i$^RrP1dY5H{v#!o3nP9w;l&g>wjv}^*LkaRlZ{WMcp$&|6Z83 z7eAX9FaMcgD?Mme&(xGuH$6FPWv0#Ta?qnmdFj^i01EOgO5-9*)2=6>G`Djl%KM=P zb&RP`-HSA%R`=Ra&xM`oV(W0aU1$JZ|2>#;Uyr8LZN`$%g$Z=8S_}p0G};$Bllaga ziY>Q*dLCL#^Fo)?1G|bcS6)ZSPi>@;b+=NZ%R8u9%RSWo{(jV?AEsNcob<2X5t{tv zI5iz|iuiXT1&lmTul`=5?jx_!=-)TVcgS5z`S}5b_I^V19zUm_EnZXYq<1vX@rjyj z{Yp2o{-oz)|IpruWSqBgheBx0`{xaQ@XO&IEv+jHGn+fT7VNiOW zdNu<)`)1^V=`wNrmdrf3dRDIgFdK&r_2bgsIl0uDTwJWQKj%XaUh>BI_}snxJhVqa z{`Krq_2A_XilY1Ab&26LV@UpnN z9Qdyu|8X>6-{B3p&%Q?N@wPEv$`$J6f>c&6a#WS!+I%uMOX-(w4nC zx8t_a?fK074%}#KNB(3x@rHAqx!>(BT>WWRF7l=u=lRf`bAIf>dEfWskXPaCK)%+y z-kUp|?!)~L_T}ic{dnT^{v0!C0FQ4rkR!_s;x-v0xa`{q_BbBN#}-8KfF6VKjEC?N zm!X{T)KDHgZ5W@ZJN&;qhU3F<90$j7a2yZE@o*du$MJ9+56AIv?1W<{96RCI3CB)2 zcEYg}j-7DqgkvWhJK@*~$4)qQ!m$&Mop9`gV<#Lt;n)esPB?bLu@jCh99uZHaBSh& z!m)*83&*I@$YbHy!m)*83&$3YEgV}ows36W*ut@eV++R?jx8KpIJR(X;n>2lg<}iH z7LF|(TR66GY~k3#v4vv`#}SJIRC=pK8i+tSME0 zjw#-5feFDHdeDd!rqI+iCg0)>#(&cmljGnHlkMallj+(4~Trt1u-Z0`M&SL)&7LC;dAK+ke2dYm~mbb|LBMPAMO173NF3MrEP|9GDi*KZC zd$-V&vO8!|{BHVDaX+0nd5BKdbyC7*r710s)8l*SH|(59v!9=%so|HX0|oc?l~R5_KG^!c}IujBdsm=l~S(wK?$k

1r#xbGVmc3tkqp7lI< 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 KKn?um2L1=Sy+cv} diff --git a/tests/opencl/mri-q/Makefile b/tests/opencl/mri-q/Makefile deleted file mode 100644 index dbff34f9..00000000 --- a/tests/opencl/mri-q/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -PROJECT = mri-q - -SRCS = main.cc args.c parboil_opencl.c ocl.c gpu_info.c file.cc computeQ.c - -CXXFLAGS += -I. - -OPTS ?= - -include ../common.mk diff --git a/tests/opencl/mri-q/args.c b/tests/opencl/mri-q/args.c deleted file mode 100644 index 9d751e29..00000000 --- a/tests/opencl/mri-q/args.c +++ /dev/null @@ -1,617 +0,0 @@ - -#include -#include -#include -#include -#include -#include - -/*****************************************************************************/ -/* Memory management routines */ - -/* Free an array of owned strings. */ -void -pb_FreeStringArray(char **string_array) -{ - char **p; - - if (!string_array) return; - for (p = string_array; *p; p++) free(*p); - free(string_array); -} - -struct pb_PlatformParam * -pb_PlatformParam(char *name, char *version) -{ - if (name == NULL) { - fprintf(stderr, "pb_PlatformParam: Invalid argument\n"); - exit(-1); - } - - struct pb_PlatformParam *ret = - (struct pb_PlatformParam *)malloc(sizeof (struct pb_PlatformParam)); - - ret->name = name; - ret->version = version; - return ret; -} - -void -pb_FreePlatformParam(struct pb_PlatformParam *p) -{ - if (p == NULL) return; - - free(p->name); - free(p->version); - free(p); -} - -struct pb_DeviceParam * -pb_DeviceParam_index(int index) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_INDEX; - ret->index = index; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_cpu(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_CPU; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_gpu(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_GPU; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_accelerator(void) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_ACCELERATOR; - return ret; -} - -struct pb_DeviceParam * -pb_DeviceParam_name(char *name) -{ - struct pb_DeviceParam *ret = - (struct pb_DeviceParam *)malloc(sizeof (struct pb_DeviceParam)); - ret->criterion = pb_Device_NAME; - ret->name = name; - return ret; -} - -void -pb_FreeDeviceParam(struct pb_DeviceParam *p) -{ - if (p == NULL) return; - - switch(p->criterion) { - case pb_Device_NAME: - free(p->name); - break; - case pb_Device_INDEX: - case pb_Device_CPU: - case pb_Device_ACCELERATOR: - break; - default: - fprintf(stderr, "pb_FreeDeviceParam: Invalid argument\n"); - exit(-1); - } -} - -void -pb_FreeParameters(struct pb_Parameters *p) -{ - free(p->outFile); - pb_FreeStringArray(p->inpFiles); - pb_FreePlatformParam(p->platform); - pb_FreeDeviceParam(p->device); - free(p); -} - -/*****************************************************************************/ - -/* Parse a comma-delimited list of strings into an - * array of strings. */ -static char ** -read_string_array(char *in) -{ - char **ret; - int i; - int count; /* Number of items in the input */ - char *substring; /* Current substring within 'in' */ - - /* Count the number of items in the string */ - count = 1; - for (i = 0; in[i]; i++) if (in[i] == ',') count++; - - /* Allocate storage */ - ret = (char **)malloc((count + 1) * sizeof(char *)); - - /* Create copies of the strings from the list */ - substring = in; - for (i = 0; i < count; i++) { - char *substring_end; - int substring_length; - - /* Find length of substring */ - for (substring_end = substring; - (*substring_end != ',') && (*substring_end != 0); - substring_end++); - - substring_length = substring_end - substring; - - /* Allocate memory and copy the substring */ - ret[i] = (char *)malloc(substring_length + 1); - memcpy(ret[i], substring, substring_length); - ret[i][substring_length] = 0; - - /* go to next substring */ - substring = substring_end + 1; - } - ret[i] = NULL; /* Write the sentinel value */ - - return ret; -} - -static void -report_parse_error(const char *str) -{ - fputs(str, stderr); -} - -/* Interpret a string as a 'pb_DeviceParam' value. - * Return a pointer to a new value, or NULL on failure. - */ -static struct pb_DeviceParam * -read_device_param(char *str) -{ - /* Try different ways of interpreting 'device_string' until one works */ - - /* If argument is an integer, then interpret it as a device index */ - errno = 0; - char *end; - long device_int = strtol(str, &end, 10); - if (!errno) { - /* Negative numbers are not valid */ - if (device_int < 0 || device_int > INT_MAX) return NULL; - - return pb_DeviceParam_index(device_int); - } - - /* Match against predefined strings */ - if (strcmp(str, "CPU") == 0) - return pb_DeviceParam_cpu(); - if (strcmp(str, "GPU") == 0) - return pb_DeviceParam_gpu(); - if (strcmp(str, "ACCELERATOR") == 0) - return pb_DeviceParam_accelerator(); - - /* Assume any other string is a device name */ - return pb_DeviceParam_name(strdup(str)); -} - -/* Interpret a string as a 'pb_PlatformParam' value. - * Return a pointer to a new value, or NULL on failure. - */ -static struct pb_PlatformParam * -read_platform_param(char *str) -{ - int separator_index; /* Index of the '-' character separating - * name and version number. It's -1 if - * there's no '-' character. */ - - /* Find the last occurrence of '-' in 'str' */ - { - char *cur; - separator_index = -1; - for (cur = str; *cur; cur++) { - if (*cur == '-') separator_index = cur - str; - } - } - - /* The platform name is either the entire string, or all characters before - * the separator */ - int name_length = separator_index == -1 ? strlen(str) : separator_index; - char *name_str = (char *)malloc(name_length + 1); - memcpy(name_str, str, name_length); - name_str[name_length] = 0; - - /* The version is either NULL, or all characters after the separator */ - char *version_str; - if (separator_index == -1) { - version_str = NULL; - } - else { - const char *version_input_str = str + separator_index + 1; - int version_length = strlen(version_input_str); - - version_str = (char *)malloc(version_length + 1); - memcpy(version_str, version_input_str, version_length); - version_str[version_length] = 0; - } - - /* Create output structure */ - return pb_PlatformParam(name_str, version_str); -} - -/****************************************************************************/ -/* Argument parsing state */ - -/* Argument parsing state. - * - * Arguments that are interpreted by the argument parser are removed from - * the list. Variables 'argc' and 'argn' do not count arguments that have - * been removed. - * - * During argument parsing, the array of arguments is compacted, overwriting - * the erased arguments. Variable 'argv_put' points to the array element - * where the next argument will be written. Variable 'argv_get' points to - * the array element where the next argument will be read from. - */ -struct argparse { - int argc; /* Number of arguments. Mutable. */ - int argn; /* Current argument index. */ - char **argv_get; /* Argument value being read. */ - char **argv_put; /* Argument value being written. - * argv_put <= argv_get. */ -}; - -static void -initialize_argparse(struct argparse *ap, int argc, char **argv) -{ - ap->argc = argc; - ap->argn = 0; - ap->argv_get = ap->argv_put = argv; -} - -/* Finish argument parsing, without processing the remaining arguments. - * Write new argument count into _argc. */ -static void -finalize_argparse(struct argparse *ap, int *_argc, char **argv) -{ - /* Move the remaining arguments */ - for(; ap->argn < ap->argc; ap->argn++) - *ap->argv_put++ = *ap->argv_get++; - - /* Update the argument count */ - *_argc = ap->argc; - - /* Insert a terminating NULL */ - argv[ap->argc] = NULL; -} - -/* Delete the current argument. The argument will not be visible - * when argument parsing is done. */ -static void -delete_argument(struct argparse *ap) -{ - if (ap->argn >= ap->argc) { - fprintf(stderr, "delete_argument\n"); - } - ap->argc--; - ap->argv_get++; -} - -/* Go to the next argument. Also, move the current argument to its - * final location in argv. */ -static void -next_argument(struct argparse *ap) -{ - if (ap->argn >= ap->argc) { - fprintf(stderr, "next_argument\n"); - } - /* Move argument to its new location. */ - *ap->argv_put++ = *ap->argv_get++; - ap->argn++; -} - -static int -is_end_of_arguments(struct argparse *ap) -{ - return ap->argn == ap->argc; -} - -/* Get the current argument */ -static char * -get_argument(struct argparse *ap) -{ - return *ap->argv_get; -} - -/* Get the current argument, and also delete it */ -static char * -consume_argument(struct argparse *ap) -{ - char *ret = get_argument(ap); - delete_argument(ap); - return ret; -} - -/****************************************************************************/ - -/* The result of parsing a command-line argument */ -typedef enum { - ARGPARSE_OK, /* Success */ - ARGPARSE_ERROR, /* Error */ - ARGPARSE_DONE /* Success, and do not continue parsing */ -} result; - -typedef result parse_action(struct argparse *ap, struct pb_Parameters *params); - - -/* A command-line option */ -struct option { - char short_name; /* If not 0, the one-character - * name of this option */ - const char *long_name; /* If not NULL, the long name of this option */ - parse_action *action; /* What to do when this option occurs. - * Sentinel value is NULL. - */ -}; - -/* Output file - * - * -o FILE - */ -static result -parse_output_file(struct argparse *ap, struct pb_Parameters *params) -{ - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting file name after '-o'\n"); - return ARGPARSE_ERROR; - } - - /* Replace the output file name */ - free(params->outFile); - params->outFile = strdup(consume_argument(ap)); - - return ARGPARSE_OK; -} - -/* Input files - * - * -i FILE,FILE,... - */ -static result -parse_input_files(struct argparse *ap, struct pb_Parameters *params) -{ - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting file name after '-i'\n"); - return ARGPARSE_ERROR; - } - - /* Replace the input file list */ - pb_FreeStringArray(params->inpFiles); - params->inpFiles = read_string_array(consume_argument(ap)); - return ARGPARSE_OK; -} - -/* End of options - * - * -- - */ - -static result -parse_end_options(struct argparse *ap, struct pb_Parameters *params) -{ - return ARGPARSE_DONE; -} - -/* OpenCL device - * - * --device X - */ - -static result -parse_device(struct argparse *ap, struct pb_Parameters *params) -{ - /* Read the next argument, which specifies a device */ - - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting device specification after '--device'\n"); - return ARGPARSE_ERROR; - } - - char *device_string = consume_argument(ap); - struct pb_DeviceParam *device_param = read_device_param(device_string); - - if (!device_param) { - report_parse_error("Unrecognized device specification format on command line\n"); - return ARGPARSE_ERROR; - } - - /* Save the result */ - pb_FreeDeviceParam(params->device); - params->device = device_param; - - return ARGPARSE_OK; -} - -static result -parse_platform(struct argparse *ap, struct pb_Parameters *params) -{ - /* Read the next argument, which specifies a platform */ - - if (is_end_of_arguments(ap)) - { - report_parse_error("Expecting device specification after '--platform'\n"); - return ARGPARSE_ERROR; - } - - char *platform_string = consume_argument(ap); - struct pb_PlatformParam *platform_param = read_platform_param(platform_string); - - if (!platform_param) { - report_parse_error("Unrecognized platform specification format on command line\n"); - return ARGPARSE_ERROR; - } - - /* Save the result */ - pb_FreePlatformParam(params->platform); - params->platform = platform_param; - - return ARGPARSE_OK; -} - - -static struct option options[] = { - { 'o', NULL, &parse_output_file }, - { 'i', NULL, &parse_input_files }, - { '-', NULL, &parse_end_options }, - { 0, "device", &parse_device }, - { 0, "platform", &parse_platform }, - { 0, NULL, NULL } -}; - -static int -is_last_option(struct option *op) -{ - return op->action == NULL; -} - -/****************************************************************************/ - -/* Parse command-line parameters. - * Return zero on error, nonzero otherwise. - * On error, the other outputs may be invalid. - * - * The information collected from parameters is used to update - * 'ret'. 'ret' should be initialized. - * - * '_argc' and 'argv' are updated to contain only the unprocessed arguments. - */ -static int -pb_ParseParameters (struct pb_Parameters *ret, int *_argc, char **argv) -{ - char *err_message; - struct argparse ap; - - /* Each argument */ - initialize_argparse(&ap, *_argc, argv); - while(!is_end_of_arguments(&ap)) { - result arg_result; /* Result of parsing this option */ - char *arg = get_argument(&ap); - - /* Process this argument */ - if (arg[0] == '-') { - /* Single-character flag */ - if ((arg[1] != 0) && (arg[2] == 0)) { - delete_argument(&ap); /* This argument is consumed here */ - - /* Find a matching short option */ - struct option *op; - for (op = options; !is_last_option(op); op++) { - if (op->short_name == arg[1]) { - arg_result = (*op->action)(&ap, ret); - goto option_was_processed; - } - } - - /* No option matches */ - report_parse_error("Unexpected command-line parameter\n"); - arg_result = ARGPARSE_ERROR; - goto option_was_processed; - } - - /* Long flag */ - if (arg[1] == '-') { - delete_argument(&ap); /* This argument is consumed here */ - - /* Find a matching long option */ - struct option *op; - for (op = options; !is_last_option(op); op++) { - if (op->long_name && strcmp(&arg[2], op->long_name) == 0) { - arg_result = (*op->action)(&ap, ret); - goto option_was_processed; - } - } - - /* No option matches */ - report_parse_error("Unexpected command-line parameter\n"); - arg_result = ARGPARSE_ERROR; - goto option_was_processed; - } - } - else { - /* Other arguments are ignored */ - next_argument(&ap); - arg_result = ARGPARSE_OK; - goto option_was_processed; - } - - option_was_processed: - /* Decide what to do next based on 'arg_result' */ - switch(arg_result) { - case ARGPARSE_OK: - /* Continue processing */ - break; - - case ARGPARSE_ERROR: - /* Error exit from the function */ - return 0; - - case ARGPARSE_DONE: - /* Normal exit from the argument parsing loop */ - goto end_of_options; - } - } /* end for each argument */ - - /* If all arguments were processed, then normal exit from the loop */ - - end_of_options: - finalize_argparse(&ap, _argc, argv); - return 1; -} - -/*****************************************************************************/ -/* Other exported functions */ - -struct pb_Parameters * -pb_ReadParameters(int *_argc, char **argv) -{ - struct pb_Parameters *ret = - (struct pb_Parameters *)malloc(sizeof(struct pb_Parameters)); - - /* Initialize the parameters structure */ - ret->outFile = NULL; - ret->inpFiles = (char **)malloc(sizeof(char *)); - ret->inpFiles[0] = NULL; - ret->platform = NULL; - ret->device = NULL; - - /* Read parameters and update _argc, argv */ - if (!pb_ParseParameters(ret, _argc, argv)) { - /* Parse error */ - pb_FreeParameters(ret); - return NULL; - } - - return ret; -} - -int -pb_Parameters_CountInputs(struct pb_Parameters *p) -{ - int n; - - for (n = 0; p->inpFiles[n]; n++); - return n; -} - diff --git a/tests/opencl/mri-q/computeQ.c b/tests/opencl/mri-q/computeQ.c deleted file mode 100644 index 65ed6f4d..00000000 --- a/tests/opencl/mri-q/computeQ.c +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2007 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#include -#include -#include -#include "ocl.h" -#include "macros.h" -#include "computeQ.h" -#include "parboil.h" - -#define NC 1 - -void computePhiMag_GPU(int numK,cl_mem phiR_d,cl_mem phiI_d,cl_mem phiMag_d,clPrmtr* clPrm) -{ - int phiMagBlocks = numK / KERNEL_PHI_MAG_THREADS_PER_BLOCK; - if (numK % KERNEL_PHI_MAG_THREADS_PER_BLOCK) - phiMagBlocks++; - - size_t DimPhiMagBlock = KERNEL_PHI_MAG_THREADS_PER_BLOCK; - size_t DimPhiMagGrid = phiMagBlocks*KERNEL_PHI_MAG_THREADS_PER_BLOCK; - - cl_int clStatus; - clStatus = clSetKernelArg(clPrm->clKernel,0,sizeof(cl_mem),&phiR_d); - clStatus = clSetKernelArg(clPrm->clKernel,1,sizeof(cl_mem),&phiI_d); - clStatus = clSetKernelArg(clPrm->clKernel,2,sizeof(cl_mem),&phiMag_d); - clStatus = clSetKernelArg(clPrm->clKernel,3,sizeof(int),&numK); - CHECK_ERROR("clSetKernelArg") - - clStatus = clEnqueueNDRangeKernel(clPrm->clCommandQueue,clPrm->clKernel,1,NULL,&DimPhiMagGrid,&DimPhiMagBlock,0,NULL,NULL); - CHECK_ERROR("clEnqueueNDRangeKernel") -} - -static -unsigned long long int -readElapsedTime(cl_event internal) -{ - cl_int status; - cl_ulong t_begin, t_end; - status = clGetEventProfilingInfo(internal, CL_PROFILING_COMMAND_START, - sizeof(cl_ulong), &t_begin, NULL); - if (status != CL_SUCCESS) return 0; - status = clGetEventProfilingInfo(internal, CL_PROFILING_COMMAND_END, - sizeof(cl_ulong), &t_end, NULL); - if (status != CL_SUCCESS) return 0; - return (unsigned long long int)(t_end - t_begin); -} - - -void computeQ_GPU (int numK,int numX, - cl_mem x_d, cl_mem y_d, cl_mem z_d, - struct kValues* kVals, - cl_mem Qr_d, cl_mem Qi_d, - clPrmtr* clPrm) -{ - int QGrids = numK / KERNEL_Q_K_ELEMS_PER_GRID; - if (numK % KERNEL_Q_K_ELEMS_PER_GRID) - QGrids++; - int QBlocks = numX / KERNEL_Q_THREADS_PER_BLOCK; - if (numX % KERNEL_Q_THREADS_PER_BLOCK) - QBlocks++; - - size_t DimQBlock = KERNEL_Q_THREADS_PER_BLOCK/NC; - size_t DimQGrid = QBlocks*KERNEL_Q_THREADS_PER_BLOCK/NC; - - cl_int clStatus; - cl_mem ck; - ck = clCreateBuffer(clPrm->clContext,CL_MEM_READ_WRITE,KERNEL_Q_K_ELEMS_PER_GRID*sizeof(struct kValues),NULL,&clStatus); - - int QGrid; - for (QGrid = 0; QGrid < QGrids; QGrid++) { - // Put the tile of K values into constant mem - int QGridBase = QGrid * KERNEL_Q_K_ELEMS_PER_GRID; - struct kValues* kValsTile = kVals + QGridBase; - int numElems = MIN(KERNEL_Q_K_ELEMS_PER_GRID, numK - QGridBase); - - clStatus = clEnqueueWriteBuffer(clPrm->clCommandQueue,ck,CL_TRUE,0,numElems*sizeof(struct kValues),kValsTile,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - - clStatus = clSetKernelArg(clPrm->clKernel,0,sizeof(int),&numK); - clStatus = clSetKernelArg(clPrm->clKernel,1,sizeof(int),&QGridBase); - clStatus = clSetKernelArg(clPrm->clKernel,2,sizeof(cl_mem),&x_d); - clStatus = clSetKernelArg(clPrm->clKernel,3,sizeof(cl_mem),&y_d); - clStatus = clSetKernelArg(clPrm->clKernel,4,sizeof(cl_mem),&z_d); - clStatus = clSetKernelArg(clPrm->clKernel,5,sizeof(cl_mem),&Qr_d); - clStatus = clSetKernelArg(clPrm->clKernel,6,sizeof(cl_mem),&Qi_d); - clStatus = clSetKernelArg(clPrm->clKernel,7,sizeof(cl_mem),&ck); - CHECK_ERROR("clSetKernelArg") - - printf ("Grid: %d, Block: %d\n", DimQGrid, DimQBlock); - - #define TIMED_EXECUTION - #ifdef TIMED_EXECUTION - cl_event e; - clStatus = clEnqueueNDRangeKernel(clPrm->clCommandQueue,clPrm->clKernel,1,NULL,&DimQGrid,&DimQBlock,0,NULL,&e); - CHECK_ERROR("clEnqueueNDRangeKernel") - clWaitForEvents(1, &e); - printf ("%llu\n", readElapsedTime(e)); - #else - clStatus = clEnqueueNDRangeKernel(clPrm->clCommandQueue,clPrm->clKernel,1,NULL,&DimQGrid,&DimQBlock,0,NULL,NULL); - CHECK_ERROR("clEnqueueNDRangeKernel") - #endif - } -} - -void createDataStructsCPU(int numK, int numX, float** phiMag, - float** Qr, float** Qi) -{ - *phiMag = (float* ) memalign(16, numK * sizeof(float)); - *Qr = (float*) memalign(16, numX * sizeof (float)); - *Qi = (float*) memalign(16, numX * sizeof (float)); -} - diff --git a/tests/opencl/mri-q/computeQ.h b/tests/opencl/mri-q/computeQ.h deleted file mode 100644 index 3312902f..00000000 --- a/tests/opencl/mri-q/computeQ.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __COMPUTEQ__ -#define __COMPUTEQ__ - -#ifdef __cplusplus -extern "C" { -#endif - -void computePhiMag_GPU(int numK,cl_mem phiR_d,cl_mem phiI_d,cl_mem phiMag_d,clPrmtr* clPrm); -void computeQ_GPU (int numK,int numX, - cl_mem x_d, cl_mem y_d, cl_mem z_d, - struct kValues* kVals, - cl_mem Qr_d, cl_mem Qi_d, - clPrmtr* clPrm); - -void createDataStructsCPU(int numK, int numX, float** phiMag, - float** Qr, float** Qi); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/mri-q/file.cc b/tests/opencl/mri-q/file.cc deleted file mode 100644 index 15b07075..00000000 --- a/tests/opencl/mri-q/file.cc +++ /dev/null @@ -1,78 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2007 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -//#include -#include -#include -#include -#include - -#include "file.h" - -#if __BYTE_ORDER != __LITTLE_ENDIAN -# error "File I/O is not implemented for this system: wrong endianness." -#endif - -extern "C" -void inputData(char* fName, int* _numK, int* _numX, - float** kx, float** ky, float** kz, - float** x, float** y, float** z, - float** phiR, float** phiI) -{ - int numK, numX; - FILE* fid = fopen(fName, "r"); - - if (fid == NULL) - { - fprintf(stderr, "Cannot open input file\n"); - exit(-1); - } - fread (&numK, sizeof (int), 1, fid); - *_numK = numK; - fread (&numX, sizeof (int), 1, fid); - *_numX = numX; - *kx = (float *) memalign(16, numK * sizeof (float)); - fread (*kx, sizeof (float), numK, fid); - *ky = (float *) memalign(16, numK * sizeof (float)); - fread (*ky, sizeof (float), numK, fid); - *kz = (float *) memalign(16, numK * sizeof (float)); - fread (*kz, sizeof (float), numK, fid); - *x = (float *) memalign(16, numX * sizeof (float)); - fread (*x, sizeof (float), numX, fid); - *y = (float *) memalign(16, numX * sizeof (float)); - fread (*y, sizeof (float), numX, fid); - *z = (float *) memalign(16, numX * sizeof (float)); - fread (*z, sizeof (float), numX, fid); - *phiR = (float *) memalign(16, numK * sizeof (float)); - fread (*phiR, sizeof (float), numK, fid); - *phiI = (float *) memalign(16, numK * sizeof (float)); - fread (*phiI, sizeof (float), numK, fid); - fclose (fid); -} - -extern "C" -void outputData(char* fName, float* outR, float* outI, int numX) -{ - FILE* fid = fopen(fName, "w"); - uint32_t tmp32; - - if (fid == NULL) - { - fprintf(stderr, "Cannot open output file\n"); - exit(-1); - } - - /* Write the data size */ - tmp32 = numX; - fwrite(&tmp32, sizeof(uint32_t), 1, fid); - - /* Write the reconstructed data */ - fwrite (outR, sizeof (float), numX, fid); - fwrite (outI, sizeof (float), numX, fid); - fclose (fid); -} diff --git a/tests/opencl/mri-q/file.h b/tests/opencl/mri-q/file.h deleted file mode 100644 index c6a61ef4..00000000 --- a/tests/opencl/mri-q/file.h +++ /dev/null @@ -1,22 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2007 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -void inputData(char* fName, int* _numK, int* _numX, - float** kx, float** ky, float** kz, - float** x, float** y, float** z, - float** phiR, float** phiI); - -void outputData(char* fName, float* outR, float* outI, int numX); - -#ifdef __cplusplus -} -#endif diff --git a/tests/opencl/mri-q/gpu_info.c b/tests/opencl/mri-q/gpu_info.c deleted file mode 100644 index 4d641f81..00000000 --- a/tests/opencl/mri-q/gpu_info.c +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ -//#include -#include -#include -#include -#include - -#include "gpu_info.h" - -void compute_active_thread(size_t *thread, - size_t *grid, - int task, - int pad, - int major, - int minor, - int sm) -{ - int max_thread; - int max_block=8; - if(major==1) - { - if(minor>=2) - max_thread=1024; - else - max_thread=768; - } - else if(major==2) - max_thread=1536; - else - //newer GPU //keep using 2.0 - max_thread=1536; - - int _grid; - int _thread; - - if(task*pad>sm*max_thread) - { - _thread=max_thread/max_block; - _grid = ((task*pad+_thread-1)/_thread)*_thread; - } - else - { - _thread=pad; - _grid=task*pad; - } - - thread[0]=_thread; - grid[0]=_grid; -} diff --git a/tests/opencl/mri-q/gpu_info.h b/tests/opencl/mri-q/gpu_info.h deleted file mode 100644 index 5d433968..00000000 --- a/tests/opencl/mri-q/gpu_info.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2010 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -#ifndef __GPUINFOH__ -#define __GPUINFOH__ - -#ifdef __cplusplus -extern "C" { -#endif - -void compute_active_thread(size_t *thread, - size_t *grid, - int task, - int pad, - int major, - int minor, - int sm); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/mri-q/kernel.cl b/tests/opencl/mri-q/kernel.cl deleted file mode 100644 index 39a1842e..00000000 --- a/tests/opencl/mri-q/kernel.cl +++ /dev/null @@ -1,51 +0,0 @@ -#include "macros.h" - -__kernel void -ComputePhiMag_GPU(__global float* phiR, __global float* phiI, __global float* phiMag, int numK) { - int indexK = get_global_id(0); - float real = indexK; - float imag = indexK; - if (indexK < numK) { - /*float*/ real = phiR[indexK]; - /*float*/ imag = phiI[indexK]; - phiMag[indexK] = real*real + imag*imag; - } -} - -__kernel void -ComputeQ_GPU(int numK, int kGlobalIndex, - __global float* x, __global float* y, __global float* z, - __global float* Qr, __global float* Qi, __global struct kValues* ck) -{ - float sX; - float sY; - float sZ; - float sQr; - float sQi; - - // Determine the element of the X arrays computed by this thread - int xIndex = get_group_id(0)*KERNEL_Q_THREADS_PER_BLOCK + get_local_id(0); - - // Read block's X values from global mem to shared mem - sX = x[xIndex]; - sY = y[xIndex]; - sZ = z[xIndex]; - sQr = Qr[xIndex]; - sQi = Qi[xIndex]; - - int kIndex = 0; - for (; (kIndex < KERNEL_Q_K_ELEMS_PER_GRID); kIndex++) { - if (kGlobalIndex < numK) { - float expArg; - expArg = PIx2 * (ck[kIndex].Kx * sX + - ck[kIndex].Ky * sY + - ck[kIndex].Kz * sZ); - sQr = sQr + ck[kIndex].PhiMag * cos(expArg); // native_cos(expArg); - sQi = sQi + ck[kIndex].PhiMag * sin(expArg); // native_sin(expArg); - } - kGlobalIndex++; - } - - Qr[xIndex] = sQr; - Qi[xIndex] = sQi; -} diff --git a/tests/opencl/mri-q/macros.h b/tests/opencl/mri-q/macros.h deleted file mode 100644 index 501ead7e..00000000 --- a/tests/opencl/mri-q/macros.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __MACROS__ -#define __MACROS__ - -#define PI 3.1415926535897932384626433832795029f -#define PIx2 6.2831853071795864769252867665590058f - -#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) -#define K_ELEMS_PER_GRID 2048 - -#define KERNEL_PHI_MAG_THREADS_PER_BLOCK 256 -#define KERNEL_Q_THREADS_PER_BLOCK 256 -#define KERNEL_Q_K_ELEMS_PER_GRID 1024 - -struct kValues { - float Kx; - float Ky; - float Kz; - float PhiMag; -}; - -#endif diff --git a/tests/opencl/mri-q/main.cc b/tests/opencl/mri-q/main.cc deleted file mode 100644 index 0f1a809b..00000000 --- a/tests/opencl/mri-q/main.cc +++ /dev/null @@ -1,321 +0,0 @@ -/*************************************************************************** - *cr - *cr (C) Copyright 2007 The Board of Trustees of the - *cr University of Illinois - *cr All Rights Reserved - *cr - ***************************************************************************/ - -/* - * C code for creating the Q data structure for fast convolution-based - * Hessian multiplication for arbitrary k-space trajectories. - * - * Inputs: - * kx - VECTOR of kx values, same length as ky and kz - * ky - VECTOR of ky values, same length as kx and kz - * kz - VECTOR of kz values, same length as kx and ky - * x - VECTOR of x values, same length as y and z - * y - VECTOR of y values, same length as x and z - * z - VECTOR of z values, same length as x and y - * phi - VECTOR of the Fourier transform of the spatial basis - * function, evaluated at [kx, ky, kz]. Same length as kx, ky, and kz. - * - * recommended g++ options: - * -O3 -lm -ffast-math -funroll-all-loops - */ - -#include -#include -#include -#include - -#include "ocl.h" -#include "file.h" -#include "macros.h" -#include "computeQ.h" - -static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) { - if (nullptr == filename || nullptr == data || 0 == size) - return CL_INVALID_VALUE; - - FILE* fp = fopen(filename, "r"); - if (NULL == fp) { - fprintf(stderr, "Failed to load kernel."); - return CL_INVALID_VALUE; - } - fseek(fp , 0 , SEEK_END); - long fsize = ftell(fp); - rewind(fp); - - *data = (uint8_t*)malloc(fsize); - *size = fread(*data, 1, fsize, fp); - - fclose(fp); - - return CL_SUCCESS; -} - -static void -setupMemoryGPU(int num, int size, cl_mem* dev_ptr, float* host_ptr,clPrmtr* clPrm) -{ - cl_int clStatus; - *dev_ptr = clCreateBuffer(clPrm->clContext,CL_MEM_READ_ONLY,num*size,NULL,&clStatus); - CHECK_ERROR("clCreateBuffer"); - clStatus = clEnqueueWriteBuffer(clPrm->clCommandQueue,*dev_ptr,CL_TRUE,0,num*size,host_ptr,0,NULL,NULL); - CHECK_ERROR("clEnequeueWriteBuffer"); -} - -static void -cleanupMemoryGPU(int num, int size, cl_mem* dev_ptr, float* host_ptr, clPrmtr* clPrm) -{ - cl_int clStatus; - clStatus = clEnqueueReadBuffer(clPrm->clCommandQueue,*dev_ptr,CL_TRUE,0,num*size,host_ptr,0,NULL,NULL); - CHECK_ERROR("clEnqueueReadBuffer") - clStatus = clReleaseMemObject(*dev_ptr); - CHECK_ERROR("clReleaseMemObject") -} - -int -main (int argc, char *argv[]) { - int numX, numK; /* Number of X and K values */ - int original_numK; /* Number of K values in input file */ - float *kx, *ky, *kz; /* K trajectory (3D vectors) */ - float *x, *y, *z; /* X coordinates (3D vectors) */ - float *phiR, *phiI; /* Phi values (complex) */ - float *phiMag; /* Magnitude of Phi */ - float *Qr, *Qi; /* Q signal (complex) */ - - struct kValues* kVals; - - struct pb_Parameters *params; - struct pb_TimerSet timers; - - pb_InitializeTimerSet(&timers); - - /* Read command line */ - params = pb_ReadParameters(&argc, argv); - - params->inpFiles = (char **)malloc(sizeof(char *) * 2); - params->inpFiles[0] = (char *)malloc(100); - params->inpFiles[1] = NULL; - strncpy(params->inpFiles[0], "32_32_32_dataset.bin", 100); - - if ((params->inpFiles[0] == NULL) || (params->inpFiles[1] != NULL)) - { - fprintf(stderr, "Expecting one input filename\n"); - exit(-1); - } - - /* Read in data */ - pb_SwitchToTimer(&timers, pb_TimerID_IO); - inputData(params->inpFiles[0], - &original_numK, &numX, - &kx, &ky, &kz, - &x, &y, &z, - &phiR, &phiI); - - /* Reduce the number of k-space samples if a number is given - * on the command line */ - if (argc < 2) - numK = original_numK; - else - { - int inputK; - char *end; - inputK = strtol(argv[1], &end, 10); - if (end == argv[1]) - { - fprintf(stderr, "Expecting an integer parameter\n"); - exit(-1); - } - - numK = MIN(inputK, original_numK); - } - - printf("%d pixels in output; %d samples in trajectory; using %d samples\n", - numX, original_numK, numK); - - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - - clPrmtr clPrm; - - pb_Context* pb_context; - pb_context = pb_InitOpenCLContext(params); - if (pb_context == NULL) { - fprintf (stderr, "Error: No OpenCL platform/device can be found."); - return -1; - } - - cl_int clStatus; - cl_device_id clDevice = (cl_device_id) pb_context->clDeviceId; - cl_platform_id clPlatform = (cl_platform_id) pb_context->clPlatformId; - clPrm.clContext = (cl_context) pb_context->clContext; - - clPrm.clCommandQueue = clCreateCommandQueue(clPrm.clContext,clDevice,CL_QUEUE_PROFILING_ENABLE,&clStatus); - CHECK_ERROR("clCreateCommandQueue") - - pb_SetOpenCL(&(clPrm.clContext), &(clPrm.clCommandQueue)); - -#ifdef HOSTGPU - const char* clSource[] = {readFile("kernel.cl")}; - CHECK_ERROR("clCreateProgramWithSource") - cl_program clProgram = clCreateProgramWithSource(clPrm.clContext,1,clSource,NULL,&clStatus); -#else - uint8_t *kernel_bin = NULL; - size_t kernel_size; - cl_int binary_status = 0; - CHECK_ERROR("read_kernel_file") - clStatus = read_kernel_file("kernel.pocl", &kernel_bin, &kernel_size); - CHECK_ERROR("clCreateProgramWithSource") - cl_program clProgram = clCreateProgramWithBinary( - clPrm.clContext, 1, &clDevice, &kernel_size, (const uint8_t**)&kernel_bin, &binary_status, &clStatus); -#endif - - char options[50]; - sprintf(options,"-I src/opencl_nvidia"); - clStatus = clBuildProgram(clProgram,0,NULL,options,NULL,NULL); - if (clStatus != CL_SUCCESS) { - char buf[4096]; - clGetProgramBuildInfo(clProgram, clDevice, CL_PROGRAM_BUILD_LOG, 4096, buf, NULL); - printf ("%s\n", buf); - CHECK_ERROR("clBuildProgram") - } - - /* Create CPU data structures */ - createDataStructsCPU(numK, numX, &phiMag, &Qr, &Qi); - - /* GPU section 1 (precompute PhiMag) */ - { - clPrm.clKernel = clCreateKernel(clProgram,"ComputePhiMag_GPU",&clStatus); - CHECK_ERROR("clCreateKernel") - - /* Mirror several data structures on the device */ - cl_mem phiR_d; - cl_mem phiI_d; - cl_mem phiMag_d; - - pb_SwitchToTimer(&timers, pb_TimerID_COPY); - - setupMemoryGPU(numK,sizeof(float),&phiR_d,phiR,&clPrm); - setupMemoryGPU(numK,sizeof(float),&phiI_d,phiI,&clPrm); - phiMag_d = clCreateBuffer(clPrm.clContext,CL_MEM_WRITE_ONLY,numK*sizeof(float),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - - clStatus = clFinish(clPrm.clCommandQueue); - CHECK_ERROR("clFinish") - - pb_SwitchToTimer(&timers, pb_TimerID_KERNEL); - - computePhiMag_GPU(numK, phiR_d, phiI_d, phiMag_d, &clPrm); - - clStatus = clFinish(clPrm.clCommandQueue); - CHECK_ERROR("clFinish") - - pb_SwitchToTimer(&timers, pb_TimerID_COPY); - - cleanupMemoryGPU(numK,sizeof(float),&phiMag_d,phiMag,&clPrm); - - clStatus = clReleaseMemObject(phiR_d); - CHECK_ERROR("clReleaseMemObject") - clStatus = clReleaseMemObject(phiI_d); - CHECK_ERROR("clReleaseMemObject") - } - - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - - kVals = (struct kValues*)calloc(numK, sizeof (struct kValues)); - - int k; - for (k = 0; k < numK; k++) { - kVals[k].Kx = kx[k]; - kVals[k].Ky = ky[k]; - kVals[k].Kz = kz[k]; - kVals[k].PhiMag = phiMag[k]; - } - - free(phiMag); - - clStatus = clReleaseKernel(clPrm.clKernel); - - /* GPU section 2 */ - { - clPrm.clKernel = clCreateKernel(clProgram,"ComputeQ_GPU",&clStatus); - CHECK_ERROR("clCreateKernel") - - cl_mem x_d; - cl_mem y_d; - cl_mem z_d; - cl_mem Qr_d; - cl_mem Qi_d; - - pb_SwitchToTimer(&timers, pb_TimerID_COPY); - - setupMemoryGPU(numX,sizeof(float),&x_d,x,&clPrm); - setupMemoryGPU(numX,sizeof(float),&y_d,y,&clPrm); - setupMemoryGPU(numX,sizeof(float),&z_d,z,&clPrm); - - Qr_d = clCreateBuffer(clPrm.clContext,CL_MEM_READ_WRITE,numX*sizeof(float),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - clMemSet(&clPrm,Qr_d,0,numX*sizeof(float)); - Qi_d = clCreateBuffer(clPrm.clContext,CL_MEM_READ_WRITE,numX*sizeof(float),NULL,&clStatus); - CHECK_ERROR("clCreateBuffer") - clMemSet(&clPrm,Qi_d,0,numX*sizeof(float)); - - clStatus = clFinish(clPrm.clCommandQueue); - CHECK_ERROR("clFinish") - - pb_SwitchToTimer(&timers, pb_TimerID_KERNEL); - - computeQ_GPU(numK, numX, x_d, y_d, z_d, kVals, Qr_d, Qi_d, &clPrm); - - clStatus = clFinish(clPrm.clCommandQueue); - CHECK_ERROR("clFinish") - - pb_SwitchToTimer(&timers, pb_TimerID_COPY); - - clStatus = clReleaseMemObject(x_d); - CHECK_ERROR("clReleaseMemObject") - clStatus = clReleaseMemObject(y_d); - CHECK_ERROR("clReleaseMemObject") - clStatus = clReleaseMemObject(z_d); - CHECK_ERROR("clReleaseMemObject") - cleanupMemoryGPU(numX,sizeof(float),&Qr_d,Qr,&clPrm); - cleanupMemoryGPU(numX,sizeof(float),&Qi_d,Qi,&clPrm); - } - - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - - if (params->outFile) - { - /* Write Q to file */ - pb_SwitchToTimer(&timers, pb_TimerID_IO); - outputData(params->outFile, Qr, Qi, numX); - pb_SwitchToTimer(&timers, pb_TimerID_COMPUTE); - } - - free (kx); - free (ky); - free (kz); - free (x); - free (y); - free (z); - free (phiR); - free (phiI); - free (kVals); - free (Qr); - free (Qi); - - //free((void*)clSource[0]); - - clStatus = clReleaseKernel(clPrm.clKernel); - clStatus = clReleaseProgram(clProgram); - clStatus = clReleaseCommandQueue(clPrm.clCommandQueue); - clStatus = clReleaseContext(clPrm.clContext); - - pb_SwitchToTimer(&timers, pb_TimerID_NONE); - pb_PrintTimerSet(&timers); - - pb_FreeParameters(params); - - return 0; -} diff --git a/tests/opencl/mri-q/ocl copy.c b/tests/opencl/mri-q/ocl copy.c deleted file mode 100644 index 9ce9a2f5..00000000 --- a/tests/opencl/mri-q/ocl copy.c +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include -#include -#include "ocl.h" - -char* readFile(const char* fileName) -{ - FILE* fp; - fp = fopen(fileName,"r"); - if(fp == NULL) - { - printf("Error 1!\n"); - exit(1); - } - - fseek(fp,0,SEEK_END); - long size = ftell(fp); - rewind(fp); - - char* buffer = (char*)malloc(sizeof(char)*(size+1)); - if(buffer == NULL) - { - printf("Error 2!\n"); - fclose(fp); - exit(1); - } - - size_t res = fread(buffer,1,size,fp); - if(res != size) - { - printf("Error 3!\n"); - fclose(fp); - exit(1); - } - - buffer[size] = 0; - fclose(fp); - return buffer; -} - -void clMemSet(cl_command_queue clCommandQueue, cl_mem buf, int val, size_t size) -{ - cl_int clStatus; - char* temp = (char*)malloc(size); - memset(temp,val,size); - clStatus = clEnqueueWriteBuffer(clCommandQueue,buf,CL_TRUE,0,size,temp,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - free(temp); -} diff --git a/tests/opencl/mri-q/ocl copy.h b/tests/opencl/mri-q/ocl copy.h deleted file mode 100644 index 8840a868..00000000 --- a/tests/opencl/mri-q/ocl copy.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __OCLH__ -#define __OCLH__ - -typedef struct { - cl_uint major; - cl_uint minor; - cl_uint multiProcessorCount; -} OpenCLDeviceProp; - -void clMemSet(cl_command_queue, cl_mem, int, size_t); -char* readFile(const char*); - -#define CHECK_ERROR(errorMessage) \ - if(clStatus != CL_SUCCESS) \ - { \ - printf("Error: %s!\n",errorMessage); \ - printf("Line: %d\n",__LINE__); \ - exit(1); \ - } - -#endif diff --git a/tests/opencl/mri-q/ocl.c b/tests/opencl/mri-q/ocl.c deleted file mode 100644 index 61cd5fe6..00000000 --- a/tests/opencl/mri-q/ocl.c +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include -#include "ocl.h" -#include - -char* readFile(const char* fileName) -{ - FILE* fp; - fp = fopen(fileName,"r"); - if(fp == NULL) - { - printf("Error 1!\n"); - exit(1); - } - - fseek(fp,0,SEEK_END); - long size = ftell(fp); - rewind(fp); - - char* buffer = (char*)malloc(sizeof(char)*(size+1)); - if(buffer == NULL) - { - printf("Error 2!\n"); - fclose(fp); - exit(1); - } - - size_t res = fread(buffer,1,size,fp); - if(res != size) - { - printf("Error 3!\n"); - fclose(fp); - exit(1); - } - - buffer[size] = 0; - fclose(fp); - return buffer; -} - -void clMemSet(clPrmtr* clPrm, cl_mem buf, int val, size_t size) -{ - cl_int clStatus; - char* temp = (char*)malloc(size); - memset(temp,val,size); - clStatus = clEnqueueWriteBuffer(clPrm->clCommandQueue,buf,CL_TRUE,0,size,temp,0,NULL,NULL); - CHECK_ERROR("clEnqueueWriteBuffer") - free(temp); -} diff --git a/tests/opencl/mri-q/ocl.h b/tests/opencl/mri-q/ocl.h deleted file mode 100644 index ce2876a7..00000000 --- a/tests/opencl/mri-q/ocl.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __OCLH__ -#define __OCLH__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - cl_context clContext; - cl_command_queue clCommandQueue; - cl_kernel clKernel; -} clPrmtr; - -void clMemSet(clPrmtr*, cl_mem, int, size_t); -char* readFile(const char*); - -#define CHECK_ERROR(errorMessage) \ - if(clStatus != CL_SUCCESS) \ - { \ - printf("Error: %s!\n",errorMessage); \ - printf("Line: %d\n",__LINE__); \ - exit(1); \ - } - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/opencl/mri-q/parboil.h b/tests/opencl/mri-q/parboil.h deleted file mode 100644 index 4c9a8b5e..00000000 --- a/tests/opencl/mri-q/parboil.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * (c) 2010 The Board of Trustees of the University of Illinois. - */ -#ifndef PARBOIL_HEADER -#define PARBOIL_HEADER - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* A platform as specified by the user on the command line */ -struct pb_PlatformParam { - char *name; /* The platform name. This string is owned. */ - char *version; /* The platform version; may be NULL. - * This string is owned. */ -}; - -/* Create a PlatformParam from the given strings. - * 'name' must not be NULL. 'version' may be NULL. - * If not NULL, the strings should have been allocated by malloc(), - * and they will be owned by the returned object. - */ -struct pb_PlatformParam * -pb_PlatformParam(char *name, char *version); - -void -pb_FreePlatformParam(struct pb_PlatformParam *); - -/* A criterion for how to select a device */ -enum pb_DeviceSelectionCriterion { - pb_Device_INDEX, /* Enumerate the devices and select one - * by its number */ - pb_Device_CPU, /* Select a CPU device */ - pb_Device_GPU, /* Select a GPU device */ - pb_Device_ACCELERATOR, /* Select an accelerator device */ - pb_Device_NAME /* Select a device by name */ -}; - -/* A device as specified by the user on the command line */ -struct pb_DeviceParam { - enum pb_DeviceSelectionCriterion criterion; - union { - int index; /* If criterion == pb_Device_INDEX, - * the index of the device */ - char *name; /* If criterion == pb_Device_NAME, - * the name of the device. - * This string is owned. */ - }; -}; - -struct pb_DeviceParam * -pb_DeviceParam_index(int index); - -struct pb_DeviceParam * -pb_DeviceParam_cpu(void); - -struct pb_DeviceParam * -pb_DeviceParam_gpu(void); - -struct pb_DeviceParam * -pb_DeviceParam_accelerator(void); - -/* Create a by-name device selection criterion. - * The string should have been allocated by malloc(), and it will will be - * owned by the returned object. - */ -struct pb_DeviceParam * -pb_DeviceParam_name(char *name); - -void -pb_FreeDeviceParam(struct pb_DeviceParam *); - -/* Command line parameters for benchmarks */ -struct pb_Parameters { - char *outFile; /* If not NULL, the raw output of the - * computation should be saved to this - * file. The string is owned. */ - char **inpFiles; /* A NULL-terminated array of strings - * holding the input file(s) for the - * computation. The array and strings - * are owned. */ - struct pb_PlatformParam *platform; /* If not NULL, the platform - * specified on the command line. */ - struct pb_DeviceParam *device; /* If not NULL, the device - * specified on the command line. */ -}; - -/* Read command-line parameters. - * - * The argc and argv parameters to main are read, and any parameters - * interpreted by this function are removed from the argument list. - * - * A new instance of struct pb_Parameters is returned. - * If there is an error, then an error message is printed on stderr - * and NULL is returned. - */ -struct pb_Parameters * -pb_ReadParameters(int *_argc, char **argv); - -/* Free an instance of struct pb_Parameters. - */ -void -pb_FreeParameters(struct pb_Parameters *p); - -void -pb_FreeStringArray(char **); - -/* Count the number of input files in a pb_Parameters instance. - */ -int -pb_Parameters_CountInputs(struct pb_Parameters *p); - -/* A time or duration. */ -//#if _POSIX_VERSION >= 200112L -typedef unsigned long long pb_Timestamp; /* time in microseconds */ -//#else -//# error "Timestamps not implemented" -//#endif - -enum pb_TimerState { - pb_Timer_STOPPED, - pb_Timer_RUNNING, -}; - -struct pb_Timer { - enum pb_TimerState state; - pb_Timestamp elapsed; /* Amount of time elapsed so far */ - pb_Timestamp init; /* Beginning of the current time interval, - * if state is RUNNING. End of the last - * recorded time interfal otherwise. */ -}; - -/* Reset a timer. - * Use this to initialize a timer or to clear - * its elapsed time. The reset timer is stopped. - */ -void -pb_ResetTimer(struct pb_Timer *timer); - -/* Start a timer. The timer is set to RUNNING mode and - * time elapsed while the timer is running is added to - * the timer. - * The timer should not already be running. - */ -void -pb_StartTimer(struct pb_Timer *timer); - -/* Stop a timer. - * This stops adding elapsed time to the timer. - * The timer should not already be stopped. - */ -void -pb_StopTimer(struct pb_Timer *timer); - -/* Get the elapsed time in seconds. */ -double -pb_GetElapsedTime(struct pb_Timer *timer); - -/* Execution time is assigned to one of these categories. */ -enum pb_TimerID { - pb_TimerID_NONE = 0, - pb_TimerID_IO, /* Time spent in input/output */ - pb_TimerID_KERNEL, /* Time spent computing on the device, - * recorded asynchronously */ - pb_TimerID_COPY, /* Time spent synchronously moving data - * to/from device and allocating/freeing - * memory on the device */ - pb_TimerID_DRIVER, /* Time spent in the host interacting with the - * driver, primarily for recording the time - * spent queueing asynchronous operations */ - pb_TimerID_COPY_ASYNC, /* Time spent in asynchronous transfers */ - pb_TimerID_COMPUTE, /* Time for all program execution other - * than parsing command line arguments, - * I/O, kernel, and copy */ - pb_TimerID_OVERLAP, /* Time double-counted in asynchronous and - * host activity: automatically filled in, - * not intended for direct usage */ - pb_TimerID_LAST /* Number of timer IDs */ -}; - -/* Dynamic list of asynchronously tracked times between events */ -struct pb_async_time_marker_list { - char *label; // actually just a pointer to a string - enum pb_TimerID timerID; /* The ID to which the interval beginning - * with this marker should be attributed */ - void * marker; - //cudaEvent_t marker; /* The driver event for this marker */ - struct pb_async_time_marker_list *next; -}; - -struct pb_SubTimer { - char *label; - struct pb_Timer timer; - struct pb_SubTimer *next; -}; - -struct pb_SubTimerList { - struct pb_SubTimer *current; - struct pb_SubTimer *subtimer_list; -}; - -/* A set of timers for recording execution times. */ -struct pb_TimerSet { - enum pb_TimerID current; - struct pb_async_time_marker_list* async_markers; - pb_Timestamp async_begin; - pb_Timestamp wall_begin; - struct pb_Timer timers[pb_TimerID_LAST]; - struct pb_SubTimerList *sub_timer_list[pb_TimerID_LAST]; -}; - -/* Reset all timers in the set. */ -void -pb_InitializeTimerSet(struct pb_TimerSet *timers); - -void -pb_AddSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID pb_Category); - -/* Select which timer the next interval of time should be accounted - * to. The selected timer is started and other timers are stopped. - * Using pb_TimerID_NONE stops all timers. */ -void -pb_SwitchToTimer(struct pb_TimerSet *timers, enum pb_TimerID timer); - -void -pb_SwitchToSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID category); - -/* Print timer values to standard output. */ -void -pb_PrintTimerSet(struct pb_TimerSet *timers); - -/* Release timer resources */ -void -pb_DestroyTimerSet(struct pb_TimerSet * timers); - -void -pb_SetOpenCL(void *clContextPtr, void *clCommandQueuePtr); - - -typedef struct pb_Device_tag { - char* name; - void* clDevice; - int id; - unsigned int in_use; - unsigned int available; -} pb_Device; - -struct pb_Context_tag; -typedef struct pb_Context_tag pb_Context; - -typedef struct pb_Platform_tag { - char* name; - char* version; - void* clPlatform; - unsigned int in_use; - pb_Context** contexts; - pb_Device** devices; -} pb_Platform; - -struct pb_Context_tag { - void* clPlatformId; - void* clContext; - void* clDeviceId; - pb_Platform* pb_platform; - pb_Device* pb_device; -}; - -// verbosely print out list of platforms and their devices to the console. -pb_Platform** -pb_GetPlatforms(); - -// Choose a platform according to the given platform specification -pb_Platform* -pb_GetPlatform(struct pb_PlatformParam *platform); - -// choose a platform: by name, name & version -pb_Platform* -pb_GetPlatformByName(const char* name); - -pb_Platform* -pb_GetPlatformByNameAndVersion(const char* name, const char* version); - -// Choose a device according to the given device specification -pb_Device* -pb_GetDevice(pb_Platform* pb_platform, struct pb_DeviceParam *device); - -pb_Device** -pb_GetDevices(pb_Platform* pb_platform); - -// choose a device by name. -pb_Device* -pb_GetDeviceByName(pb_Platform* pb_platform, const char* name); - -pb_Platform* -pb_GetPlatformByEnvVars(); - -pb_Context* -pb_InitOpenCLContext(struct pb_Parameters* parameters); - -void -pb_ReleasePlatforms(); - -void -pb_ReleaseContext(pb_Context* c); - -void -pb_PrintPlatformInfo(pb_Context* c); - -void -perf_init(); - -//#define MEASURE_KERNEL_TIME - -#include - -#ifdef MEASURE_KERNEL_TIME -#define clEnqueueNDRangeKernel(q,k,d,o,dg,db,a,b,c) pb_clEnqueueNDRangeKernel((q), (k), (d), (o), (dg), (db), (a), (b), (c)) -cl_int -pb_clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, - cl_kernel /* kernel */, - cl_uint /* work_dim */, - const size_t * /* global_work_offset */, - const size_t * /* global_work_size */, - const size_t * /* local_work_size */, - cl_uint /* num_events_in_wait_list */, - const cl_event * /* event_wait_list */, - cl_event * /* event */); -#endif - -enum { T_FLOAT, T_DOUBLE, T_SHORT, T_INT, T_UCHAR }; -void pb_sig_float(char*, float*, int); -void pb_sig_double(char*, double*, int); -void pb_sig_short(char*, short*, int); -void pb_sig_int(char*, int*, int); -void pb_sig_uchar(char*, unsigned char*, unsigned int); -void pb_sig_clmem(char*, cl_command_queue, cl_mem, int); - -#ifdef __cplusplus -} -#endif - -#endif //PARBOIL_HEADER - diff --git a/tests/opencl/mri-q/parboil_opencl.c b/tests/opencl/mri-q/parboil_opencl.c deleted file mode 100644 index a4db1680..00000000 --- a/tests/opencl/mri-q/parboil_opencl.c +++ /dev/null @@ -1,1394 +0,0 @@ -/* - * (c) 2007 The Board of Trustees of the University of Illinois. - */ - -#include -#include -#include -#include -#include -#include - -#if _POSIX_VERSION >= 200112L -# include -#endif - -//#include "perfmon.h" - -cl_context *clContextPtr; -cl_command_queue *clCommandQueuePtr; - -// #define DISABLE_PARBOIL_TIMER - -/*****************************************************************************/ -/* Timer routines */ - -static int is_async(enum pb_TimerID timer) -{ - return (timer == pb_TimerID_KERNEL) || - (timer == pb_TimerID_COPY_ASYNC); -} - -static int is_blocking(enum pb_TimerID timer) -{ - return (timer == pb_TimerID_COPY) || (timer == pb_TimerID_NONE); -} - -#define INVALID_TIMERID pb_TimerID_LAST - -static int asyncs_outstanding(struct pb_TimerSet* timers) -{ - return (timers->async_markers != NULL) && - (timers->async_markers->timerID != INVALID_TIMERID); -} - -static struct pb_async_time_marker_list * -get_last_async(struct pb_TimerSet* timers) -{ - /* Find the last event recorded thus far */ - struct pb_async_time_marker_list * last_event = timers->async_markers; - if(last_event != NULL && last_event->timerID != INVALID_TIMERID) { - while(last_event->next != NULL && - last_event->next->timerID != INVALID_TIMERID) - last_event = last_event->next; - return last_event; - } else - return NULL; -} - -static void insert_marker(struct pb_TimerSet* tset, enum pb_TimerID timer) -{ - cl_int ciErrNum = CL_SUCCESS; - struct pb_async_time_marker_list ** new_event = &(tset->async_markers); - - while(*new_event != NULL && (*new_event)->timerID != INVALID_TIMERID) { - new_event = &((*new_event)->next); - } - - if(*new_event == NULL) { - *new_event = (struct pb_async_time_marker_list *) - malloc(sizeof(struct pb_async_time_marker_list)); - (*new_event)->marker = calloc(1, sizeof(cl_event)); - /* - // I don't think this is needed at all. I believe clEnqueueMarker 'creates' the event -#if ( __OPENCL_VERSION__ >= CL_VERSION_1_1 ) -fprintf(stderr, "Creating Marker [%d]\n", timer); - *((cl_event *)((*new_event)->marker)) = clCreateUserEvent(*clContextPtr, &ciErrNum); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Creating User Event Object!\n"); - } - ciErrNum = clSetUserEventStatus(*((cl_event *)((*new_event)->marker)), CL_QUEUED); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Setting User Event Status!\n"); - } -#endif -*/ - (*new_event)->next = NULL; - } - - /* valid event handle now aquired: insert the event record */ - (*new_event)->label = NULL; - (*new_event)->timerID = timer; - ciErrNum = clEnqueueMarker(*clCommandQueuePtr, (cl_event *)(*new_event)->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Enqueueing Marker!\n"); - } - -} - -static void insert_submarker(struct pb_TimerSet* tset, char *label, enum pb_TimerID timer) -{ - cl_int ciErrNum = CL_SUCCESS; - struct pb_async_time_marker_list ** new_event = &(tset->async_markers); - - while(*new_event != NULL && (*new_event)->timerID != INVALID_TIMERID) { - new_event = &((*new_event)->next); - } - - if(*new_event == NULL) { - *new_event = (struct pb_async_time_marker_list *) - malloc(sizeof(struct pb_async_time_marker_list)); - (*new_event)->marker = calloc(1, sizeof(cl_event)); - /* -#if ( __OPENCL_VERSION__ >= CL_VERSION_1_1 ) -fprintf(stderr, "Creating SubMarker %s[%d]\n", label, timer); - *((cl_event *)((*new_event)->marker)) = clCreateUserEvent(*clContextPtr, &ciErrNum); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Creating User Event Object!\n"); - } - ciErrNum = clSetUserEventStatus(*((cl_event *)((*new_event)->marker)), CL_QUEUED); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Setting User Event Status!\n"); - } -#endif -*/ - (*new_event)->next = NULL; - } - - /* valid event handle now aquired: insert the event record */ - (*new_event)->label = label; - (*new_event)->timerID = timer; - ciErrNum = clEnqueueMarker(*clCommandQueuePtr, (cl_event *)(*new_event)->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Enqueueing Marker!\n"); - } - -} - - -/* Assumes that all recorded events have completed */ -static pb_Timestamp record_async_times(struct pb_TimerSet* tset) -{ - struct pb_async_time_marker_list * next_interval = NULL; - struct pb_async_time_marker_list * last_marker = get_last_async(tset); - pb_Timestamp total_async_time = 0; - enum pb_TimerID timer; - - for(next_interval = tset->async_markers; next_interval != last_marker; - next_interval = next_interval->next) { - cl_ulong command_start=0, command_end=0; - cl_int ciErrNum = CL_SUCCESS; - - ciErrNum = clGetEventProfilingInfo(*((cl_event *)next_interval->marker), CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &command_start, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error getting first EventProfilingInfo: %d\n", ciErrNum); - } - - ciErrNum = clGetEventProfilingInfo(*((cl_event *)next_interval->next->marker), CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &command_end, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error getting second EventProfilingInfo: %d\n", ciErrNum); - } - - pb_Timestamp interval = (pb_Timestamp) (((double)(command_end - command_start)) / 1e3); - tset->timers[next_interval->timerID].elapsed += interval; - if (next_interval->label != NULL) { - struct pb_SubTimer *subtimer = tset->sub_timer_list[next_interval->timerID]->subtimer_list; - while (subtimer != NULL) { - if ( strcmp(subtimer->label, next_interval->label) == 0) { - subtimer->timer.elapsed += interval; - break; - } - subtimer = subtimer->next; - } - } - total_async_time += interval; - next_interval->timerID = INVALID_TIMERID; - } - - if(next_interval != NULL) - next_interval->timerID = INVALID_TIMERID; - - return total_async_time; -} - -static void -accumulate_time(pb_Timestamp *accum, - pb_Timestamp start, - pb_Timestamp end) -{ -//#if _POSIX_VERSION >= 200112L - *accum += end - start; -//#else -//# error "Timestamps not implemented for this system" -//#endif -} - -//#if _POSIX_VERSION >= 200112L -static pb_Timestamp get_time() -{ - //struct timeval tv; - //gettimeofday(&tv, NULL); - //return (pb_Timestamp) (tv.tv_sec * 1000000LL + tv.tv_usec); - return 0; -} -//#else -//# error "no supported time libraries are available on this platform" -//#endif - -void -pb_ResetTimer(struct pb_Timer *timer) -{ -//#ifndef DISABLE_PARBOIL_TIMER - timer->state = pb_Timer_STOPPED; - -//#if _POSIX_VERSION >= 200112L - timer->elapsed = 0; -//#else -//# error "pb_ResetTimer: not implemented for this system" -//#endif -//#endif -} - -void -pb_StartTimer(struct pb_Timer *timer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - if (timer->state != pb_Timer_STOPPED) { - fputs("Ignoring attempt to start a running timer\n", stderr); - return; - } - - timer->state = pb_Timer_RUNNING; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - timer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StartTimer: not implemented for this system" -#endif -#endif*/ -} - -void -pb_StartTimerAndSubTimer(struct pb_Timer *timer, struct pb_Timer *subtimer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - - unsigned int numNotStopped = 0x3; // 11 - if (timer->state != pb_Timer_STOPPED) { - fputs("Warning: Timer was not stopped\n", stderr); - numNotStopped &= 0x1; // Zero out 2^1 - } - if (subtimer->state != pb_Timer_STOPPED) { - fputs("Warning: Subtimer was not stopped\n", stderr); - numNotStopped &= 0x2; // Zero out 2^0 - } - if (numNotStopped == 0x0) { - fputs("Ignoring attempt to start running timer and subtimer\n", stderr); - return; - } - - timer->state = pb_Timer_RUNNING; - subtimer->state = pb_Timer_RUNNING; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - - if (numNotStopped & 0x2) { - timer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } - - if (numNotStopped & 0x1) { - subtimer->init = tv.tv_sec * 1000000LL + tv.tv_usec; - } - } -#else -# error "pb_StartTimer: not implemented for this system" -#endif - -#endif*/ -} - -void -pb_StopTimer(struct pb_Timer *timer) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - - pb_Timestamp fini; - - if (timer->state != pb_Timer_RUNNING) { - fputs("Ignoring attempt to stop a stopped timer\n", stderr); - return; - } - - timer->state = pb_Timer_STOPPED; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - fini = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StopTimer: not implemented for this system" -#endif - - accumulate_time(&timer->elapsed, timer->init, fini); - timer->init = fini; - -#endif*/ -} - -void pb_StopTimerAndSubTimer(struct pb_Timer *timer, struct pb_Timer *subtimer) { -/*#ifndef DISABLE_PARBOIL_TIMER - - pb_Timestamp fini; - - unsigned int numNotRunning = 0x3; // 11 - if (timer->state != pb_Timer_RUNNING) { - fputs("Warning: Timer was not running\n", stderr); - numNotRunning &= 0x1; // Zero out 2^1 - } - if (subtimer->state != pb_Timer_RUNNING) { - fputs("Warning: Subtimer was not running\n", stderr); - numNotRunning &= 0x2; // Zero out 2^0 - } - if (numNotRunning == 0x0) { - fputs("Ignoring attempt to stop stopped timer and subtimer\n", stderr); - return; - } - - - timer->state = pb_Timer_STOPPED; - subtimer->state = pb_Timer_STOPPED; - -#if _POSIX_VERSION >= 200112L - { - struct timeval tv; - gettimeofday(&tv, NULL); - fini = tv.tv_sec * 1000000LL + tv.tv_usec; - } -#else -# error "pb_StopTimer: not implemented for this system" -#endif - - if (numNotRunning & 0x2) { - accumulate_time(&timer->elapsed, timer->init, fini); - timer->init = fini; - } - - if (numNotRunning & 0x1) { - accumulate_time(&subtimer->elapsed, subtimer->init, fini); - subtimer->init = fini; - } - -#endif*/ -} - -/* Get the elapsed time in seconds. */ -double -pb_GetElapsedTime(struct pb_Timer *timer) -{ - /*double ret; -#ifndef DISABLE_PARBOIL_TIMER - - if (timer->state != pb_Timer_STOPPED) { - fputs("Elapsed time from a running timer is inaccurate\n", stderr); - } - -#if _POSIX_VERSION >= 200112L - ret = timer->elapsed / 1e6; -#else -# error "pb_GetElapsedTime: not implemented for this system" -#endif -#endif - return ret;*/ - return 0; -} - -void -pb_InitializeTimerSet(struct pb_TimerSet *timers) -{ -/*#ifndef DISABLE_PARBOIL_TIMER - int n; - - timers->wall_begin = 0; //get_time(); - timers->current = pb_TimerID_NONE; - - timers->async_markers = NULL; - - for (n = 0; n < pb_TimerID_LAST; n++) { - pb_ResetTimer(&timers->timers[n]); - timers->sub_timer_list[n] = NULL; - } -#endif*/ -} - -void pb_SetOpenCL(void *p_clContextPtr, void *p_clCommandQueuePtr) { - clContextPtr = ((cl_context *)p_clContextPtr); - clCommandQueuePtr = ((cl_command_queue *)p_clCommandQueuePtr); -} - -void -pb_AddSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID pb_Category) { -/*#ifndef DISABLE_PARBOIL_TIMER - - struct pb_SubTimer *subtimer = (struct pb_SubTimer *) malloc - (sizeof(struct pb_SubTimer)); - - int len = strlen(label); - - subtimer->label = (char *) malloc (sizeof(char)*(len+1)); - sprintf(subtimer->label, "%s\0", label); - - pb_ResetTimer(&subtimer->timer); - subtimer->next = NULL; - - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[pb_Category]; - if (subtimerlist == NULL) { - subtimerlist = (struct pb_SubTimerList *) calloc - (1, sizeof(struct pb_SubTimerList)); - subtimerlist->subtimer_list = subtimer; - timers->sub_timer_list[pb_Category] = subtimerlist; - } else { - // Append to list - struct pb_SubTimer *element = subtimerlist->subtimer_list; - while (element->next != NULL) { - element = element->next; - } - element->next = subtimer; - } - -#endif*/ -} - -void -pb_SwitchToTimer(struct pb_TimerSet *timers, enum pb_TimerID timer) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - - /* Stop the currently running timer */ - if (timers->current != pb_TimerID_NONE) { - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[timers->current]; - struct pb_SubTimer *currSubTimer = (subtimerlist != NULL) ? subtimerlist->current : NULL; - - if (!is_async(timers->current) ) { - if (timers->current != timer) { - if (currSubTimer != NULL) { - pb_StopTimerAndSubTimer(&timers->timers[timers->current], &currSubTimer->timer); - } else { - pb_StopTimer(&timers->timers[timers->current]); - } - } else { - if (currSubTimer != NULL) { - pb_StopTimer(&currSubTimer->timer); - } - } - } else { - insert_marker(timers, timer); - if (!is_async(timer)) { // if switching to async too, keep driver going - pb_StopTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - pb_Timestamp currentTime = 0; //get_time(); - - /* The only cases we check for asynchronous task completion is - * when an overlapping CPU operation completes, or the next - * segment blocks on completion of previous async operations */ - if( asyncs_outstanding(timers) && - (!is_async(timers->current) || is_blocking(timer) ) ) { - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - /* CL_COMPLETE if completed */ - - cl_int ciErrNum = CL_SUCCESS; - cl_int async_done = CL_COMPLETE; - - ciErrNum = clGetEventInfo(*((cl_event *)last_event->marker), CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &async_done, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Querying EventInfo!\n"); - } - - - if(is_blocking(timer)) { - /* Async operations completed after previous CPU operations: - * overlapped time is the total CPU time since this set of async - * operations were first issued */ - - // timer to switch to is COPY or NONE - if(async_done != CL_COMPLETE) { - accumulate_time(&(timers->timers[pb_TimerID_OVERLAP].elapsed), - timers->async_begin,currentTime); - } - - /* Wait on async operation completion */ - ciErrNum = clWaitForEvents(1, (cl_event *)last_event->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Waiting for Events!\n"); - } - - pb_Timestamp total_async_time = record_async_times(timers); - - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - if(async_done == CL_COMPLETE) { - //fprintf(stderr, "Async_done: total_async_type = %lld\n", total_async_time); - timers->timers[pb_TimerID_OVERLAP].elapsed += total_async_time; - } - - } else - /* implies (!is_async(timers->current) && asyncs_outstanding(timers)) */ - // i.e. Current Not Async (not KERNEL/COPY_ASYNC) but there are outstanding - // so something is deeper in stack - if(async_done == CL_COMPLETE ) { - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - timers->timers[pb_TimerID_OVERLAP].elapsed += record_async_times(timers); - } - } - - /* Start the new timer */ - if (timer != pb_TimerID_NONE) { - if(!is_async(timer)) { - pb_StartTimer(&timers->timers[timer]); - } else { - // toSwitchTo Is Async (KERNEL/COPY_ASYNC) - if (!asyncs_outstanding(timers)) { - /* No asyncs outstanding, insert a fresh async marker */ - - insert_marker(timers, timer); - timers->async_begin = currentTime; - } else if(!is_async(timers->current)) { - /* Previous asyncs still in flight, but a previous SwitchTo - * already marked the end of the most recent async operation, - * so we can rename that marker as the beginning of this async - * operation */ - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - last_event->label = NULL; - last_event->timerID = timer; - } - if (!is_async(timers->current)) { - pb_StartTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - timers->current = timer; - -#endif -#endif -} - -void -pb_SwitchToSubTimer(struct pb_TimerSet *timers, char *label, enum pb_TimerID category) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - struct pb_SubTimerList *subtimerlist = timers->sub_timer_list[timers->current]; - struct pb_SubTimer *curr = (subtimerlist != NULL) ? subtimerlist->current : NULL; - - if (timers->current != pb_TimerID_NONE) { - if (!is_async(timers->current) ) { - if (timers->current != category) { - if (curr != NULL) { - pb_StopTimerAndSubTimer(&timers->timers[timers->current], &curr->timer); - } else { - pb_StopTimer(&timers->timers[timers->current]); - } - } else { - if (curr != NULL) { - pb_StopTimer(&curr->timer); - } - } - } else { - insert_submarker(timers, label, category); - if (!is_async(category)) { // if switching to async too, keep driver going - pb_StopTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - pb_Timestamp currentTime = 0; //get_time(); - - /* The only cases we check for asynchronous task completion is - * when an overlapping CPU operation completes, or the next - * segment blocks on completion of previous async operations */ - if( asyncs_outstanding(timers) && - (!is_async(timers->current) || is_blocking(category) ) ) { - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - /* CL_COMPLETE if completed */ - - cl_int ciErrNum = CL_SUCCESS; - cl_int async_done = CL_COMPLETE; - - ciErrNum = clGetEventInfo(*((cl_event *)last_event->marker), CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &async_done, NULL); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Querying EventInfo!\n"); - } - - if(is_blocking(category)) { - /* Async operations completed after previous CPU operations: - * overlapped time is the total CPU time since this set of async - * operations were first issued */ - - // timer to switch to is COPY or NONE - // if it hasn't already finished, then just take now and use that as the elapsed time in OVERLAP - // anything happening after now isn't OVERLAP because everything is being stopped to wait for synchronization - // it seems that the extra sync wall time isn't being recorded anywhere - if(async_done != CL_COMPLETE) - accumulate_time(&(timers->timers[pb_TimerID_OVERLAP].elapsed), - timers->async_begin,currentTime); - - /* Wait on async operation completion */ - ciErrNum = clWaitForEvents(1, (cl_event *)last_event->marker); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Waiting for Events!\n"); - } - pb_Timestamp total_async_time = record_async_times(timers); - - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - // If it did finish, then accumulate all the async time that did happen into OVERLAP - // the immediately preceding EventSynchronize theoretically didn't have any effect since it was already completed. - if(async_done == CL_COMPLETE /*cudaSuccess*/) - timers->timers[pb_TimerID_OVERLAP].elapsed += total_async_time; - - } else - /* implies (!is_async(timers->current) && asyncs_outstanding(timers)) */ - // i.e. Current Not Async (not KERNEL/COPY_ASYNC) but there are outstanding - // so something is deeper in stack - if(async_done == CL_COMPLETE /*cudaSuccess*/) { - /* Async operations completed before previous CPU operations: - * overlapped time is the total async time */ - timers->timers[pb_TimerID_OVERLAP].elapsed += record_async_times(timers); - } - // else, this isn't blocking, so just check the next time around - } - - subtimerlist = timers->sub_timer_list[category]; - struct pb_SubTimer *subtimer = NULL; - - if (label != NULL) { - subtimer = subtimerlist->subtimer_list; - while (subtimer != NULL) { - if (strcmp(subtimer->label, label) == 0) { - break; - } else { - subtimer = subtimer->next; - } - } - } - - /* Start the new timer */ - if (category != pb_TimerID_NONE) { - if(!is_async(category)) { - if (subtimerlist != NULL) { - subtimerlist->current = subtimer; - } - - if (category != timers->current && subtimer != NULL) { - pb_StartTimerAndSubTimer(&timers->timers[category], &subtimer->timer); - } else if (subtimer != NULL) { - pb_StartTimer(&subtimer->timer); - } else { - pb_StartTimer(&timers->timers[category]); - } - } else { - if (subtimerlist != NULL) { - subtimerlist->current = subtimer; - } - - // toSwitchTo Is Async (KERNEL/COPY_ASYNC) - if (!asyncs_outstanding(timers)) { - /* No asyncs outstanding, insert a fresh async marker */ - insert_submarker(timers, label, category); - timers->async_begin = currentTime; - } else if(!is_async(timers->current)) { - /* Previous asyncs still in flight, but a previous SwitchTo - * already marked the end of the most recent async operation, - * so we can rename that marker as the beginning of this async - * operation */ - - struct pb_async_time_marker_list * last_event = get_last_async(timers); - last_event->timerID = category; - last_event->label = label; - } // else, marker for switchToThis was already inserted - - //toSwitchto is already asynchronous, but if current/prev state is async too, then DRIVER is already running - if (!is_async(timers->current)) { - pb_StartTimer(&timers->timers[pb_TimerID_DRIVER]); - } - } - } - - timers->current = category; -#endif -#endif -} - -void -pb_PrintTimerSet(struct pb_TimerSet *timers) -{ -#if 0 -#ifndef DISABLE_PARBOIL_TIMER - pb_Timestamp wall_end = 0; //get_time(); - - struct pb_Timer *t = timers->timers; - struct pb_SubTimer* sub = NULL; - - int maxSubLength; - - const char *categories[] = { - "IO", "Kernel", "Copy", "Driver", "Copy Async", "Compute" - }; - - const int maxCategoryLength = 10; - - int i; - for(i = 1; i < pb_TimerID_LAST-1; ++i) { // exclude NONE and OVRELAP from this format - if(pb_GetElapsedTime(&t[i]) != 0) { - - // Print Category Timer - printf("%-*s: %f\n", maxCategoryLength, categories[i-1], pb_GetElapsedTime(&t[i])); - - if (timers->sub_timer_list[i] != NULL) { - sub = timers->sub_timer_list[i]->subtimer_list; - maxSubLength = 0; - while (sub != NULL) { - // Find longest SubTimer label - if (strlen(sub->label) > maxSubLength) { - maxSubLength = strlen(sub->label); - } - sub = sub->next; - } - - // Fit to Categories - if (maxSubLength <= maxCategoryLength) { - maxSubLength = maxCategoryLength; - } - - sub = timers->sub_timer_list[i]->subtimer_list; - - // Print SubTimers - while (sub != NULL) { - printf(" -%-*s: %f\n", maxSubLength, sub->label, pb_GetElapsedTime(&sub->timer)); - sub = sub->next; - } - } - } - } - - if(pb_GetElapsedTime(&t[pb_TimerID_OVERLAP]) != 0) - printf("CPU/Kernel Overlap: %f\n", pb_GetElapsedTime(&t[pb_TimerID_OVERLAP])); - - float walltime = (wall_end - timers->wall_begin)/ 1e6; - printf("Timer Wall Time: %f\n", walltime); - -#endif -#endif -} - -void pb_DestroyTimerSet(struct pb_TimerSet * timers) -{ -#ifndef DISABLE_PARBOIL_TIMER - /* clean up all of the async event markers */ - struct pb_async_time_marker_list* event = timers->async_markers; - while(event != NULL) { - - cl_int ciErrNum = CL_SUCCESS; - ciErrNum = clWaitForEvents(1, (cl_event *)(event)->marker); - if (ciErrNum != CL_SUCCESS) { - //fprintf(stderr, "Error Waiting for Events!\n"); - } - - ciErrNum = clReleaseEvent( *((cl_event *)(event)->marker) ); - if (ciErrNum != CL_SUCCESS) { - fprintf(stderr, "Error Release Events!\n"); - } - - free((event)->marker); - struct pb_async_time_marker_list* next = ((event)->next); - - free(event); - - // (*event) = NULL; - event = next; - } - - int i = 0; - for(i = 0; i < pb_TimerID_LAST; ++i) { - if (timers->sub_timer_list[i] != NULL) { - struct pb_SubTimer *subtimer = timers->sub_timer_list[i]->subtimer_list; - struct pb_SubTimer *prev = NULL; - while (subtimer != NULL) { - free(subtimer->label); - prev = subtimer; - subtimer = subtimer->next; - free(prev); - } - free(timers->sub_timer_list[i]); - } - } -#endif -} - -static pb_Platform** ptr = NULL; - -// verbosely print out list of platforms and their devices to the console. -pb_Platform** -pb_GetPlatforms() { - if (ptr == NULL) { - cl_uint num_platforms; - clGetPlatformIDs(0, NULL, &num_platforms); - if (num_platforms == 0) return NULL; - - ptr = (pb_Platform **) malloc(sizeof(pb_Platform *) * (num_platforms + 1)); - cl_platform_id* ids = (cl_platform_id *) malloc(num_platforms * sizeof(cl_platform_id)); - clGetPlatformIDs(num_platforms, ids, NULL); - - unsigned int i; - for (i = 0; i < num_platforms; i++) { - ptr[i] = (pb_Platform *) malloc(sizeof(pb_Platform)); - ptr[i]->clPlatform = ids[i]; - ptr[i]->contexts = NULL; - ptr[i]->in_use = 0; - ptr[i]->devices = NULL; - - size_t sz; - clGetPlatformInfo(ids[i], CL_PLATFORM_NAME, 0, NULL, &sz); - char* name = (char *) malloc(sz + 1); - clGetPlatformInfo(ids[i], CL_PLATFORM_NAME, sz, name, NULL); - name[sz] = '\0'; - ptr[i]->name = name; - - clGetPlatformInfo(ids[i], CL_PLATFORM_VERSION, 0, NULL, &sz); - char* version = (char *) malloc(sz + 1); - clGetPlatformInfo(ids[i], CL_PLATFORM_VERSION, sz, version, NULL); - version[sz] = '\0'; - ptr[i]->version = version; - } - ptr[i] = NULL; - - free(ids); - } - - return (pb_Platform**) ptr; -} - -pb_Context* -createContext(pb_Platform* pb_platform, pb_Device* pb_device) { - pb_Context* c = (pb_Context*) malloc(sizeof(pb_Context)); - cl_int clStatus; - cl_context_properties clCps[3] = { - CL_CONTEXT_PLATFORM, (cl_context_properties)(pb_platform->clPlatform), 0 - }; - c->clContext = - clCreateContext(clCps, 1, (cl_device_id*)&pb_device->clDevice, NULL, NULL, &clStatus); - c->clPlatformId = pb_platform->clPlatform; - c->clDeviceId = pb_device->clDevice; - c->pb_platform = pb_platform; - c->pb_device = pb_device; - pb_platform->in_use = 1; - pb_device->in_use = 1; - unsigned int i = 0; - if (pb_platform->contexts == NULL) { - pb_platform->contexts = (pb_Context**) malloc(2*sizeof(pb_Context*)); - } else { - for (i = 0; pb_platform->contexts[i] != NULL; i++) {}; - pb_platform->contexts = (pb_Context**) realloc(pb_platform->contexts, - (i+1)*sizeof(pb_Context*)); - } - pb_platform->contexts[i+1] = NULL; - pb_platform->contexts[i] = c; - return c; -} - -// choose a platform by name. -pb_Platform* -pb_GetPlatformByName(const char* name) { - pb_Platform** ps = (pb_Platform **) pb_GetPlatforms(); - if (ps == NULL) return NULL; - if (name == NULL) { - return *ps; - } - - while (*ps) { - if (strstr((*ps)->name, name)) break; - ps++; - } - return (pb_Platform*) *ps; -} - -pb_Device** -pb_GetDevices(pb_Platform* pb_platform) { - if (pb_platform->devices == NULL) { - cl_uint num_devs; - cl_device_id* dev_ids; - clGetDeviceIDs((cl_platform_id) pb_platform->clPlatform, - CL_DEVICE_TYPE_ALL, 0, NULL, &num_devs); - if (num_devs == 0) return NULL; - - pb_platform->devices = - (pb_Device **) malloc((num_devs + 1) * sizeof(pb_Device *)); - dev_ids = (cl_device_id *) malloc(sizeof(cl_device_id) * num_devs); - clGetDeviceIDs((cl_platform_id) pb_platform->clPlatform, - CL_DEVICE_TYPE_ALL, num_devs, dev_ids, NULL); - - unsigned int i; - for (i = 0; i < num_devs; i++) { - pb_platform->devices[i] = (pb_Device *) malloc(sizeof(pb_Device)); - - pb_platform->devices[i]->clDevice = dev_ids[i]; - pb_platform->devices[i]->id = i; - - size_t sz; - clGetDeviceInfo(dev_ids[i], CL_DEVICE_NAME, 0, NULL, &sz); - char* name = (char *) malloc(sz + 1); - clGetDeviceInfo(dev_ids[i], CL_DEVICE_NAME, sz, name, NULL); - name[sz] = '\0'; - pb_platform->devices[i]->name = (char *) name; - - cl_bool available; - clGetDeviceInfo(dev_ids[i], CL_DEVICE_AVAILABLE, sizeof(cl_bool), &available, NULL); - pb_platform->devices[i]->available = (int) available; - - pb_platform->devices[i]->in_use = 0; - } - pb_platform->devices[i] = NULL; - } - return (pb_Device **) pb_platform->devices; -} - -// choose a device by name. -static pb_Device* -pb_SelectDeviceByName(pb_Device **ds, const char* name) { - if (ds == NULL) return NULL; - if (name == NULL) return *ds; - while (*ds) { - if (strstr((*ds)->name, name)) break; - ds++; - } - - return *ds; -} - -// choose a device by name and set the device's 'in_use' flag. -pb_Device* -pb_GetDeviceByName(pb_Platform* pb_platform, const char* name) { - pb_Device** ds = (pb_Device **) pb_GetDevices(pb_platform); - pb_Device *d = pb_SelectDeviceByName(ds, name); - - if (d) d->in_use = 1; - - return d; -} - -void -pb_ReleasePlatforms() { - if (!ptr) return; - pb_Platform** cur_ptr = ptr; - while (*cur_ptr) { - pb_Platform* pfptr = *cur_ptr++; - if (pfptr->devices) { - pb_Device** dvptr = pfptr->devices; - while (*dvptr) { - pb_Device* d = *dvptr++; - free(d->name); - free(d); - } - free(pfptr->devices); - } - if (pfptr->contexts) { - pb_Context** cptr = pfptr->contexts; - while (*cptr) { - free(*cptr++); - } - free(pfptr->contexts); - } - free(pfptr->name); - free(pfptr); - } - free(ptr); - ptr = NULL; -} - -pb_Platform* -pb_GetPlatformByNameAndVersion(const char* name, const char* version) { - pb_Platform** ps = (pb_Platform **) pb_GetPlatforms(); - if (ps == NULL) return NULL; - if (name == NULL) return *ps; - while (*ps) { - if (strstr((*ps)->name, name) && strstr((*ps)->version, version)) break; - ps++; - } - return (pb_Platform*) *ps; -} - -/* Return a pointer to the device at the specified index, or NULL. - * Used by pb_GetDevice. */ -static pb_Device * -select_device_by_index(pb_Device** ds, int id) -{ - int i = 0; - pb_Device** p = ds; - while (*p && (i < id)) { p++; i++; } - return *p; -} - -/* Return a pointer to the device with the specified type, or NULL. - * Used by pb_GetDevice. */ -static pb_Device * -select_device_by_type(pb_Device** ds, - enum pb_DeviceSelectionCriterion criterion) -{ - cl_device_type sought_type; - - /* Determine the OpenCL device type to search for */ - switch(criterion) { - case pb_Device_CPU: - sought_type = CL_DEVICE_TYPE_CPU; - break; - case pb_Device_GPU: - sought_type = CL_DEVICE_TYPE_GPU; - break; - case pb_Device_ACCELERATOR: - sought_type = CL_DEVICE_TYPE_ACCELERATOR; - break; - default: - fprintf(stderr, "pb_GetDevice: Invalid device type"); - exit(-1); - } - - /* Find the device */ - { - pb_Device** p = ds; - cl_device_type type; - while (*p) { - clGetDeviceInfo(((cl_device_id) ((*p)->clDevice)), CL_DEVICE_TYPE, - sizeof(cl_device_type), &type, NULL); - if (type == sought_type) break; - } - - return *p; - } -} - -pb_Device* -pb_GetDevice(pb_Platform* pb_platform, struct pb_DeviceParam *device) -{ - pb_Device** ds = (pb_Device **) pb_GetDevices(pb_platform); - - // The list of devices must be nonempty - if (ds == NULL || *ds == NULL) { - fprintf(stderr, "Error: No device is found in platform: name = %s, version = %s\n.", pb_platform->name, pb_platform->version); - exit(-1); - } - - pb_Device *selected_device = NULL; - - if (device != NULL) { - /* Use 'device' to select and return a device. - * If unable to select a device, fall - * back on the default selection mechanism. */ - switch(device->criterion) { - case pb_Device_INDEX: - selected_device = select_device_by_index(ds, device->index); - break; - case pb_Device_GPU: - case pb_Device_CPU: - case pb_Device_ACCELERATOR: - selected_device = select_device_by_type(ds, device->criterion); - break; - case pb_Device_NAME: - selected_device = pb_SelectDeviceByName(ds, device->name); - break; - default: - fprintf(stderr, "pb_GetDevice: Invalid argument"); - exit(-1); - } - } - - /* By default or if user-specified selection failed, - * select the first device */ - if (selected_device == NULL) - selected_device = *ds; - - /* Set the in_use flag */ - selected_device->in_use = 1; - - return selected_device; -} - -pb_Device* -pb_GetDeviceByEnvVars(pb_Platform* pb_platform) { - - /* Convert environment variables to a 'pb_DeviceParam' */ - struct pb_DeviceParam *param = NULL; - - char* device_num = getenv("PARBOIL_DEVICE_NUMBER"); - if (device_num && strcmp(device_num, "")) { - int id = atoi(device_num); - param = pb_DeviceParam_index(id); - } - else { - char* device_name = getenv("PARBOIL_DEVICE_NAME"); - if (device_name && strcmp(device_name, "")) { - param = pb_DeviceParam_name(strdup(device_name)); - } - else { - char* device_type = getenv("PARBOIL_DEVICE_TYPE"); - if (device_type && strcmp(device_type, "")) { - if (strcmp(device_type, "CPU") == 0) - param = pb_DeviceParam_cpu(); - else if (strcmp(device_type, "GPU") == 0) - param = pb_DeviceParam_gpu(); - else if (strcmp(device_type, "ACCELERATOR") == 0) - param = pb_DeviceParam_accelerator(); - } - } - } - - /* Get a device */ - pb_Device *d = pb_GetDevice(pb_platform, param); - pb_FreeDeviceParam(param); - - return d; -} - -pb_Platform* -pb_GetPlatformByEnvVars() { - char* name = getenv("PARBOIL_PLATFORM_NAME"); - char* version = getenv("PARBOIL_PLATFORM_VERSION"); - - /* Create a pb_PlatformParam object (or NULL) representing the data from the - * environment variables */ - struct pb_PlatformParam *platform; - - if (name) { - if (version) { - platform = pb_PlatformParam(strdup(name), strdup(version)); - } - else { - platform = pb_PlatformParam(strdup(name), NULL); - } - } - else { - platform = NULL; - } - - /* Convert to a platform */ - pb_Platform *p = pb_GetPlatform(platform); - pb_FreePlatformParam(platform); - - return p; -} - -/* Choose an OpenCL platform based on the given command-line parameters. - * If NULL, use the default OpenCL platform. */ -pb_Platform* -pb_GetPlatform(struct pb_PlatformParam *platform) { - if (platform != NULL) { - /* Try to use command-line parameters to choose platform */ - char *name = platform->name; - char *version = platform->version; - - if (!name) { - fprintf(stderr, "Internal error: NULL pointer"); - exit(-1); - } - - if (version) { - pb_Platform* p = pb_GetPlatformByNameAndVersion(name, version); - if (p) return p; - } - - pb_Platform* p = pb_GetPlatformByName(name); - if (p) return p; - } - - pb_Platform* p = pb_GetPlatformByName(NULL); - if (p == NULL) { - fprintf(stderr, "Error: No OpenCL platform in this system. Exiting."); - exit(-1); - } - return p; -} - -//extern void perf_init(); -//extern void mxpa_scheduler_init(); - -pb_Context* -pb_InitOpenCLContext(struct pb_Parameters* parameters) { -#if 0 - pb_Platform* ps = pb_GetPlatform(parameters->platform); - if (!ps) return NULL; - pb_Device* ds = pb_GetDevice(ps, parameters->device); - if (!ds) return NULL; - - /* HERE INITIALIZE TIMER */ - //perf_init(); - //mxpa_scheduler_init(); - - pb_Context* c = createContext(ps, ds); - pb_PrintPlatformInfo(c); - return c; -#endif - cl_int _err; - cl_platform_id platform_id; - cl_device_id device_id; - cl_context context; - clGetPlatformIDs(1, &platform_id, NULL); - clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL); - context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &_err); - - pb_Context* c = (pb_Context*)malloc(sizeof(pb_Context)); - c->clContext = context; - c->clDeviceId = device_id; - c->clPlatformId = platform_id; - c->pb_platform = (pb_Platform*)malloc(sizeof(pb_Platform)); - c->pb_device = (pb_Device*)malloc(sizeof(pb_Device)); - c->pb_platform->devices = (pb_Device**)malloc(sizeof(pb_Device*) * 2); - c->pb_platform->devices[0] = c->pb_device; - c->pb_platform->devices[1] = NULL; - c->pb_platform->contexts = (pb_Context**)malloc(sizeof(pb_Context*) * 2); - c->pb_platform->contexts[0] = c; - c->pb_platform->contexts[1] = NULL; - c->pb_platform->in_use = 1; - c->pb_device->in_use = 1; - return c; -} - -void -pb_ReleaseOpenCLContext(pb_Context* c) { - pb_ReleasePlatforms(); -} - -void -pb_PrintPlatformInfo(pb_Context* c) { - /*pb_Platform** ps = pb_GetPlatforms(); - if (!ps) { - fprintf (stderr, "No platform found"); - return; - } - - printf ("********************************************************\n"); - printf ("DETECTED OPENCL PLATFORMS AND DEVICES:\n"); - printf ("--------------------------------------------------------\n"); - - while (*ps) { - printf ("PLATFORM = %s, %s", (*ps)->name, (*ps)->version); - if (c->pb_platform == *ps) printf (" (SELECTED)"); - printf ("\n"); - - pb_Device** ds = (pb_Device **) pb_GetDevices((*ps)); - if (ds == NULL) { - printf (" + (No devices)\n"); - } else { - while (*ds) { - printf (" + %d: %s", (*ds)->id, (*ds)->name); - if (c->pb_device == *ds) printf (" (SELECTED)"); - printf ("\n"); - ds++; - } - } - - ps++; - } - printf ("********************************************************\n");*/ -} - -#ifdef MEASURE_KERNEL_TIME - -#undef clEnqueueNDRangeKernel - -//extern void pin_trace_enable(char*); -//extern void pin_trace_disable(char*); - -cl_int -pb_clEnqueueNDRangeKernel(cl_command_queue q/* command_queue */, - cl_kernel k/* kernel */, - cl_uint d/* work_dim */, - const size_t * o/* global_work_offset */, - const size_t * gws/* global_work_size */, - const size_t * lws/* local_work_size */, - cl_uint n/* num_events_in_wait_list */, - const cl_event * w/* event_wait_list */, - cl_event * e/* event */) { - - char buf[128]; - struct timeval begin, end; - clGetKernelInfo(k, CL_KERNEL_FUNCTION_NAME, 128, buf, NULL); - -#if 0 - int i; - for (i = 0; i < d; i++) { - printf ("%s: %d: %d / %d\n", buf, i, gws[i], (lws == NULL ? 0 : lws[i])); - } -#endif - - clFinish(q); clFlush(q); - //pin_trace_enable(buf); - //gettimeofday(&begin, NULL); - cl_int result = clEnqueueNDRangeKernel(q, k, d, o, gws, lws, n, w, e); - clFinish(q); clFlush(q); - //gettimeofday(&end, NULL); - //pin_trace_disable(buf); - //float t = (float)(end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) / 1000000.0f; - fflush(stdout); - fflush(stderr); - //printf ("PBTIMER: %s: %f\n", buf, t); - return result; -} - -#endif - -void -pb_sig_float(char* c, float* p, int sz) { - int i; - double s = 0.0; - for (i = 0; i < sz; i++) s += p[i] * (float)(i+1); - printf ("[Signature] %s = %lf\n", c, s); -} - -void -pb_sig_double(char* c, double* p, int sz) { - int i; - double s = 0.0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lf\n", c, s); -} - -void -pb_sig_short(char* c, short* p, int sz) { - int i; - long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void -pb_sig_int(char* c, int* p, int sz) { - int i; - long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void -pb_sig_uchar(char* c, unsigned char* p, unsigned int sz) { - int i; - unsigned long long int s = 0; - for (i = 0; i < sz; i++) s += p[i]; - printf ("[Signature] %s = %lld\n", c, s); -} - -void pb_sig_clmem(char* s, cl_command_queue command_queue, cl_mem memobj, int ty) { - size_t sz; - if (clGetMemObjectInfo(memobj, CL_MEM_SIZE, sizeof(size_t), &sz, NULL) != CL_SUCCESS) { - printf ("Something wrong.\n"); - assert(0); - } else { - printf ("size = %d\n", sz); - } - char* hp; // = (char*) malloc(sz); - //posix_memalign((void**)&hp, 64, sz); - hp = (char*)malloc(sz); - - clEnqueueReadBuffer (command_queue, - memobj, - CL_TRUE, - 0, - sz, - hp, - 0, - NULL, - NULL); - - if (ty == T_FLOAT) pb_sig_float(s, (float*)hp, sz/sizeof(float)); - if (ty == T_DOUBLE) pb_sig_double(s, (double*)hp, sz/sizeof(double)); - if (ty == T_INT) pb_sig_int(s, (int*)hp, sz/sizeof(int)); - if (ty == T_SHORT) pb_sig_short(s, (short*)hp, sz/sizeof(short)); - if (ty == T_UCHAR) pb_sig_uchar(s, (unsigned char*)hp, sz/sizeof(char)); - - free(hp); -} - diff --git a/tests/opencl/sgemm2/kernel.cl b/tests/opencl/sgemm2/kernel.cl deleted file mode 100644 index 6a764820..00000000 --- a/tests/opencl/sgemm2/kernel.cl +++ /dev/null @@ -1,73 +0,0 @@ -__kernel void sgemm2(__global float *A, - __global float *B, - __global float *C, - const unsigned int N, - __local float *localA, - __local float *localB) -{ - int globalRow = get_global_id(1); - int globalCol = get_global_id(0); - int localRow = get_local_id(1); - int localCol = get_local_id(0); - int localSize = get_local_size(0); // assuming square local size - - float sum = 0.0f; - - // Loop over all blocks of both matrices - for (int k = 0; k < N; k += localSize) { - // Load block of matrix A to local memory - localA[localRow * localSize + localCol] = A[globalRow * N + k + localCol]; - - // Load block of matrix B to local memory, adjusting for column-major access - localB[localRow * localSize + localCol] = B[(k + localRow) * N + globalCol]; - - // Synchronize to make sure the tiles are loaded - barrier(CLK_LOCAL_MEM_FENCE); - - // Multiply the two matrix blocks and accumulate result - for (int j = 0; j < localSize; j++) { - sum += localA[localRow * localSize + j] * localB[j * localSize + localCol]; - } - - // Ensure computation is done before loading next block - barrier(CLK_LOCAL_MEM_FENCE); - } - - C[globalRow * N + globalCol] = sum; -} - -/*__kernel void sgemm2(__global float *A, - __global float *B, - __global float *C, - const unsigned int N) -{ - int globalRow = get_global_id(1); - int globalCol = get_global_id(0); - int localRow = get_local_id(1); - int localCol = get_local_id(0); - - // Static local memory declaration - __local float localA[16][16]; - __local float localB[16][16]; - - float sum = 0.0f; - - // Iterate over blocks - for (int k = 0; k < N; k += 16) { - // Load a block of matrix A into local memory - localA[localRow][localCol] = A[globalRow * N + k + localCol]; - - // Load a block of matrix B into local memory - localB[localRow][localCol] = B[(k + localRow) * N + globalCol]; - - // Ensure the entire block is loaded - barrier(CLK_LOCAL_MEM_FENCE); - - // Compute multiplication for this block - for (int j = 0; j < 16; j++) { - sum += localA[localRow][j] * localB[j][localCol]; - } - } - - C[globalRow * N + globalCol] = sum; -}*/ \ No newline at end of file diff --git a/tests/opencl/vectorhypot/Makefile b/tests/opencl/vectorhypot/Makefile deleted file mode 100644 index 5763dfb5..00000000 --- a/tests/opencl/vectorhypot/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PROJECT = vectorhypot - -SRCS = main.cc oclUtils.cpp shrUtils.cpp cmd_arg_reader.cpp - -CXXFLAGS += -I. - -OPTS ?= - -include ../common.mk - diff --git a/tests/opencl/vectorhypot/cmd_arg_reader.cpp b/tests/opencl/vectorhypot/cmd_arg_reader.cpp deleted file mode 100644 index 9b7f91ef..00000000 --- a/tests/opencl/vectorhypot/cmd_arg_reader.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -/* CUda UTility Library */ - -// includes, file -#include "cmd_arg_reader.h" - -// includes, system -#include - -// internal unnamed namespace - -namespace -{ - // types, internal (class, enum, struct, union, typedef) - - // variables, internal - -} // namespace { - -// variables, exported - -/*static*/ CmdArgReader* CmdArgReader::self; -/*static*/ char** CmdArgReader::rargv; -/*static*/ int CmdArgReader::rargc; - -// functions, exported - -//////////////////////////////////////////////////////////////////////////////// -//! Public construction interface -//! @return a handle to the class instance -//! @param argc number of command line arguments (as given to main()) -//! @param argv command line argument string (as given to main()) -//////////////////////////////////////////////////////////////////////////////// -/*static*/ void -CmdArgReader::init( const int argc, const char** argv) -{ - if ( NULL != self) - { - return; - } - - // command line arguments - if (( 0 == argc) || ( 0 == argv)) - { - LOGIC_EXCEPTION( "No command line arguments given."); - } - - self = new CmdArgReader(); - - self->createArgsMaps( argc, argv); - - rargc = argc; - rargv = const_cast( argv); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Constructor, default -//////////////////////////////////////////////////////////////////////////////// -CmdArgReader::CmdArgReader() : - args(), - unprocessed(), - iter(), - iter_unprocessed() -{ } - -//////////////////////////////////////////////////////////////////////////////// -//! Destructor -//////////////////////////////////////////////////////////////////////////////// -CmdArgReader::~CmdArgReader() -{ - for( iter = args.begin(); iter != args.end(); ++iter) - { - if( *(iter->second.first) == typeid( int)) - { - delete static_cast( iter->second.second); - break; - } - else if( *(iter->second.first) == typeid( bool)) - { - delete static_cast( iter->second.second); - break; - } - else if( *(iter->second.first) == typeid( std::string)) - { - delete static_cast( iter->second.second); - break; - } - else if( *(iter->second.first) == typeid( std::vector< std::string>) ) - { - delete static_cast< std::vector< std::string>* >( iter->second.second); - break; - } - else if( *(iter->second.first) == typeid( std::vector) ) - { - delete static_cast< std::vector* >( iter->second.second); - break; - } - } -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read args as token value pair into map for better processing (Even the -//! values remain strings until the parameter values is requested by the -//! program.) -//! @param argc the argument count (as given to 'main') -//! @param argv the char* array containing the command line arguments -//////////////////////////////////////////////////////////////////////////////// -void -CmdArgReader::createArgsMaps( const int argc, const char** argv) { - - std::string token; - std::string val_str; - - std::map< std::string, std::string> args; - - std::string::size_type pos; - std::string arg; - for( int i=1; i - inline const T* getArgHelper( const std::string& name); - - //! Check if a command line argument with name \a name exists - //! @return true if a command line argument of name \a name exists, - //! otherwise false - //! @param name the name of the requested argument - inline bool existArgHelper( const std::string& name) const; - - //! Read args as token value pair into map for better processing - //! (Even the values remain strings until the parameter values is - //! requested by the program.) - //! @param argc the argument count (as given to 'main') - //! @param argv the char* array containing the command line arguments - void createArgsMaps( const int argc, const char** argv); - - //! Helper for "casting" the strings from the map with the unprocessed - //! values to the correct - //! data type. - //! @return true if conversion succeeded, otherwise false - //! @param element the value as string - //! @param val the value as type T - template - static inline bool convertToT( const std::string& element, T& val); - -public: - - // typedefs internal - - //! container for a processed command line argument - //! typeid is used to easily be able to decide if a re-requested token-value - //! pair match the type of the first conversion - typedef std::pair< const std::type_info*, void*> ValType; - //! map of already converted values - typedef std::map< std::string, ValType > ArgsMap; - //! iterator for the map of already converted values - typedef ArgsMap::iterator ArgsMapIter; - typedef ArgsMap::const_iterator ConstArgsMapIter; - - //! map of unprocessed (means unconverted) token-value pairs - typedef std::map< std::string, std::string> UnpMap; - //! iterator for the map of unprocessed (means unconverted) token-value pairs - typedef std::map< std::string, std::string>::iterator UnpMapIter; - -private: - -#ifdef _WIN32 -# pragma warning( disable: 4251) -#endif - - //! rargc original value of argc - static int rargc; - - //! rargv contains command line arguments in raw format - static char** rargv; - - //! args Map containing the already converted token-value pairs - ArgsMap args; - - //! args Map containing the unprocessed / unconverted token-value pairs - UnpMap unprocessed; - - //! iter Iterator for the map with the already converted token-value - //! pairs (to avoid frequent reallocation) - ArgsMapIter iter; - - //! iter Iterator for the map with the unconverted token-value - //! pairs (to avoid frequent reallocation) - UnpMapIter iter_unprocessed; - -#ifdef _WIN32 -# pragma warning( default: 4251) -#endif - -private: - - //! Constructor, copy (not implemented) - CmdArgReader( const CmdArgReader&); - - //! Assignment operator (not implemented) - CmdArgReader& operator=( const CmdArgReader&); -}; - -// variables, exported (extern) - -// functions, inlined (inline) - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line argument arrays -//! @note This function is used each type for which no template specialization -//! exist (which will cause errors if the type does not fulfill the std::vector -//! interface). -//////////////////////////////////////////////////////////////////////////////// -template -/*static*/ inline bool -CmdArgReader::convertToT( const std::string& element, T& val) -{ - // preallocate storage - val.resize( std::count( element.begin(), element.end(), ',') + 1); - - unsigned int i = 0; - std::string::size_type pos_start = 1; // leave array prefix '[' - std::string::size_type pos_end = 0; - - // do for all elements of the comma seperated list - while( std::string::npos != ( pos_end = element.find(',', pos_end+1)) ) - { - // convert each element by the appropriate function - if ( ! convertToT< typename T::value_type >( - std::string( element, pos_start, pos_end - pos_start), val[i])) - { - return false; - } - - pos_start = pos_end + 1; - ++i; - } - - std::string tmp1( element, pos_start, element.length() - pos_start - 1); - - // process last element (leave array postfix ']') - if ( ! convertToT< typename T::value_type >( std::string( element, - pos_start, - element.length() - pos_start - 1), - val[i])) - { - return false; - } - - // possible to process all elements? - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line arguments of type int -//////////////////////////////////////////////////////////////////////////////// -template<> -inline bool -CmdArgReader::convertToT( const std::string& element, int& val) -{ - std::istringstream ios( element); - ios >> val; - - bool ret_val = false; - if ( ios.eof()) - { - ret_val = true; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line arguments of type float -//////////////////////////////////////////////////////////////////////////////// -template<> -inline bool -CmdArgReader::convertToT( const std::string& element, float& val) -{ - std::istringstream ios( element); - ios >> val; - - bool ret_val = false; - if ( ios.eof()) - { - ret_val = true; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line arguments of type double -//////////////////////////////////////////////////////////////////////////////// -template<> -inline bool -CmdArgReader::convertToT( const std::string& element, double& val) -{ - std::istringstream ios( element); - ios >> val; - - bool ret_val = false; - if ( ios.eof()) - { - ret_val = true; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line arguments of type string -//////////////////////////////////////////////////////////////////////////////// -template<> -inline bool -CmdArgReader::convertToT( const std::string& element, - std::string& val) -{ - val = element; - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Conversion function for command line arguments of type bool -//////////////////////////////////////////////////////////////////////////////// -template<> -inline bool -CmdArgReader::convertToT( const std::string& element, bool& val) -{ - // check if value is given as string-type { true | false } - if ( "true" == element) - { - val = true; - return true; - } - else if ( "false" == element) - { - val = false; - return true; - } - // check if argument is given as integer { 0 | 1 } - else - { - int tmp; - if ( convertToT( element, tmp)) - { - if ( 1 == tmp) - { - val = true; - return true; - } - else if ( 0 == tmp) - { - val = false; - return true; - } - } - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the value of the command line argument with given name -//! @return A const handle to the requested argument. If the argument does -//! not exist or if it is not from type T NULL is returned -//! @param T the type of the argument requested -//! @param name the name of the requested argument -//////////////////////////////////////////////////////////////////////////////// -template -/*static*/ const T* -CmdArgReader::getArg( const std::string& name) -{ - if( ! self) - { - RUNTIME_EXCEPTION("CmdArgReader::getArg(): CmdArgReader not initialized."); - return NULL; - } - - return self->getArgHelper( name); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Check if a command line argument with the given name exists -//! @return true if a command line argument with name \a name exists, -//! otherwise false -//! @param name name of the command line argument in question -//////////////////////////////////////////////////////////////////////////////// -/*static*/ inline bool -CmdArgReader::existArg( const std::string& name) -{ - if( ! self) - { - RUNTIME_EXCEPTION("CmdArgReader::getArg(): CmdArgReader not initialized."); - return false; - } - - return self->existArgHelper( name); -} - -//////////////////////////////////////////////////////////////////////////////// -//! @brief Get the value of the command line argument with given name -//! @return A const handle to the requested argument. If the argument does -//! not exist or if it is not from type T NULL is returned -//! @param T the type of the argument requested -//! @param name the name of the requested argument -//////////////////////////////////////////////////////////////////////////////// -template -const T* -CmdArgReader::getArgHelper( const std::string& name) -{ - // check if argument already processed and stored in correct type - if ( args.end() != (iter = args.find( name))) - { - if ( (*(iter->second.first)) == typeid( T) ) - { - return (T*) iter->second.second; - } - } - else - { - T* tmp = new T; - - // check the array with unprocessed values - if ( unprocessed.end() != (iter_unprocessed = unprocessed.find( name))) - { - // try to "cast" the string to the type requested - if ( convertToT< T >( iter_unprocessed->second, *tmp)) - { - // add the token element pair to map of already converted values - args[name] = std::make_pair( &(typeid( T)), (void*) tmp); - - return tmp; - } - } - - // not used while not inserted into the map -> cleanup - delete tmp; - } - - // failed, argument not available - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Check if a command line argument with name \a name exists -//! @return true if a command line argument of name \a name exists, -//! otherwise false -//! @param name the name of the requested argument -//////////////////////////////////////////////////////////////////////////////// -inline bool -CmdArgReader::existArgHelper( const std::string& name) const -{ - bool ret_val = false; - - // check if argument already processed and stored in correct type - if( args.end() != args.find( name)) - { - ret_val = true; - } - else - { - - // check the array with unprocessed values - if ( unprocessed.end() != unprocessed.find( name)) - { - ret_val = true; - } - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the original / raw argc program argument -//////////////////////////////////////////////////////////////////////////////// -/*static*/ inline int& -CmdArgReader::getRArgc() -{ - if( ! self) - { - RUNTIME_EXCEPTION("CmdArgReader::getRArgc(): CmdArgReader not initialized."); - } - - return rargc; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the original / raw argv program argument -//////////////////////////////////////////////////////////////////////////////// -/*static*/ inline char**& -CmdArgReader::getRArgv() -{ - if( ! self) - { - RUNTIME_EXCEPTION("CmdArgReader::getRArgc(): CmdArgReader not initialized."); - } - - return rargv; -} - -// functions, exported (extern) - -#endif // #ifndef _CMDARGREADER_H_ diff --git a/tests/opencl/vectorhypot/exception.h b/tests/opencl/vectorhypot/exception.h deleted file mode 100644 index e4650d99..00000000 --- a/tests/opencl/vectorhypot/exception.h +++ /dev/null @@ -1,151 +0,0 @@ -/* -* Copyright 1993-2010 NVIDIA Corporation. All rights reserved. -* -* Please refer to the NVIDIA end user license agreement (EULA) associated -* with this source code for terms and conditions that govern your use of -* this software. Any use, reproduction, disclosure, or distribution of -* this software and related documentation outside the terms of the EULA -* is strictly prohibited. -* -*/ - -/* CUda UTility Library */ -#ifndef _EXCEPTION_H_ -#define _EXCEPTION_H_ - -// includes, system -#include -#include -#include -#include - -//! Exception wrapper. -//! @param Std_Exception Exception out of namespace std for easy typing. -template -class Exception : public Std_Exception -{ -public: - - //! @brief Static construction interface - //! @return Alwayss throws ( Located_Exception) - //! @param file file in which the Exception occurs - //! @param line line in which the Exception occurs - //! @param detailed details on the code fragment causing the Exception - static void throw_it( const char* file, - const int line, - const char* detailed = "-" ); - - //! Static construction interface - //! @return Alwayss throws ( Located_Exception) - //! @param file file in which the Exception occurs - //! @param line line in which the Exception occurs - //! @param detailed details on the code fragment causing the Exception - static void throw_it( const char* file, - const int line, - const std::string& detailed); - - //! Destructor - virtual ~Exception() throw(); - -private: - - //! Constructor, default (private) - Exception(); - - //! Constructor, standard - //! @param str string returned by what() - Exception( const std::string& str); - -}; - -//////////////////////////////////////////////////////////////////////////////// -//! Exception handler function for arbitrary exceptions -//! @param ex exception to handle -//////////////////////////////////////////////////////////////////////////////// -template -inline void -handleException( const Exception_Typ& ex) -{ - std::cerr << ex.what() << std::endl; - - exit( EXIT_FAILURE); -} - -//! Convenience macros - -//! Exception caused by dynamic program behavior, e.g. file does not exist -#define RUNTIME_EXCEPTION( msg) \ - Exception::throw_it( __FILE__, __LINE__, msg) - -//! Logic exception in program, e.g. an assert failed -#define LOGIC_EXCEPTION( msg) \ - Exception::throw_it( __FILE__, __LINE__, msg) - -//! Out of range exception -#define RANGE_EXCEPTION( msg) \ - Exception::throw_it( __FILE__, __LINE__, msg) - -//////////////////////////////////////////////////////////////////////////////// -//! Implementation - -// includes, system -#include - -//////////////////////////////////////////////////////////////////////////////// -//! Static construction interface. -//! @param Exception causing code fragment (file and line) and detailed infos. -//////////////////////////////////////////////////////////////////////////////// -/*static*/ template -void -Exception:: -throw_it( const char* file, const int line, const char* detailed) -{ - std::stringstream s; - - // Quiet heavy-weight but exceptions are not for - // performance / release versions - s << "Exception in file '" << file << "' in line " << line << "\n" - << "Detailed description: " << detailed << "\n"; - - throw Exception( s.str()); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Static construction interface. -//! @param Exception causing code fragment (file and line) and detailed infos. -//////////////////////////////////////////////////////////////////////////////// -/*static*/ template -void -Exception:: -throw_it( const char* file, const int line, const std::string& msg) -{ - throw_it( file, line, msg.c_str()); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Constructor, default (private). -//////////////////////////////////////////////////////////////////////////////// -template -Exception::Exception() : - Exception("Unknown Exception.\n") -{ } - -//////////////////////////////////////////////////////////////////////////////// -//! Constructor, standard (private). -//! String returned by what(). -//////////////////////////////////////////////////////////////////////////////// -template -Exception::Exception( const std::string& s) : - Std_Exception( s) -{ } - -//////////////////////////////////////////////////////////////////////////////// -//! Destructor -//////////////////////////////////////////////////////////////////////////////// -template -Exception::~Exception() throw() { } - -// functions, exported - -#endif // #ifndef _EXCEPTION_H_ - diff --git a/tests/opencl/vectorhypot/kernel.cl b/tests/opencl/vectorhypot/kernel.cl deleted file mode 100644 index 1983a862..00000000 --- a/tests/opencl/vectorhypot/kernel.cl +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -// OpenCL Kernel Function Naive Implementation for hyptenuse -__kernel void VectorHypot(__global float4* fg4A, __global float4* fg4B, __global float4* fg4Hypot, unsigned int uiOffset, int iInnerLoopCount, unsigned int uiNumElements) -{ - // get index into global data array - size_t szGlobalOffset = get_global_id(0) + uiOffset; - - // bound check - if (szGlobalOffset >= uiNumElements) - { - return; - } - - // Processing 4 elements per work item, so read fgA and fgB source values from GMEM - float4 f4A = fg4A[szGlobalOffset]; - float4 f4B = fg4B[szGlobalOffset]; - float4 f4H = (float4)0.0f; - - // Get the hypotenuses the vectors of 'legs', but exaggerate the time needed with loop - for (int i = 0; i < iInnerLoopCount; i++) - { - // compute the 4 hypotenuses using built-in function - f4H.x = hypot (f4A.x, f4B.x); - f4H.y = hypot (f4A.y, f4B.y); - f4H.z = hypot (f4A.z, f4B.z); - f4H.w = hypot (f4A.w, f4B.w); - } - - // Write 4 result values back out to GMEM - fg4Hypot[szGlobalOffset] = f4H; -} \ No newline at end of file diff --git a/tests/opencl/vectorhypot/main.cc b/tests/opencl/vectorhypot/main.cc deleted file mode 100644 index ec25bbf2..00000000 --- a/tests/opencl/vectorhypot/main.cc +++ /dev/null @@ -1,702 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -// ********************************************************************* -// oclCopyComputeOverlap Notes: -// -// OpenCL API demo application for NVIDIA CUDA GPU's that implements a -// element by element vector hyptenuse computation using 2 input float arrays -// and 1 output float array. -// -// Demonstrates host->GPU and GPU->host copies that are asynchronous/overlapped -// with respect to GPU computation (and with respect to host thread). -// -// Because the overlap acheivable for this computation and data set on a given system depends upon the GPU being used and the -// GPU/Host bandwidth, the sample adjust the computation duration to test the most ideal case and test against a consistent standard. -// This sample should be able to achieve up to 30% overlap on GPU's arch 1.2 and 1.3, and up to 50% on arch 2.0+ (Fermi) GPU's. -// -// After setup, warmup and calibration to the system, the sample runs 4 scenarios: -// A) Computations with 2 command queues on GPU -// A multiple-cycle sequence is executed, timed and compared against the host -// B) Computations with 1 command queue on GPU -// A multiple-cycle sequence is executed, timed and compared against the host -// -// The 2-command queue approach ought to be substantially faster -// -// For developmental purposes, the "iInnerLoopCount" variable passes into kernel and independently -// increases compute time without increasing data size (via a loop inside the kernel) -// -// At some value of iInnerLoopCount, # of elements, workgroup size, etc the Overlap percentage should reach 30%: -// (This ~naively assumes time H2D bandwidth is the same as D2H bandwidth, but this is close on most systems) -// -// If we name the time to copy single input vector H2D (or outpute vector D2H) as "T", then the optimum comparison case is: -// -// Single Queue with all the data and all the work -// Ttot (serial) = 4T + 4T + 2T = 10T -// -// Dual Queue, where each queue has 1/2 the data and 1/2 the work -// Tq0 (overlap) = 2T + 2T + T .... -// Tq1 (overlap) = .... 2T + 2T + T -// -// Ttot (elapsed, wall) = 2T + 2T + 2T + T = 7T -// -// Best Overlap % = 100.0 * (10T - 7T)/10T = 30.0 % (Tesla arch 1.2 or 1.3, single copy engine) -// -// For multiple independent cycles using arch >= 2.0 with 2 copy engines, input and output copies can also be overlapped. -// This doesn't help for the first cycle, but theoretically can lead to 50% overlap over many independent cycles. -// ********************************************************************* - -// common SDK header for standard utilities and system libs -#include -#include -#include - -// Best possible and Min ratio of compute/copy overlap timing benefit to pass the test -// values greater than 0.0f represent a speed-up relative to non-overlapped -#define EXPECTED_OVERLAP 30.0f -#define EXPECTED_OVERLAP_FERMI 45.0f -#define PASS_FACTOR 0.60f -#define RETRIES_ON_FAILURE 1 - -// Base sizes for parameters manipulated dynamically or on the command line -#define BASE_WORK_ITEMS 64 -#define BASE_ARRAY_LENGTH 40000 -#define BASE_LOOP_COUNT 32 - -static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) { - if (nullptr == filename || nullptr == data || 0 == size) - return CL_INVALID_VALUE; - - FILE* fp = fopen(filename, "r"); - if (NULL == fp) { - fprintf(stderr, "Failed to load kernel."); - return CL_INVALID_VALUE; - } - fseek(fp , 0 , SEEK_END); - long fsize = ftell(fp); - rewind(fp); - - *data = (uint8_t*)malloc(fsize); - *size = fread(*data, 1, fsize, fp); - - fclose(fp); - - return CL_SUCCESS; -} - -// Vars -// ********************************************************************* -cl_platform_id cpPlatform; // OpenCL platform -cl_context cxGPUContext; // OpenCL context -cl_command_queue cqCommandQueue[2]; // OpenCL command queues -cl_device_id* cdDevices; // OpenCL device list -cl_program cpProgram; // OpenCL program -cl_kernel ckKernel[2]; // OpenCL kernel, 1 per queue -cl_mem cmPinnedSrcA; // OpenCL pinned host source buffer A -cl_mem cmPinnedSrcB; // OpenCL pinned host source buffer B -cl_mem cmPinnedResult; // OpenCL pinned host result buffer -float* fSourceA = NULL; // Mapped pointer for pinned Host source A buffer -float* fSourceB = NULL; // Mapped pointer for pinned Host source B buffer -float* fResult = NULL; // Mapped pointer for pinned Host result buffer -cl_mem cmDevSrcA; // OpenCL device source buffer A -cl_mem cmDevSrcB; // OpenCL device source buffer B -cl_mem cmDevResult; // OpenCL device result buffer -size_t szBuffBytes; // Size of main buffers -size_t szGlobalWorkSize; // 1D var for Total # of work items in the launched ND range -size_t szLocalWorkSize = BASE_WORK_ITEMS; // initial # of work items in the work group -cl_int ciErrNum; // Error code var -char* cPathAndName = NULL; // Var for full paths to data, src, etc. -char* cSourceCL = NULL; // Buffer to hold source for compilation -const char* cExecutableName = NULL; - -// demo config vars -const char* cSourceFile = "kernel.cl"; // OpenCL computation kernel source code -float* Golden = NULL; // temp buffer to hold golden results for cross check -bool bNoPrompt = false; // Command line switch to skip exit prompt -bool bQATest = false; // Command line switch to test - -// Forward Declarations -// ********************************************************************* -double DualQueueSequence(int iCycles, unsigned int uiNumElements, bool bShowConfig); -double OneQueueSequence(int iCycles, unsigned int uiNumElements, bool bShowConfig); -int AdjustCompute(cl_device_id cdTargetDevice, unsigned int uiNumElements, int iInitialLoopCount, int iCycles); -void VectorHypotHost(const float* pfData1, const float* pfData2, float* pfResult, unsigned int uiNumElements, int iInnerLoopCount); -void Cleanup (int iExitCode); -void (*pCleanup)(int) = &Cleanup; - -int *gp_argc = 0; -const char *** gp_argv = NULL; - -// Main function -// ********************************************************************* -int main(int argc, const char **argv) -{ - //Locals - size_t szKernelLength; // Byte size of kernel code - double dBuildTime; // Compile time - cl_uint uiTargetDevice = 0; // Default Device to compute on - cl_uint uiNumDevsUsed = 1; // Number of devices used in this sample - cl_uint uiNumDevices; // Number of devices available - int iDevCap = -1; // Capability of device - int iInnerLoopCount = BASE_LOOP_COUNT; // Varies "compute intensity" per data within the kernel - const int iTestCycles = 10; // How many times to run the external test loop - const int iWarmupCycles = 8; // How many times to run the warmup sequence - cl_uint uiWorkGroupMultiple = 4; // Command line var (using "workgroupmult=") to optionally increase workgroup size - cl_uint uiNumElements = BASE_ARRAY_LENGTH; // initial # of elements per array to process (note: procesing 4 per work item) - cl_uint uiSizeMultiple = 4; // Command line var (using "sizemult=") to optionally increase vector sizes - bool bPassFlag = false; // Var to accumulate test pass/fail - shrBOOL bMatch = shrFALSE; // Cross check result - shrBOOL bTestOverlap = shrFALSE; - double dAvgGPUTime[2] = {0.0, 0.0}; // Average time of iTestCycles calls for 2-Queue and 1-Queue test - double dHostTime[2] = {0.0, 0.0}; // Host computation time (2nd test is redundant but a good stability indicator) - float fMinPassCriteria[2] = {0.0f, 0.0f}; // Test pass cireria, adjusted dependant on GPU arch - - gp_argc = &argc; - gp_argv = &argv; - - shrQAStart(argc, (char **)argv); - - // start logs - cExecutableName = argv[0]; - shrSetLogFileName ("oclCopyComputeOverlap.txt"); - shrLog("%s Starting...\n\n", argv[0]); - - // get basic command line args - bNoPrompt = (shrTRUE == shrCheckCmdLineFlag(argc, argv, "noprompt")); - bQATest = (shrTRUE == shrCheckCmdLineFlag(argc, argv, "qatest")); - shrGetCmdLineArgumentu(argc, argv, "device", &uiTargetDevice); - - // Optional Command-line multiplier for vector size - // Default val of 4 gives 10.24 million float elements per vector - // Range of 3 - 16 (7.68 to 40.96 million floats) is reasonable range (if system and GPU have enough memory) - shrGetCmdLineArgumentu(argc, argv, "sizemult", &uiSizeMultiple); - uiSizeMultiple = CLAMP(uiSizeMultiple, 1, 50); - uiNumElements = uiSizeMultiple * BASE_ARRAY_LENGTH * BASE_WORK_ITEMS; - shrLog("Array sizes = %u float elements\n", uiNumElements); - - // Optional Command-line multiplier for workgroup size (x 64 work items) - // Default val of 4 gives szLocalWorkSize of 256. - // Range of 1 - 8 (resulting in workgroup sizes of 64 to 512) is reasonable range - shrGetCmdLineArgumentu(argc, argv, "workgroupmult", &uiWorkGroupMultiple); - uiWorkGroupMultiple = CLAMP(uiWorkGroupMultiple, 1, 10); - szLocalWorkSize = uiWorkGroupMultiple * BASE_WORK_ITEMS; - shrLog("Workgroup Size = %u\n\n", szLocalWorkSize); - - // Get the NVIDIA platform if available, otherwise use default - shrLog("Get the Platform ID...\n\n"); - ciErrNum = oclGetPlatformID(&cpPlatform); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Get OpenCL platform name and version - char cBuffer[256]; - ciErrNum = clGetPlatformInfo (cpPlatform, CL_PLATFORM_NAME, sizeof(cBuffer), cBuffer, NULL); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("Platform Name = %s\n\n", cBuffer); - - // Get all the devices - shrLog("Get the Device info and select Device...\n"); - uiNumDevices = 1; - cdDevices = (cl_device_id*)malloc(uiNumDevices * sizeof(cl_device_id)); - ciErrNum = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_DEFAULT, 1, cdDevices, NULL); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Set target device and check capabilities - shrLog(" # of Devices Available = %u\n", uiNumDevices); - uiTargetDevice = CLAMP(uiTargetDevice, 0, (uiNumDevices - 1)); - shrLog(" Using Device %u, ", uiTargetDevice); - oclPrintDevName(LOGBOTH, cdDevices[uiTargetDevice]); - /*iDevCap = oclGetDevCap(cdDevices[uiTargetDevice]); - if (iDevCap > 0) { - shrLog(", Capability = %d.%d\n\n", iDevCap/10, iDevCap%10); - } else { - shrLog("\n\n", iDevCap); - } - if (strstr(cBuffer, "NVIDIA") != NULL) - { - if (iDevCap < 12) - { - shrLog("Device doesn't have overlap capability. Skipping test...\n"); - Cleanup (EXIT_SUCCESS); - } - - // Device and Platform eligible for overlap testing - bTestOverlap = shrTRUE; - - // If device has overlap capability, proceed - fMinPassCriteria[0] = PASS_FACTOR * EXPECTED_OVERLAP; // 1st cycle overlap is same for 1 or 2 copy engines - if (iDevCap != 20) - { - // Single copy engine - fMinPassCriteria[1] = PASS_FACTOR * EXPECTED_OVERLAP; // avg of many cycles - } - else - { - char cDevName[1024]; - clGetDeviceInfo(cdDevices[uiTargetDevice], CL_DEVICE_NAME, sizeof(cDevName), &cDevName, NULL); - if(strstr(cDevName, "Quadro")!=0 || strstr(cDevName, "Tesla")!=0) - { - // Tesla or Quadro (arch = 2.0) ... Dual copy engine - fMinPassCriteria[1] = PASS_FACTOR * EXPECTED_OVERLAP_FERMI; // average of many cycles - } - else - { - // Geforce ... Single copy engine - fMinPassCriteria[1] = PASS_FACTOR * EXPECTED_OVERLAP; // average of many cycles - } - } - }*/ - - // Create the context - shrLog("clCreateContext...\n"); - cxGPUContext = clCreateContext(0, uiNumDevsUsed, &cdDevices[uiTargetDevice], NULL, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Create 2 command-queues - cqCommandQueue[0] = clCreateCommandQueue(cxGPUContext, cdDevices[uiTargetDevice], 0, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clCreateCommandQueue [0]...\n"); - cqCommandQueue[1] = clCreateCommandQueue(cxGPUContext, cdDevices[uiTargetDevice], 0, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clCreateCommandQueue [1]...\n"); - - // Allocate the OpenCL source and result buffer memory objects on GPU device GMEM - szBuffBytes = sizeof(cl_float) * uiNumElements; - cmDevSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - cmDevSrcB = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - cmDevResult = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clCreateBuffer (Src A, Src B and Result GPU Device GMEM, 3 x %u floats) ...\n", uiNumElements); - - // Allocate pinned source and result host buffers: - // Note: Pinned (Page Locked) memory is needed for async host<->GPU memory copy operations *** - cmPinnedSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - cmPinnedSrcB = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - cmPinnedResult = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clCreateBuffer (Src A, Src B and Result Pinned Host buffers, 3 x %u floats)...\n\n", uiNumElements); - - // Get mapped pointers to pinned input host buffers - // Note: This allows general (non-OpenCL) host functions to access pinned buffers using standard pointers - fSourceA = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcA, CL_TRUE, CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - fSourceB = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcB, CL_TRUE, CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - fResult = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedResult, CL_TRUE, CL_MAP_READ, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum); - oclCheckErrorEX (ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clEnqueueMapBuffer (Pointers to 3 pinned host buffers)...\n"); - - // Alloc temp golden buffer for cross checks - Golden = (float*)malloc(szBuffBytes); - oclCheckErrorEX(Golden != NULL, shrTRUE, pCleanup); - -#ifdef HOSTGPU - // Read the OpenCL kernel in from source file - cPathAndName = shrFindFilePath(cSourceFile, argv[0]); - oclCheckError(cPathAndName != NULL, shrTRUE); - shrLog("oclLoadProgSource (%s)...\n", cSourceFile); - cSourceCL = oclLoadProgSource(cPathAndName, "", &szKernelLength); - // Create the program object - shrLog("clCreateProgramWithSource...\n"); - cpProgram = clCreateProgramWithSource(cxGPUContext, 1, (const char **)&cSourceCL, &szKernelLength, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); -#else - uint8_t *kernel_bin = NULL; - size_t kernel_size; - cl_int binary_status = 0; - ciErrNum = read_kernel_file("kernel.pocl", &kernel_bin, &kernel_size); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - cpProgram = clCreateProgramWithBinary( - cxGPUContext, 1, &cdDevices[uiTargetDevice], &kernel_size, (const uint8_t**)&kernel_bin, &binary_status, &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); -#endif - // Build the program for the target device - clFinish(cqCommandQueue[0]); - shrDeltaT(0); - ciErrNum = clBuildProgram(cpProgram, uiNumDevsUsed, &cdDevices[uiTargetDevice], "-cl-fast-relaxed-math", NULL, NULL); - shrLog("clBuildProgram..."); - if (ciErrNum != CL_SUCCESS) - { - // write out standard error, Build Log and PTX, then cleanup and exit - shrLogEx(LOGBOTH | ERRORMSG, (double)ciErrNum, STDERROR); - oclLogBuildInfo(cpProgram, oclGetFirstDev(cxGPUContext)); - oclLogPtx(cpProgram, oclGetFirstDev(cxGPUContext), "VectorHypot.ptx"); - Cleanup(EXIT_FAILURE); - } - dBuildTime = shrDeltaT(0); - - // Create the kernel - ckKernel[0] = clCreateKernel(cpProgram, "VectorHypot", &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - ckKernel[1] = clCreateKernel(cpProgram, "VectorHypot", &ciErrNum); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clCreateKernel (ckKernel[2])...\n"); - - // Offsets for 2 queues - cl_uint uiOffset[2] = {0, uiNumElements / (2 * 4)}; - - // Set the Argument values for the 1st kernel instance (queue 0) - ciErrNum = clSetKernelArg(ckKernel[0], 0, sizeof(cl_mem), (void*)&cmDevSrcA); - ciErrNum |= clSetKernelArg(ckKernel[0], 1, sizeof(cl_mem), (void*)&cmDevSrcB); - ciErrNum |= clSetKernelArg(ckKernel[0], 2, sizeof(cl_mem), (void*)&cmDevResult); - ciErrNum |= clSetKernelArg(ckKernel[0], 3, sizeof(cl_uint), (void*)&uiOffset[0]); - ciErrNum |= clSetKernelArg(ckKernel[0], 4, sizeof(cl_int), (void*)&iInnerLoopCount); - ciErrNum |= clSetKernelArg(ckKernel[0], 5, sizeof(cl_uint), (void*)&uiNumElements); - shrLog("clSetKernelArg ckKernel[0] args 0 - 5...\n"); - - // Set the Argument values for the 2d kernel instance (queue 1) - ciErrNum |= clSetKernelArg(ckKernel[1], 0, sizeof(cl_mem), (void*)&cmDevSrcA); - ciErrNum |= clSetKernelArg(ckKernel[1], 1, sizeof(cl_mem), (void*)&cmDevSrcB); - ciErrNum |= clSetKernelArg(ckKernel[1], 2, sizeof(cl_mem), (void*)&cmDevResult); - ciErrNum |= clSetKernelArg(ckKernel[1], 3, sizeof(cl_uint), (void*)&uiOffset[1]); - ciErrNum |= clSetKernelArg(ckKernel[1], 4, sizeof(cl_int), (void*)&iInnerLoopCount); - ciErrNum |= clSetKernelArg(ckKernel[1], 5, sizeof(cl_uint), (void*)&uiNumElements); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - shrLog("clSetKernelArg ckKernel[1] args 0 - 5...\n\n"); - - //******************************************* - // Warmup the driver with dual queue sequence - //******************************************* - - // Warmup with dual queue sequence for iTestCycles - shrLog("Warmup with 2-Queue sequence, %d cycles...\n", iWarmupCycles); - DualQueueSequence(iWarmupCycles, uiNumElements, false); - - // Use single queue config to adjust compute intensity - shrLog("Adjust compute for GPU / system...\n"); - iInnerLoopCount = AdjustCompute(cdDevices[uiTargetDevice], uiNumElements, iInnerLoopCount, iTestCycles); - shrLog(" Kernel inner loop count = %d\n", iInnerLoopCount); - - //******************************************* - // Run and time with 2 command-queues - //******************************************* - for( int iRun =0; iRun <= RETRIES_ON_FAILURE; ++iRun ) { - - // Run the sequence iTestCycles times - dAvgGPUTime[0] = DualQueueSequence(iTestCycles, uiNumElements, false); - - // Warmup then Compute on host iTestCycles times (using mapped standard pointer to pinned host cl_mem buffer) - shrLog(" Device vs Host Result Comparison\t: "); - VectorHypotHost(fSourceA, fSourceB, Golden, uiNumElements, iInnerLoopCount); - shrDeltaT(0); - for (int i = 0; i < iTestCycles; i++) - { - VectorHypotHost (fSourceA, fSourceB, Golden, uiNumElements, iInnerLoopCount); - } - dHostTime[0] = shrDeltaT(0)/iTestCycles; - - // Compare host and GPU results (using mapped standard pointer to pinned host cl_mem buffer) - bMatch = shrComparefet(Golden, fResult, uiNumElements, 0.0f, 0); - shrLog("gpu %s cpu\n", (bMatch == shrTRUE) ? "MATCHES" : "DOESN'T MATCH"); - bPassFlag = (bMatch == shrTRUE); - - //******************************************* - // Run and time with 1 command queue - //******************************************* - // Run the sequence iTestCycles times - dAvgGPUTime[1] = OneQueueSequence(iTestCycles, uiNumElements, false); - - // Compute on host iTestCycles times (using mapped standard pointer to pinned host cl_mem buffer) - shrLog(" Device vs Host Result Comparison\t: "); - shrDeltaT(0); - for (int i = 0; i < iTestCycles; i++) - { - VectorHypotHost(fSourceA, fSourceB, Golden, (int)uiNumElements, iInnerLoopCount); - } - dHostTime[1] = shrDeltaT(0)/iTestCycles; - - // Compare host and GPU results (using mapped standard pointer to pinned host cl_mem buffer) - bMatch = shrComparefet(Golden, fResult, uiNumElements, 0.0f, 0); - shrLog("gpu %s cpu\n", (bMatch == shrTRUE) ? "MATCHES" : "DOESN'T MATCH"); - bPassFlag &= (bMatch == shrTRUE); - - //******************************************* - - // Compare Single and Dual queue timing - shrLog("\nResult Summary:\n"); - - // Log GPU and CPU Time for 2-queue scenario - shrLog(" Avg GPU Elapsed Time for 2-Queues\t= %.5f s\n", dAvgGPUTime[0]); - shrLog(" Avg Host Elapsed Time\t\t\t= %.5f s\n\n", dHostTime[0]); - - // Log GPU and CPU Time for 1-queue scenario - shrLog(" Avg GPU Elapsed Time for 1-Queue\t= %.5f s\n", dAvgGPUTime[1]); - shrLog(" Avg Host Elapsed Time\t\t\t= %.5f s\n\n", dHostTime[1]); - - // Log overlap % for GPU (comparison of 2-queue and 1 queue scenarios) and status - double dAvgOverlap = 100.0 * (1.0 - dAvgGPUTime[0]/dAvgGPUTime[1]); - - if( bTestOverlap ) { - bool bAvgOverlapOK = (dAvgOverlap >= fMinPassCriteria[1]); - if( iRun == RETRIES_ON_FAILURE || bAvgOverlapOK ) { - shrLog(" Measured and (Acceptable) Avg Overlap\t= %.1f %% (%.1f %%) -> Measured Overlap is %s\n\n", dAvgOverlap, fMinPassCriteria[1], bAvgOverlapOK ? "Acceptable" : "NOT Acceptable"); - - // Log info to master log in standard format - shrLogEx(LOGBOTH | MASTER, 0, "oclCopyComputeOverlap-Avg, Throughput = %.4f OverlapPercent, Time = %.5f s, Size = %u Elements, NumDevsUsed = %u, Workgroup = %u\n", - dAvgOverlap, dAvgGPUTime[0], uiNumElements, uiNumDevsUsed, szLocalWorkSize); - - bPassFlag &= bAvgOverlapOK; - break; - } - } - - shrLog(" Measured and (Acceptable) Avg Overlap\t= %.1f %% (%.1f %%) -> Retry %d more time(s)...\n\n", dAvgOverlap, fMinPassCriteria[1], RETRIES_ON_FAILURE - iRun); - } - - - //******************************************* - // Report pass/fail, cleanup and exit - Cleanup (bPassFlag ? EXIT_SUCCESS : EXIT_FAILURE); - - return 0; -} - -// Run 1 queue sequence for n cycles -// ********************************************************************* -double OneQueueSequence(int iCycles, unsigned int uiNumElements, bool bShowConfig) -{ - // Use fresh source Data: (re)initialize pinned host array buffers (using mapped standard pointer to pinned host cl_mem buffer) - shrFillArray(fSourceA, (int)uiNumElements); - shrFillArray(fSourceB, (int)uiNumElements); - - // Reset Global work size for 1 command-queue, and log work sizes & dimensions - szGlobalWorkSize = shrRoundUp((int)szLocalWorkSize, (int)(uiNumElements/4)); - - // *** Make sure queues are empty and then start timer - double dAvgTime = 0.0; - clFinish(cqCommandQueue[0]); - clFinish(cqCommandQueue[1]); - shrDeltaT(0); - - // Run the sequence iCycles times - for (int i = 0; i < iCycles; i++) - { - // Nonblocking Write of all of input data from host to device in command-queue 0 - ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szBuffBytes, (void*)&fSourceA[0], 0, NULL, NULL); - ciErrNum |= clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcB, CL_FALSE, 0, szBuffBytes, (void*)&fSourceB[0], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - - // Launch kernel computation, command-queue 0 - ciErrNum = clEnqueueNDRangeKernel(cqCommandQueue[0], ckKernel[0], 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Non Blocking Read of output data from device to host, command-queue 0 - ciErrNum = clEnqueueReadBuffer(cqCommandQueue[0], cmDevResult, CL_FALSE, 0, szBuffBytes, (void*)&fResult[0], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - - // Flush sequence to device (may not be necessary on Linux or WinXP or when using the NVIDIA Tesla Computing Cluster driver) - clFlush(cqCommandQueue[0]); - } - - // *** Assure sync to host and return average sequence time - clFinish(cqCommandQueue[0]); - dAvgTime = shrDeltaT(0)/(double)iCycles; - - // Log config if asked for - if (bShowConfig) - { - shrLog("\n1-Queue sequence Configuration:\n"); - shrLog(" Global Work Size (per command-queue)\t= %u\n Local Work Size \t\t\t= %u\n # of Work Groups (per command-queue)\t= %u\n # of command-queues\t\t\t= 1\n", - szGlobalWorkSize, szLocalWorkSize, szGlobalWorkSize/szLocalWorkSize); - } - return dAvgTime; -} - -// Run 2 queue sequence for n cycles -// ********************************************************************* -double DualQueueSequence(int iCycles, unsigned int uiNumElements, bool bShowConfig) -{ - // Locals - size_t szHalfBuffer = szBuffBytes / 2; - size_t szHalfOffset = szHalfBuffer / sizeof(float); - double dAvgTime = 0.0; - - // Use fresh source Data: (re)initialize pinned host array buffers (using mapped standard pointer to pinned host cl_mem buffer) - shrFillArray(fSourceA, (int)uiNumElements); - shrFillArray(fSourceB, (int)uiNumElements); - - // Set Global work size for 2 command-queues, and log work sizes & dimensions - szGlobalWorkSize = shrRoundUp((int)szLocalWorkSize, (int)(uiNumElements/(2 * 4))); - - // Make sure queues are empty and then start timer - clFinish(cqCommandQueue[0]); - clFinish(cqCommandQueue[1]); - shrDeltaT(0); - - for (int i = 0; i < iCycles; i++) - { - // Mid Phase 0 - // Nonblocking Write of 1st half of input data from host to device in command-queue 0 - ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceA[0], 0, NULL, NULL); - ciErrNum |= clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcB, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceB[0], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - - // Push out the write for queue 0 (and prior read from queue 1 at end of loop) to the driver - // (not necessary on Linux, Mac OSX or WinXP) - clFlush(cqCommandQueue[0]); - clFlush(cqCommandQueue[1]); - - // Start Phase 1 *********************************** - - // Launch kernel computation, command-queue 0 - // (Note: The order MATTERS here on Fermi ! THE KERNEL IN THIS PHASE SHOULD BE LAUNCHED BEFORE THE WRITE) - ciErrNum = clEnqueueNDRangeKernel(cqCommandQueue[0], ckKernel[0], 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Nonblocking Write of 2nd half of input data from host to device in command-queue 1 - // (Note: The order MATTERS here on Fermi ! THE KERNEL IN THIS PHASE SHOULD BE LAUNCHED BEFORE THE WRITE) - ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[1], cmDevSrcA, CL_FALSE, szHalfBuffer, szHalfBuffer, (void*)&fSourceA[szHalfOffset], 0, NULL, NULL); - ciErrNum |= clEnqueueWriteBuffer(cqCommandQueue[1], cmDevSrcB, CL_FALSE, szHalfBuffer, szHalfBuffer, (void*)&fSourceB[szHalfOffset], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - - // Push out the compute for queue 0 and write for queue 1 to the driver - // (not necessary on Linux, Mac OSX or WinXP) - clFlush(cqCommandQueue[0]); - clFlush(cqCommandQueue[1]); - - // Start Phase 2 *********************************** - - // Launch kernel computation, command-queue 1 - ciErrNum = clEnqueueNDRangeKernel(cqCommandQueue[1], ckKernel[1], 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - - // Non Blocking Read of 1st half of output data from device to host, command-queue 0 - ciErrNum = clEnqueueReadBuffer(cqCommandQueue[0], cmDevResult, CL_FALSE, 0, szHalfBuffer, (void*)&fResult[0], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - - // Push out the compute for queue 1 and the read for queue 0 to the driver - // (not necessary on Linux, Mac OSX or WinXP) - clFlush(cqCommandQueue[0]); - clFlush(cqCommandQueue[1]); - - // Start Phase 0 (Rolls over) *********************************** - - // Non Blocking Read of 2nd half of output data from device to host, command-queue 1 - ciErrNum = clEnqueueReadBuffer(cqCommandQueue[1], cmDevResult, CL_FALSE, szHalfBuffer, szHalfBuffer, (void*)&fResult[szHalfOffset], 0, NULL, NULL); - shrCheckError(ciErrNum, CL_SUCCESS); - } - - // *** Sync to host and get average sequence time - clFinish(cqCommandQueue[0]); - clFinish(cqCommandQueue[1]); - dAvgTime = shrDeltaT(0)/(double)iCycles; - - // Log config if asked for - if (bShowConfig) - { - shrLog("\n2-Queue sequence Configuration:\n"); - shrLog(" Global Work Size (per command-queue)\t= %u\n Local Work Size \t\t\t= %u\n # of Work Groups (per command-queue)\t= %u\n # of command-queues\t\t\t= 2\n", - szGlobalWorkSize, szLocalWorkSize, szGlobalWorkSize/szLocalWorkSize); - } - - return dAvgTime; -} - -// Function to adjust compute task according to device capability -// This allows a consistent overlap % across a wide variety of GPU's for test purposes -// It also implitly illustrates the relationship between compute capability and overlap at fixed work size -// ********************************************************************* -int AdjustCompute(cl_device_id cdTargetDevice, unsigned int uiNumElements, int iInitLoopCount, int iCycles) -{ - // Locals - double dCopyTime, dComputeTime; - int iComputedLoopCount; - - // Change Source Data - shrFillArray(fSourceA, (int)uiNumElements); - shrFillArray(fSourceB, (int)uiNumElements); - - // Reset Global work size for 1 command-queue, and log work sizes & dimensions - szGlobalWorkSize = shrRoundUp((int)szLocalWorkSize, (int)(uiNumElements/4)); - - // *** Make sure queues are empty and then start timer - clFinish(cqCommandQueue[0]); - clFinish(cqCommandQueue[1]); - shrDeltaT(0); - - // Run the copy iCycles times and measure copy time on this system - for (int i = 0; i < iCycles; i++) - { - // Nonblocking Write of all of input data from host to device in command-queue 0 - ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szBuffBytes, (void*)&fSourceA[0], 0, NULL, NULL); - ciErrNum |= clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcB, CL_FALSE, 0, szBuffBytes, (void*)&fSourceB[0], 0, NULL, NULL); - ciErrNum |= clFlush(cqCommandQueue[0]); - shrCheckError(ciErrNum, CL_SUCCESS); - } - clFinish(cqCommandQueue[0]); - dCopyTime = shrDeltaT(0); - - // Run the compute iCycles times and measure compute time on this system - for (int i = 0; i < iCycles; i++) - { - // Launch kernel computation, command-queue 0 - ciErrNum = clEnqueueNDRangeKernel(cqCommandQueue[0], ckKernel[0], 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL); - ciErrNum |= clFlush(cqCommandQueue[0]); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - } - clFinish(cqCommandQueue[0]); - dComputeTime = shrDeltaT(0); - - // Determine number of core loop cycles proportional to copy/compute time ratio - dComputeTime = MAX(dComputeTime, 1.0e-6); - iComputedLoopCount = CLAMP(2, (int)((dCopyTime/dComputeTime) * (double)iInitLoopCount), (iInitLoopCount * 4)); - ciErrNum |= clSetKernelArg(ckKernel[0], 4, sizeof(cl_int), (void*)&iComputedLoopCount); - ciErrNum |= clSetKernelArg(ckKernel[1], 4, sizeof(cl_int), (void*)&iComputedLoopCount); - oclCheckErrorEX(ciErrNum, CL_SUCCESS, pCleanup); - return (iComputedLoopCount); -} - -// Cleanup/Exit function -// ********************************************************************* -void Cleanup (int iExitCode) -{ - // Cleanup allocated objects - shrLog("Starting Cleanup...\n\n"); - if(cPathAndName)free(cPathAndName); - if(cSourceCL)free(cSourceCL); - if(Golden)free(Golden); - if(ckKernel[0])clReleaseKernel(ckKernel[0]); - if(ckKernel[1])clReleaseKernel(ckKernel[1]); - if(cpProgram)clReleaseProgram(cpProgram); - if(fSourceA)clEnqueueUnmapMemObject(cqCommandQueue[0], cmPinnedSrcA, (void*)fSourceA, 0, NULL, NULL); - if(fSourceB)clEnqueueUnmapMemObject(cqCommandQueue[0], cmPinnedSrcB, (void*)fSourceB, 0, NULL, NULL); - if(fResult)clEnqueueUnmapMemObject(cqCommandQueue[0], cmPinnedResult, (void*)fResult, 0, NULL, NULL); - if(cmDevSrcA)clReleaseMemObject(cmDevSrcA); - if(cmDevSrcB)clReleaseMemObject(cmDevSrcB); - if(cmDevResult)clReleaseMemObject(cmDevResult); - if(cmPinnedSrcA)clReleaseMemObject(cmPinnedSrcA); - if(cmPinnedSrcB)clReleaseMemObject(cmPinnedSrcB); - if(cmPinnedResult)clReleaseMemObject(cmPinnedResult); - if(cqCommandQueue[0])clReleaseCommandQueue(cqCommandQueue[0]); - if(cqCommandQueue[1])clReleaseCommandQueue(cqCommandQueue[1]); - if(cxGPUContext)clReleaseContext(cxGPUContext); - if(cdDevices)free(cdDevices); - - // Master status Pass/Fail (all tests) - shrQAFinishExit( *gp_argc, (const char **)*gp_argv, (iExitCode == EXIT_SUCCESS) ? QA_PASSED : QA_FAILED ); -} - -// "Golden" Host processing vector hyptenuse function for comparison purposes -// ********************************************************************* -void VectorHypotHost(const float* pfData1, const float* pfData2, float* pfResult, unsigned int uiNumElements, int iInnerLoopCount) -{ - for (unsigned int i = 0; i < uiNumElements; i++) - { - float fA = pfData1[i]; - float fB = pfData2[i]; - float fC = sqrtf(fA * fA + fB * fB); - - pfResult[i] = fC; - } -} diff --git a/tests/opencl/vectorhypot/oclUtils.cpp b/tests/opencl/vectorhypot/oclUtils.cpp deleted file mode 100644 index 6d920858..00000000 --- a/tests/opencl/vectorhypot/oclUtils.cpp +++ /dev/null @@ -1,806 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -// ********************************************************************* -// Utilities specific to OpenCL samples in NVIDIA GPU Computing SDK -// ********************************************************************* - -#include -#include -#include -#include -#include -#include "oclUtils.h" - -////////////////////////////////////////////////////////////////////////////// -//! Gets the platform ID for NVIDIA if available, otherwise default -//! -//! @return the id -//! @param clSelectedPlatformID OpenCL platoform ID -////////////////////////////////////////////////////////////////////////////// -cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID) -{ - char chBuffer[1024]; - cl_uint num_platforms; - cl_platform_id* clPlatformIDs; - cl_int ciErrNum; - *clSelectedPlatformID = NULL; - - // Get OpenCL platform count - ciErrNum = clGetPlatformIDs (0, NULL, &num_platforms); - if (ciErrNum != CL_SUCCESS) - { - shrLog(" Error %i in clGetPlatformIDs Call !!!\n\n", ciErrNum); - return -1000; - } - else - { - if(num_platforms == 0) - { - shrLog("No OpenCL platform found!\n\n"); - return -2000; - } - else - { - // if there's a platform or more, make space for ID's - if ((clPlatformIDs = (cl_platform_id*)malloc(num_platforms * sizeof(cl_platform_id))) == NULL) - { - shrLog("Failed to allocate memory for cl_platform ID's!\n\n"); - return -3000; - } - - // get platform info for each platform and trap the NVIDIA platform if found - ciErrNum = clGetPlatformIDs (num_platforms, clPlatformIDs, NULL); - for(cl_uint i = 0; i < num_platforms; ++i) - { - ciErrNum = clGetPlatformInfo (clPlatformIDs[i], CL_PLATFORM_NAME, 1024, &chBuffer, NULL); - if(ciErrNum == CL_SUCCESS) - { - if(strstr(chBuffer, "NVIDIA") != NULL) - { - *clSelectedPlatformID = clPlatformIDs[i]; - break; - } - } - } - - // default to zeroeth platform if NVIDIA not found - if(*clSelectedPlatformID == NULL) - { - shrLog("WARNING: NVIDIA OpenCL platform not found - defaulting to first platform!\n\n"); - *clSelectedPlatformID = clPlatformIDs[0]; - } - - free(clPlatformIDs); - } - } - - return CL_SUCCESS; -} - -////////////////////////////////////////////////////////////////////////////// -//! Print the device name -//! -//! @param iLogMode enum LOGBOTH, LOGCONSOLE, LOGFILE -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -void oclPrintDevName(int iLogMode, cl_device_id device) -{ - char device_string[1024]; - clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, "%s\n", device_string); -} - -////////////////////////////////////////////////////////////////////////////// -//! Print info about the device -//! -//! @param iLogMode enum LOGBOTH, LOGCONSOLE, LOGFILE -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -void oclPrintDevInfo(int iLogMode, cl_device_id device) -{ - char device_string[1024]; - bool nv_device_attibute_query = false; - - // CL_DEVICE_NAME - clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_NAME: \t\t\t%s\n", device_string); - - // CL_DEVICE_VENDOR - clGetDeviceInfo(device, CL_DEVICE_VENDOR, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_VENDOR: \t\t\t%s\n", device_string); - - // CL_DRIVER_VERSION - clGetDeviceInfo(device, CL_DRIVER_VERSION, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, " CL_DRIVER_VERSION: \t\t\t%s\n", device_string); - - // CL_DEVICE_VERSION - clGetDeviceInfo(device, CL_DEVICE_VERSION, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_VERSION: \t\t\t%s\n", device_string); - - // CL_DEVICE_OPENCL_C_VERSION (if CL_DEVICE_VERSION version > 1.0) - if(strncmp("OpenCL 1.0", device_string, 10) != 0) - { - // This code is unused for devices reporting OpenCL 1.0, but a def is needed anyway to allow compilation using v 1.0 headers - // This constant isn't #defined in 1.0 - #ifndef CL_DEVICE_OPENCL_C_VERSION - #define CL_DEVICE_OPENCL_C_VERSION 0x103D - #endif - - clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_VERSION, sizeof(device_string), &device_string, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_OPENCL_C_VERSION: \t\t%s\n", device_string); - } - - // CL_DEVICE_TYPE - cl_device_type type; - clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(type), &type, NULL); - if( type & CL_DEVICE_TYPE_CPU ) - shrLogEx(iLogMode, 0, " CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_CPU"); - if( type & CL_DEVICE_TYPE_GPU ) - shrLogEx(iLogMode, 0, " CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_GPU"); - if( type & CL_DEVICE_TYPE_ACCELERATOR ) - shrLogEx(iLogMode, 0, " CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_ACCELERATOR"); - if( type & CL_DEVICE_TYPE_DEFAULT ) - shrLogEx(iLogMode, 0, " CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_DEFAULT"); - - // CL_DEVICE_MAX_COMPUTE_UNITS - cl_uint compute_units; - clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_COMPUTE_UNITS:\t\t%u\n", compute_units); - - // CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS - size_t workitem_dims; - clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, sizeof(workitem_dims), &workitem_dims, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:\t%u\n", workitem_dims); - - // CL_DEVICE_MAX_WORK_ITEM_SIZES - size_t workitem_size[3]; - clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(workitem_size), &workitem_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_WORK_ITEM_SIZES:\t%u / %u / %u \n", workitem_size[0], workitem_size[1], workitem_size[2]); - - // CL_DEVICE_MAX_WORK_GROUP_SIZE - size_t workgroup_size; - clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(workgroup_size), &workgroup_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_WORK_GROUP_SIZE:\t%u\n", workgroup_size); - - // CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint clock_frequency; - clGetDeviceInfo(device, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(clock_frequency), &clock_frequency, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_CLOCK_FREQUENCY:\t%u MHz\n", clock_frequency); - - // CL_DEVICE_ADDRESS_BITS - cl_uint addr_bits; - clGetDeviceInfo(device, CL_DEVICE_ADDRESS_BITS, sizeof(addr_bits), &addr_bits, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_ADDRESS_BITS:\t\t%u\n", addr_bits); - - // CL_DEVICE_MAX_MEM_ALLOC_SIZE - cl_ulong max_mem_alloc_size; - clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(max_mem_alloc_size), &max_mem_alloc_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_MEM_ALLOC_SIZE:\t\t%u MByte\n", (unsigned int)(max_mem_alloc_size / (1024 * 1024))); - - // CL_DEVICE_GLOBAL_MEM_SIZE - cl_ulong mem_size; - clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(mem_size), &mem_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_GLOBAL_MEM_SIZE:\t\t%u MByte\n", (unsigned int)(mem_size / (1024 * 1024))); - - // CL_DEVICE_ERROR_CORRECTION_SUPPORT - cl_bool error_correction_support; - clGetDeviceInfo(device, CL_DEVICE_ERROR_CORRECTION_SUPPORT, sizeof(error_correction_support), &error_correction_support, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_ERROR_CORRECTION_SUPPORT:\t%s\n", error_correction_support == CL_TRUE ? "yes" : "no"); - - // CL_DEVICE_LOCAL_MEM_TYPE - cl_device_local_mem_type local_mem_type; - clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_TYPE, sizeof(local_mem_type), &local_mem_type, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_LOCAL_MEM_TYPE:\t\t%s\n", local_mem_type == 1 ? "local" : "global"); - - // CL_DEVICE_LOCAL_MEM_SIZE - clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(mem_size), &mem_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_LOCAL_MEM_SIZE:\t\t%u KByte\n", (unsigned int)(mem_size / 1024)); - - // CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE - clGetDeviceInfo(device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, sizeof(mem_size), &mem_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:\t%u KByte\n", (unsigned int)(mem_size / 1024)); - - // CL_DEVICE_QUEUE_PROPERTIES - cl_command_queue_properties queue_properties; - clGetDeviceInfo(device, CL_DEVICE_QUEUE_PROPERTIES, sizeof(queue_properties), &queue_properties, NULL); - if( queue_properties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ) - shrLogEx(iLogMode, 0, " CL_DEVICE_QUEUE_PROPERTIES:\t\t%s\n", "CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"); - if( queue_properties & CL_QUEUE_PROFILING_ENABLE ) - shrLogEx(iLogMode, 0, " CL_DEVICE_QUEUE_PROPERTIES:\t\t%s\n", "CL_QUEUE_PROFILING_ENABLE"); - - // CL_DEVICE_IMAGE_SUPPORT - cl_bool image_support; - clGetDeviceInfo(device, CL_DEVICE_IMAGE_SUPPORT, sizeof(image_support), &image_support, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_IMAGE_SUPPORT:\t\t%u\n", image_support); - - // CL_DEVICE_MAX_READ_IMAGE_ARGS - cl_uint max_read_image_args; - clGetDeviceInfo(device, CL_DEVICE_MAX_READ_IMAGE_ARGS, sizeof(max_read_image_args), &max_read_image_args, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_READ_IMAGE_ARGS:\t%u\n", max_read_image_args); - - // CL_DEVICE_MAX_WRITE_IMAGE_ARGS - cl_uint max_write_image_args; - clGetDeviceInfo(device, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, sizeof(max_write_image_args), &max_write_image_args, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_MAX_WRITE_IMAGE_ARGS:\t%u\n", max_write_image_args); - - // CL_DEVICE_SINGLE_FP_CONFIG - cl_device_fp_config fp_config; - clGetDeviceInfo(device, CL_DEVICE_SINGLE_FP_CONFIG, sizeof(cl_device_fp_config), &fp_config, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_SINGLE_FP_CONFIG:\t\t%s%s%s%s%s%s\n", - fp_config & CL_FP_DENORM ? "denorms " : "", - fp_config & CL_FP_INF_NAN ? "INF-quietNaNs " : "", - fp_config & CL_FP_ROUND_TO_NEAREST ? "round-to-nearest " : "", - fp_config & CL_FP_ROUND_TO_ZERO ? "round-to-zero " : "", - fp_config & CL_FP_ROUND_TO_INF ? "round-to-inf " : "", - fp_config & CL_FP_FMA ? "fma " : ""); - - // CL_DEVICE_IMAGE2D_MAX_WIDTH, CL_DEVICE_IMAGE2D_MAX_HEIGHT, CL_DEVICE_IMAGE3D_MAX_WIDTH, CL_DEVICE_IMAGE3D_MAX_HEIGHT, CL_DEVICE_IMAGE3D_MAX_DEPTH - size_t szMaxDims[5]; - shrLogEx(iLogMode, 0, "\n CL_DEVICE_IMAGE "); - clGetDeviceInfo(device, CL_DEVICE_IMAGE2D_MAX_WIDTH, sizeof(size_t), &szMaxDims[0], NULL); - shrLogEx(iLogMode, 0, "\t\t\t2D_MAX_WIDTH\t %u\n", szMaxDims[0]); - clGetDeviceInfo(device, CL_DEVICE_IMAGE2D_MAX_HEIGHT, sizeof(size_t), &szMaxDims[1], NULL); - shrLogEx(iLogMode, 0, "\t\t\t\t\t2D_MAX_HEIGHT\t %u\n", szMaxDims[1]); - clGetDeviceInfo(device, CL_DEVICE_IMAGE3D_MAX_WIDTH, sizeof(size_t), &szMaxDims[2], NULL); - shrLogEx(iLogMode, 0, "\t\t\t\t\t3D_MAX_WIDTH\t %u\n", szMaxDims[2]); - clGetDeviceInfo(device, CL_DEVICE_IMAGE3D_MAX_HEIGHT, sizeof(size_t), &szMaxDims[3], NULL); - shrLogEx(iLogMode, 0, "\t\t\t\t\t3D_MAX_HEIGHT\t %u\n", szMaxDims[3]); - clGetDeviceInfo(device, CL_DEVICE_IMAGE3D_MAX_DEPTH, sizeof(size_t), &szMaxDims[4], NULL); - shrLogEx(iLogMode, 0, "\t\t\t\t\t3D_MAX_DEPTH\t %u\n", szMaxDims[4]); - - // CL_DEVICE_EXTENSIONS: get device extensions, and if any then parse & log the string onto separate lines - clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, sizeof(device_string), &device_string, NULL); - if (device_string != 0) - { - shrLogEx(iLogMode, 0, "\n CL_DEVICE_EXTENSIONS:"); - std::string stdDevString; - stdDevString = std::string(device_string); - size_t szOldPos = 0; - size_t szSpacePos = stdDevString.find(' ', szOldPos); // extensions string is space delimited - while (szSpacePos != stdDevString.npos) - { - if( strcmp("cl_nv_device_attribute_query", stdDevString.substr(szOldPos, szSpacePos - szOldPos).c_str()) == 0 ) - nv_device_attibute_query = true; - - if (szOldPos > 0) - { - shrLogEx(iLogMode, 0, "\t\t"); - } - shrLogEx(iLogMode, 0, "\t\t\t%s\n", stdDevString.substr(szOldPos, szSpacePos - szOldPos).c_str()); - - do { - szOldPos = szSpacePos + 1; - szSpacePos = stdDevString.find(' ', szOldPos); - } while (szSpacePos == szOldPos); - } - shrLogEx(iLogMode, 0, "\n"); - } - else - { - shrLogEx(iLogMode, 0, " CL_DEVICE_EXTENSIONS: None\n"); - } - - if(nv_device_attibute_query) - { - cl_uint compute_capability_major, compute_capability_minor; - clGetDeviceInfo(device, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, sizeof(cl_uint), &compute_capability_major, NULL); - clGetDeviceInfo(device, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, sizeof(cl_uint), &compute_capability_minor, NULL); - shrLogEx(iLogMode, 0, "\n CL_DEVICE_COMPUTE_CAPABILITY_NV:\t%u.%u\n", compute_capability_major, compute_capability_minor); - - shrLogEx(iLogMode, 0, " NUMBER OF MULTIPROCESSORS:\t\t%u\n", compute_units); // this is the same value reported by CL_DEVICE_MAX_COMPUTE_UNITS - shrLogEx(iLogMode, 0, " NUMBER OF CUDA CORES:\t\t\t%u\n", ConvertSMVer2Cores(compute_capability_major, compute_capability_minor) * compute_units); - - cl_uint regs_per_block; - clGetDeviceInfo(device, CL_DEVICE_REGISTERS_PER_BLOCK_NV, sizeof(cl_uint), ®s_per_block, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_REGISTERS_PER_BLOCK_NV:\t%u\n", regs_per_block); - - cl_uint warp_size; - clGetDeviceInfo(device, CL_DEVICE_WARP_SIZE_NV, sizeof(cl_uint), &warp_size, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_WARP_SIZE_NV:\t\t%u\n", warp_size); - - cl_bool gpu_overlap; - clGetDeviceInfo(device, CL_DEVICE_GPU_OVERLAP_NV, sizeof(cl_bool), &gpu_overlap, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_GPU_OVERLAP_NV:\t\t%s\n", gpu_overlap == CL_TRUE ? "CL_TRUE" : "CL_FALSE"); - - cl_bool exec_timeout; - clGetDeviceInfo(device, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, sizeof(cl_bool), &exec_timeout, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV:\t%s\n", exec_timeout == CL_TRUE ? "CL_TRUE" : "CL_FALSE"); - - cl_bool integrated_memory; - clGetDeviceInfo(device, CL_DEVICE_INTEGRATED_MEMORY_NV, sizeof(cl_bool), &integrated_memory, NULL); - shrLogEx(iLogMode, 0, " CL_DEVICE_INTEGRATED_MEMORY_NV:\t%s\n", integrated_memory == CL_TRUE ? "CL_TRUE" : "CL_FALSE"); - } - - // CL_DEVICE_PREFERRED_VECTOR_WIDTH_ - shrLogEx(iLogMode, 0, " CL_DEVICE_PREFERRED_VECTOR_WIDTH_\t"); - cl_uint vec_width [6]; - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, sizeof(cl_uint), &vec_width[0], NULL); - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, sizeof(cl_uint), &vec_width[1], NULL); - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, sizeof(cl_uint), &vec_width[2], NULL); - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, sizeof(cl_uint), &vec_width[3], NULL); - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, sizeof(cl_uint), &vec_width[4], NULL); - clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, sizeof(cl_uint), &vec_width[5], NULL); - shrLogEx(iLogMode, 0, "CHAR %u, SHORT %u, INT %u, LONG %u, FLOAT %u, DOUBLE %u\n\n\n", - vec_width[0], vec_width[1], vec_width[2], vec_width[3], vec_width[4], vec_width[5]); -} - -////////////////////////////////////////////////////////////////////////////// -//! Get and return device capability -//! -//! @return the 2 digit integer representation of device Cap (major minor). return -1 if NA -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -int oclGetDevCap(cl_device_id device) -{ - char cDevString[1024]; - bool bDevAttributeQuery = false; - int iDevArch = -1; - - // Get device extensions, and if any then search for cl_nv_device_attribute_query - clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, sizeof(cDevString), &cDevString, NULL); - if (cDevString != 0) - { - std::string stdDevString; - stdDevString = std::string(cDevString); - size_t szOldPos = 0; - size_t szSpacePos = stdDevString.find(' ', szOldPos); // extensions string is space delimited - while (szSpacePos != stdDevString.npos) - { - if( strcmp("cl_nv_device_attribute_query", stdDevString.substr(szOldPos, szSpacePos - szOldPos).c_str()) == 0 ) - { - bDevAttributeQuery = true; - } - - do { - szOldPos = szSpacePos + 1; - szSpacePos = stdDevString.find(' ', szOldPos); - } while (szSpacePos == szOldPos); - } - } - - // if search succeeded, get device caps - if(bDevAttributeQuery) - { - cl_int iComputeCapMajor, iComputeCapMinor; - clGetDeviceInfo(device, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, sizeof(cl_uint), (void*)&iComputeCapMajor, NULL); - clGetDeviceInfo(device, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, sizeof(cl_uint), (void*)&iComputeCapMinor, NULL); - iDevArch = (10 * iComputeCapMajor) + iComputeCapMinor; - } - - return iDevArch; -} - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of the first device from the context -//! -//! @return the id -//! @param cxGPUContext OpenCL context -////////////////////////////////////////////////////////////////////////////// -cl_device_id oclGetFirstDev(cl_context cxGPUContext) -{ - size_t szParmDataBytes; - cl_device_id* cdDevices; - - // get the list of GPU devices associated with context - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, 0, NULL, &szParmDataBytes); - cdDevices = (cl_device_id*) malloc(szParmDataBytes); - - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, szParmDataBytes, cdDevices, NULL); - - cl_device_id first = cdDevices[0]; - free(cdDevices); - - return first; -} - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of device with maximal FLOPS from the context -//! -//! @return the id -//! @param cxGPUContext OpenCL context -////////////////////////////////////////////////////////////////////////////// -cl_device_id oclGetMaxFlopsDev(cl_context cxGPUContext) -{ - size_t szParmDataBytes; - cl_device_id* cdDevices; - - // get the list of GPU devices associated with context - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, 0, NULL, &szParmDataBytes); - cdDevices = (cl_device_id*) malloc(szParmDataBytes); - size_t device_count = szParmDataBytes / sizeof(cl_device_id); - - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, szParmDataBytes, cdDevices, NULL); - - cl_device_id max_flops_device = cdDevices[0]; - int max_flops = 0; - - size_t current_device = 0; - - // CL_DEVICE_MAX_COMPUTE_UNITS - cl_uint compute_units; - clGetDeviceInfo(cdDevices[current_device], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL); - - // CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint clock_frequency; - clGetDeviceInfo(cdDevices[current_device], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(clock_frequency), &clock_frequency, NULL); - - max_flops = compute_units * clock_frequency; - ++current_device; - - while( current_device < device_count ) - { - // CL_DEVICE_MAX_COMPUTE_UNITS - cl_uint compute_units; - clGetDeviceInfo(cdDevices[current_device], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL); - - // CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint clock_frequency; - clGetDeviceInfo(cdDevices[current_device], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(clock_frequency), &clock_frequency, NULL); - - int flops = compute_units * clock_frequency; - if( flops > max_flops ) - { - max_flops = flops; - max_flops_device = cdDevices[current_device]; - } - ++current_device; - } - - free(cdDevices); - - return max_flops_device; -} - -////////////////////////////////////////////////////////////////////////////// -//! Loads a Program file and prepends the cPreamble to the code. -//! -//! @return the source string if succeeded, 0 otherwise -//! @param cFilename program filename -//! @param cPreamble code that is prepended to the loaded file, typically a set of #defines or a header -//! @param szFinalLength returned length of the code string -////////////////////////////////////////////////////////////////////////////// -char* oclLoadProgSource(const char* cFilename, const char* cPreamble, size_t* szFinalLength) -{ - // locals - FILE* pFileStream = NULL; - size_t szSourceLength; - - // open the OpenCL source code file - #ifdef _WIN32 // Windows version - if(fopen_s(&pFileStream, cFilename, "rb") != 0) - { - return NULL; - } - #else // Linux version - pFileStream = fopen(cFilename, "rb"); - if(pFileStream == 0) - { - return NULL; - } - #endif - - size_t szPreambleLength = strlen(cPreamble); - - // get the length of the source code - fseek(pFileStream, 0, SEEK_END); - szSourceLength = ftell(pFileStream); - fseek(pFileStream, 0, SEEK_SET); - - // allocate a buffer for the source code string and read it in - char* cSourceString = (char *)malloc(szSourceLength + szPreambleLength + 1); - memcpy(cSourceString, cPreamble, szPreambleLength); - if (fread((cSourceString) + szPreambleLength, szSourceLength, 1, pFileStream) != 1) - { - fclose(pFileStream); - free(cSourceString); - return 0; - } - - // close the file and return the total length of the combined (preamble + source) string - fclose(pFileStream); - if(szFinalLength != 0) - { - *szFinalLength = szSourceLength + szPreambleLength; - } - cSourceString[szSourceLength + szPreambleLength] = '\0'; - - return cSourceString; -} - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of the nth device from the context -//! -//! @return the id or -1 when out of range -//! @param cxGPUContext OpenCL context -//! @param device_idx index of the device of interest -////////////////////////////////////////////////////////////////////////////// -cl_device_id oclGetDev(cl_context cxGPUContext, unsigned int nr) -{ - size_t szParmDataBytes; - cl_device_id* cdDevices; - - // get the list of GPU devices associated with context - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, 0, NULL, &szParmDataBytes); - - if( szParmDataBytes / sizeof(cl_device_id) <= nr ) { - return (cl_device_id)-1; - } - - cdDevices = (cl_device_id*) malloc(szParmDataBytes); - - clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, szParmDataBytes, cdDevices, NULL); - - cl_device_id device = cdDevices[nr]; - free(cdDevices); - - return device; -} - -////////////////////////////////////////////////////////////////////////////// -//! Get the binary (PTX) of the program associated with the device -//! -//! @param cpProgram OpenCL program -//! @param cdDevice device of interest -//! @param binary returned code -//! @param length length of returned code -////////////////////////////////////////////////////////////////////////////// -void oclGetProgBinary( cl_program cpProgram, cl_device_id cdDevice, char** binary, size_t* length) -{ - // Grab the number of devices associated witht the program - cl_uint num_devices; - clGetProgramInfo(cpProgram, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &num_devices, NULL); - - // Grab the device ids - cl_device_id* devices = (cl_device_id*) malloc(num_devices * sizeof(cl_device_id)); - clGetProgramInfo(cpProgram, CL_PROGRAM_DEVICES, num_devices * sizeof(cl_device_id), devices, 0); - - // Grab the sizes of the binaries - size_t* binary_sizes = (size_t*)malloc(num_devices * sizeof(size_t)); - clGetProgramInfo(cpProgram, CL_PROGRAM_BINARY_SIZES, num_devices * sizeof(size_t), binary_sizes, NULL); - - // Now get the binaries - char** ptx_code = (char**) malloc(num_devices * sizeof(char*)); - for( unsigned int i=0; i= 0 && index < errorCount) ? errorString[index] : "Unspecified Error"; -} - -// Helper function to get OpenCL image format string (channel order and type) from constant -// ********************************************************************* -const char* oclImageFormatString(cl_uint uiImageFormat) -{ - // cl_channel_order - if (uiImageFormat == CL_R)return "CL_R"; - if (uiImageFormat == CL_A)return "CL_A"; - if (uiImageFormat == CL_RG)return "CL_RG"; - if (uiImageFormat == CL_RA)return "CL_RA"; - if (uiImageFormat == CL_RGB)return "CL_RGB"; - if (uiImageFormat == CL_RGBA)return "CL_RGBA"; - if (uiImageFormat == CL_BGRA)return "CL_BGRA"; - if (uiImageFormat == CL_ARGB)return "CL_ARGB"; - if (uiImageFormat == CL_INTENSITY)return "CL_INTENSITY"; - if (uiImageFormat == CL_LUMINANCE)return "CL_LUMINANCE"; - - // cl_channel_type - if (uiImageFormat == CL_SNORM_INT8)return "CL_SNORM_INT8"; - if (uiImageFormat == CL_SNORM_INT16)return "CL_SNORM_INT16"; - if (uiImageFormat == CL_UNORM_INT8)return "CL_UNORM_INT8"; - if (uiImageFormat == CL_UNORM_INT16)return "CL_UNORM_INT16"; - if (uiImageFormat == CL_UNORM_SHORT_565)return "CL_UNORM_SHORT_565"; - if (uiImageFormat == CL_UNORM_SHORT_555)return "CL_UNORM_SHORT_555"; - if (uiImageFormat == CL_UNORM_INT_101010)return "CL_UNORM_INT_101010"; - if (uiImageFormat == CL_SIGNED_INT8)return "CL_SIGNED_INT8"; - if (uiImageFormat == CL_SIGNED_INT16)return "CL_SIGNED_INT16"; - if (uiImageFormat == CL_SIGNED_INT32)return "CL_SIGNED_INT32"; - if (uiImageFormat == CL_UNSIGNED_INT8)return "CL_UNSIGNED_INT8"; - if (uiImageFormat == CL_UNSIGNED_INT16)return "CL_UNSIGNED_INT16"; - if (uiImageFormat == CL_UNSIGNED_INT32)return "CL_UNSIGNED_INT32"; - if (uiImageFormat == CL_HALF_FLOAT)return "CL_HALF_FLOAT"; - if (uiImageFormat == CL_FLOAT)return "CL_FLOAT"; - - // unknown constant - return "Unknown"; -} diff --git a/tests/opencl/vectorhypot/oclUtils.h b/tests/opencl/vectorhypot/oclUtils.h deleted file mode 100644 index 2b109e18..00000000 --- a/tests/opencl/vectorhypot/oclUtils.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -#ifndef OCL_UTILS_H -#define OCL_UTILS_H - -// ********************************************************************* -// Utilities specific to OpenCL samples in NVIDIA GPU Computing SDK -// ********************************************************************* - -// Common headers: Cross-API utililties and OpenCL header -#include - -// All OpenCL headers -#if defined (__APPLE__) || defined(MACOSX) - #include -#else - #include -#endif - -// Includes -#include -#include -#include - -// For systems with CL_EXT that are not updated with these extensions, we copied these -// extensions from -#ifndef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV - /* cl_nv_device_attribute_query extension - no extension #define since it has no functions */ - #define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 - #define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 - #define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002 - #define CL_DEVICE_WARP_SIZE_NV 0x4003 - #define CL_DEVICE_GPU_OVERLAP_NV 0x4004 - #define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 - #define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006 -#endif - -// reminders for build output window and log -#ifdef _WIN32 - #pragma message ("Note: including shrUtils.h") - #pragma message ("Note: including opencl.h") -#endif - -// SDK Revision # -#define OCL_SDKREVISION "7027912" - -// Error and Exit Handling Macros... -// ********************************************************************* -// Full error handling macro with Cleanup() callback (if supplied)... -// (Companion Inline Function lower on page) -#define oclCheckErrorEX(a, b, c) __oclCheckErrorEX(a, b, c, __FILE__ , __LINE__) - -// Short version without Cleanup() callback pointer -// Both Input (a) and Reference (b) are specified as args -#define oclCheckError(a, b) oclCheckErrorEX(a, b, 0) - -////////////////////////////////////////////////////////////////////////////// -//! Gets the platform ID for NVIDIA if available, otherwise default to platform 0 -//! -//! @return the id -//! @param clSelectedPlatformID OpenCL platform ID -////////////////////////////////////////////////////////////////////////////// -extern "C" cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID); - -////////////////////////////////////////////////////////////////////////////// -//! Print info about the device -//! -//! @param iLogMode enum LOGBOTH, LOGCONSOLE, LOGFILE -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -extern "C" void oclPrintDevInfo(int iLogMode, cl_device_id device); - -////////////////////////////////////////////////////////////////////////////// -//! Get and return device capability -//! -//! @return the 2 digit integer representation of device Cap (major minor). return -1 if NA -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -extern "C" int oclGetDevCap(cl_device_id device); - -////////////////////////////////////////////////////////////////////////////// -//! Print the device name -//! -//! @param iLogMode enum LOGBOTH, LOGCONSOLE, LOGFILE -//! @param device OpenCL id of the device -////////////////////////////////////////////////////////////////////////////// -extern "C" void oclPrintDevName(int iLogMode, cl_device_id device); - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of the first device from the context -//! -//! @return the id -//! @param cxGPUContext OpenCL context -////////////////////////////////////////////////////////////////////////////// -extern "C" cl_device_id oclGetFirstDev(cl_context cxGPUContext); - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of the nth device from the context -//! -//! @return the id or -1 when out of range -//! @param cxGPUContext OpenCL context -//! @param device_idx index of the device of interest -////////////////////////////////////////////////////////////////////////////// -extern "C" cl_device_id oclGetDev(cl_context cxGPUContext, unsigned int device_idx); - -////////////////////////////////////////////////////////////////////////////// -//! Gets the id of device with maximal FLOPS from the context -//! -//! @return the id -//! @param cxGPUContext OpenCL context -////////////////////////////////////////////////////////////////////////////// -extern "C" cl_device_id oclGetMaxFlopsDev(cl_context cxGPUContext); - -////////////////////////////////////////////////////////////////////////////// -//! Loads a Program file and prepends the cPreamble to the code. -//! -//! @return the source string if succeeded, 0 otherwise -//! @param cFilename program filename -//! @param cPreamble code that is prepended to the loaded file, typically a set of #defines or a header -//! @param szFinalLength returned length of the code string -////////////////////////////////////////////////////////////////////////////// -extern "C" char* oclLoadProgSource(const char* cFilename, const char* cPreamble, size_t* szFinalLength); - -////////////////////////////////////////////////////////////////////////////// -//! Get the binary (PTX) of the program associated with the device -//! -//! @param cpProgram OpenCL program -//! @param cdDevice device of interest -//! @param binary returned code -//! @param length length of returned code -////////////////////////////////////////////////////////////////////////////// -extern "C" void oclGetProgBinary( cl_program cpProgram, cl_device_id cdDevice, char** binary, size_t* length); - -////////////////////////////////////////////////////////////////////////////// -//! Get and log the binary (PTX) from the OpenCL compiler for the requested program & device -//! -//! @param cpProgram OpenCL program -//! @param cdDevice device of interest -//! @param const char* cPtxFileName optional PTX file name -////////////////////////////////////////////////////////////////////////////// -extern "C" void oclLogPtx(cl_program cpProgram, cl_device_id cdDevice, const char* cPtxFileName); - -////////////////////////////////////////////////////////////////////////////// -//! Get and log the Build Log from the OpenCL compiler for the requested program & device -//! -//! @param cpProgram OpenCL program -//! @param cdDevice device of interest -////////////////////////////////////////////////////////////////////////////// -extern "C" void oclLogBuildInfo(cl_program cpProgram, cl_device_id cdDevice); - -// Helper function for De-allocating cl objects -// ********************************************************************* -extern "C" void oclDeleteMemObjs(cl_mem* cmMemObjs, int iNumObjs); - -// Helper function to get OpenCL error string from constant -// ********************************************************************* -extern "C" const char* oclErrorString(cl_int error); - -// Helper function to get OpenCL image format string (channel order and type) from constant -// ********************************************************************* -extern "C" const char* oclImageFormatString(cl_uint uiImageFormat); - -// companion inline function for error checking and exit on error WITH Cleanup Callback (if supplied) -// ********************************************************************* -inline void __oclCheckErrorEX(cl_int iSample, cl_int iReference, void (*pCleanup)(int), const char* cFile, const int iLine) -{ - // An error condition is defined by the sample/test value not equal to the reference - if (iReference != iSample) - { - // If the sample/test value isn't equal to the ref, it's an error by defnition, so override 0 sample/test value - iSample = (iSample == 0) ? -9999 : iSample; - - // Log the error info - shrLog("\n !!! Error # %i (%s) at line %i , in file %s !!!\n\n", iSample, oclErrorString(iSample), iLine, cFile); - - // Cleanup and exit, or just exit if no cleanup function pointer provided. Use iSample (error code in this case) as process exit code. - if (pCleanup != NULL) - { - pCleanup(iSample); - } - else - { - shrLogEx(LOGBOTH | CLOSELOG, 0, "Exiting...\n"); - exit(iSample); - } - } -} - -#endif \ No newline at end of file diff --git a/tests/opencl/vectorhypot/shrQATest.h b/tests/opencl/vectorhypot/shrQATest.h deleted file mode 100644 index 245cf8dc..00000000 --- a/tests/opencl/vectorhypot/shrQATest.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -* Copyright 1993-2010 NVIDIA Corporation. All rights reserved. -* -* Please refer to the NVIDIA end user license agreement (EULA) associated -* with this source code for terms and conditions that govern your use of -* this software. Any use, reproduction, disclosure, or distribution of -* this software and related documentation outside the terms of the EULA -* is strictly prohibited. -* -*/ - -#ifndef SHR_QATEST_H -#define SHR_QATEST_H - -// ********************************************************************* -// Generic utilities for NVIDIA GPU Computing SDK -// ********************************************************************* - -// OS dependent includes -#ifdef _WIN32 - #pragma message ("Note: including windows.h") - #pragma message ("Note: including math.h") - #pragma message ("Note: including assert.h") - #pragma message ("Note: including time.h") - -// Headers needed for Windows - #include - #include -#else - // Headers needed for Linux - #include - #include - #include - #include - #include - #include - #include - #include - #include -#endif - -#ifndef STRCASECMP -#ifdef _WIN32 -#define STRCASECMP _stricmp -#else -#define STRCASECMP strcasecmp -#endif -#endif - -#ifndef STRNCASECMP -#ifdef _WIN32 -#define STRNCASECMP _strnicmp -#else -#define STRNCASECMP strncasecmp -#endif -#endif - - -// Standardized QA Start/Finish for CUDA SDK tests -#define shrQAStart(a, b) __shrQAStart(a, b) -#define shrQAFinish(a, b, c) __shrQAFinish(a, b, c) -#define shrQAFinish2(a, b, c, d) __shrQAFinish2(a, b, c, d) - -inline int findExeNameStart(const char *exec_name) -{ - int exename_start = (int)strlen(exec_name); - - while( (exename_start > 0) && - (exec_name[exename_start] != '\\') && - (exec_name[exename_start] != '/') ) - { - exename_start--; - } - if (exec_name[exename_start] == '\\' || - exec_name[exename_start] == '/') - { - return exename_start+1; - } else { - return exename_start; - } -} - -inline int __shrQAStart(int argc, char **argv) -{ - bool bQATest = false; - // First clear the output buffer - fflush(stdout); - fflush(stdout); - - for (int i=1; i < argc; i++) { - int string_start = 0; - while (argv[i][string_start] == '-') - string_start++; - char *string_argv = &argv[i][string_start]; - - if (!STRCASECMP(string_argv, "qatest")) { - bQATest = true; - } - } - - // We don't want to print the entire path, so we search for the first - int exename_start = findExeNameStart(argv[0]); - if (bQATest) { - fprintf(stdout, "&&&& RUNNING %s", &(argv[0][exename_start])); - for (int i=1; i < argc; i++) fprintf(stdout, " %s", argv[i]); - fprintf(stdout, "\n"); - } else { - fprintf(stdout, "[%s] starting...\n", &(argv[0][exename_start])); - } - fflush(stdout); - printf("\n"); fflush(stdout); - return exename_start; -} - -enum eQAstatus { - QA_FAILED = 0, - QA_PASSED = 1, - QA_WAIVED = 2 -}; - -inline void __ExitInTime(int seconds) -{ - fprintf(stdout, "> exiting in %d seconds: ", seconds); - fflush(stdout); - time_t t; - int count; - for (t=time(0)+seconds, count=seconds; time(0) < t; count--) { - fprintf(stdout, "%d...", count); -#ifdef WIN32 - Sleep(1000); -#else - sleep(1); -#endif - } - fprintf(stdout,"done!\n\n"); - fflush(stdout); -} - - -inline void __shrQAFinish(int argc, const char **argv, int iStatus) -{ - // By default QATest is disabled and NoPrompt is Enabled (times out at seconds passed into __ExitInTime() ) - bool bQATest = false, bNoPrompt = true, bQuitInTime = true; - const char *sStatus[] = { "FAILED", "PASSED", "WAIVED", NULL }; - - for (int i=1; i < argc; i++) { - int string_start = 0; - while (argv[i][string_start] == '-') - string_start++; - - const char *string_argv = &argv[i][string_start]; - if (!STRCASECMP(string_argv, "qatest")) { - bQATest = true; - } - // For SDK individual samples that don't specify -noprompt or -prompt, - // a 3 second delay will happen before exiting, giving a user time to view results - if (!STRCASECMP(string_argv, "noprompt") || !STRCASECMP(string_argv, "help")) { - bNoPrompt = true; - bQuitInTime = false; - } - if (!STRCASECMP(string_argv, "prompt")) { - bNoPrompt = false; - bQuitInTime = false; - } - } - - int exename_start = findExeNameStart(argv[0]); - if (bQATest) { - fprintf(stdout, "&&&& %s %s", sStatus[iStatus], &(argv[0][exename_start])); - for (int i=1; i < argc; i++) fprintf(stdout, " %s", argv[i]); - fprintf(stdout, "\n"); - } else { - fprintf(stdout, "[%s] test results...\n%s\n", &(argv[0][exename_start]), sStatus[iStatus]); - } - fflush(stdout); - printf("\n"); fflush(stdout); - if (bQuitInTime) { - __ExitInTime(3); - } else { - if (!bNoPrompt) { - fprintf(stdout, "\nPress to exit...\n"); - fflush(stdout); - getchar(); - } - } -} - -inline void __shrQAFinish2(bool bQATest, int argc, const char **argv, int iStatus) -{ - bool bQuitInTime = true; - const char *sStatus[] = { "FAILED", "PASSED", "WAIVED", NULL }; - - for (int i=1; i < argc; i++) { - int string_start = 0; - while (argv[i][string_start] == '-') - string_start++; - - const char *string_argv = &argv[i][string_start]; - // For SDK individual samples that don't specify -noprompt or -prompt, - // a 3 second delay will happen before exiting, giving a user time to view results - if (!STRCASECMP(string_argv, "noprompt") || !STRCASECMP(string_argv, "help")) { - bQuitInTime = false; - } - if (!STRCASECMP(string_argv, "prompt")) { - bQuitInTime = false; - } - } - - int exename_start = findExeNameStart(argv[0]); - if (bQATest) { - fprintf(stdout, "&&&& %s %s", sStatus[iStatus], &(argv[0][exename_start])); - for (int i=1; i < argc; i++) fprintf(stdout, " %s", argv[i]); - fprintf(stdout, "\n"); - } else { - fprintf(stdout, "[%s] test results...\n%s\n", &(argv[0][exename_start]), sStatus[iStatus]); - } - fflush(stdout); - - if (bQuitInTime) { - __ExitInTime(3); - } -} - -inline void shrQAFinishExit(int argc, const char **argv, int iStatus) -{ - __shrQAFinish(argc, argv, iStatus); - - exit(iStatus ? EXIT_SUCCESS : EXIT_FAILURE); -} - -inline void shrQAFinishExit2(bool bQAtest, int argc, const char **argv, int iStatus) -{ - __shrQAFinish2(bQAtest, argc, argv, iStatus); - - exit(iStatus ? EXIT_SUCCESS : EXIT_FAILURE); -} - -#endif \ No newline at end of file diff --git a/tests/opencl/vectorhypot/shrUtils.cpp b/tests/opencl/vectorhypot/shrUtils.cpp deleted file mode 100644 index cf0d2c3e..00000000 --- a/tests/opencl/vectorhypot/shrUtils.cpp +++ /dev/null @@ -1,1954 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -// ********************************************************************* -// Generic Utilities for NVIDIA GPU Computing SDK -// ********************************************************************* - -// includes -#include -#include -#include -#include -#include "shrUtils.h" -#include "cmd_arg_reader.h" - -// size of PGM file header -const unsigned int PGMHeaderSize = 0x40; -#define MIN_EPSILON_ERROR 1e-3f - -// Deallocate memory allocated within shrUtils -// ********************************************************************* -void shrFree(void* ptr) -{ - if( NULL != ptr) free( ptr); -} - -// Helper function to init data arrays -// ********************************************************************* -void shrFillArray(float* pfData, int iSize) -{ - int i; - const float fScale = 1.0f / (float)RAND_MAX; - for (i = 0; i < iSize; ++i) - { - pfData[i] = fScale * rand(); - } -} - -// Helper function to print data arrays -// ********************************************************************* -void shrPrintArray(float* pfData, int iSize) -{ - int i; - for (i = 0; i < iSize; ++i) - { - shrLog("%d: %.3f\n", i, pfData[i]); - } -} - -// Helper function to return precision delta time for 3 counters since last call based upon host high performance counter -// ********************************************************************* -double shrDeltaT(int iCounterID = 0) -{ - // local var for computation of microseconds since last call - double DeltaT; - - #ifdef _WIN32 // Windows version of precision host timer - - // Variables that need to retain state between calls - static LARGE_INTEGER liOldCount0 = {0, 0}; - static LARGE_INTEGER liOldCount1 = {0, 0}; - static LARGE_INTEGER liOldCount2 = {0, 0}; - - // locals for new count, new freq and new time delta - LARGE_INTEGER liNewCount, liFreq; - if (QueryPerformanceFrequency(&liFreq)) - { - // Get new counter reading - QueryPerformanceCounter(&liNewCount); - - // Update the requested timer - switch (iCounterID) - { - case 0: - { - // Calculate time difference for timer 0. (zero when called the first time) - DeltaT = liOldCount0.LowPart ? (((double)liNewCount.QuadPart - (double)liOldCount0.QuadPart) / (double)liFreq.QuadPart) : 0.0; - - // Reset old count to new - liOldCount0 = liNewCount; - - break; - } - case 1: - { - // Calculate time difference for timer 1. (zero when called the first time) - DeltaT = liOldCount1.LowPart ? (((double)liNewCount.QuadPart - (double)liOldCount1.QuadPart) / (double)liFreq.QuadPart) : 0.0; - - // Reset old count to new - liOldCount1 = liNewCount; - - break; - } - case 2: - { - // Calculate time difference for timer 2. (zero when called the first time) - DeltaT = liOldCount2.LowPart ? (((double)liNewCount.QuadPart - (double)liOldCount2.QuadPart) / (double)liFreq.QuadPart) : 0.0; - - // Reset old count to new - liOldCount2 = liNewCount; - - break; - } - default: - { - // Requested counter ID out of range - return -9999.0; - } - } - - // Returns time difference in seconds sunce the last call - return DeltaT; - } - else - { - // No high resolution performance counter - return -9999.0; - } - #else // Linux version of precision host timer. See http://www.informit.com/articles/article.aspx?p=23618&seqNum=8 - static struct timeval _NewTime; // new wall clock time (struct representation in seconds and microseconds) - static struct timeval _OldTime0; // old wall clock time 0(struct representation in seconds and microseconds) - static struct timeval _OldTime1; // old wall clock time 1(struct representation in seconds and microseconds) - static struct timeval _OldTime2; // old wall clock time 2(struct representation in seconds and microseconds) - - // Get new counter reading - gettimeofday(&_NewTime, NULL); - - switch (iCounterID) - { - case 0: - { - // Calculate time difference for timer 0. (zero when called the first time) - DeltaT = ((double)_NewTime.tv_sec + 1.0e-6 * (double)_NewTime.tv_usec) - ((double)_OldTime0.tv_sec + 1.0e-6 * (double)_OldTime0.tv_usec); - - // Reset old time 0 to new - _OldTime0.tv_sec = _NewTime.tv_sec; - _OldTime0.tv_usec = _NewTime.tv_usec; - - break; - } - case 1: - { - // Calculate time difference for timer 1. (zero when called the first time) - DeltaT = ((double)_NewTime.tv_sec + 1.0e-6 * (double)_NewTime.tv_usec) - ((double)_OldTime1.tv_sec + 1.0e-6 * (double)_OldTime1.tv_usec); - - // Reset old time 1 to new - _OldTime1.tv_sec = _NewTime.tv_sec; - _OldTime1.tv_usec = _NewTime.tv_usec; - - break; - } - case 2: - { - // Calculate time difference for timer 2. (zero when called the first time) - DeltaT = ((double)_NewTime.tv_sec + 1.0e-6 * (double)_NewTime.tv_usec) - ((double)_OldTime2.tv_sec + 1.0e-6 * (double)_OldTime2.tv_usec); - - // Reset old time 2 to new - _OldTime2.tv_sec = _NewTime.tv_sec; - _OldTime2.tv_usec = _NewTime.tv_usec; - - break; - } - default: - { - // Requested counter ID out of range - return -9999.0; - } - } - - // Returns time difference in seconds sunce the last call - return DeltaT; - #endif -} - -// Optional LogFileName Override function -// ********************************************************************* -char* cLogFilePathAndName = NULL; -void shrSetLogFileName (const char* cOverRideName) -{ - if( cLogFilePathAndName != NULL ) { - free(cLogFilePathAndName); - } - cLogFilePathAndName = (char*) malloc(strlen(cOverRideName) + 1); - #ifdef WIN32 - strcpy_s(cLogFilePathAndName, strlen(cOverRideName) + 1, cOverRideName); - #else - strcpy(cLogFilePathAndName, cOverRideName); - #endif - return; -} - -// Function to log standardized information to console, file or both -// ********************************************************************* -static int shrLogV(int iLogMode, int iErrNum, const char* cFormatString, va_list vaArgList) -{ - static FILE* pFileStream0 = NULL; - static FILE* pFileStream1 = NULL; - size_t szNumWritten = 0; - char cFileMode [3]; - - // if the sample log file is closed and the call incudes a "write-to-file", open file for writing - if ((pFileStream0 == NULL) && (iLogMode & LOGFILE)) - { - // if the default filename has not been overriden, set to default - if (cLogFilePathAndName == NULL) - { - shrSetLogFileName(DEFAULTLOGFILE); - } - - #ifdef _WIN32 // Windows version - // set the file mode - if (iLogMode & APPENDMODE) // append to prexisting file contents - { - sprintf_s (cFileMode, 3, "a+"); - } - else // replace prexisting file contents - { - sprintf_s (cFileMode, 3, "w"); - } - - // open the individual sample log file in the requested mode - errno_t err = fopen_s(&pFileStream0, cLogFilePathAndName, cFileMode); - - // if error on attempt to open, be sure the file is null or close it, then return negative error code - if (err != 0) - { - if (pFileStream0) - { - fclose (pFileStream0); - } - return -err; - } - #else // Linux & Mac version - // set the file mode - if (iLogMode & APPENDMODE) // append to prexisting file contents - { - sprintf (cFileMode, "a+"); - } - else // replace prexisting file contents - { - sprintf (cFileMode, "w"); - } - - // open the file in the requested mode - if ((pFileStream0 = fopen(cLogFilePathAndName, cFileMode)) == 0) - { - // if error on attempt to open, be sure the file is null or close it, then return negative error code - if (pFileStream0) - { - fclose (pFileStream0); - } - return -1; - } - #endif - } - - // if the master log file is closed and the call incudes a "write-to-file" and MASTER, open master logfile file for writing - if ((pFileStream1 == NULL) && (iLogMode & LOGFILE) && (iLogMode & MASTER)) - { - #ifdef _WIN32 // Windows version - // open the master log file in append mode - errno_t err = fopen_s(&pFileStream1, MASTERLOGFILE, "a+"); - - // if error on attempt to open, be sure the file is null or close it, then return negative error code - if (err != 0) - { - if (pFileStream1) - { - fclose (pFileStream1); - pFileStream1 = NULL; - } - iLogMode = LOGCONSOLE; // Force to LOGCONSOLE only since the file stream is invalid -// return -err; - } - #else // Linux & Mac version - - // open the file in the requested mode - if ((pFileStream1 = fopen(MASTERLOGFILE, "a+")) == 0) - { - // if error on attempt to open, be sure the file is null or close it, then return negative error code - if (pFileStream1) - { - fclose (pFileStream1); - pFileStream1 = NULL; - } - iLogMode = LOGCONSOLE; // Force to LOGCONSOLE only since the file stream is invalid -// return -1; - } - #endif - - // If master log file length has become excessive, empty/reopen - if (iLogMode != LOGCONSOLE) - { - fseek(pFileStream1, 0L, SEEK_END); - if (ftell(pFileStream1) > 50000L) - { - fclose (pFileStream1); - #ifdef _WIN32 // Windows version - fopen_s(&pFileStream1, MASTERLOGFILE, "w"); - #else - pFileStream1 = fopen(MASTERLOGFILE, "w"); - #endif - } - } - } - - // Handle special Error Message code - if (iLogMode & ERRORMSG) - { - // print string to console if flagged - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf ("\n !!! Error # %i at ", iErrNum); // console - } - // print string to file if flagged - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, "\n !!! Error # %i at ", iErrNum); // sample log file - } - } - - // Vars used for variable argument processing - const char* pStr; - const char* cArg; - int iArg; - double dArg; - unsigned int uiArg; - std::string sFormatSpec; - const std::string sFormatChars = " -+#0123456789.dioufnpcsXxEeGgAa"; - const std::string sTypeChars = "dioufnpcsXxEeGgAa"; - char cType = 'c'; - - // Start at the head of the string and scan to the null at the end - for (pStr = cFormatString; *pStr; ++pStr) - { - // Check if the current character is not a formatting specifier ('%') - if (*pStr != '%') - { - // character is not '%', so print it verbatim to console and/or files as flagged - if (iLogMode & LOGCONSOLE) - { - szNumWritten = putc(*pStr, stdout); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = putc(*pStr, pFileStream0); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = putc(*pStr, pFileStream1); // master log file - } - } - } - else - { - // character is '%', so skip over it and read the full format specifier for the argument - ++pStr; - sFormatSpec = '%'; - - // special handling for string of %%%% - bool bRepeater = (*pStr == '%'); - if (bRepeater) - { - cType = '%'; - } - - // chars after the '%' are part of format if on list of constants... scan until that isn't true or NULL is found - while (pStr && ((sFormatChars.find(*pStr) != std::string::npos) || bRepeater)) - { - sFormatSpec += *pStr; - - // If the char is a type specifier, trap it and stop scanning - // (a type specifier char is always the last in the format except for string of %%%) - if (sTypeChars.find(*pStr) != std::string::npos) - { - cType = *pStr; - break; - } - - // Special handling for string of %%% - // If a string of %%% was started and then it ends, break (There won't be a typical type specifier) - if (bRepeater && (*pStr != '%')) - { - break; - } - - pStr++; - } - - // Now handle the arg according to type - switch (cType) - { - case '%': // special handling for string of %%%% - { - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf(sFormatSpec.c_str()); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, sFormatSpec.c_str()); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = fprintf(pFileStream1, sFormatSpec.c_str()); // master log file - } - } - continue; - } - case 'c': // single byte char - case 's': // string of single byte chars - { - // Set cArg as the next value in list and print to console and/or files if flagged - cArg = va_arg(vaArgList, char*); - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf(sFormatSpec.c_str(), cArg); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, sFormatSpec.c_str(), cArg); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = fprintf(pFileStream1, sFormatSpec.c_str(), cArg); // master log file - } - } - continue; - } - case 'd': // signed decimal integer - case 'i': // signed decimal integer - { - // set iArg as the next value in list and print to console and/or files if flagged - iArg = va_arg(vaArgList, int); - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf(sFormatSpec.c_str(), iArg); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, sFormatSpec.c_str(), iArg); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = fprintf(pFileStream1, sFormatSpec.c_str(), iArg); // master log file - } - } - continue; - } - case 'u': // unsigned decimal integer - case 'o': // unsigned octal integer - case 'x': // unsigned hexadecimal integer using "abcdef" - case 'X': // unsigned hexadecimal integer using "ABCDEF" - { - // set uiArg as the next value in list and print to console and/or files if flagged - uiArg = va_arg(vaArgList, unsigned int); - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf(sFormatSpec.c_str(), uiArg); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, sFormatSpec.c_str(), uiArg); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = fprintf(pFileStream1, sFormatSpec.c_str(), uiArg); // master log file - } - } - continue; - } - case 'f': // float/double - case 'e': // scientific double/float - case 'E': // scientific double/float - case 'g': // scientific double/float - case 'G': // scientific double/float - case 'a': // signed hexadecimal double precision float - case 'A': // signed hexadecimal double precision float - { - // set dArg as the next value in list and print to console and/or files if flagged - dArg = va_arg(vaArgList, double); - if (iLogMode & LOGCONSOLE) - { - szNumWritten = printf(sFormatSpec.c_str(), dArg); // console - } - if (iLogMode & LOGFILE) - { - szNumWritten = fprintf (pFileStream0, sFormatSpec.c_str(), dArg); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = fprintf(pFileStream1, sFormatSpec.c_str(), dArg); // master log file - } - } - continue; - } - default: - { - // print arg of unknown/unsupported type to console and/or file if flagged - if (iLogMode & LOGCONSOLE) // console - { - szNumWritten = putc(*pStr, stdout); - } - if (iLogMode & LOGFILE) - { - szNumWritten = putc(*pStr, pFileStream0); // sample log file - if (iLogMode & MASTER) - { - szNumWritten = putc(*pStr, pFileStream1); // master log file - } - } - } - } - } - } - - // end the sample log with a horizontal line if closing - if (iLogMode & CLOSELOG) - { - if (iLogMode & LOGCONSOLE) - { - printf(HDASHLINE); - } - if (iLogMode & LOGFILE) - { - fprintf(pFileStream0, HDASHLINE); - } - } - - // flush console and/or file buffers if updated - if (iLogMode & LOGCONSOLE) - { - fflush(stdout); - } - if (iLogMode & LOGFILE) - { - fflush (pFileStream0); - - // if the master log file has been updated, flush it too - if (iLogMode & MASTER) - { - fflush (pFileStream1); - } - } - - // If the log file is open and the caller requests "close file", then close and NULL file handle - if ((pFileStream0) && (iLogMode & CLOSELOG)) - { - fclose (pFileStream0); - pFileStream0 = NULL; - } - if ((pFileStream1) && (iLogMode & CLOSELOG)) - { - fclose (pFileStream1); - pFileStream1 = NULL; - } - - // return error code or OK - if (iLogMode & ERRORMSG) - { - return iErrNum; - } - else - { - return 0; - } -} - -// Function to log standardized information to console, file or both -// ********************************************************************* -int shrLogEx(int iLogMode = LOGCONSOLE, int iErrNum = 0, const char* cFormatString = "", ...) -{ - va_list vaArgList; - - // Prepare variable agument list - va_start(vaArgList, cFormatString); - int ret = shrLogV(iLogMode, iErrNum, cFormatString, vaArgList); - - // end variable argument handler - va_end(vaArgList); - - return ret; -} - -// Function to log standardized information to console, file or both -// ********************************************************************* -int shrLog(const char* cFormatString = "", ...) -{ - va_list vaArgList; - - // Prepare variable agument list - va_start(vaArgList, cFormatString); - int ret = shrLogV(LOGBOTH, 0, cFormatString, vaArgList); - - // end variable argument handler - va_end(vaArgList); - - return ret; -} - -////////////////////////////////////////////////////////////////////////////// -//! Find the path for a file assuming that -//! files are found in the searchPath. -//! -//! @return the path if succeeded, otherwise 0 -//! @param filename name of the file -//! @param executable_path optional absolute path of the executable -////////////////////////////////////////////////////////////////////////////// -char* shrFindFilePath(const char* filename, const char* executable_path) -{ - // defines a variable that is replaced with the name of the executable - - // Typical relative search paths to locate needed companion files (e.g. sample input data, or JIT source files) - // The origin for the relative search may be the .exe file, a .bat file launching an .exe, a browser .exe launching the .exe or .bat, etc - const char* searchPath[] = - { - "./", // same dir - "./data/", // "/data/" subdir - "./src/", // "/src/" subdir - "./src//data/", // "/src//data/" subdir - "./inc/", // "/inc/" subdir - "../", // up 1 in tree - "../data/", // up 1 in tree, "/data/" subdir - "../src/", // up 1 in tree, "/src/" subdir - "../inc/", // up 1 in tree, "/inc/" subdir - "../OpenCL/src//", // up 1 in tree, "/OpenCL/src//" subdir - "../OpenCL/src//data/", // up 1 in tree, "/OpenCL/src//data/" subdir - "../OpenCL/src//src/", // up 1 in tree, "/OpenCL/src//src/" subdir - "../OpenCL/src//inc/", // up 1 in tree, "/OpenCL/src//inc/" subdir - "../C/src//", // up 1 in tree, "/C/src//" subdir - "../C/src//data/", // up 1 in tree, "/C/src//data/" subdir - "../C/src//src/", // up 1 in tree, "/C/src//src/" subdir - "../C/src//inc/", // up 1 in tree, "/C/src//inc/" subdir - "../DirectCompute/src//", // up 1 in tree, "/DirectCompute/src//" subdir - "../DirectCompute/src//data/", // up 1 in tree, "/DirectCompute/src//data/" subdir - "../DirectCompute/src//src/", // up 1 in tree, "/DirectCompute/src//src/" subdir - "../DirectCompute/src//inc/", // up 1 in tree, "/DirectCompute/src//inc/" subdir - "../../", // up 2 in tree - "../../data/", // up 2 in tree, "/data/" subdir - "../../src/", // up 2 in tree, "/src/" subdir - "../../inc/", // up 2 in tree, "/inc/" subdir - "../../../", // up 3 in tree - "../../../src//", // up 3 in tree, "/src//" subdir - "../../../src//data/", // up 3 in tree, "/src//data/" subdir - "../../../src//src/", // up 3 in tree, "/src//src/" subdir - "../../../src//inc/", // up 3 in tree, "/src//inc/" subdir - "../../../sandbox//", // up 3 in tree, "/sandbox//" subdir - "../../../sandbox//data/", // up 3 in tree, "/sandbox//data/" subdir - "../../../sandbox//src/", // up 3 in tree, "/sandbox//src/" subdir - "../../../sandbox//inc/" // up 3 in tree, "/sandbox//inc/" subdir - }; - - // Extract the executable name - std::string executable_name; - if (executable_path != 0) - { - executable_name = std::string(executable_path); - - #ifdef _WIN32 - // Windows path delimiter - size_t delimiter_pos = executable_name.find_last_of('\\'); - executable_name.erase(0, delimiter_pos + 1); - - if (executable_name.rfind(".exe") != string::npos) - { - // we strip .exe, only if the .exe is found - executable_name.resize(executable_name.size() - 4); - } - #else - // Linux & OSX path delimiter - size_t delimiter_pos = executable_name.find_last_of('/'); - executable_name.erase(0,delimiter_pos+1); - #endif - - } - - // Loop over all search paths and return the first hit - for( unsigned int i = 0; i < sizeof(searchPath)/sizeof(char*); ++i ) - { - std::string path(searchPath[i]); - size_t executable_name_pos = path.find(""); - - // If there is executable_name variable in the searchPath - // replace it with the value - if(executable_name_pos != std::string::npos) - { - if(executable_path != 0) - { - path.replace(executable_name_pos, strlen(""), executable_name); - - } - else - { - // Skip this path entry if no executable argument is given - continue; - } - } - - // Test if the file exists - path.append(filename); - std::fstream fh(path.c_str(), std::fstream::in); - if (fh.good()) - { - // File found - // returning an allocated array here for backwards compatibility reasons - char* file_path = (char*) malloc(path.length() + 1); - #ifdef _WIN32 - strcpy_s(file_path, path.length() + 1, path.c_str()); - #else - strcpy(file_path, path.c_str()); - #endif - return file_path; - } - } - - // File not found - return 0; -} - -////////////////////////////////////////////////////////////////////////////// -//! Read file \filename and return the data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -////////////////////////////////////////////////////////////////////////////// -template -shrBOOL -shrReadFile( const char* filename, T** data, unsigned int* len, bool verbose) -{ - // check input arguments - ARGCHECK(NULL != filename); - ARGCHECK(NULL != len); - - // intermediate storage for the data read - std::vector data_read; - - // open file for reading - std::fstream fh( filename, std::fstream::in); - // check if filestream is valid - if(!fh.good()) - { - if (verbose) - std::cerr << "shrReadFile() : Opening file failed." << std::endl; - return shrFALSE; - } - - // read all data elements - T token; - while( fh.good()) - { - fh >> token; - data_read.push_back( token); - } - - // the last element is read twice - data_read.pop_back(); - - // check if reading result is consistent - if( ! fh.eof()) - { - if (verbose) - std::cerr << "WARNING : readData() : reading file might have failed." - << std::endl; - } - - fh.close(); - - // check if the given handle is already initialized - if( NULL != *data) - { - if( *len != data_read.size()) - { - std::cerr << "shrReadFile() : Initialized memory given but " - << "size mismatch with signal read " - << "(data read / data init = " << (unsigned int)data_read.size() - << " / " << *len << ")" << std::endl; - - return shrFALSE; - } - } - else - { - // allocate storage for the data read - *data = (T*) malloc( sizeof(T) * data_read.size()); - // store signal size - *len = static_cast( data_read.size()); - } - - // copy data - memcpy( *data, &data_read.front(), sizeof(T) * data_read.size()); - - return shrTRUE; -} - -////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -////////////////////////////////////////////////////////////////////////////// -template -shrBOOL -shrWriteFile( const char* filename, const T* data, unsigned int len, - const T epsilon, bool verbose) -{ - ARGCHECK(NULL != filename); - ARGCHECK(NULL != data); - - // open file for writing - std::fstream fh( filename, std::fstream::out); - // check if filestream is valid - if(!fh.good()) - { - if (verbose) - std::cerr << "shrWriteFile() : Opening file failed." << std::endl; - return shrFALSE; - } - - // first write epsilon - fh << "# " << epsilon << "\n"; - - // write data - for( unsigned int i = 0; (i < len) && (fh.good()); ++i) - { - fh << data[i] << ' '; - } - - // Check if writing succeeded - if( ! fh.good()) - { - if (verbose) - std::cerr << "shrWriteFile() : Writing file failed." << std::endl; - return shrFALSE; - } - - // file ends with nl - fh << std::endl; - - return shrTRUE; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg single precision floating point data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFilef( const char* filename, float** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg double precision floating point data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFiled( const char* filename, double** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg integer data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFilei( const char* filename, int** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg unsigned integer data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFileui( const char* filename, unsigned int** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg char / byte data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFileb( const char* filename, char** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Read file \filename containg unsigned char / byte data -//! @return shrTRUEif reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrReadFileub( const char* filename, unsigned char** data, unsigned int* len, bool verbose) -{ - return shrReadFile( filename, data, len, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for single precision floating point data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFilef( const char* filename, const float* data, unsigned int len, - const float epsilon, bool verbose) -{ - return shrWriteFile( filename, data, len, epsilon, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for double precision floating point data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFiled( const char* filename, const double* data, unsigned int len, - const double epsilon, bool verbose) -{ - return shrWriteFile( filename, data, len, epsilon, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for integer data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFilei( const char* filename, const int* data, unsigned int len, bool verbose) -{ - return shrWriteFile( filename, data, len, 0, verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for unsigned integer data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFileui( const char* filename,const unsigned int* data,unsigned int len, bool verbose) -{ - return shrWriteFile( filename, data, len, static_cast(0), verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for byte / char data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFileb( const char* filename, const char* data, unsigned int len, bool verbose) -{ - return shrWriteFile( filename, data, len, static_cast(0), verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for byte / char data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFileub( const char* filename, const unsigned char* data, - unsigned int len, bool verbose) -{ - return shrWriteFile( filename, data, len, static_cast(0), verbose); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename for unsigned byte / char data -//! @return shrTRUEif writing the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrWriteFileb( const char* filename,const unsigned char* data,unsigned int len, bool verbose) -{ - return shrWriteFile( filename, data, len, static_cast(0), verbose); -} - -////////////////////////////////////////////////////////////////////////////// -//! Load PGM or PPM file -//! @note if data == NULL then the necessary memory is allocated in the -//! function and w and h are initialized to the size of the image -//! @return shrTRUE if the file loading succeeded, otherwise shrFALSE -//! @param file name of the file to load -//! @param data handle to the memory for the image file data -//! @param w width of the image -//! @param h height of the image -//! @param channels number of channels in image -////////////////////////////////////////////////////////////////////////////// -shrBOOL loadPPM(const char* file, unsigned char** data, - unsigned int *w, unsigned int *h, unsigned int *channels) -{ - FILE* fp = 0; - - #ifdef _WIN32 - // open the file for binary read - errno_t err; - if ((err = fopen_s(&fp, file, "rb")) != 0) - #else - // open the file for binary read - if ((fp = fopen(file, "rb")) == 0) - #endif - { - // if error on attempt to open, be sure the file is null or close it, then return negative error code - if (fp) - { - fclose (fp); - } - std::cerr << "loadPPM() : Failed to open file: " << file << std::endl; - return shrFALSE; - } - - // check header - char header[PGMHeaderSize]; - if ((fgets( header, PGMHeaderSize, fp) == NULL) && ferror(fp)) - { - if (fp) - { - fclose (fp); - } - std::cerr << "loadPPM() : File is not a valid PPM or PGM image" << std::endl; - *channels = 0; - return shrFALSE; - } - - if (strncmp(header, "P5", 2) == 0) - { - *channels = 1; - } - else if (strncmp(header, "P6", 2) == 0) - { - *channels = 3; - } - else - { - std::cerr << "loadPPM() : File is not a PPM or PGM image" << std::endl; - *channels = 0; - return shrFALSE; - } - - // parse header, read maxval, width and height - unsigned int width = 0; - unsigned int height = 0; - unsigned int maxval = 0; - unsigned int i = 0; - while(i < 3) - { - if ((fgets(header, PGMHeaderSize, fp) == NULL) && ferror(fp)) - { - if (fp) - { - fclose (fp); - } - std::cerr << "loadPPM() : File is not a valid PPM or PGM image" << std::endl; - return shrFALSE; - } - if(header[0] == '#') continue; - - #ifdef _WIN32 - if(i == 0) - { - i += sscanf_s(header, "%u %u %u", &width, &height, &maxval); - } - else if (i == 1) - { - i += sscanf_s(header, "%u %u", &height, &maxval); - } - else if (i == 2) - { - i += sscanf_s(header, "%u", &maxval); - } - #else - if(i == 0) - { - i += sscanf(header, "%u %u %u", &width, &height, &maxval); - } - else if (i == 1) - { - i += sscanf(header, "%u %u", &height, &maxval); - } - else if (i == 2) - { - i += sscanf(header, "%u", &maxval); - } - #endif - } - - // check if given handle for the data is initialized - if(NULL != *data) - { - if (*w != width || *h != height) - { - fclose(fp); - std::cerr << "loadPPM() : Invalid image dimensions." << std::endl; - return shrFALSE; - } - } - else - { - *data = (unsigned char*)malloc( sizeof(unsigned char) * width * height * *channels); - *w = width; - *h = height; - } - - // read and close file - if (fread(*data, sizeof(unsigned char), width * height * *channels, fp) != width * height * *channels) - { - fclose(fp); - std::cerr << "loadPPM() : Invalid image." << std::endl; - return shrFALSE; - } - fclose(fp); - - return shrTRUE; -} - -////////////////////////////////////////////////////////////////////////////// -//! Write / Save PPM or PGM file -//! @note Internal usage only -//! @param file name of the image file -//! @param data handle to the data read -//! @param w width of the image -//! @param h height of the image -////////////////////////////////////////////////////////////////////////////// -shrBOOL savePPM( const char* file, unsigned char *data, - unsigned int w, unsigned int h, unsigned int channels) -{ - ARGCHECK(NULL != data); - ARGCHECK(w > 0); - ARGCHECK(h > 0); - - std::fstream fh( file, std::fstream::out | std::fstream::binary ); - if( fh.bad()) - { - std::cerr << "savePPM() : Opening file failed." << std::endl; - return shrFALSE; - } - - if (channels == 1) - { - fh << "P5\n"; - } - else if (channels == 3) { - fh << "P6\n"; - } - else { - std::cerr << "savePPM() : Invalid number of channels." << std::endl; - return shrFALSE; - } - - fh << w << "\n" << h << "\n" << 0xff << std::endl; - - for( unsigned int i = 0; (i < (w*h*channels)) && fh.good(); ++i) - { - fh << data[i]; - } - fh.flush(); - - if( fh.bad()) - { - std::cerr << "savePPM() : Writing data failed." << std::endl; - return shrFALSE; - } - fh.close(); - - return shrTRUE; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Load PPM image file (with unsigned char as data element type), padding 4th component -//! @return shrTrue if reading the file succeeded, otherwise shrFALSE -//! @param file name of the image file -//! @param data handle to the data read -//! @param w width of the image -//! @param h height of the image -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrLoadPPM4ub( const char* file, unsigned char** OutData, - unsigned int *w, unsigned int *h) -{ - // Load file data into a temporary buffer with automatic allocation - unsigned char* cLocalData = 0; - unsigned int channels; - shrBOOL bLoadOK = loadPPM(file, &cLocalData, w, h, &channels); // this allocates cLocalData, which must be freed later - - // If the data loaded OK from file to temporary buffer, then go ahead with padding and transfer - if (shrTRUE == bLoadOK) - { - // if the receiving buffer is null, allocate it... caller must free this - int size = *w * *h; - if (*OutData == NULL) - { - *OutData = (unsigned char*)malloc(sizeof(unsigned char) * size * 4); - } - - // temp pointers for incrementing - unsigned char* cTemp = cLocalData; - unsigned char* cOutPtr = *OutData; - - // transfer data, padding 4th element - for(int i=0; i( arg_name); - if( NULL != v) - { - // assign value - *val = *v; - ret_val = shrTRUE; - } - else { - // fail safe - val = NULL; - } - } - catch( const std::exception& /*ex*/) - { - std::cerr << "Error when parsing command line argument string." << std::endl; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type unsigned int -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrGetCmdLineArgumentu( const int argc, const char** argv, - const char* arg_name, unsigned int* val) -{ - shrBOOL ret_val = shrFALSE; - - try - { - // initialize - CmdArgReader::init( argc, argv); - - // access argument - const int* v = CmdArgReader::getArg( arg_name); - if( NULL != v) - { - // assign value - *val = *v; - ret_val = shrTRUE; - } - else { - // fail safe - val = NULL; - } - } - catch( const std::exception& /*ex*/) - { - std::cerr << "Error when parsing command line argument string." << std::endl; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type float -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrGetCmdLineArgumentf( const int argc, const char** argv, - const char* arg_name, float* val) -{ - shrBOOL ret_val = shrFALSE; - - try - { - // initialize - CmdArgReader::init( argc, argv); - - // access argument - const float* v = CmdArgReader::getArg( arg_name); - if( NULL != v) - { - // assign value - *val = *v; - ret_val = shrTRUE; - } - else { - // fail safe - val = NULL; - } - } - catch( const std::exception& /*ex*/) - { - std::cerr << "Error when parsing command line argument string." << std::endl; - } - - return ret_val; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type string -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrGetCmdLineArgumentstr( const int argc, const char** argv, - const char* arg_name, char** val) -{ - shrBOOL ret_val = shrFALSE; - - try - { - // initialize - CmdArgReader::init( argc, argv); - - // access argument - const std::string* v = CmdArgReader::getArg( arg_name); - if( NULL != v) - { - - // allocate memory for the string - *val = (char*)malloc(sizeof(char) * (v->length() + 1)); - - // copy from string to c_str - #ifdef WIN32 - strcpy_s(*val, v->length() + 1, v->c_str()); - #else - strcpy(*val, v->c_str()); - #endif - ret_val = shrTRUE; - } - else { - // fail safe - *val = NULL; - } - } - catch( const std::exception& /*ex*/) - { - std::cerr << "Error when parsing command line argument string."<< - std::endl; - } - - return ret_val; - -} - -////////////////////////////////////////////////////////////////////////////// -//! Compare two arrays of arbitrary type -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -////////////////////////////////////////////////////////////////////////////// -template -shrBOOL -compareData( const T* reference, const T* data, const unsigned int len, - const S epsilon, const float threshold) -{ - ARGCHECK( epsilon >= 0); - - bool result = true; - unsigned int error_count = 0; - - for( unsigned int i = 0; i < len; ++i) { - - T diff = reference[i] - data[i]; - bool comp = (diff <= epsilon) && (diff >= -epsilon); - result &= comp; - - error_count += !comp; - -#ifdef _DEBUG - if( ! comp) - { - std::cerr << "ERROR, i = " << i << ",\t " - << reference[i] << " / " - << data[i] - << " (reference / data)\n"; - } -#endif - } - - if (threshold == 0.0f) { - return (result) ? shrTRUE : shrFALSE; - } else { - return (len*threshold > error_count) ? shrTRUE : shrFALSE; - } -} - -////////////////////////////////////////////////////////////////////////////// -//! Compare two arrays of arbitrary type -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -////////////////////////////////////////////////////////////////////////////// -template -shrBOOL -compareDataAsFloat( const T* reference, const T* data, const unsigned int len, - const S epsilon) -{ - ARGCHECK(epsilon >= 0); - - // If we set epsilon to be 0, let's set a minimum threshold - float max_error = MAX( (float)epsilon, MIN_EPSILON_ERROR ); - int error_count = 0; - bool result = true; - - for( unsigned int i = 0; i < len; ++i) { - float diff = fabs((float)reference[i] - (float)data[i]); - bool comp = (diff < max_error); - result &= comp; - - if( ! comp) - { - error_count++; -#ifdef _DEBUG - if (error_count < 50) { - shrLog("\n ERROR(epsilon=%4.3f), i=%d, (ref)0x%02x / (data)0x%02x / (diff)%d\n", max_error, i, reference[i], data[i], (unsigned int)diff); - } -#endif - } - } - if (error_count) { - shrLog("\n Total # of errors = %d\n", error_count); - } - return (error_count == 0) ? shrTRUE : shrFALSE; -} - -////////////////////////////////////////////////////////////////////////////// -//! Compare two arrays of arbitrary type -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//! @param epsilon threshold % of (# of bytes) for pass/fail -////////////////////////////////////////////////////////////////////////////// -template -shrBOOL -compareDataAsFloatThreshold( const T* reference, const T* data, const unsigned int len, - const S epsilon, const float threshold) -{ - ARGCHECK(epsilon >= 0); - - // If we set epsilon to be 0, let's set a minimum threshold - float max_error = MAX( (float)epsilon, MIN_EPSILON_ERROR); - int error_count = 0; - bool result = true; - - for( unsigned int i = 0; i < len; ++i) { - float diff = fabs((float)reference[i] - (float)data[i]); - bool comp = (diff < max_error); - result &= comp; - - if( ! comp) - { - error_count++; -//#ifdef _DEBUG - if (error_count < 50) { - shrLog("\n ERROR(epsilon=%4.3f), i=%d, (ref)%f / (data)%f / (diff)%f\n", max_error, i, reference[i], data[i], diff); - } -//#endif - } - } - - if (threshold == 0.0f) { - if (error_count) { - shrLog("\n Total # of errors = %d\n", error_count); - } - return (error_count == 0) ? shrTRUE : shrFALSE; - } else { - - if (error_count) { - shrLog("\n %.2f(%%) of bytes mismatched (count=%d)\n", (float)error_count*100/(float)len, error_count); - } - - return ((len*threshold > error_count) ? shrTRUE : shrFALSE); - } -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparef( const float* reference, const float* data, - const unsigned int len ) -{ - const float epsilon = 0.0; - return compareData( reference, data, len, epsilon, 0.0f ); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparei( const int* reference, const int* data, - const unsigned int len ) -{ - const int epsilon = 0; - return compareData( reference, data, len, epsilon, 0.0f); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two unsigned integer arrays, with epsilon and threshold -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrCompareuit( const unsigned int* reference, const unsigned int* data, - const unsigned int len, const float epsilon, const float threshold ) -{ - return compareDataAsFloatThreshold( reference, data, len, epsilon, threshold ); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrCompareub( const unsigned char* reference, const unsigned char* data, - const unsigned int len ) -{ - const int epsilon = 0; - return compareData( reference, data, len, epsilon, 0.0f); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays (inc Threshold for # of pixel we can have errors) -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrCompareubt( const unsigned char* reference, const unsigned char* data, - const unsigned int len, const float epsilon, const float threshold ) -{ - return compareDataAsFloatThreshold( reference, data, len, epsilon, threshold ); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays -//! @return shrTRUE if \a reference and \a data are identical, -//! otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrCompareube( const unsigned char* reference, const unsigned char* data, - const unsigned int len, const float epsilon ) -{ - return compareDataAsFloat( reference, data, len, epsilon ); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays with an epsilon tolerance for equality -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparefe( const float* reference, const float* data, - const unsigned int len, const float epsilon ) -{ - return compareData( reference, data, len, epsilon, 0.0f); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays with an epsilon tolerance for equality and a -//! threshold for # pixel errors -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparefet( const float* reference, const float* data, - const unsigned int len, const float epsilon, const float threshold ) -{ - return compareDataAsFloatThreshold( reference, data, len, epsilon, threshold ); -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays using L2-norm with an epsilon tolerance for equality -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrCompareL2fe( const float* reference, const float* data, - const unsigned int len, const float epsilon ) -{ - ARGCHECK(epsilon >= 0); - - float error = 0; - float ref = 0; - - for( unsigned int i = 0; i < len; ++i) { - - float diff = reference[i] - data[i]; - error += diff * diff; - ref += reference[i] * reference[i]; - } - - float normRef = sqrtf(ref); - if (fabs(ref) < 1e-7) { -#ifdef _DEBUG - std::cerr << "ERROR, reference l2-norm is 0\n"; -#endif - return shrFALSE; - } - float normError = sqrtf(error); - error = normError / normRef; - bool result = error < epsilon; -#ifdef _DEBUG - if( ! result) - { - std::cerr << "ERROR, l2-norm error " - << error << " is greater than epsilon " << epsilon << "\n"; - } -#endif - - return result ? shrTRUE : shrFALSE; -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two PPM image files with an epsilon tolerance for equality -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param src_file filename for the image to be compared -//! @param data filename for the reference data / gold image -//! @param epsilon epsilon to use for the comparison -//! @param threshold threshold of pixels that can still mismatch to pass (i.e. 0.15f = 15% must pass) -//! @param verboseErrors output details of image mismatch to std::cerr -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparePPM( const char *src_file, const char *ref_file, const float epsilon, const float threshold) -{ - unsigned char* src_data = NULL; - unsigned char* ref_data = NULL; - unsigned long error_count = 0; - unsigned int ref_width, ref_height; - unsigned int src_width, src_height; - - // Check sample and reference file pointers - if (src_file == NULL || ref_file == NULL) { - shrLog("\n> shrComparePGM: src_file or ref_file is NULL\n Aborting comparison !!!\n\n"); - return shrFALSE; - } - shrLog("\n> shrComparePPM:\n (a)rendered: <%s>\n (b)reference: <%s>\n", src_file, ref_file); - - // Load the ref image file - if (shrLoadPPM4ub(ref_file, &ref_data, &ref_width, &ref_height) != shrTRUE) - { - shrLog("\n Unable to load ref image file: %s\n Aborting comparison !!!\n\n", ref_file); - return shrFALSE; - } - - // Load the sample image file - if (shrLoadPPM4ub(src_file, &src_data, &src_width, &src_height) != shrTRUE) - { - shrLog("\n Unable to load src image file: %s\n Aborting comparison !!!\n\n", src_file); - return shrFALSE; - } - - // check to see if image dimensions match - if(src_height != ref_height || src_width != ref_width) - { - shrLog("\n Source and ref size mismatch (%u x %u) vs (%u x %u)\n Aborting Comparison !!!\n\n ", - src_width, src_height, ref_width, ref_height); - return shrFALSE; - } - - // compare the images - if (shrCompareubt(ref_data, src_data, src_width*src_height*4, epsilon, threshold ) == shrFALSE) - { - error_count=1; - } - - shrLog(" Images %s\n\n", (error_count == 0) ? "Match" : "Don't Match !!!"); - return (error_count == 0) ? shrTRUE : shrFALSE; // returns true if all pixels pass -} - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two PGM image files with an epsilon tolerance for equality -//! @return shrTRUE if \a reference and \a data are identical, otherwise shrFALSE -//! @param src_file filename for the image to be compared -//! @param data filename for the reference data / gold image -//! @param epsilon epsilon to use for the comparison -//! @param threshold threshold of pixels that can still mismatch to pass (i.e. 0.15f = 15% must pass) -//////////////////////////////////////////////////////////////////////////////// -shrBOOL shrComparePGM( const char *src_file, const char *ref_file, const float epsilon, const float threshold) -{ - unsigned char* src_data = NULL; - unsigned char* ref_data = NULL; - unsigned long error_count = 0; - unsigned int ref_width, ref_height; - unsigned int src_width, src_height; - - // Check sample and reference file pointers - if (src_file == NULL || ref_file == NULL) { - shrLog("\n> shrComparePGM: src_file or ref_file is NULL\n Aborting comparison !!!\n\n"); - return shrFALSE; - } - shrLog("\n> shrComparePGM:\n (a)rendered: <%s>\n (b)reference: <%s>\n", src_file, ref_file); - - // Load the ref image file - if (shrLoadPPM4ub(ref_file, &ref_data, &ref_width, &ref_height) != shrTRUE) - { - shrLog("\n Unable to load ref image file: %s\n Aborting comparison !!!\n\n", ref_file); - return shrFALSE; - } - - // Load the sample image file - if (shrLoadPPM4ub(src_file, &src_data, &src_width, &src_height) != shrTRUE) - { - shrLog("\n Unable to load src image file: %s\n Aborting comparison !!!\n\n", src_file); - return shrFALSE; - } - - // check to see if image dimensions match - if(src_height != ref_height || src_width != ref_width) - { - shrLog("\n Source and ref size mismatch (%u x %u) vs (%u x %u)\n Aborting Comparison !!!\n\n ", - src_width, src_height, ref_width, ref_height); - return shrFALSE; - } - - // compare the images - if (shrCompareubt(ref_data, src_data, src_width*src_height*4, epsilon, threshold ) == shrFALSE) - { - error_count=1; - } - - shrLog(" Images %s\n\n", (error_count == 0) ? "Match" : "Don't Match !!!"); - return (error_count == 0) ? shrTRUE : shrFALSE; // returns true if all pixels pass -} - -// Load raw data from disk -unsigned char* shrLoadRawFile(const char* filename, size_t size) -{ - FILE *fp = NULL; - #ifdef WIN32 - errno_t err; - if ((err = fopen_s(&fp, filename, "rb")) != 0) - #else - if ((fp = fopen(filename, "rb")) == NULL) - #endif - { - shrLog(" Error opening file '%s' !!!\n", filename); - return 0; - } - - unsigned char* data = (unsigned char*)malloc(size); - size_t read = fread(data, 1, size, fp); - fclose(fp); - - shrLog(" Read '%s', %d bytes\n", filename, read); - - return data; -} - -// Round Up Division function -size_t shrRoundUp(int group_size, int global_size) -{ - int r = global_size % group_size; - if(r == 0) - { - return global_size; - } else - { - return global_size + group_size - r; - } -} \ No newline at end of file diff --git a/tests/opencl/vectorhypot/shrUtils.h b/tests/opencl/vectorhypot/shrUtils.h deleted file mode 100644 index 0f2795d4..00000000 --- a/tests/opencl/vectorhypot/shrUtils.h +++ /dev/null @@ -1,642 +0,0 @@ -/* -* Copyright 1993-2010 NVIDIA Corporation. All rights reserved. -* -* Please refer to the NVIDIA end user license agreement (EULA) associated -* with this source code for terms and conditions that govern your use of -* this software. Any use, reproduction, disclosure, or distribution of -* this software and related documentation outside the terms of the EULA -* is strictly prohibited. -* -*/ - -#ifndef SHR_UTILS_H -#define SHR_UTILS_H - -// ********************************************************************* -// Generic utilities for NVIDIA GPU Computing SDK -// ********************************************************************* - -// reminders for output window and build log -#ifdef _WIN32 - #pragma message ("Note: including windows.h") - #pragma message ("Note: including math.h") - #pragma message ("Note: including assert.h") -#endif - -// OS dependent includes -#ifdef _WIN32 - // Headers needed for Windows - #include -#else - // Headers needed for Linux - #include - #include - #include - #include - #include - #include - #include -#endif - -// Other headers needed for both Windows and Linux -#include -#include -#include -#include -#include - -// Un-comment the following #define to enable profiling code in SDK apps -//#define GPU_PROFILING - -// Beginning of GPU Architecture definitions -inline int ConvertSMVer2Cores(int major, int minor) -{ - // Defines for GPU Architecture types (using the SM version to determine the # of cores per SM - typedef struct { - int SM; // 0xMm (hexidecimal notation), M = SM Major version, and m = SM minor version - int Cores; - } sSMtoCores; - - sSMtoCores nGpuArchCoresPerSM[] = - { { 0x10, 8 }, // Tesla Generation (SM 1.0) G80 class - { 0x11, 8 }, // Tesla Generation (SM 1.1) G8x class - { 0x12, 8 }, // Tesla Generation (SM 1.2) G9x class - { 0x13, 8 }, // Tesla Generation (SM 1.3) GT200 class - { 0x20, 32 }, // Fermi Generation (SM 2.0) GF100 class - { 0x21, 48 }, // Fermi Generation (SM 2.1) GF10x class - { 0x30, 192}, // Fermi Generation (SM 3.0) GK10x class - { -1, -1 } - }; - - int index = 0; - while (nGpuArchCoresPerSM[index].SM != -1) { - if (nGpuArchCoresPerSM[index].SM == ((major << 4) + minor) ) { - return nGpuArchCoresPerSM[index].Cores; - } - index++; - } - printf("MapSMtoCores SM %d.%d is undefined (please update to the latest SDK)!\n", major, minor); - return -1; -} -// end of GPU Architecture definitions - - -// Defines and enum for use with logging functions -// ********************************************************************* -#define DEFAULTLOGFILE "SdkConsoleLog.txt" -#define MASTERLOGFILE "SdkMasterLog.csv" -enum LOGMODES -{ - LOGCONSOLE = 1, // bit to signal "log to console" - LOGFILE = 2, // bit to signal "log to file" - LOGBOTH = 3, // convenience union of first 2 bits to signal "log to both" - APPENDMODE = 4, // bit to set "file append" mode instead of "replace mode" on open - MASTER = 8, // bit to signal master .csv log output - ERRORMSG = 16, // bit to signal "pre-pend Error" - CLOSELOG = 32 // bit to close log file, if open, after any requested file write -}; -#define HDASHLINE "-----------------------------------------------------------\n" - -// Standardized boolean -enum shrBOOL -{ - shrFALSE = 0, - shrTRUE = 1 -}; - -// Standardized MAX, MIN and CLAMP -#define MAX(a, b) ((a > b) ? a : b) -#define MIN(a, b) ((a < b) ? a : b) -#define CLAMP(a, b, c) MIN(MAX(a, b), c) // double sided clip of input a -#define TOPCLAMP(a, b) (a < b ? a:b) // single top side clip of input a - -// Error and Exit Handling Macros... -// ********************************************************************* -// Full error handling macro with Cleanup() callback (if supplied)... -// (Companion Inline Function lower on page) -#define shrCheckErrorEX(a, b, c) __shrCheckErrorEX(a, b, c, __FILE__ , __LINE__) - -// Short version without Cleanup() callback pointer -// Both Input (a) and Reference (b) are specified as args -#define shrCheckError(a, b) shrCheckErrorEX(a, b, 0) - -// Standardized Exit Macro for leaving main()... extended version -// (Companion Inline Function lower on page) -#define shrExitEX(a, b, c) __shrExitEX(a, b, c) - -// Standardized Exit Macro for leaving main()... short version -// (Companion Inline Function lower on page) -#define shrEXIT(a, b) __shrExitEX(a, b, EXIT_SUCCESS) - -// Simple argument checker macro -#define ARGCHECK(a) if((a) != shrTRUE)return shrFALSE - -// Define for user-customized error handling -#define STDERROR "file %s, line %i\n\n" , __FILE__ , __LINE__ - -// Function to deallocate memory allocated within shrUtils -// ********************************************************************* -extern "C" void shrFree(void* ptr); - -// ********************************************************************* -// Helper function to log standardized information to Console, to File or to both -//! Examples: shrLogEx(LOGBOTH, 0, "Function A\n"); -//! : shrLogEx(LOGBOTH | ERRORMSG, ciErrNum, STDERROR); -//! -//! Automatically opens file and stores handle if needed and not done yet -//! Closes file and nulls handle on request -//! -//! @param 0 iLogMode: LOGCONSOLE, LOGFILE, LOGBOTH, APPENDMODE, MASTER, ERRORMSG, CLOSELOG. -//! LOGFILE and LOGBOTH may be | 'd with APPENDMODE to select file append mode instead of overwrite mode -//! LOGFILE and LOGBOTH may be | 'd with CLOSELOG to "write and close" -//! First 3 options may be | 'd with MASTER to enable independent write to master data log file -//! First 3 options may be | 'd with ERRORMSG to start line with standard error message -//! @param 2 dValue: -//! Positive val = double value for time in secs to be formatted to 6 decimals. -//! Negative val is an error code and this give error preformatting. -//! @param 3 cFormatString: String with formatting specifiers like printf or fprintf. -//! ALL printf flags, width, precision and type specifiers are supported with this exception: -//! Wide char type specifiers intended for wprintf (%S and %C) are NOT supported -//! Single byte char type specifiers (%s and %c) ARE supported -//! @param 4... variable args: like printf or fprintf. Must match format specifer type above. -//! @return 0 if OK, negative value on error or if error occurs or was passed in. -// ********************************************************************* -extern "C" int shrLogEx(int iLogMode, int iErrNum, const char* cFormatString, ...); - -// Short version of shrLogEx defaulting to shrLogEx(LOGBOTH, 0, -// ********************************************************************* -extern "C" int shrLog(const char* cFormatString, ...); - -// ********************************************************************* -// Delta timer function for up to 3 independent timers using host high performance counters -// Maintains state for 3 independent counters -//! Example: double dElapsedTime = shrDeltaTime(0); -//! -//! @param 0 iCounterID: Which timer to check/reset. (0, 1, 2) -//! @return delta time of specified counter since last call in seconds. Otherwise -9999.0 if error -// ********************************************************************* -extern "C" double shrDeltaT(int iCounterID); - -// Optional LogFileNameOverride function -// ********************************************************************* -extern "C" void shrSetLogFileName (const char* cOverRideName); - -// Helper function to init data arrays -// ********************************************************************* -extern "C" void shrFillArray(float* pfData, int iSize); - -// Helper function to print data arrays -// ********************************************************************* -extern "C" void shrPrintArray(float* pfData, int iSize); - -//////////////////////////////////////////////////////////////////////////// -//! Find the path for a filename -//! @return the path if succeeded, otherwise 0 -//! @param filename name of the file -//! @param executablePath optional absolute path of the executable -//////////////////////////////////////////////////////////////////////////// -extern "C" char* shrFindFilePath(const char* filename, const char* executablePath); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing single precision floating point data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFilef( const char* filename, float** data, unsigned int* len, - bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing double precision floating point data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFiled( const char* filename, double** data, unsigned int* len, - bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing integer data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFilei( const char* filename, int** data, unsigned int* len, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing unsigned integer data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFileui( const char* filename, unsigned int** data, - unsigned int* len, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing char / byte data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFileb( const char* filename, char** data, unsigned int* len, - bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Read file \filename containing unsigned char / byte data -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param filename name of the source file -//! @param data uninitialized pointer, returned initialized and pointing to -//! the data read -//! @param len number of data elements in data, -1 on error -//! @note If a NULL pointer is passed to this function and it is -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrReadFileub( const char* filename, unsigned char** data, - unsigned int* len, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing single precision floating point -//! data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFilef( const char* filename, const float* data, unsigned int len, - const float epsilon, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing double precision floating point -//! data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//! @param epsilon epsilon for comparison -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFiled( const char* filename, const float* data, unsigned int len, - const double epsilon, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing integer data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFilei( const char* filename, const int* data, unsigned int len, - bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing unsigned integer data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFileui( const char* filename, const unsigned int* data, - unsigned int len, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing char / byte data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFileb( const char* filename, const char* data, unsigned int len, - bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Write a data file \filename containing unsigned char / byte data -//! @return shrTRUE if writing the file succeeded, otherwise shrFALSE -//! @param filename name of the file to write -//! @param data pointer to data to write -//! @param len number of data elements in data, -1 on error -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrWriteFileub( const char* filename, const unsigned char* data, - unsigned int len, bool verbose = false); - -//////////////////////////////////////////////////////////////////////////// -//! Load PPM image file (with unsigned char as data element type), padding -//! 4th component -//! @return shrTRUE if reading the file succeeded, otherwise shrFALSE -//! @param file name of the image file -//! @param OutData handle to the data read -//! @param w width of the image -//! @param h height of the image -//! -//! Note: If *OutData is NULL this function allocates buffer that must be freed by caller -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrLoadPPM4ub(const char* file, unsigned char** OutData, - unsigned int *w, unsigned int *h); - -//////////////////////////////////////////////////////////////////////////// -//! Save PPM image file (with unsigned char as data element type, padded to -//! 4 bytes) -//! @return shrTRUE if saving the file succeeded, otherwise shrFALSE -//! @param file name of the image file -//! @param data handle to the data read -//! @param w width of the image -//! @param h height of the image -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrSavePPM4ub( const char* file, unsigned char *data, - unsigned int w, unsigned int h); - -//////////////////////////////////////////////////////////////////////////////// -//! Save PGM image file (with unsigned char as data element type) -//! @return shrTRUE if saving the file succeeded, otherwise shrFALSE -//! @param file name of the image file -//! @param data handle to the data read -//! @param w width of the image -//! @param h height of the image -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrSavePGMub( const char* file, unsigned char *data, - unsigned int w, unsigned int h); - -//////////////////////////////////////////////////////////////////////////// -//! Load PGM image file (with unsigned char as data element type) -//! @return shrTRUE if saving the file succeeded, otherwise shrFALSE -//! @param file name of the image file -//! @param data handle to the data read -//! @param w width of the image -//! @param h height of the image -//! @note If a NULL pointer is passed to this function and it is initialized -//! within shrUtils, then free() has to be used to deallocate the memory -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrLoadPGMub( const char* file, unsigned char** data, - unsigned int *w,unsigned int *h); - -//////////////////////////////////////////////////////////////////////////// -// Command line arguments: General notes -// * All command line arguments begin with '--' followed by the token; -// token and value are seperated by '='; example --samples=50 -// * Arrays have the form --model=[one.obj,two.obj,three.obj] -// (without whitespaces) -//////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////// -//! Check if command line argument \a flag-name is given -//! @return shrTRUE if command line argument \a flag_name has been given, -//! otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param flag_name name of command line flag -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCheckCmdLineFlag( const int argc, const char** argv, - const char* flag_name); - -//////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type int -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrGetCmdLineArgumenti( const int argc, const char** argv, - const char* arg_name, int* val); - -//////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type unsigned int -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrGetCmdLineArgumentu( const int argc, const char** argv, - const char* arg_name, unsigned int* val); - -//////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type float -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrGetCmdLineArgumentf( const int argc, const char** argv, - const char* arg_name, float* val); - -//////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument of type string -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val value of the command line argument -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrGetCmdLineArgumentstr( const int argc, const char** argv, - const char* arg_name, char** val); - -//////////////////////////////////////////////////////////////////////////// -//! Get the value of a command line argument list those element are strings -//! @return shrTRUE if command line argument \a arg_name has been given and -//! is of the requested type, otherwise shrFALSE -//! @param argc argc as passed to main() -//! @param argv argv as passed to main() -//! @param arg_name name of the command line argument -//! @param val command line argument list -//! @param len length of the list / number of elements -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrGetCmdLineArgumentListstr( const int argc, const char** argv, - const char* arg_name, char** val, - unsigned int* len); - -//////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparef( const float* reference, const float* data, - const unsigned int len); - -//////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparei( const int* reference, const int* data, - const unsigned int len ); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two unsigned integer arrays, with epsilon and threshold -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param threshold tolerance % # of comparison errors (0.15f = 15%) -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCompareuit( const unsigned int* reference, const unsigned int* data, - const unsigned int len, const float epsilon, const float threshold ); - -//////////////////////////////////////////////////////////////////////////// -//! Compare two unsigned char arrays -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCompareub( const unsigned char* reference, const unsigned char* data, - const unsigned int len ); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integers with a tolernance for # of byte errors -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//! @param threshold tolerance % # of comparison errors (0.15f = 15%) -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCompareubt( const unsigned char* reference, const unsigned char* data, - const unsigned int len, const float epsilon, const float threshold ); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two integer arrays witha n epsilon tolerance for equality -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCompareube( const unsigned char* reference, const unsigned char* data, - const unsigned int len, const float epsilon ); - -//////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays with an epsilon tolerance for equality -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparefe( const float* reference, const float* data, - const unsigned int len, const float epsilon ); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays with an epsilon tolerance for equality and a -//! threshold for # pixel errors -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparefet( const float* reference, const float* data, - const unsigned int len, const float epsilon, const float threshold ); - -//////////////////////////////////////////////////////////////////////////// -//! Compare two float arrays using L2-norm with an epsilon tolerance for -//! equality -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param reference handle to the reference data / gold image -//! @param data handle to the computed data -//! @param len number of elements in reference and data -//! @param epsilon epsilon to use for the comparison -//////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrCompareL2fe( const float* reference, const float* data, - const unsigned int len, const float epsilon ); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two PPM image files with an epsilon tolerance for equality -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param src_file filename for the image to be compared -//! @param data filename for the reference data / gold image -//! @param epsilon epsilon to use for the comparison -//! @param threshold threshold of pixels that can still mismatch to pass (i.e. 0.15f = 15% must pass) -//! $param verboseErrors output details of image mismatch to std::err -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparePPM( const char *src_file, const char *ref_file, const float epsilon, const float threshold); - -//////////////////////////////////////////////////////////////////////////////// -//! Compare two PGM image files with an epsilon tolerance for equality -//! @return shrTRUEif \a reference and \a data are identical, otherwise shrFALSE -//! @param src_file filename for the image to be compared -//! @param data filename for the reference data / gold image -//! @param epsilon epsilon to use for the comparison -//! @param threshold threshold of pixels that can still mismatch to pass (i.e. 0.15f = 15% must pass) -//! $param verboseErrors output details of image mismatch to std::err -//////////////////////////////////////////////////////////////////////////////// -extern "C" shrBOOL shrComparePGM( const char *src_file, const char *ref_file, const float epsilon, const float threshold); - -extern "C" unsigned char* shrLoadRawFile(const char* filename, size_t size); - -extern "C" size_t shrRoundUp(int group_size, int global_size); - -// companion inline function for error checking and exit on error WITH Cleanup Callback (if supplied) -// ********************************************************************* -inline void __shrCheckErrorEX(int iSample, int iReference, void (*pCleanup)(int), const char* cFile, const int iLine) -{ - if (iReference != iSample) - { - shrLogEx(LOGBOTH | ERRORMSG, iSample, "line %i , in file %s !!!\n\n" , iLine, cFile); - if (pCleanup != NULL) - { - pCleanup(EXIT_FAILURE); - } - else - { - shrLogEx(LOGBOTH | CLOSELOG, 0, "Exiting...\n"); - exit(EXIT_FAILURE); - } - } -} - -// Standardized Exit -// ********************************************************************* -inline void __shrExitEX(int argc, const char** argv, int iExitCode) -{ -#ifdef WIN32 - if (!shrCheckCmdLineFlag(argc, argv, "noprompt") && !shrCheckCmdLineFlag(argc, argv, "qatest")) -#else - if (shrCheckCmdLineFlag(argc, argv, "prompt") && !shrCheckCmdLineFlag(argc, argv, "qatest")) -#endif - { - shrLogEx(LOGBOTH | CLOSELOG, 0, "\nPress to Quit...\n"); - getchar(); - } - else - { - shrLogEx(LOGBOTH | CLOSELOG, 0, "%s Exiting...\n", argv[0]); - } - fflush(stderr); - exit(iExitCode); -} - -#endif \ No newline at end of file