diff --git a/dat/iasi_peak_pressures.dat b/dat/iasi_peak_pressures.dat new file mode 100755 index 0000000..3aad117 --- /dev/null +++ b/dat/iasi_peak_pressures.dat @@ -0,0 +1,8461 @@ + 122.040 + 102.050 + 69.970 + 27.260 + 27.260 + 69.970 + 122.040 + 102.050 + 45.290 + 20.400 + 27.260 + 45.290 + 85.180 + 85.180 + 10.370 + 10.370 + 10.370 + 14.810 + 35.510 + 56.730 + 45.290 + 20.400 + 20.400 + 35.510 + 69.970 + 85.180 + 69.970 + 20.400 + 20.400 + 35.510 + 56.730 + 69.970 + 69.970 + 27.260 + 20.400 + 35.510 + 56.730 + 69.970 + 69.970 + 27.260 + 20.400 + 35.510 + 45.290 + 69.970 + 69.970 + 35.510 + 20.400 + 27.260 + 45.290 + 56.730 + 69.970 + 35.510 + 20.400 + 27.260 + 45.290 + 69.970 + 69.970 + 45.290 + 20.400 + 20.400 + 45.290 + 56.730 + 69.970 + 45.290 + 27.260 + 27.260 + 45.290 + 56.730 + 69.970 + 14.810 + 10.370 + 10.370 + 14.810 + 27.260 + 45.290 + 45.290 + 45.290 + 27.260 + 35.510 + 35.510 + 35.510 + 45.290 + 45.290 + 35.510 + 45.290 + 56.730 + 45.290 + 35.510 + 27.260 + 1.420 + 1.420 + 1.420 + 1.420 + 2.611 + 2.611 + 4.407 + 6.950 + 10.370 + 10.370 + 10.370 + 10.370 + 35.510 + 45.290 + 45.290 + 35.510 + 20.400 + 20.400 + 45.290 + 69.970 + 56.730 + 45.290 + 20.400 + 14.810 + 35.510 + 56.730 + 69.970 + 45.290 + 20.400 + 14.810 + 27.260 + 56.730 + 69.970 + 56.730 + 27.260 + 14.810 + 20.400 + 45.290 + 69.970 + 69.970 + 35.510 + 20.400 + 20.400 + 35.510 + 69.970 + 69.970 + 45.290 + 20.400 + 14.810 + 27.260 + 56.730 + 69.970 + 56.730 + 27.260 + 14.810 + 20.400 + 45.290 + 69.970 + 69.970 + 45.290 + 14.810 + 20.400 + 35.510 + 69.970 + 69.970 + 56.730 + 20.400 + 14.810 + 35.510 + 56.730 + 69.970 + 69.970 + 45.290 + 10.370 + 27.260 + 45.290 + 85.180 + 85.180 + 69.970 + 27.260 + 27.260 + 45.290 + 69.970 + 102.050 + 85.180 + 45.290 + 20.400 + 27.260 + 56.730 + 102.050 + 102.050 + 69.970 + 20.400 + 20.400 + 56.730 + 102.050 + 122.040 + 102.050 + 45.290 + 20.400 + 35.510 + 69.970 + 122.040 + 122.040 + 69.970 + 35.510 + 35.510 + 56.730 + 122.040 + 143.840 + 122.040 + 56.730 + 35.510 + 56.730 + 102.050 + 222.940 + 143.840 + 102.050 + 45.290 + 45.290 + 69.970 + 253.710 + 253.710 + 222.940 + 69.970 + 45.290 + 69.970 + 253.710 + 286.600 + 253.710 + 222.940 + 56.730 + 69.970 + 222.940 + 286.600 + 286.600 + 286.600 + 122.040 + 56.730 + 253.710 + 286.600 + 286.600 + 286.600 + 286.600 + 56.730 + 253.710 + 321.500 + 321.500 + 321.500 + 358.280 + 321.500 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 358.280 + 396.810 + 396.810 + 358.280 + 396.810 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 478.540 + 436.950 + 396.810 + 436.950 + 396.810 + 396.810 + 565.540 + 565.540 + 478.540 + 436.950 + 396.810 + 396.810 + 565.540 + 656.430 + 610.600 + 436.950 + 436.950 + 396.810 + 521.460 + 702.730 + 702.730 + 565.540 + 478.540 + 436.950 + 478.540 + 610.600 + 656.430 + 610.600 + 478.540 + 396.810 + 358.280 + 321.500 + 321.500 + 286.600 + 56.730 + 45.290 + 35.510 + 20.400 + 14.810 + 10.370 + 286.600 + 358.280 + 436.950 + 610.600 + 656.430 + 656.430 + 702.730 + 795.090 + 795.090 + 795.090 + 795.090 + 656.430 + 610.600 + 795.090 + 795.090 + 795.090 + 795.090 + 656.430 + 478.540 + 749.120 + 795.090 + 795.090 + 795.090 + 656.430 + 436.950 + 565.540 + 795.090 + 795.090 + 795.090 + 702.730 + 436.950 + 521.460 + 565.540 + 565.540 + 610.600 + 656.430 + 436.950 + 478.540 + 610.600 + 610.600 + 565.540 + 610.600 + 521.460 + 436.950 + 610.600 + 749.120 + 795.090 + 749.120 + 521.460 + 436.950 + 610.600 + 749.120 + 795.090 + 749.120 + 565.540 + 436.950 + 610.600 + 749.120 + 795.090 + 749.120 + 610.600 + 436.950 + 610.600 + 749.120 + 795.090 + 749.120 + 656.430 + 436.950 + 610.600 + 749.120 + 795.090 + 749.120 + 702.730 + 478.540 + 610.600 + 749.120 + 749.120 + 656.430 + 478.540 + 396.810 + 436.950 + 436.950 + 396.810 + 656.430 + 656.430 + 521.460 + 656.430 + 795.090 + 839.950 + 839.950 + 795.090 + 610.600 + 610.600 + 702.730 + 749.120 + 656.430 + 656.430 + 656.430 + 749.120 + 839.950 + 882.800 + 839.950 + 795.090 + 749.120 + 749.120 + 839.950 + 882.800 + 839.950 + 795.090 + 656.430 + 702.730 + 795.090 + 839.950 + 882.800 + 839.950 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 839.950 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 749.120 + 702.730 + 656.430 + 702.730 + 795.090 + 882.800 + 839.950 + 795.090 + 749.120 + 839.950 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 795.090 + 839.950 + 882.800 + 882.800 + 795.090 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 795.090 + 882.800 + 882.800 + 882.800 + 795.090 + 749.120 + 795.090 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 749.120 + 656.430 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 795.090 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 795.090 + 702.730 + 702.730 + 795.090 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 795.090 + 610.600 + 656.430 + 749.120 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 839.950 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 10.370 + 4.407 + 922.460 + 922.460 + 922.460 + 922.460 + 4.407 + 922.460 + 20.400 + 10.370 + 6.950 + 922.460 + 922.460 + 922.460 + 10.370 + 20.400 + 10.370 + 6.950 + 6.950 + 922.460 + 922.460 + 14.810 + 10.370 + 14.810 + 20.400 + 10.370 + 10.370 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 20.400 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 10.370 + 10.370 + 4.407 + 922.460 + 922.460 + 922.460 + 922.460 + 6.950 + 6.950 + 6.950 + 922.460 + 10.370 + 6.950 + 6.950 + 4.407 + 4.407 + 6.950 + 6.950 + 4.407 + 4.407 + 6.950 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 27.260 + 20.400 + 20.400 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 20.400 + 27.260 + 20.400 + 20.400 + 922.460 + 10.370 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 10.370 + 20.400 + 20.400 + 20.400 + 6.950 + 10.370 + 20.400 + 882.800 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 20.400 + 10.370 + 10.370 + 20.400 + 20.400 + 20.400 + 10.370 + 10.370 + 10.370 + 839.950 + 10.370 + 14.810 + 10.370 + 10.370 + 4.407 + 2.611 + 4.407 + 4.407 + 4.407 + 4.407 + 6.950 + 2.611 + 2.611 + 2.611 + 2.611 + 2.611 + 4.407 + 882.800 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 4.407 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 4.407 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 795.090 + 795.090 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 749.120 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 749.120 + 656.430 + 749.120 + 839.950 + 882.800 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 882.800 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 749.120 + 749.120 + 749.120 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 749.120 + 702.730 + 610.600 + 656.430 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 795.090 + 702.730 + 610.600 + 702.730 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 702.730 + 656.430 + 749.120 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 702.730 + 749.120 + 749.120 + 656.430 + 610.600 + 702.730 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 749.120 + 656.430 + 749.120 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 839.950 + 882.800 + 922.460 + 882.800 + 882.800 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 702.730 + 610.600 + 610.600 + 656.430 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 882.800 + 839.950 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 882.800 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 795.090 + 795.090 + 795.090 + 749.120 + 702.730 + 565.540 + 565.540 + 656.430 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 795.090 + 795.090 + 882.800 + 882.800 + 795.090 + 795.090 + 882.800 + 882.800 + 839.950 + 749.120 + 795.090 + 839.950 + 839.950 + 839.950 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 882.800 + 839.950 + 795.090 + 702.730 + 702.730 + 749.120 + 749.120 + 702.730 + 565.540 + 436.950 + 358.280 + 396.810 + 478.540 + 656.430 + 749.120 + 749.120 + 795.090 + 749.120 + 795.090 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 749.120 + 749.120 + 795.090 + 839.950 + 795.090 + 749.120 + 656.430 + 610.600 + 656.430 + 656.430 + 702.730 + 702.730 + 749.120 + 795.090 + 795.090 + 749.120 + 610.600 + 610.600 + 565.540 + 565.540 + 610.600 + 656.430 + 656.430 + 610.600 + 565.540 + 478.540 + 610.600 + 656.430 + 656.430 + 610.600 + 565.540 + 358.280 + 321.500 + 521.460 + 565.540 + 610.600 + 656.430 + 749.120 + 749.120 + 702.730 + 749.120 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 882.800 + 839.950 + 795.090 + 795.090 + 795.090 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 749.120 + 610.600 + 656.430 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 839.950 + 839.950 + 795.090 + 749.120 + 749.120 + 656.430 + 749.120 + 749.120 + 702.730 + 656.430 + 702.730 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 610.600 + 478.540 + 521.460 + 521.460 + 478.540 + 610.600 + 656.430 + 702.730 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 656.430 + 749.120 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 565.540 + 521.460 + 521.460 + 565.540 + 610.600 + 610.600 + 478.540 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 749.120 + 565.540 + 521.460 + 656.430 + 795.090 + 795.090 + 795.090 + 749.120 + 396.810 + 396.810 + 478.540 + 656.430 + 610.600 + 478.540 + 436.950 + 396.810 + 321.500 + 358.280 + 396.810 + 396.810 + 321.500 + 286.600 + 321.500 + 321.500 + 222.940 + 122.040 + 69.970 + 122.040 + 656.430 + 656.430 + 749.120 + 749.120 + 702.730 + 610.600 + 521.460 + 436.950 + 610.600 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 749.120 + 795.090 + 795.090 + 749.120 + 702.730 + 656.430 + 610.600 + 521.460 + 396.810 + 521.460 + 565.540 + 521.460 + 396.810 + 521.460 + 610.600 + 610.600 + 610.600 + 565.540 + 610.600 + 656.430 + 702.730 + 656.430 + 656.430 + 610.600 + 610.600 + 521.460 + 396.810 + 521.460 + 565.540 + 610.600 + 610.600 + 565.540 + 478.540 + 396.810 + 358.280 + 436.950 + 478.540 + 478.540 + 396.810 + 478.540 + 565.540 + 565.540 + 565.540 + 656.430 + 702.730 + 702.730 + 656.430 + 702.730 + 749.120 + 749.120 + 702.730 + 610.600 + 656.430 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 749.120 + 321.500 + 610.600 + 610.600 + 656.430 + 749.120 + 795.090 + 795.090 + 795.090 + 749.120 + 702.730 + 610.600 + 610.600 + 702.730 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 610.600 + 358.280 + 702.730 + 749.120 + 702.730 + 656.430 + 702.730 + 749.120 + 702.730 + 749.120 + 749.120 + 749.120 + 702.730 + 610.600 + 610.600 + 610.600 + 565.540 + 436.950 + 358.280 + 396.810 + 565.540 + 565.540 + 478.540 + 436.950 + 396.810 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 286.600 + 286.600 + 396.810 + 478.540 + 521.460 + 521.460 + 521.460 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 749.120 + 749.120 + 749.120 + 702.730 + 702.730 + 702.730 + 656.430 + 656.430 + 610.600 + 656.430 + 702.730 + 702.730 + 702.730 + 656.430 + 656.430 + 565.540 + 521.460 + 396.810 + 396.810 + 521.460 + 610.600 + 610.600 + 656.430 + 656.430 + 702.730 + 702.730 + 656.430 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 656.430 + 610.600 + 521.460 + 396.810 + 396.810 + 478.540 + 521.460 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 702.730 + 656.430 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 610.600 + 610.600 + 565.540 + 521.460 + 396.810 + 358.280 + 396.810 + 436.950 + 478.540 + 478.540 + 396.810 + 321.500 + 286.600 + 286.600 + 286.600 + 358.280 + 396.810 + 478.540 + 521.460 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 565.540 + 521.460 + 436.950 + 358.280 + 358.280 + 436.950 + 478.540 + 521.460 + 521.460 + 565.540 + 610.600 + 610.600 + 610.600 + 565.540 + 610.600 + 610.600 + 565.540 + 521.460 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 321.500 + 286.600 + 321.500 + 358.280 + 396.810 + 358.280 + 286.600 + 286.600 + 396.810 + 436.950 + 478.540 + 521.460 + 565.540 + 565.540 + 565.540 + 610.600 + 610.600 + 565.540 + 478.540 + 478.540 + 478.540 + 565.540 + 610.600 + 565.540 + 478.540 + 396.810 + 478.540 + 521.460 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 610.600 + 610.600 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 565.540 + 565.540 + 521.460 + 478.540 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 358.280 + 396.810 + 436.950 + 478.540 + 521.460 + 521.460 + 565.540 + 521.460 + 521.460 + 521.460 + 478.540 + 478.540 + 478.540 + 521.460 + 565.540 + 565.540 + 565.540 + 521.460 + 521.460 + 521.460 + 478.540 + 436.950 + 436.950 + 396.810 + 321.500 + 286.600 + 253.710 + 286.600 + 321.500 + 358.280 + 321.500 + 286.600 + 321.500 + 396.810 + 436.950 + 436.950 + 478.540 + 436.950 + 396.810 + 358.280 + 396.810 + 396.810 + 396.810 + 321.500 + 286.600 + 253.710 + 286.600 + 358.280 + 396.810 + 436.950 + 436.950 + 478.540 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 521.460 + 478.540 + 478.540 + 478.540 + 396.810 + 396.810 + 321.500 + 286.600 + 321.500 + 396.810 + 436.950 + 478.540 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 610.600 + 610.600 + 610.600 + 565.540 + 565.540 + 565.540 + 610.600 + 610.600 + 565.540 + 478.540 + 436.950 + 521.460 + 565.540 + 565.540 + 565.540 + 521.460 + 396.810 + 396.810 + 358.280 + 478.540 + 565.540 + 565.540 + 565.540 + 610.600 + 565.540 + 565.540 + 565.540 + 521.460 + 521.460 + 478.540 + 478.540 + 521.460 + 521.460 + 478.540 + 396.810 + 396.810 + 436.950 + 436.950 + 396.810 + 321.500 + 286.600 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 358.280 + 286.600 + 253.710 + 286.600 + 286.600 + 396.810 + 396.810 + 436.950 + 478.540 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 478.540 + 396.810 + 436.950 + 436.950 + 436.950 + 396.810 + 321.500 + 286.600 + 253.710 + 286.600 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 436.950 + 478.540 + 478.540 + 396.810 + 358.280 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 286.600 + 222.940 + 222.940 + 222.940 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 565.540 + 565.540 + 521.460 + 521.460 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 521.460 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 321.500 + 286.600 + 253.710 + 286.600 + 358.280 + 396.810 + 396.810 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 478.540 + 436.950 + 436.950 + 396.810 + 321.500 + 358.280 + 396.810 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 286.600 + 286.600 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 286.600 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 286.600 + 253.710 + 222.940 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 253.710 + 253.710 + 253.710 + 321.500 + 358.280 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 358.280 + 286.600 + 321.500 + 358.280 + 396.810 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 286.600 + 286.600 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 358.280 + 396.810 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 286.600 + 253.710 + 286.600 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 253.710 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 253.710 + 253.710 + 286.600 + 253.710 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 321.500 + 321.500 + 286.600 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 286.600 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 222.940 + 222.940 + 222.940 + 222.940 + 222.940 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 286.600 + 253.710 + 286.600 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 286.600 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 286.600 + 286.600 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 358.280 + 396.810 + 396.810 + 436.950 + 478.540 + 478.540 + 436.950 + 396.810 + 396.810 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 358.280 + 286.600 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 396.810 + 358.280 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 521.460 + 521.460 + 521.460 + 521.460 + 478.540 + 478.540 + 521.460 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 358.280 + 321.500 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 358.280 + 321.500 + 286.600 + 321.500 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 321.500 + 286.600 + 286.600 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 396.810 + 358.280 + 286.600 + 286.600 + 286.600 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 286.600 + 253.710 + 222.940 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 222.940 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 286.600 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 286.600 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 286.600 + 253.710 + 222.940 + 222.940 + 194.360 + 222.940 + 222.940 + 194.360 + 222.940 + 222.940 + 253.710 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 286.600 + 286.600 + 286.600 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 222.940 + 253.710 + 253.710 + 222.940 + 222.940 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 222.940 + 222.940 + 222.940 + 253.710 + 253.710 + 286.600 + 286.600 + 286.600 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 194.360 + 222.940 + 194.360 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 321.500 + 358.280 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 286.600 + 286.600 + 222.940 + 253.710 + 286.600 + 286.600 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 222.940 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 358.280 + 321.500 + 358.280 + 396.810 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 396.810 + 358.280 + 286.600 + 253.710 + 253.710 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 253.710 + 253.710 + 222.940 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 321.500 + 286.600 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 321.500 + 358.280 + 358.280 + 358.280 + 358.280 + 286.600 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 253.710 + 253.710 + 286.600 + 286.600 + 286.600 + 358.280 + 396.810 + 358.280 + 358.280 + 321.500 + 253.710 + 253.710 + 253.710 + 321.500 + 358.280 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 358.280 + 321.500 + 253.710 + 286.600 + 321.500 + 396.810 + 396.810 + 436.950 + 396.810 + 396.810 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 436.950 + 436.950 + 436.950 + 436.950 + 436.950 + 478.540 + 478.540 + 521.460 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 396.810 + 358.280 + 286.600 + 253.710 + 321.500 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 253.710 + 253.710 + 253.710 + 286.600 + 286.600 + 253.710 + 253.710 + 222.940 + 253.710 + 286.600 + 286.600 + 321.500 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 358.280 + 286.600 + 286.600 + 358.280 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 436.950 + 396.810 + 396.810 + 436.950 + 396.810 + 396.810 + 321.500 + 286.600 + 253.710 + 321.500 + 396.810 + 396.810 + 396.810 + 396.810 + 478.540 + 521.460 + 521.460 + 521.460 + 521.460 + 478.540 + 436.950 + 436.950 + 436.950 + 436.950 + 396.810 + 358.280 + 396.810 + 478.540 + 478.540 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 521.460 + 478.540 + 478.540 + 478.540 + 521.460 + 478.540 + 478.540 + 436.950 + 396.810 + 396.810 + 358.280 + 321.500 + 286.600 + 321.500 + 321.500 + 321.500 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 286.600 + 321.500 + 358.280 + 396.810 + 396.810 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 321.500 + 286.600 + 321.500 + 396.810 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 358.280 + 321.500 + 253.710 + 253.710 + 321.500 + 396.810 + 396.810 + 436.950 + 436.950 + 396.810 + 396.810 + 396.810 + 396.810 + 396.810 + 321.500 + 396.810 + 478.540 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 478.540 + 436.950 + 521.460 + 565.540 + 565.540 + 610.600 + 610.600 + 565.540 + 565.540 + 521.460 + 436.950 + 396.810 + 478.540 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 478.540 + 478.540 + 396.810 + 358.280 + 286.600 + 286.600 + 358.280 + 396.810 + 436.950 + 478.540 + 436.950 + 396.810 + 436.950 + 521.460 + 565.540 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 521.460 + 478.540 + 565.540 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 610.600 + 610.600 + 565.540 + 521.460 + 521.460 + 521.460 + 521.460 + 521.460 + 478.540 + 521.460 + 521.460 + 521.460 + 478.540 + 478.540 + 436.950 + 396.810 + 358.280 + 286.600 + 253.710 + 286.600 + 358.280 + 396.810 + 436.950 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 396.810 + 321.500 + 286.600 + 286.600 + 286.600 + 286.600 + 253.710 + 253.710 + 286.600 + 358.280 + 396.810 + 396.810 + 436.950 + 478.540 + 521.460 + 521.460 + 521.460 + 565.540 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 565.540 + 610.600 + 565.540 + 565.540 + 521.460 + 521.460 + 521.460 + 478.540 + 396.810 + 286.600 + 396.810 + 478.540 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 610.600 + 610.600 + 565.540 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 478.540 + 436.950 + 396.810 + 436.950 + 436.950 + 396.810 + 358.280 + 321.500 + 286.600 + 253.710 + 222.940 + 253.710 + 286.600 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 478.540 + 478.540 + 478.540 + 478.540 + 436.950 + 396.810 + 321.500 + 396.810 + 436.950 + 478.540 + 521.460 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 565.540 + 656.430 + 656.430 + 702.730 + 702.730 + 702.730 + 656.430 + 656.430 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 656.430 + 610.600 + 656.430 + 702.730 + 702.730 + 702.730 + 656.430 + 656.430 + 610.600 + 521.460 + 436.950 + 521.460 + 610.600 + 610.600 + 610.600 + 565.540 + 610.600 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 565.540 + 521.460 + 478.540 + 396.810 + 321.500 + 321.500 + 396.810 + 396.810 + 396.810 + 358.280 + 286.600 + 253.710 + 321.500 + 358.280 + 321.500 + 321.500 + 253.710 + 286.600 + 321.500 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 521.460 + 565.540 + 565.540 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 656.430 + 656.430 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 656.430 + 610.600 + 610.600 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 702.730 + 656.430 + 610.600 + 521.460 + 396.810 + 436.950 + 521.460 + 565.540 + 610.600 + 610.600 + 656.430 + 656.430 + 702.730 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 610.600 + 565.540 + 521.460 + 436.950 + 396.810 + 358.280 + 286.600 + 286.600 + 396.810 + 436.950 + 478.540 + 521.460 + 565.540 + 610.600 + 610.600 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 565.540 + 521.460 + 436.950 + 396.810 + 321.500 + 396.810 + 521.460 + 565.540 + 610.600 + 656.430 + 656.430 + 702.730 + 702.730 + 656.430 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 749.120 + 656.430 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 656.430 + 610.600 + 478.540 + 478.540 + 565.540 + 656.430 + 702.730 + 749.120 + 749.120 + 749.120 + 702.730 + 702.730 + 656.430 + 656.430 + 610.600 + 565.540 + 396.810 + 396.810 + 478.540 + 565.540 + 565.540 + 565.540 + 521.460 + 478.540 + 358.280 + 321.500 + 396.810 + 478.540 + 565.540 + 610.600 + 656.430 + 656.430 + 656.430 + 702.730 + 702.730 + 702.730 + 702.730 + 749.120 + 749.120 + 749.120 + 702.730 + 702.730 + 702.730 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 656.430 + 610.600 + 610.600 + 565.540 + 565.540 + 521.460 + 436.950 + 396.810 + 321.500 + 286.600 + 321.500 + 396.810 + 436.950 + 478.540 + 521.460 + 565.540 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 610.600 + 565.540 + 521.460 + 478.540 + 396.810 + 396.810 + 396.810 + 358.280 + 321.500 + 396.810 + 478.540 + 565.540 + 610.600 + 610.600 + 656.430 + 656.430 + 702.730 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 749.120 + 702.730 + 656.430 + 610.600 + 521.460 + 565.540 + 656.430 + 749.120 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 795.090 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 702.730 + 656.430 + 656.430 + 610.600 + 565.540 + 478.540 + 436.950 + 436.950 + 396.810 + 286.600 + 286.600 + 396.810 + 478.540 + 521.460 + 565.540 + 610.600 + 610.600 + 610.600 + 610.600 + 565.540 + 396.810 + 436.950 + 521.460 + 521.460 + 396.810 + 396.810 + 565.540 + 656.430 + 702.730 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 702.730 + 749.120 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 749.120 + 656.430 + 565.540 + 478.540 + 565.540 + 656.430 + 702.730 + 656.430 + 656.430 + 749.120 + 749.120 + 749.120 + 795.090 + 749.120 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 795.090 + 795.090 + 795.090 + 749.120 + 656.430 + 610.600 + 565.540 + 656.430 + 749.120 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 795.090 + 749.120 + 749.120 + 656.430 + 610.600 + 565.540 + 436.950 + 521.460 + 521.460 + 521.460 + 396.810 + 396.810 + 478.540 + 565.540 + 610.600 + 656.430 + 702.730 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 749.120 + 702.730 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 882.800 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 795.090 + 702.730 + 656.430 + 656.430 + 610.600 + 478.540 + 478.540 + 565.540 + 656.430 + 702.730 + 749.120 + 749.120 + 749.120 + 749.120 + 702.730 + 656.430 + 656.430 + 565.540 + 521.460 + 396.810 + 396.810 + 396.810 + 396.810 + 436.950 + 521.460 + 521.460 + 610.600 + 702.730 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 795.090 + 702.730 + 610.600 + 565.540 + 656.430 + 749.120 + 795.090 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 882.800 + 882.800 + 839.950 + 795.090 + 656.430 + 610.600 + 702.730 + 795.090 + 795.090 + 795.090 + 795.090 + 656.430 + 702.730 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 795.090 + 795.090 + 749.120 + 702.730 + 656.430 + 565.540 + 478.540 + 478.540 + 610.600 + 656.430 + 656.430 + 610.600 + 521.460 + 565.540 + 565.540 + 565.540 + 610.600 + 702.730 + 749.120 + 795.090 + 795.090 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 795.090 + 749.120 + 610.600 + 702.730 + 795.090 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 795.090 + 656.430 + 610.600 + 656.430 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 795.090 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 795.090 + 795.090 + 749.120 + 656.430 + 478.540 + 521.460 + 656.430 + 749.120 + 795.090 + 795.090 + 839.950 + 839.950 + 795.090 + 795.090 + 656.430 + 610.600 + 702.730 + 795.090 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 839.950 + 795.090 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 656.430 + 610.600 + 702.730 + 795.090 + 795.090 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 795.090 + 795.090 + 565.540 + 478.540 + 565.540 + 656.430 + 656.430 + 610.600 + 656.430 + 749.120 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 795.090 + 839.950 + 882.800 + 882.800 + 882.800 + 795.090 + 749.120 + 702.730 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 1.420 + 1.420 + 396.810 + 521.460 + 749.120 + 749.120 + 702.730 + 749.120 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 749.120 + 795.090 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 795.090 + 610.600 + 565.540 + 610.600 + 749.120 + 795.090 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 839.950 + 795.090 + 795.090 + 882.800 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 702.730 + 656.430 + 749.120 + 795.090 + 882.800 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 839.950 + 795.090 + 795.090 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 882.800 + 795.090 + 749.120 + 749.120 + 795.090 + 839.950 + 795.090 + 749.120 + 839.950 + 882.800 + 882.800 + 839.950 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 839.950 + 882.800 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 795.090 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 795.090 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 795.090 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 749.120 + 795.090 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 839.950 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 882.800 + 839.950 + 795.090 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 795.090 + 749.120 + 749.120 + 795.090 + 882.800 + 882.800 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 795.090 + 839.950 + 882.800 + 839.950 + 795.090 + 839.950 + 882.800 + 882.800 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 839.950 + 882.800 + 882.800 + 839.950 + 795.090 + 839.950 + 882.800 + 839.950 + 749.120 + 795.090 + 839.950 + 795.090 + 795.090 + 795.090 + 839.950 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 795.090 + 749.120 + 795.090 + 839.950 + 795.090 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 795.090 + 749.120 + 795.090 + 839.950 + 795.090 + 749.120 + 795.090 + 795.090 + 749.120 + 702.730 + 795.090 + 795.090 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 749.120 + 795.090 + 795.090 + 749.120 + 702.730 + 795.090 + 795.090 + 749.120 + 749.120 + 795.090 + 795.090 + 702.730 + 749.120 + 795.090 + 795.090 + 702.730 + 795.090 + 795.090 + 795.090 + 702.730 + 795.090 + 795.090 + 702.730 + 702.730 + 795.090 + 795.090 + 656.430 + 702.730 + 749.120 + 702.730 + 656.430 + 702.730 + 749.120 + 702.730 + 656.430 + 749.120 + 795.090 + 702.730 + 749.120 + 795.090 + 749.120 + 702.730 + 795.090 + 795.090 + 702.730 + 749.120 + 795.090 + 749.120 + 656.430 + 795.090 + 749.120 + 702.730 + 702.730 + 749.120 + 749.120 + 702.730 + 749.120 + 795.090 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 795.090 + 795.090 + 839.950 + 839.950 + 882.800 + 839.950 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 795.090 + 795.090 + 795.090 + 795.090 + 749.120 + 795.090 + 749.120 + 702.730 + 702.730 + 702.730 + 656.430 + 610.600 + 702.730 + 702.730 + 610.600 + 702.730 + 702.730 + 656.430 + 656.430 + 610.600 + 521.460 + 656.430 + 656.430 + 565.540 + 610.600 + 610.600 + 521.460 + 521.460 + 478.540 + 521.460 + 656.430 + 656.430 + 565.540 + 656.430 + 656.430 + 478.540 + 436.950 + 478.540 + 478.540 + 521.460 + 521.460 + 521.460 + 656.430 + 610.600 + 478.540 + 436.950 + 436.950 + 478.540 + 565.540 + 565.540 + 565.540 + 565.540 + 478.540 + 396.810 + 396.810 + 436.950 + 610.600 + 610.600 + 565.540 + 565.540 + 521.460 + 396.810 + 396.810 + 436.950 + 610.600 + 610.600 + 565.540 + 565.540 + 478.540 + 436.950 + 396.810 + 478.540 + 521.460 + 521.460 + 565.540 + 521.460 + 478.540 + 478.540 + 478.540 + 436.950 + 478.540 + 521.460 + 565.540 + 565.540 + 565.540 + 565.540 + 521.460 + 396.810 + 436.950 + 521.460 + 521.460 + 565.540 + 565.540 + 565.540 + 1.420 + 1.420 + 436.950 + 478.540 + 478.540 + 565.540 + 521.460 + 436.950 + 1.420 + 1.420 + 396.810 + 396.810 + 478.540 + 521.460 + 478.540 + 396.810 + 1.420 + 1.420 + 321.500 + 396.810 + 521.460 + 478.540 + 396.810 + 321.500 + 1.420 + 1.420 + 436.950 + 478.540 + 478.540 + 436.950 + 358.280 + 321.500 + 1.420 + 1.420 + 396.810 + 396.810 + 396.810 + 396.810 + 358.280 + 1.420 + 1.420 + 321.500 + 358.280 + 358.280 + 396.810 + 358.280 + 286.600 + 1.420 + 1.420 + 321.500 + 321.500 + 358.280 + 358.280 + 321.500 + 1.420 + 4.407 + 253.710 + 321.500 + 358.280 + 358.280 + 321.500 + 1.420 + 2.611 + 1.420 + 321.500 + 358.280 + 321.500 + 286.600 + 1.420 + 2.611 + 1.420 + 286.600 + 321.500 + 286.600 + 286.600 + 1.420 + 1.420 + 1.420 + 286.600 + 286.600 + 286.600 + 253.710 + 1.420 + 1.420 + 2.611 + 253.710 + 286.600 + 286.600 + 1.420 + 1.420 + 1.420 + 1.420 + 253.710 + 286.600 + 286.600 + 1.420 + 1.420 + 2.611 + 1.420 + 1.420 + 286.600 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 286.600 + 286.600 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 286.600 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 396.810 + 1.420 + 1.420 + 396.810 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 10.370 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 2.611 + 10.370 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 1.420 + 1.420 + 1.420 + 1.420 + 1.420 + 6.950 + 6.950 + 1.420 + 1.420 + 1.420 + 4.407 + 6.950 + 4.407 + 1.420 + 1.420 + 1.420 + 6.950 + 6.950 + 2.611 + 1.420 + 1.420 + 4.407 + 6.950 + 6.950 + 1.420 + 1.420 + 1.420 + 6.950 + 6.950 + 1.420 + 1.420 + 1.420 + 6.950 + 10.370 + 2.611 + 1.420 + 1.420 + 4.407 + 10.370 + 4.407 + 1.420 + 1.420 + 4.407 + 10.370 + 4.407 + 1.420 + 1.420 + 1.420 + 10.370 + 6.950 + 1.420 + 1.420 + 4.407 + 10.370 + 1.420 + 1.420 + 1.420 + 6.950 + 10.370 + 1.420 + 1.420 + 1.420 + 10.370 + 10.370 + 1.420 + 1.420 + 1.420 + 14.810 + 1.420 + 1.420 + 1.420 + 14.810 + 14.810 + 1.420 + 1.420 + 1.420 + 20.400 + 1.420 + 1.420 + 1.420 + 27.260 + 2.611 + 1.420 + 1.420 + 35.510 + 2.611 + 1.420 + 1.420 + 35.510 + 2.611 + 2.611 + 2.611 + 45.290 + 2.611 + 2.611 + 2.611 + 45.290 + 2.611 + 2.611 + 2.611 + 56.730 + 2.611 + 2.611 + 2.611 + 69.970 + 2.611 + 2.611 + 253.710 + 2.611 + 2.611 + 286.600 + 286.600 + 2.611 + 286.600 + 321.500 + 321.500 + 321.500 + 358.280 + 358.280 + 358.280 + 396.810 + 396.810 + 396.810 + 436.950 + 436.950 + 436.950 + 478.540 + 521.460 + 478.540 + 521.460 + 565.540 + 565.540 + 610.600 + 610.600 + 610.600 + 656.430 + 656.430 + 702.730 + 702.730 + 702.730 + 749.120 + 749.120 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 795.090 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 839.950 + 839.950 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 839.950 + 839.950 + 839.950 + 795.090 + 839.950 + 922.460 + 922.460 + 839.950 + 839.950 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 957.440 + 957.440 + 957.440 + 957.440 + 957.440 + 922.460 + 922.460 + 922.460 + 882.800 + 882.800 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 + 922.460 diff --git a/makefile b/makefile new file mode 100755 index 0000000..1658f0d --- /dev/null +++ b/makefile @@ -0,0 +1,75 @@ +# Define directories containing source +SHELL = /bin/sh + +#FC = pgf90 +FC = gfortran + +# pgf90 flags: +#CFLAGS = -g -Mbounds + +# gfortran flags: +CFLAGS = -Jexec + +# xlf90 flags: +#CFLAGS = -g -C -qsuffix=f=F90 + +# Allowed SUFFIXES: +.SUFFIXES : +.SUFFIXES : .F90 .o .mod + +SDIR=./src +XDIR=./exec + +SOURCE = ${SDIR}/depstat_main.F90 + +OBJS = ${XDIR}/parameters.o \ + ${XDIR}/array_definitions.o \ + ${XDIR}/depstat_main.o \ + ${XDIR}/prepare.o \ + ${XDIR}/vcoordinate.o \ + ${XDIR}/fetchOneTime.o \ + ${XDIR}/getSensorNumber.o \ + ${XDIR}/average.o \ + ${XDIR}/report.o + +MODULES = ${XDIR}/parameters.o ${XDIR}/array_definitions.o + + +# Object dependencies: + +${XDIR}/depstat_main : $(OBJS) $(MODULES) + $(FC) -o ${XDIR}/depstat_main $(OBJS) + +${XDIR}/parameters.o : ${SDIR}/parameters.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/parameters.F90 -o ${XDIR}/parameters.o + +${XDIR}/depstat_main.o : ${SDIR}/depstat_main.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/depstat_main.F90 -o ${XDIR}/depstat_main.o + +${XDIR}/prepare.o : ${SDIR}/prepare.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/prepare.F90 -o ${XDIR}/prepare.o + +${XDIR}/vcoordinate.o : ${SDIR}/vcoordinate.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/vcoordinate.F90 -o ${XDIR}/vcoordinate.o + +${XDIR}/fetchOneTime.o : ${SDIR}/fetchOneTime.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/fetchOneTime.F90 -o ${XDIR}/fetchOneTime.o + +${XDIR}/getSensorNumber.o : ${SDIR}/getSensorNumber.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/getSensorNumber.F90 -o ${XDIR}/getSensorNumber.o + +${XDIR}/average.o : ${SDIR}/average.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/average.F90 -o ${XDIR}/average.o + +${XDIR}/report.o : ${SDIR}/report.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/report.F90 -o ${XDIR}/report.o + +${XDIR}/array_definitions.o : ${SDIR}/array_definitions.F90 + $(FC) -c $(CFLAGS) $(INCFLAG) ${SDIR}/array_definitions.F90 -o ${XDIR}/array_definitions.o + +# + +clean : + rm -f ${OBJS} ${XDIR}/*.mod ${SDIR}/*~ +clobber : + rm -f ${OBJS} ${XDIR}/*.mod ${SDIR}/*~ ${XDIR}/depstat_main diff --git a/nam/satellite_instruments.nml b/nam/satellite_instruments.nml new file mode 100755 index 0000000..e23c807 --- /dev/null +++ b/nam/satellite_instruments.nml @@ -0,0 +1,14 @@ +&satellite_instruments +satinst%noaa18_amsua=.true. +satinst%noaa19_amsua=.true. +satinst%metopb_amsua=.true. +satinst%metopc_amsua=.true. +satinst%noaa19_mhs=.true. +satinst%metopb_mhs=.true. +satinst%metopc_mhs=.true. +satinst%fy3d_mwhs2=.true. +satinst%snpp_atms=.true. +satinst%noaa20_atms=.true. +satinst%metopb_iasi=.true. +satinst%metopc_iasi=.true. +/ diff --git a/scripts/depstat.sh b/scripts/depstat.sh new file mode 100755 index 0000000..fe7c5ee --- /dev/null +++ b/scripts/depstat.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash + +# This program produces the statistics for plotting + +bold=$(tput bold) +normal=$(tput sgr0) +unline=$(tput smul) + +PROGNAME=`basename $0` + +# Define a usage function +usage() { + +cat << USAGE + +${bold}NAME${normal} + ${PROGNAME} - generates departure statistics for plotting + +${bold}USAGE${normal} + ${PROGNAME} -c + -t + -f + -l + [ -h ] +${bold}DESCRIPTION${normal} + This program produces the ASCII files + containing departure statistics suitable + for plotting. + +${bold}OPTIONS${normal} + + -c ${unline}control-name${normal} + The short 4-digit name for control run + (e.g. cont) + + -t ${unline}test-name${normal} + The short 4-digit name for test run + (e.g. test) + + -f ${unline}first-dtg${normal} + The first DTG + + -l ${unline}last-dtg${normal} + The last DTG + + -h Help! Print usage information. + +USAGE +} + +CNAME=DUMMY +TNAME=DUMMY +FDTG=DUMMY +LDTG=DUMMY + +this_script_loc="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +appdir=$(dirname ${this_script_loc}) +exedir=${appdir}/libexec +bindir=${appdir}/bin +libdir=${appdir}/lib + +wdir=$( pwd ) + +if [ ${#} -eq 0 ]; then + echo "No command line arguments provided" + echo "Try '${PROGNAME} -h' for more information" + exit 1 +fi + +while getopts c:t:f:l:h option +do + case $option in + c) + CNAME=$OPTARG + ;; + t) + TNAME=$OPTARG + ;; + f) + FDTG=$OPTARG + ;; + l) + LDTG=$OPTARG + ;; + h) + usage + exit 0 + ;; + *) + echo + echo "Try '${PROGNAME} -h' for more information" + ;; + esac +done + +whoami > uid.txt + +g="large" # hyperspectral long-wave channels displayed also in channel index space +p="0" # Treat AIRS and CrIS separately from each other + +if [ "${g}" = "large" ]; then + o=1 + lwwn=1 +else + o=0 + lwwn=0 +fi + + +#Produce statistics + +rank=1 +${exedir}/depstat_main ${TNAME} ${CNAME} ${FDTG} ${LDTG} ${g} ${rank} ${p} + + +#Create directory for output + +fname="number_of_days.txt" +if [ -s ${fname} ]; then + read n < ${fname} +else + n=0 +fi +rm -f ${fname} + +if [ ${n} -lt 0 ]; then + exit +fi + + +indir=${wdir}/${TNAME}_${CNAME}_${n}days/data/ +outdir=${wdir}/${TNAME}_${CNAME}_${n}days/figs/ +mkdir -p $indir +mkdir -p $outdir + +mv ${TNAME}_${CNAME}_*_om?_* $indir +mv ${TNAME}_*_om?_* $indir +mv ${CNAME}_*_om?_* $indir +mv ${TNAME}_*_bcor_* $indir +mv ${CNAME}_*_bcor_* $indir +mv ${TNAME}_${CNAME}_datacount_summary $indir + +#--------------- Run python plot ------------------------------------ + +python3 plotdepstat.py ${CNAME} ${TNAME} ${indir} ${outdir} + +exit diff --git a/scripts/plotdepstat.py b/scripts/plotdepstat.py new file mode 100644 index 0000000..7c9b783 --- /dev/null +++ b/scripts/plotdepstat.py @@ -0,0 +1,330 @@ +import sys +import numpy as np +import matplotlib as mpl +mpl.use('Agg') +import matplotlib.pyplot as plt +from matplotlib.ticker import ScalarFormatter, FixedLocator + +ref=sys.argv[1] +exp=sys.argv[2] +ddir=sys.argv[3] +out=sys.argv[4] + + +obtype=['tempu','tempv','tempuv','tempt','tempq','tempz','temprh', + 'airepu','airepv','airepuv','airept', + 'tpau','tpav','tpauv','tat', + 'radarrh','radarwind', + 'amsua','mhs','mwhs2', + 'iasiwv','iasilw','iasilw_wn', + 'surface','atms', + 'criswv','crislw','crislw_wn'] + +plottype=['pressure_log','pressure_log','pressure_log','pressure_log','pressure','pressure_log','pressure', + 'pressure','pressure','pressure','pressure', + 'pressure_log','pressure_log','pressure_log','pressure_log', + 'pressure','pressure', + 'channel','channel','channel', + 'ppressure','ppressure_log','lwwn', + 'surface','channel2', + 'ppressure','ppressure_log','lwwn'] + +titles=['TEMP U','TEMP V','TEMP U/V','TEMP T','TEMP Q','TEMP Z','TEMP RH', + 'AIREP U','AIREP V','AIREP U/V','AIREP T', + 'TEMP/AIREP U','TEMP/AIREP V','TEMP/AIREP U/V','TEMP/AIREP T', + 'Radar RH', 'Radar Wind', + 'AMSU-A','MHS','MWHS2', + 'IASI WV','IASI LW','IASI LW channel index space', + 'SURFACE','ATMS', + 'CrIS WV','CrIS LW','CrIS LW channel index space'] + +ylabels=['Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]', + 'Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]', + 'Pressure [hPa]','Pressure [hPa]','Pressure [hPa]','Pressure [hPa]', + 'Pressure [hPa]','Pressure [hPa]', + 'Channel index','Channel index','Channel index', + 'Peak pressure [hPa]','Peak pressure [hPa]','Channel', + '','Channel index', + 'Peak pressure [hPa]','Peak pressure [hPa]','Channel'] + +xlabels=['Mean','Mean','Std','Std','Norm Std','Norm Std'] +subtitles=['OmA Mean', 'OmB Mean', 'OmA St.Dev.', 'OmB St.Dev.', 'Control-normalized OmA St.Dev', 'Control-normalized OmB St.Dev'] + +limdefmean=[{'xmin':-0.0014, 'xmax':0.0014, 'xticks':[-0.001,0.001], 'dx':0.0002}, + {'xmin':-0.005, 'xmax':0.005, 'xticks':[-0.003,0.003], 'dx':0.001}, + {'xmin':-0.014, 'xmax':0.014, 'xticks':[-0.01,0.01], 'dx':0.002}, + {'xmin':-0.05, 'xmax':0.05, 'xticks':[-0.03,0.03], 'dx':0.01}, + {'xmin':-0.14, 'xmax':0.14, 'xticks':[-0.1,0.1], 'dx':0.02}, + {'xmin':-0.5, 'xmax':0.5, 'xticks':[-0.3,0.3], 'dx':0.1}, + {'xmin':-1.4, 'xmax':1.4, 'xticks':[-1.,1.], 'dx':0.2}, + {'xmin':-5., 'xmax':5., 'xticks':[-3.,3.], 'dx':1.}, + {'xmin':-14., 'xmax':14., 'xticks':[-10.,10.], 'dx':2.}] + +limdefstd=[{'xmin':0, 'xmax':0.00012, 'xticks':[0,0.0001], 'dx':0.00002}, + {'xmin':0, 'xmax':0.0005, 'xticks':[0,0.0002,0.0004], 'dx':0.0001}, + {'xmin':0, 'xmax':0.0012, 'xticks':[0,0.001], 'dx':0.0002}, + {'xmin':0, 'xmax':0.005, 'xticks':[0,0.002,0.004], 'dx':0.001}, + {'xmin':0, 'xmax':0.012, 'xticks':[0,0.01], 'dx':0.002}, + {'xmin':0, 'xmax':0.05, 'xticks':[0,0.02,0.04], 'dx':0.01}, + {'xmin':0, 'xmax':0.12, 'xticks':[0,0.1], 'dx':0.02}, + {'xmin':0, 'xmax':0.5, 'xticks':[0,0.2,0.4], 'dx':0.1}, + {'xmin':0, 'xmax':1.2, 'xticks':[0,1.], 'dx':0.2}, + {'xmin':0, 'xmax':5., 'xticks':[0,2.,4.], 'dx':1.}, + {'xmin':0, 'xmax':12, 'xticks':[0,10.], 'dx':2.}] + +limdefnorm=[] + +def deflim_mean(xval1,xval2): + lims=np.array([0.0014, 0.005, 0.014, 0.05, 0.14, 0.5, 1.4, 5., 14.]) + if ((np.abs(xval1[0]) > 2.2*np.max(np.abs(xval1[1:]))) or (np.abs(xval2[0]) > 2.2*np.max(np.abs(xval2[1:])))) and (len(xval1)>5) and (len(xval2)>5): + xext = np.max(np.abs(np.concatenate((xval1[1:],xval2[1:]), axis=None))) + else: + xext = np.max(np.abs(np.concatenate((xval1,xval2), axis=None))) + + if (len(lims[lims>xext])==0): + x = -1 + else: + x = np.where(lims == lims[lims>xext][0])[0][0] #find nearest x-axis limit value ge xext + + return limdefmean[x] + +def deflim_std(xval1,xval2): + lims=np.array([0.00012, 0.0005, 0.0012, 0.005, 0.012, 0.05, 0.12, 0.5, 1.2, 5.]) + xext = np.max(np.concatenate((xval1[1:],xval2[1:]), axis=None)) + if (len(lims[lims>xext])==0): + x = -1 + else: + x = np.where(lims == lims[lims>xext][0])[0][0] #find nearest x-axis limit value ge xext + return limdefstd[x] + +def deflim_norm(xval,left,right): + ticklims=np.array([0.4,0.5,0.6,0.7,0.8,0.85,0.9,0.95,0.96,0.97,0.98,0.99,0.995,0.999]) + lims=np.array([0.,0.,0.3,0.6,0.65,0.75,0.86,0.9,0.93,0.95,0.97,0.98,0.99,0.998]) + dx=np.array([0.2,0.1,0.1,0.1,0.05,0.05,0.02,0.01,0.01,0.01,0.01,0.002,0.001,0.0002]) + xext = np.max(np.abs(1-np.concatenate(((xval+left)[1:],(xval+right)[1:]), axis=None))) + + if (len(ticklims[ticklims>xext])==0): + x = 0 + else: + x = np.where(ticklims == ticklims[ticklims>(1-xext)][0])[0][0] + xticks = [ticklims[x],2-ticklims[x]] + + return {'xmin':lims[x], 'xmax':2-lims[x], 'xticks':xticks, 'dx':dx[x]} + + + +for i in range(len(obtype)): + fig, axs = plt.subplots(3, 2, figsize=(8.27,11.69), constrained_layout=True) + fig.suptitle(titles[i], fontsize='xx-large') + + fin=[ddir+ref+'_'+obtype[i]+'_oma_mean', ddir+exp+'_'+obtype[i]+'_oma_mean', + ddir+ref+'_'+obtype[i]+'_omb_mean', ddir+exp+'_'+obtype[i]+'_omb_mean', + ddir+ref+'_'+obtype[i]+'_oma_sdev', ddir+exp+'_'+obtype[i]+'_oma_sdev', + ddir+ref+'_'+obtype[i]+'_omb_sdev', ddir+exp+'_'+obtype[i]+'_omb_sdev', + ddir+exp+'_'+ref+'_'+obtype[i]+'_oma_norm', + ddir+exp+'_'+ref+'_'+obtype[i]+'_omb_norm'] + + for j,ax in enumerate(axs.flat): + if j<4: #plots nr 1-4 + datain1=np.loadtxt(fin[2*j]); datain2=np.loadtxt(fin[2*j+1]) + + if len(datain1)!=0 and len(datain2)!=0: #if datafile is NOT empty + profile1=datain1[:,0]; vlev=datain1[:,1]; profile2=datain2[:,0] + + if j<2: #mean plots + ax.axvline(x = 0, color = 'k', linestyle = '--', linewidth=0.7) + xdict = deflim_mean(profile1,profile2) + ax.set_xlim(xdict['xmin'],xdict['xmax']) + ax.set_xticks(xdict['xticks']) + ax.set_xticks(np.arange(xdict['xmin'], xdict['xmax'], xdict['dx']), minor=True) + elif j>=2: #std plots + xdict = deflim_std(profile1,profile2) + for l in range(1,len(xdict['xticks'])): + ax.axvline(x = xdict['xticks'][l], color = 'k', linestyle = '--', linewidth=0.7) + ax.set_xlim(xdict['xmin'],xdict['xmax']) + ax.set_xticks(xdict['xticks']) + ax.set_xticks(np.arange(xdict['xmin'], xdict['xmax'], xdict['dx']), minor=True) + + if plottype[i]=='pressure_log' or plottype[i]=='ppressure_log': + ax.semilogy(profile2,vlev,color='red', label=exp) + ax.semilogy(profile1,vlev,color='blue', label=ref) + ax.yaxis.set_major_formatter(ScalarFormatter()) + ax.yaxis.set_major_locator(FixedLocator([10.,30.,100.,300.,1000.])) + ax.set_ylim(top=1000,bottom=4) + ax.legend(loc='upper left', frameon=False) + ax.invert_yaxis() + elif plottype[i]=='pressure' or plottype[i]=='ppressure': + ax.plot(profile2,vlev,color='red', label=exp) + ax.plot(profile1,vlev,color='blue', label=ref) + ax.set_ylim(top=1000, bottom=0) + ax.set_yticks([0.,200.,400.,600.,800.,1000.]) + ax.legend(loc='upper left', frameon=False) + ax.invert_yaxis() + elif plottype[i]=='surface': + ax.plot(profile2,vlev,color='red', label=exp) + ax.plot(profile1,vlev,color='blue', label=ref) + ax.set_ylim(top=8, bottom=1) + ax.set_yticks([1.,2.,3.,4.,5.,6.,7.,8.]) + ax.set_yticklabels(['In-situ Zs','In-situ U/V10m','APD','In-Situ RH2m','In-situ Q2m','In-situ T2m','Skin T','ASCAT U/V']) + ax.legend(loc='upper left', frameon=False) + elif plottype[i]=='lwwn': + ax.plot(profile2,vlev,color='red', label=exp, linewidth=0.7) + ax.plot(profile1,vlev,color='blue', label=ref, linewidth=0.7) + ax.set_ylim(top=4500, bottom=0) + ax.set_yticks([0.,500.,1000.,1500.,2000.,2500.,3000.,3500.,4000.]) + ax.legend(loc='upper left', frameon=False) + elif plottype[i]=='channel': + ax.plot(profile2,vlev,color='red', label=exp) + ax.plot(profile1,vlev,color='blue', label=ref) + ax.set_ylim(top=np.max(vlev)+0.5, bottom=np.min(vlev)-0.5) + ax.set_yticks(np.arange(np.min(vlev),np.max(vlev)+1,1)) + ax.legend(loc='upper left', frameon=False) + elif plottype[i]=='channel2': + pos = np.where(np.diff(vlev) > 1)[0] #find the discontinuity spot + dy = np.diff(vlev)[0] #find difference between levels + add = np.arange(float(vlev[pos])+1, float(vlev[pos+1]), dy) #add missing levels + addnan = np.empty(len(add)) + addnan[:] = np.nan + newvlev = np.insert(vlev, pos+1, add) + newprofile1 = np.insert(profile1, pos+1, addnan) #apply nan to missing levels to produce the + newprofile2 = np.insert(profile2, pos+1, addnan) + ax.plot(newprofile2,newvlev,color='red', label=exp) + ax.plot(newprofile1,newvlev,color='blue', label=ref) + ax.set_ylim(top=np.max(newvlev)+0.5, bottom=np.min(newvlev)-0.5) + ax.set_yticks(np.arange(np.min(newvlev),np.max(newvlev)+1,1)) + + + else: #if datafile is empty + if j<2: + ax.axvline(x = 0, color = 'k', linestyle = '--', linewidth=0.7) + xdict=limdefmean[-1] + ax.set_xlim(xdict['xmin'],xdict['xmax']) + ax.set_xticks(xdict['xticks']) + ax.set_xticks(np.arange(xdict['xmin'], xdict['xmax'], xdict['dx']), minor=True) + elif j>=2: + xdict=limdefstd[-1] + for l in range(1,len(xdict['xticks'])): + ax.axvline(x = xdict['xticks'][l], color = 'k', linestyle = '--', linewidth=0.7) + ax.set_xlim(xdict['xmin'],xdict['xmax']) + ax.set_xticks(xdict['xticks']) + ax.set_xticks(np.arange(xdict['xmin'], xdict['xmax'], xdict['dx']), minor=True) + + if plottype[i]=='pressure_log' or plottype[i]=='ppressure_log': + ax.set_yscale('log') + ax.yaxis.set_major_formatter(ScalarFormatter()) + ax.yaxis.set_major_locator(FixedLocator([10.,30.,100.,300.,1000.])) + ax.set_ylim(top=1000,bottom=4) + ax.invert_yaxis() + elif plottype[i]=='pressure' or plottype[i]=='ppressure': + ax.set_ylim(top=1000, bottom=0) + ax.set_yticks([0.,200.,400.,600.,800.,1000.]) + ax.legend(loc='upper left', frameon=False) + ax.invert_yaxis() + elif plottype[i]=='surface': + ax.set_yticks([1,2,3,4,5,6,7,8]) + ax.set_yticklabels(['In-situ Zs','In-situ U/V10m','APD','In-Situ RH2m','In-situ Q2m','In-situ T2m','Skin T','ASCAT U/V']) + elif plottype[i]=='lwwn': + ax.set_ylim(top=4500, bottom=0) + ax.set_yticks([0.,500.,1000.,1500.,2000.,2500.,3000.,3500.,4000.]) + elif plottype[i]=='channel' or plottype[i]=='channel2': + if obtype[i]=='mhs': + nchan=5 #number of channels + elif obtype[i]=='mwhs2' or obtype[i]=='amsua': + nchan=15 + elif obtype[i]=='atms': + nchan=22 + ax.set_ylim(top=0.5, bottom=nchan+0.5) + ax.set_yticks(np.arange(1,nchan+1,1)) + + + else: #plots nr 4-5 + datain=np.loadtxt(fin[2*j-j%2]) + if len(datain)!=0: #if datafile is NOT empty + profile=datain[:,0]; vlev=datain[:,1] + lconf=datain[:,2]; rconf=datain[:,3] + ax.axvline(x = 1, color = 'k', linestyle = '--', linewidth=1) + xdict = deflim_norm(profile,lconf,rconf) + ax.set_xlim(xdict['xmin'],xdict['xmax']) + ax.set_xticks(xdict['xticks']) + ax.set_xticks(np.arange(xdict['xmin'], xdict['xmax'], xdict['dx']), minor=True) + if plottype[i]=='pressure_log' or plottype[i]=='ppressure_log': + ax.semilogy(profile, vlev, color='r',linewidth=2) + ax.hlines(y = vlev, xmin=profile+lconf, xmax=profile+rconf, color = 'red', linewidth=2) + ax.yaxis.set_major_formatter(ScalarFormatter()) + ax.yaxis.set_major_locator(FixedLocator([10.,30.,100.,300.,1000.])) + ax.set_ylim(top=1050,bottom=4) + ax.invert_yaxis() + elif plottype[i]=='pressure' or plottype[i]=='ppressure': + ax.plot(profile, vlev, color='r',linewidth=2) + ax.hlines(y = vlev, xmin=profile+lconf, xmax=profile+rconf, color = 'red', linewidth=2) + ax.set_ylim(top=1050, bottom=0) + ax.set_yticks([0.,200.,400.,600.,800.,1000.]) + ax.invert_yaxis() + elif plottype[i]=='surface': + ax.plot(profile, vlev, color='r',linewidth=2) + ax.hlines(y = vlev, xmin=profile+lconf, xmax=profile+rconf, color = 'red', linewidth=2) + ax.set_ylim(top=8, bottom=1) + ax.set_yticks([1,2,3,4,5,6,7,8]) + ax.set_yticklabels(['In-situ Zs','In-situ U/V10m','APD','In-Situ RH2m','In-situ Q2m','In-situ T2m','Skin T','ASCAT U/V']) + elif plottype[i]=='lwwn': + ax.plot(profile, vlev, color='r',linewidth=0.7) + ax.hlines(y = vlev, xmin=profile+lconf, xmax=profile+rconf, color = 'red', linewidth=0.7) + ax.set_ylim(top=4500, bottom=0) + ax.set_yticks([0.,500.,1000.,1500.,2000.,2500.,3000.,3500.,4000.]) + elif plottype[i]=='channel': + ax.plot(profile, vlev, color='r') + ax.hlines(y = vlev, xmin=profile+lconf, xmax=profile+rconf, color = 'red') + ax.set_ylim(top=np.max(vlev)+0.5, bottom=np.min(vlev)-0.5) + ax.set_yticks(np.arange(np.min(vlev),np.max(vlev)+1,1)) + elif plottype[i]=='channel2': + pos = np.where(np.diff(vlev) > 1)[0] #find the discontinuity spot + dy = np.diff(vlev)[0] #find difference between levels + add = np.arange(float(vlev[pos])+1, float(vlev[pos+1]), dy) #add missing levels + addnan = np.empty(len(add)) + addnan[:] = np.nan + newvlev = np.insert(vlev, pos+1, add) + newprofile = np.insert(profile, pos+1, addnan) #apply nan to missing levels to produce the + newlconf = np.insert(lconf, pos+1, addnan) #discontinuity in the profile plot + newrconf = np.insert(rconf, pos+1, addnan) + ax.plot(newprofile, newvlev, color='r') + ax.hlines(y = newvlev, xmin=newprofile+newlconf, + xmax=newprofile+newrconf, color = 'red') + ax.set_ylim(top=np.max(newvlev)+0.5, bottom=np.min(newvlev)-0.5) + ax.set_yticks(np.arange(np.min(newvlev),np.max(newvlev)+1,1)) + + else: #if datafile is empty + ax.axvline(x = 1, color = 'k', linestyle = '--', linewidth=1) + ax.set_xlim(0.99,2-0.99) + ax.set_xticks([0.995,2-0.995]) + ax.set_xticks(np.arange(0.99, 2-0.99, 0.001), minor=True) + if plottype[i]=='pressure_log' or plottype[i]=='ppressure_log': + ax.set_yscale('log') + ax.yaxis.set_major_formatter(ScalarFormatter()) + ax.yaxis.set_major_locator(FixedLocator([10.,30.,100.,300.,1000.])) + ax.set_ylim(top=1050,bottom=4) + ax.invert_yaxis() + elif plottype[i]=='pressure' or plottype[i]=='ppressure': + ax.set_ylim(top=1050, bottom=0) + ax.set_yticks([0.,200.,400.,600.,800.,1000.]) + ax.invert_yaxis() + elif plottype[i]=='surface': + ax.set_yticks([1,2,3,4,5,6,7,8]) + ax.set_yticklabels(['In-situ Zs','In-situ U/V10m','APD','In-Situ RH2m','In-situ Q2m','In-situ T2m','Skin T','ASCAT U/V']) + elif plottype[i]=='lwwn': + ax.set_ylim(top=4500, bottom=0) + ax.set_yticks([0.,500.,1000.,1500.,2000.,2500.,3000.,3500.,4000.]) + elif plottype[i]=='channel' or plottype[i]=='channel2': + if obtype[i]=='mhs': + nchan=5 #number of channels + elif obtype[i]=='mwhs2' or obtype[i]=='amsua': + nchan=15 + elif obtype[i]=='atms': + nchan=22 + ax.set_ylim(top=0.5, bottom=nchan+0.5) + ax.set_yticks(np.arange(1,nchan+1,1)) + + ax.set(ylabel=ylabels[i], xlabel=xlabels[j]) + ax.set_title(subtitles[j]) + ax.grid(which='major', axis='both', linestyle=':') + + plt.savefig(out+obtype[i]+'.png') diff --git a/scripts/rundepstat.sh b/scripts/rundepstat.sh new file mode 100755 index 0000000..3126d3b --- /dev/null +++ b/scripts/rundepstat.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash + +# This script will write ODB dara to ASCII format + +bold=$(tput bold) +normal=$(tput sgr0) +unline=$(tput smul) + +PROGNAME=`basename $0` + +# Define a usage function +usage() { + +cat << USAGE + +${bold}NAME${normal} + ${PROGNAME} - write ODB data to ASCII files + +${bold}USAGE${normal} + ${PROGNAME} -d + -c + -t + [ -h ] + +${bold}DESCRIPTION${normal} + Untar the preliminarily checked out CCMA ODB files + and write the information to ASCII format. The ODB + files should be named as follows: + __odb_ccma.tar + where NAME is strictly 4-digit-long. + +${bold}OPTIONS${normal} + -d ${unline}input-dir${normal} + Input directory containing CCMA ODB tar files + in the format __odb_ccma.tar + + -c ${unline}control-name${normal} + The short 4-digit name for control run + experiment data (e.g. cont) + + -t ${unline}test-name${normal} + The short 4-digit name for test run + experiment data (e.g. test) + + -h Help! Print usage information. + +USAGE +} + + +INPDIR=DUMMY +CNAME=DUMMY +TNAME=DUMMY + +this_script_loc="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +appdir=$(dirname ${this_script_loc}) +bindir=${appdir}/bin +libdir=${appdir}/lib +exedir=${appdir}/libexec + +wdir=$( pwd ) +tmpdir=${wdir}/temp + +if [ ${#} -eq 0 ]; then + echo "No command line arguments provided" + echo "Try '${PROGNAME} -h' for more information" + exit 1 +fi + +while getopts d:c:t:h option +do + case $option in + d) + INPDIR=$OPTARG + ;; + c) + CNAME=$OPTARG + ;; + t) + TNAME=$OPTARG + ;; + h) + usage + exit 0 + ;; + *) + echo + echo "Try '${PROGNAME} -h' for more information" + ;; + esac +done + +if [ ${INPDIR} == "DUMMY" ]; then + echo "Please define input data directory using -d" + echo "Try '${PROGNAME} -h' for more information" + exit 1 +fi +if [ ${CNAME} == "DUMMY" ]; then + echo "Please define control exp 4-digit short name using -c" + echo "Try '${PROGNAME} -h' for more information" + exit 1 +fi +if [ ${TNAME} == "DUMMY" ]; then + echo "Please define test exp 4-digit short name using -t" + echo "Try '${PROGNAME} -h' for more information" + exit 1 +fi + + +mkdir -p ${wdir}/depstat_tmp_${CNAME} +mkdir -p ${wdir}/depstat_tmp_${TNAME} +mkdir -p ${tmpdir} + +cd $INPDIR +dtgs=$( ls ${CNAME}*.tar | cut -c 6-15 ) +cd ${tmpdir} + +for expname in $CNAME $TNAME +do + for dtg in $dtgs + do + tar -xf ${INPDIR}/${expname}_${dtg}_odb_ccma.tar -C . + cd odb_ccma/CCMA + j=0 + for i in conv radar nonconv + do + j=`expr ${j} + 1` + rm -f ${tmpdir}/extract_${i}.dat + + if [ ${j} -eq 1 ] ; then + odbsql -q "select reportype,-1,-2,obstype,varno,vertco_reference_1,lon,lat,datum_status,obsvalue,fg_depar,an_depar,biascorr_fg,time from hdr,body" > ${tmpdir}/extract_${i}.dat + + elif [ ${j} -eq 2 ] ; then + odbsql -q "select -3,-1,-2,obstype,varno,vertco_reference_1,lon,lat,datum_status,obsvalue,fg_depar,an_depar,biascorr_fg,time from hdr,body" > ${tmpdir}/extract_${i}.dat + + else + odbsql -q "select reportype,satellite_identifier,satellite_instrument,obstype,varno,vertco_reference_1,lon,lat,datum_status,obsvalue,fg_depar,an_depar,biascorr_fg,time from hdr,body,sat where satellite_instrument is not null" > ${tmpdir}/extract_${i}a.dat + + odbsql -q "select reportype,satellite_identifier,sensor,obstype,varno,vertco_reference_1,lon,lat,datum_status,obsvalue,fg_depar,an_depar,biascorr_fg,time from hdr,body,sat where satellite_instrument is null" > ${wdir}/temp/extract_${i}b.dat + + cat ${tmpdir}/extract_${i}a.dat ${tmpdir}/extract_${i}b.dat > ${tmpdir}/extract_${i}.dat + fi + + ls -l ${tmpdir}/extract_${i}.dat + + done + + cd ${tmpdir} + rm -f obstat.log obstat.out + + ${exedir}/obstat.x + + cat obstat.log obstat.out > ${expname}_${dtg}.txt + mv ${expname}_${dtg}.txt ${wdir}/depstat_tmp_${expname}/. + + done +done + +module unload odb_api +rm -R $tmpdir +exit diff --git a/src/array_definitions.F90 b/src/array_definitions.F90 new file mode 100755 index 0000000..ce4cec7 --- /dev/null +++ b/src/array_definitions.F90 @@ -0,0 +1,32 @@ +module array_definitions + + use parameters, only : & + jpim, jprb, maxtimes, nobgroups, & + nlevels_temp, nlevels_rttov, niasich + implicit none + + character(len=4) :: expid, conid + character(len=10) :: cdate_first, cdate_last + character(len=10), dimension(nobgroups) :: groupid + + integer(kind=jpim) :: nlevels + integer(kind=jpim) :: ntimeslots + integer(kind=jpim), dimension(maxtimes) :: idate_array + integer(kind=jpim) :: irank + + real(kind=jprb), dimension(nlevels_temp) :: levels_temp + real(kind=jprb), dimension(nlevels_rttov) :: levels_rttov + real(kind=jprb), dimension(niasich) :: iasi_peakpres + + real(kind=jprb), dimension(:,:,:,:,:,:), allocatable :: statarray + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: statistic + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: stat95l + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: stat95u + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: stat99l + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: stat99u + real(kind=jprb), dimension(:,:,:,:,:), allocatable :: hemispheric + real(kind=jprb), dimension(:,:,:,:), allocatable :: global + real(kind=jprb), dimension(:,:,:), allocatable :: stat95_bg + real(kind=jprb), dimension(:,:,:), allocatable :: stat95_an + +end module array_definitions diff --git a/src/average.F90 b/src/average.F90 new file mode 100755 index 0000000..43c2670 --- /dev/null +++ b/src/average.F90 @@ -0,0 +1,609 @@ +subroutine average + + use parameters, only : & + jpim, jprb, nobgroups, ndomains, nstat, l_uncorrected + use array_definitions, only : & + nlevels, ntimeslots, statarray, statistic, & + stat95l, stat95u, stat99l, stat99u, & + stat95_bg, stat95_an + + implicit none + integer(kind=jpim) :: jgroup, jrun, jdomain, jlevel, jstat, jtimeslot + integer(kind=jpim) :: ifound, ndf, i, ntimes_bg, ntimes_an + real(kind=jprb), dimension(nstat) :: old, upd, new + real(kind=jprb), dimension(nobgroups,ntimeslots,ndomains+1,nlevels,nstat) :: & + depstat_array + real(kind=jprb) :: mean, sdev, chisq95, sigma, chisq99 + real(kind=jprb) :: ratio_mean_bg, ratio_sdev_bg + real(kind=jprb) :: ratio_mean_an, ratio_sdev_an + + depstat_array(:,:,:,:,:)=0.0_jprb + + do jgroup=1,nobgroups + do jrun=1,2 + do jdomain=1,ndomains+1 + do jlevel=1,nlevels + + statistic(jgroup,jrun,jdomain,jlevel,:)=0.0_jprb + stat95l(jgroup,jrun,jdomain,jlevel,:)=0.0_jprb + stat95u(jgroup,jrun,jdomain,jlevel,:)=0.0_jprb + stat99l(jgroup,jrun,jdomain,jlevel,:)=0.0_jprb + stat99u(jgroup,jrun,jdomain,jlevel,:)=0.0_jprb + + +! if (jdomain<5 .or. jdomain==6 .or. jdomain==8) then + + do jtimeslot=1,ntimeslots + + old=statistic(jgroup,jrun,jdomain,jlevel,:) + upd=statarray(jgroup,jtimeslot,jrun,jdomain,jlevel,:) + new(:)=0.0_jprb + + do jstat=1,nstat + + if (jstat==1 .or. jstat==5 .or. jstat==9) then ! Count + + new(jstat)=old(jstat)+upd(jstat) + + else if (jstat==2 .or. jstat==6 .or. jstat==10) then ! Mean + + if (new(jstat-1)<1.0e-9) then + new(jstat)=upd(jstat) + else + new(jstat)= & + (old(jstat-1)*old(jstat)+upd(jstat-1)*upd(jstat)) / & + (old(jstat-1)+upd(jstat-1)) + end if + + if (jrun==1) then + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) = & + upd(jstat) + else if (jrun==2) then + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) = & + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) & + - upd(jstat) + end if + + else if (jstat==3 .or. jstat==7 .or. jstat==11) then ! RMS + + if (new(jstat-2)<1.0e-9) then + new(jstat)=upd(jstat) + else + new(jstat)= sqrt ( & + (old(jstat-2)*old(jstat)**2+upd(jstat-2)*upd(jstat)**2) / & + (old(jstat-2)+upd(jstat-2)) ) + end if + + else if (jstat==4 .or. jstat==8 .or. jstat==12) then ! S.Dev. + + if (new(jstat-3)<1.0e-9) then + new(jstat)=upd(jstat) + else + new(jstat)=sqrt( (new(jstat-3)/(new(jstat-3)-1.0_jprb)) * & + (new(jstat-1)**2-new(jstat-2)**2) ) + end if + + if (jrun==1) then + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) = & + upd(jstat) + else if (jrun==2) then + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) = & + depstat_array(jgroup,jtimeslot,jdomain,jlevel,jstat) / & + upd(jstat) + end if + + else + + cycle + + endif + + end do + + statistic(jgroup,jrun,jdomain,jlevel,:) = new(:) + + end do + + do jstat=4,8,4 + ndf=nint(statistic(jgroup,jrun,jdomain,jlevel,jstat-3)-1.0_jprb) + sigma=statistic(jgroup,jrun,jdomain,jlevel,jstat) + + if (ndf<0_jpim) cycle + if (ndf==0_jpim) then + write (*,'(a)') 'Warning: Confidence intervals could not' // & + ' be computed!' + write (*,'(5(1x,i2))') jgroup,jrun,jdomain,jlevel,jstat + cycle + endif + stat95l(jgroup,jrun,jdomain,jlevel,jstat) = & + chisq95(ndf,.true.)*sigma + stat95u(jgroup,jrun,jdomain,jlevel,jstat) = & + chisq95(ndf,.false.)*sigma + stat99l(jgroup,jrun,jdomain,jlevel,jstat) = & + chisq99(ndf,.true.)*sigma + stat99u(jgroup,jrun,jdomain,jlevel,jstat) = & + chisq99(ndf,.false.)*sigma + end do + + end do + + end do + end do + end do + + +! Add mean bias correction to mean departures + + if (l_uncorrected) then + + do jgroup=1,nobgroups + do jrun=1,2 + do jdomain=1,ndomains+1 + do jlevel=1,nlevels + statistic(jgroup,jrun,jdomain,jlevel,2)= & + statistic(jgroup,jrun,jdomain,jlevel,2) + & + statistic(jgroup,jrun,jdomain,jlevel,10) + statistic(jgroup,jrun,jdomain,jlevel,6)= & + statistic(jgroup,jrun,jdomain,jlevel,6) + & + statistic(jgroup,jrun,jdomain,jlevel,10) + enddo + enddo + enddo + enddo + + end if + +! Differentiate + statistic(:,3,:,:,:)=statistic(:,1,:,:,:)-statistic(:,2,:,:,:) + +! Normalize by control + where (abs(statistic(:,2,:,:,:))>1.0e-9) & + statistic(:,4,:,:,:)=statistic(:,1,:,:,:)/statistic(:,2,:,:,:) + where (abs(statistic(:,2,:,:,:))>1.0e-9) & + stat95l(:,4,:,:,:)=stat95l(:,1,:,:,:)/statistic(:,2,:,:,:) + where (abs(statistic(:,2,:,:,:))>1.0e-9) & + stat95u(:,4,:,:,:)=stat95u(:,1,:,:,:)/statistic(:,2,:,:,:) + where (abs(statistic(:,2,:,:,:))>1.0e-9) & + stat99l(:,4,:,:,:)=stat99l(:,1,:,:,:)/statistic(:,2,:,:,:) + where (abs(statistic(:,2,:,:,:))>1.0e-9) & + stat99u(:,4,:,:,:)=stat99u(:,1,:,:,:)/statistic(:,2,:,:,:) + + +!------------- + + do jgroup=1,nobgroups + do jdomain=1,ndomains+1 + do jlevel=1,nlevels + + ntimes_bg=0 + ratio_mean_bg=0.0 + do jtimeslot=1,ntimeslots + if (abs(statarray(jgroup,jtimeslot,2,jdomain,jlevel,4))> & + 1.0e-6) then + ntimes_bg=ntimes_bg+1 + ratio_mean_bg = & + ratio_mean_bg + & + statarray(jgroup,jtimeslot,1,jdomain,jlevel,4) / & + statarray(jgroup,jtimeslot,2,jdomain,jlevel,4) + end if + end do + ratio_mean_bg = & + ratio_mean_bg/ntimes_bg + + ratio_sdev_bg=0.0 + do jtimeslot=1,ntimeslots + if (abs(statarray(jgroup,jtimeslot,2,jdomain,jlevel,4))> & + 1.0e-6) then + ratio_sdev_bg = & + ratio_sdev_bg + & + ((statarray(jgroup,jtimeslot,1,jdomain,jlevel,4) / & + statarray(jgroup,jtimeslot,2,jdomain,jlevel,4)) - & + ratio_mean_bg)**2 + end if + end do + if (ntimes_bg>1) then + ratio_sdev_bg = sqrt ( ratio_sdev_bg / (ntimes_bg-1) ) + stat95_bg(jgroup,jdomain,jlevel) = & + 1.96*ratio_sdev_bg/sqrt(1.0*ntimes_bg) ! 95% indeed +! 2.575*ratio_sdev_bg/sqrt(1.0*ntimes_bg) ! 99% +! 1.645*ratio_sdev_bg/sqrt(1.0*ntimes_bg) ! 90% + else + ratio_sdev_bg = 0.0 + stat95_bg(jgroup,jdomain,jlevel) = 0.0 + end if + +!------------- +! 95% confidence intervals from daily variability in sdev ratios + + ntimes_an=0 + ratio_mean_an=0.0 + do jtimeslot=1,ntimeslots + if (abs(statarray(jgroup,jtimeslot,2,jdomain,jlevel,8))> & + 1.0e-6) then + ntimes_an=ntimes_an+1 + ratio_mean_an = & + ratio_mean_an + & + statarray(jgroup,jtimeslot,1,jdomain,jlevel,8) / & + statarray(jgroup,jtimeslot,2,jdomain,jlevel,8) + end if + end do + ratio_mean_an = & + ratio_mean_an/ntimes_an + + ratio_sdev_an=0.0 + do jtimeslot=1,ntimeslots + if (abs(statarray(jgroup,jtimeslot,2,jdomain,jlevel,8))> & + 1.0e-6) then + ratio_sdev_an = & + ratio_sdev_an + & + ((statarray(jgroup,jtimeslot,1,jdomain,jlevel,8) / & + statarray(jgroup,jtimeslot,2,jdomain,jlevel,8)) - & + ratio_mean_an)**2 + end if + end do + if (ntimes_an>1) then + ratio_sdev_an = sqrt ( ratio_sdev_an / (ntimes_an-1) ) + stat95_an(jgroup,jdomain,jlevel) = & + 1.96*ratio_sdev_an/sqrt(1.0*ntimes_an) ! 95% indeed +! 2.575*ratio_sdev_an/sqrt(1.0*ntimes_an) ! 99% +! 1.645*ratio_sdev_an/sqrt(1.0*ntimes_an) ! 90% + else + ratio_sdev_an = 0.0 + stat95_an(jgroup,jdomain,jlevel) = 0.0 + end if + + end do + end do + end do +!------------- + +end subroutine average + + +function chisq95(ndf,lower) result(value) + use parameters, only : jpim, jprb + implicit none + integer(kind=jpim) :: ndf, i, j, k + logical :: lower + real(kind=jprb) :: value, chisq + integer, parameter :: nlarges=57 + real(kind=jprb), dimension(249) :: tab_lower, tab_upper + real(kind=jprb), dimension(nlarges) :: tab_large_lower, tab_large_upper + integer(kind=jprb), dimension(nlarges) :: larges + + tab_lower(:)=0.0_jprb + tab_upper(:)=0.0_jprb + + tab_lower(1:249) = (/ & + 5.024, 7.378, 9.348, 11.143, 12.833, 14.449, 16.013, 17.535, 19.023, 20.483, & + 21.920, 23.337, 24.736, 26.119, 27.488, 28.845, 30.191, 31.526, 32.852, 34.170, & + 35.479, 36.781, 38.076, 39.364, 40.646, 41.923, 43.195, 44.461, 45.722, 46.979, & + 48.232, 49.480, 50.725, 51.966, 53.203, 54.437, 55.668, 56.896, 58.120, 59.342, & + 60.561, 61.777, 62.990, 64.201, 65.410, 66.617, 67.821, 69.023, 70.222, 71.420, & + 72.616, 73.810, 75.002, 76.192, 77.380, 78.567, 79.752, 80.936, 82.117, 83.298, & + 84.476, 85.654, 86.830, 88.004, 89.177, 90.349, 91.519, 92.689, 93.856, 95.023, & + 96.189, 97.353, 98.516, 99.678, 100.839, 101.999, 103.158, 104.316, 105.473, 106.629, & + 107.783, 108.937, 110.090, 111.242, 112.393, 113.544, 114.693, 115.841, 116.989, 118.136, & + 119.282, 120.427, 121.571, 122.715, 123.858, 125.000, 126.141, 127.282, 128.422, 129.561, & + 130.700, 131.838, 132.975, 134.111, 135.247, 136.382, 137.517, 138.651, 139.784, 140.917, & + 142.049, 143.180, 144.311, 145.441, 146.571, 147.700, 148.829, 149.957, 151.084, 152.211, & + 153.338, 154.464, 155.589, 156.714, 157.839, 158.962, 160.086, 161.209, 162.331, 163.453, & + 164.575, 165.696, 166.816, 167.936, 169.056, 170.175, 171.294, 172.412, 173.530, 174.648, & + 175.765, 176.882, 177.998, 179.114, 180.229, 181.344, 182.459, 183.573, 184.687, 185.800, & + 186.914, 188.026, 189.139, 190.251, 191.362, 192.474, 193.584, 194.695, 195.805, 196.915, & + 198.025, 199.134, 200.243, 201.351, 202.459, 203.567, 204.675, 205.782, 206.889, 207.995, & + 209.102, 210.208, 211.313, 212.419, 213.524, 214.628, 215.733, 216.837, 217.941, 219.044, & + 220.148, 221.251, 222.353, 223.456, 224.558, 225.660, 226.761, 227.863, 228.964, 230.064, & + 231.165, 232.265, 233.365, 234.465, 235.564, 236.664, 237.763, 238.861, 239.960, 241.058, & + 242.156, 243.254, 244.351, 245.448, 246.545, 247.642, 248.739, 249.835, 250.931, 252.027, & + 253.122, 254.218, 255.313, 256.408, 257.503, 258.597, 259.691, 260.785, 261.879, 262.973, & + 264.066, 265.159, 266.252, 267.345, 268.438, 269.530, 270.622, 271.714, 272.806, 273.898, & + 274.989, 276.080, 277.171, 278.262, 279.352, 280.443, 281.533, 282.623, 283.713, 284.802, & + 285.892, 286.981, 288.070, 289.159, 290.248, 291.336, 292.425, 293.513, 294.601 /) + + tab_upper(1:249) = (/ & + 9.82e-4, 5.06e-2, 0.216, 0.484, 0.831, 1.237, 1.690, 2.180, 2.700, 3.247, & + 3.816, 4.404, 5.009, 5.629, 6.262, 6.908, 7.564, 8.231, 8.907, 9.591, & + 10.283, 10.982, 11.689, 12.401, 13.120, 13.844, 14.573, 15.308, 16.047, 16.791, & + 17.539, 18.291, 19.047, 19.806, 20.569, 21.336, 22.106, 22.878, 23.654, 24.433, & + 25.215, 25.999, 26.785, 27.575, 28.366, 29.160, 29.956, 30.755, 31.555, 32.357, & + 33.162, 33.968, 34.776, 35.586, 36.398, 37.212, 38.027, 38.844, 39.662, 40.482, & + 41.303, 42.126, 42.950, 43.776, 44.603, 45.431, 46.261, 47.092, 47.924, 48.758, & + 49.592, 50.428, 51.265, 52.103, 52.942, 53.782, 54.623, 55.466, 56.309, 57.153, & + 57.998, 58.845, 59.692, 60.540, 61.389, 62.239, 63.089, 63.941, 64.793, 65.647, & + 66.501, 67.356, 68.211, 69.068, 69.925, 70.783, 71.642, 72.501, 73.361, 74.222, & + 75.083, 75.946, 76.809, 77.672, 78.536, 79.401, 80.267, 81.133, 82.000, 82.867, & + 83.735, 84.604, 85.473, 86.342, 87.213, 88.084, 88.955, 89.827, 90.700, 91.573, & + 92.446, 93.320, 94.195, 95.070, 95.946, 96.822, 97.698, 98.576, 99.453, 100.331, & + 101.210, 102.089, 102.968, 103.848, 104.729, 105.609, 106.491, 107.372, 108.254, 109.137, & + 110.020, 110.903, 111.787, 112.671, 113.556, 114.441, 115.326, 116.212, 117.098, 117.985, & + 118.871, 119.759, 120.646, 121.534, 122.423, 123.312, 124.201, 125.090, 125.980, 126.870, & + 127.761, 128.651, 129.543, 130.434, 131.326, 132.218, 133.111, 134.003, 134.897, 135.790, & + 136.684, 137.578, 138.472, 139.367, 140.262, 141.157, 142.053, 142.949, 143.845, 144.741, & + 145.638, 146.535, 147.432, 148.330, 149.228, 150.126, 151.024, 151.923, 152.822, 153.721, & + 154.621, 155.521, 156.421, 157.321, 158.221, 159.122, 160.023, 160.925, 161.826, 162.728, & + 163.630, 164.532, 165.435, 166.338, 167.241, 168.144, 169.047, 169.951, 170.855, 171.759, & + 172.664, 173.568, 174.473, 175.378, 176.283, 177.189, 178.095, 179.001, 179.907, 180.813, & + 181.720, 182.627, 183.534, 184.441, 185.348, 186.256, 187.164, 188.072, 188.980, 189.889, & + 190.797, 191.706, 192.615, 193.524, 194.434, 195.343, 196.253, 197.163, 198.073, 198.984, & + 199.894, 200.805, 201.716, 202.627, 203.539, 204.450, 205.362, 206.274, 207.186 /) + + larges(1:nlarges)=(/ & + 250, 300, 350, 400, 450, & + 500, 550, 600, 650, 700, & + 750, 800, 850, 900, 950, & + 1000, 2000, 3000, 4000, 5000, & + 6000, 7000, 8000, 9000, & + 10000, 20000, 30000, 40000, 50000, & + 60000, 70000, 80000, 90000, & + 100000, 200000, 300000, 400000, 500000, & + 600000, 700000, 800000, 900000, & + 1000000, 2000000, 3000000, 4000000, 5000000, & + 6000000, 7000000, 8000000, 9000000, & + 10000000, & + 20000000, & + 30000000, & + 50000000, & + 70000000, & + 100000000 /) + + tab_large_lower(1:nlarges) = (/ & + 295.689, 349.874, 403.723, 457.305, 510.670, & + 563.852, 616.878, 669.769, 722.542, 775.211, & + 827.785, 880.275, 932.689, 985.032, 1037.311, & + 1089.5309, 2125.8422, 3153.7034, 4177.1910, 5197.8837, & + 6216.5912, 7233.7944, 8249.8067, 9264.8458, & + 10279.0701, 20393.8835, 30481.9824, 40556.2531, 50621.6868, & + 60680.8433, 70735.2433, 80785.8776, 90833.4343, & + 100878.4146, 201241.4819, 301520.0729, 401754.9359, 501961.8542, & + 602148.9226, 702320.9496, 802481.0684, 902631.4553, & + 1002773.6946, 2003921.8083, 3004802.7849, 4005545.4821, 5006199.8102, & + 6006791.3697, 7007335.3602, 8007841.6923, 9008317.2553, & + 10008767.0554, & + 20012397.6540, & + 30015183.4720, & + 50019601.3171, & + 70023191.8682, & + 100027718.8242 /) + + tab_large_upper(1:nlarges) = (/ & + 208.098, 253.912, 300.064, 346.482, 393.118, & + 439.936, 486.910, 534.019, 581.245, 628.577, & + 676.003, 723.513, 771.099, 818.756, 866.477, & + 914.257, 1877.9460, 2850.0849, 3826.5973, 4805.9047, & + 5787.1972, 6769.9939, 7753.9816, 8738.9425, & + 9724.7183, 19609.9048, 29521.8057, 39447.5349, 49382.1011, & + 59322.9444, 69268.5443, 79217.9099, 89170.3530, & + 99125.3726, 198762.3040, 298483.7116, 398248.8474, 498041.9275, & + 597854.8590, 697682.8313, 797522.7097, 897372.3225, & + 997230.0804, 1996081.9616, 2995200.9586, 3994458.2769, 4993803.9461, & + 5993212.4685, 6992668.4047, 7992161.9403, 8991686.4904, & + 9991236.8703, & + 19987605.9946, & + 29984819.0959, & + 49980407.7777, & + 69976806.3161, & + 99972267.3101 /) + + k=min(ndf,larges(nlarges)) + + if (lower) then + + if (k<=1) then + chisq=tab_lower(1) + value=sqrt(1.0_jprb*k/chisq) + else if (k<=249_jpim) then + chisq=tab_lower(k) + value=sqrt(1.0_jprb*k/chisq) + else + i=1_jpim + j=2_jpim + do while (larges(j)4) call getarg(5,clarge) + + if (clarge=='large' .or. clarge=='LARGE') then + nlevels=nlevels_large + else + nlevels=nlevels_small + end if + + crank='0' + if (iargc()>5) call getarg(6,crank) + read (crank,*) irank + + open (11,file='uid.txt',status='old') + read (11,*) uid + close (11) + + call prepare(flag) + + select case (flag) + case (1,2) + write (*,'(a)') 'Problem with input dates' + case (3) + write (*,'(a)') 'Last date must not be before first date' + case (4) + write (*,'(a)') 'Some (experiment) input files are missing' + case (5) + write (*,'(a)') 'Some (control) input files are missing' + case default + continue + end select + + open (11,file='number_of_days.txt',status='replace') + if (flag==0) then + write (11,'(i3)') ntimeslots*interval/24 + else + write (11,'(i3)') -1 + endif + close (11) + + if (flag/=0) stop + +!------------------------------------------------------------------------------ +! Retrieve statistics for each timeslot + + allocate (statarray(nobgroups,ntimeslots,4,ndomains+1,nlevels,nstat)) + allocate (hemispheric(nobgroups,4,ndomains,nlevels,nstat)) + allocate (global(nobgroups,4,nlevels,nstat)) + + open (999,file='depstat.log',status='replace') + do jtimeslot=1,ntimeslots + + if (mod(jtimeslot,10)==0) write (*,*) idate_array(jtimeslot) + hemispheric(:,:,:,:,:)=0.0_jprb + global(:,:,:,:)=0.0_jprb + + call fetchOneTime(jtimeslot) + + statarray(:,jtimeslot,:,1:ndomains,:,:)=hemispheric(:,:,:,:,:) + statarray(:,jtimeslot,:,ndomains+1,:,:)=global(:,:,:,:) + + end do + close (999) + +!------------------------------------------------------------------------------ +! Average over all timeslots and report + + allocate (statistic(nobgroups,4,ndomains+1,nlevels,nstat)) + allocate (stat95l(nobgroups,4,ndomains+1,nlevels,nstat)) + allocate (stat95u(nobgroups,4,ndomains+1,nlevels,nstat)) + allocate (stat99l(nobgroups,4,ndomains+1,nlevels,nstat)) + allocate (stat99u(nobgroups,4,ndomains+1,nlevels,nstat)) + allocate (stat95_bg(nobgroups,ndomains+1,nlevels)) + allocate (stat95_an(nobgroups,ndomains+1,nlevels)) + + call average + call report + + deallocate (hemispheric) + deallocate (global) + deallocate (statistic) + deallocate (stat95l) + deallocate (stat95u) + deallocate (stat99l) + deallocate (stat99u) + deallocate (stat95_bg) + deallocate (stat95_an) + +!------------------------------------------------------------------------------ +! Deallocate and close the program + + deallocate (statarray) + +end program depstat diff --git a/src/fetchOneTime.F90 b/src/fetchOneTime.F90 new file mode 100755 index 0000000..23d65d2 --- /dev/null +++ b/src/fetchOneTime.F90 @@ -0,0 +1,567 @@ +subroutine fetchOneTime(jtimeslot) + + use parameters, only : & + jpim, jprb, & + nobgroups, ndomains, nsensors, nstat, nlevels_large, & + uid + use array_definitions, only : & + expid, conid, & + idate_array, iasi_peakpres, & + hemispheric, global, nlevels + + implicit none + + integer(kind=jpim) :: jtimeslot + +! Local variables + character(len=10) :: cdate + character(len=100) :: csensor, cdomain + character(len=200) :: exp_file, con_file, cline + + integer(kind=jpim) :: jrun, jsensor, jgroup, jdomain, jlevel, jgroup_array(4), jposition + integer(kind=jpim) :: lok, iend, ibeg + integer(kind=jpim) :: offset + integer(kind=jpim) :: channel + integer(kind=jpim) :: Vcoordinate + + logical :: bg, an, bc, inrecord, inheader + + real(kind=jprb), dimension(nobgroups,4,ndomains,nlevels,nsensors,nstat) :: array + real(kind=jprb), dimension(6) :: linedata + integer(kind=jpim), dimension(3) :: idum + real(kind=jprb) :: oldcount, oldmean, oldrms, cfactor + real(kind=jprb) :: newcount, newmean, newrms, newsdev + + +!--------------------------------------------------------------------------------------- +! Some preparations + + write (cdate,'(i10.10)') idate_array(jtimeslot) + exp_file= 'depstat_tmp_'//expid//'/'// & + expid//'_'//cdate//'.txt' + con_file= 'depstat_tmp_'//conid//'/'// & + conid//'_'//cdate//'.txt' + + +!--------------------------------------------------------------------------------------- +! Read input data + + array(:,:,:,:,:,:)=0.0 + + do jrun=1,2 + + if (jrun==1) then + open (11,file=trim(exp_file),status='old') + else if (jrun==2) then + open (11,file=trim(con_file),status='old') + end if + + csensor='' +! bg=.false. + bg=.true. + an=.false. + bc=.false. + inrecord=.false. + inheader=.false. + + + do + + read (11,'(a)',iostat=lok) cline + if (lok<0) exit + + if (cline(1:8)=='---Start') then + inheader=.true. + cycle + elseif (cline(1:6)=='---End') then + inheader=.false. + cycle + endif + + if (inheader) cycle + + +! Which departures? + if (cline(1:4)=='OmB:') then + bg=.true. + an=.false. + bc=.false. + cycle + elseif (cline(1:4)=='OmA:') then + bg=.false. + an=.true. + bc=.false. + cycle + elseif (cline(1:5)=='Bcor:') then + bg=.false. + an=.false. + bc=.true. + cycle + end if + +! Which instrument we are dealing with? + if (cline(1:1)/=' ' .and. cline(1:4)/='Read') then + iend=LEN_TRIM(cline) + ibeg=1 + read (cline(ibeg:iend),'(a)') csensor + call getSensorNumber(csensor,jsensor,jgroup_array,jposition) + + inrecord=.true. + cycle + endif + + jdomain=1 ! Only one domain for now ... + + if (len_trim(cline)==0 .and. inrecord) then + inrecord=.false. + endif + + if (.not. inrecord) cycle + if ( (.not. bg) .and. (.not. an) .and. (.not. bc) ) cycle + if ( jsensor<1 .or. jsensor>nsensors .or. & + jgroup_array(1)<1 .or. jgroup_array(1)>nobgroups) then + write (999,'(a)') trim(csensor) + cycle + end if + + do jgroup=1,4 + + if (jgroup_array(jgroup)<1_jpim .or. jgroup_array(jgroup)>nobgroups) cycle + if (jgroup_array(jgroup)==15) then + linedata(1)=jposition + read (cline,*,iostat=lok) idum(1:3), linedata(2:6) + else + read (cline,*,iostat=lok) idum(1:2), linedata(1:6) + end if + if (lok>0) cycle + + offset=0 + + if (jgroup_array(jgroup)==20 .and. linedata(1)>2300.0 .and. linedata(1)<=5600.0) then + offset=1 ! IASI WV BAND + else if (jgroup_array(jgroup)==23 .and. linedata(1)>713.0 .and. linedata(1)<=1578.0) then + offset=1 ! CRIS WV BAND + end if + + if (jgroup_array(jgroup)>=20 .and. jgroup_array(jgroup)<=21) then ! IASI: Level from peak pressure + channel=nint(linedata(1)) + if (iasi_peakpres(channel)>1.0e-4) then + jlevel=Vcoordinate(iasi_peakpres(channel),jgroup_array(jgroup)) + else + jlevel=0 + endif + + else if (jgroup_array(jgroup)>=23 .and. jgroup_array(jgroup)<=24) then ! CRIS: Level from peak pressure + ! Note that the nearest IASI channel will be used! + call cris_ch2wn(linedata(1)) ! Channel number to wavenumber + call iasi_wn2ch(linedata(1),channel) ! Wavenumber to IASI channel + if (iasi_peakpres(channel)>1.0e-4) then + jlevel=Vcoordinate(iasi_peakpres(channel),jgroup_array(jgroup)) + else + jlevel=0 + endif + + else if (jgroup_array(jgroup)==22_jpim) then ! IASI LW-band Wavenumber space + linedata(1)=644.75+.25*linedata(1) ! Channel index to wavenumber + jlevel=Vcoordinate(linedata(1),jgroup_array(jgroup)) +! if (nlevels/=nlevels_large) jlevel=0_jpim + + else if (jgroup_array(jgroup)==25_jpim) then ! CrIS LW-band Wavenumber space + if (linedata(1)<713.5) then + linedata(1)=649.375+.625*linedata(1) ! Channel index to wavenumber + elseif (linedata(1)<1578.5) then + linedata(1)=1209.375+.625*(linedata(1)-713.0) + else + linedata(1)=2154.375+.625*(linedata(1)-1578.0) + endif + jlevel=Vcoordinate(linedata(1),jgroup_array(jgroup)) +! if (nlevels/=nlevels_large) jlevel=0_jpim + + else if (jgroup_array(jgroup)>=38_jpim .and. & ! IASI individual + jgroup_array(jgroup)<=40_jpim) then + linedata(1)=644.75+.25*linedata(1) ! Channel index to wavenumber + jlevel=Vcoordinate(linedata(1),jgroup_array(jgroup)) +! if (nlevels/=nlevels_large) jlevel=0_jpim + + else if (jgroup_array(jgroup)>=41_jpim .and. & ! CrIS individual + jgroup_array(jgroup)<=42_jpim) then + if (linedata(1)<713.5) then + linedata(1)=649.375+.625*linedata(1) ! Channel index to wavenumber + else + linedata(1)=1210.00+1.25*(linedata(1)-714.0) ! Channel index to wavenumber + endif + jlevel=Vcoordinate(linedata(1),jgroup_array(jgroup)) +! if (nlevels/=nlevels_large) jlevel=0_jpim + + else + jlevel=Vcoordinate(linedata(1),jgroup_array(jgroup)) + + end if + + if (jlevel<1 .or. jlevel>nlevels) cycle + + if (bg) then + oldcount=array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,1) + oldmean =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,2) + oldrms =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,3) + newcount=linedata(2) + newmean =linedata(3) + newrms =linedata(4) + + newmean= & + (oldcount*oldmean+newcount*newmean)/ & + (oldcount+newcount) + newrms =& + sqrt( (oldcount*oldrms**2 + newcount*newrms**2)/ & + (oldcount+newcount) ) + if (newcount<2) then + cfactor=1.0_jprb + else + cfactor = newcount*1.0_jprb/(newcount-1) + endif + + newsdev = sqrt(cfactor*(newrms**2-newmean**2)) + newcount=oldcount+newcount + + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,1)= & + newcount + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,2)= & + newmean + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,3)= & + newrms + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,4)= & + newsdev + + else if (an) then + oldcount=array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,5) + oldmean =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,6) + oldrms =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,7) + newcount=linedata(2) + newmean =linedata(3) + newrms =linedata(4) + + newmean= & + (oldcount*oldmean+newcount*newmean)/ & + (oldcount+newcount) + newrms =& + sqrt( (oldcount*oldrms**2 + newcount*newrms**2)/ & + (oldcount+newcount) ) + if (newcount<2) then + cfactor=1.0_jprb + else + cfactor = newcount*1.0_jprb/(newcount-1) + endif + newsdev = sqrt(cfactor*(newrms**2-newmean**2)) + newcount=oldcount+newcount + + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,5)= & + newcount + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,6)= & + newmean + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,7)= & + newrms + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,8)= & + newsdev + + else if (bc) then + oldcount=array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,9) + oldmean =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,10) + oldrms =array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,11) + newcount=linedata(2) + newmean =linedata(3) + newrms =linedata(4) + + newmean= & + (oldcount*oldmean+newcount*newmean)/ & + (oldcount+newcount) + newrms =& + sqrt( (oldcount*oldrms**2 + newcount*newrms**2)/ & + (oldcount+newcount) ) + if (newcount<2) then + cfactor=1.0_jprb + else + cfactor = newcount*1.0_jprb/(newcount-1) + endif + newsdev = sqrt(cfactor*(newrms**2-newmean**2)) + newcount=oldcount+newcount + + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,9)= & + newcount + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,10)= & + newmean + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,11)= & + newrms + array(jgroup_array(jgroup)+offset,jrun,jdomain,jlevel,jsensor,12)= & + newsdev + + end if + + end do + + end do + + end do + close (11) + + +!--------------------------------------------------------------------------------------- +! Combine data from possibly many sensors + + hemispheric(:,:,:,:,:)=0.0 + + do jgroup=1,nobgroups + do jrun=1,2 + domainloop: do jdomain=1,ndomains + do jlevel=1,nlevels + + do jsensor=1,nsensors + + if (array(jgroup,jrun,jdomain,jlevel,jsensor,1)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,1)= & + hemispheric(jgroup,jrun,jdomain,jlevel,1) + & ! OMB COUNT + array(jgroup,jrun,jdomain,jlevel,jsensor,1) + hemispheric(jgroup,jrun,jdomain,jlevel,2)= & + hemispheric(jgroup,jrun,jdomain,jlevel,2) + & ! OMB MEAN + array(jgroup,jrun,jdomain,jlevel,jsensor,1)* & + array(jgroup,jrun,jdomain,jlevel,jsensor,2) + hemispheric(jgroup,jrun,jdomain,jlevel,3)= & + hemispheric(jgroup,jrun,jdomain,jlevel,3) + & ! OMB RMS + array(jgroup,jrun,jdomain,jlevel,jsensor,1)* & + array(jgroup,jrun,jdomain,jlevel,jsensor,3)**2 + end if + + if (array(jgroup,jrun,jdomain,jlevel,jsensor,5)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,5)= & + hemispheric(jgroup,jrun,jdomain,jlevel,5) + & ! OMA COUNT + array(jgroup,jrun,jdomain,jlevel,jsensor,5) + hemispheric(jgroup,jrun,jdomain,jlevel,6)= & + hemispheric(jgroup,jrun,jdomain,jlevel,6) + & ! OMA MEAN + array(jgroup,jrun,jdomain,jlevel,jsensor,5)* & + array(jgroup,jrun,jdomain,jlevel,jsensor,6) + hemispheric(jgroup,jrun,jdomain,jlevel,7)= & + hemispheric(jgroup,jrun,jdomain,jlevel,7) + & ! OMA RMS + array(jgroup,jrun,jdomain,jlevel,jsensor,5)*& + array(jgroup,jrun,jdomain,jlevel,jsensor,7)**2 + end if + + if (array(jgroup,jrun,jdomain,jlevel,jsensor,9)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,9)= & + hemispheric(jgroup,jrun,jdomain,jlevel,9) + & ! BCOR COUNT + array(jgroup,jrun,jdomain,jlevel,jsensor,9) + hemispheric(jgroup,jrun,jdomain,jlevel,10)= & + hemispheric(jgroup,jrun,jdomain,jlevel,10) + & ! BCOR MEAN + array(jgroup,jrun,jdomain,jlevel,jsensor,9)* & + array(jgroup,jrun,jdomain,jlevel,jsensor,10) + hemispheric(jgroup,jrun,jdomain,jlevel,11)= & + hemispheric(jgroup,jrun,jdomain,jlevel,11) + & ! BCOR RMS + array(jgroup,jrun,jdomain,jlevel,jsensor,9)*& + array(jgroup,jrun,jdomain,jlevel,jsensor,11)**2 + end if + + end do + + if (hemispheric(jgroup,jrun,jdomain,jlevel,1)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,2)= & + hemispheric(jgroup,jrun,jdomain,jlevel,2)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,1) + hemispheric(jgroup,jrun,jdomain,jlevel,3)= & + sqrt(hemispheric(jgroup,jrun,jdomain,jlevel,3)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,1)) + if (hemispheric(jgroup,jrun,jdomain,jlevel,1)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = hemispheric(jgroup,jrun,jdomain,jlevel,1) / & + (hemispheric(jgroup,jrun,jdomain,jlevel,1)-1) + endif + hemispheric(jgroup,jrun,jdomain,jlevel,4)= & + sqrt(cfactor* & + (hemispheric(jgroup,jrun,jdomain,jlevel,3)**2-& + hemispheric(jgroup,jrun,jdomain,jlevel,2)**2) ) + end if + + if (hemispheric(jgroup,jrun,jdomain,jlevel,5)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,6)= & + hemispheric(jgroup,jrun,jdomain,jlevel,6)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,5) + hemispheric(jgroup,jrun,jdomain,jlevel,7)= & + sqrt(hemispheric(jgroup,jrun,jdomain,jlevel,7)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,5)) + if (hemispheric(jgroup,jrun,jdomain,jlevel,5)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = hemispheric(jgroup,jrun,jdomain,jlevel,5) / & + (hemispheric(jgroup,jrun,jdomain,jlevel,5)-1) + endif + hemispheric(jgroup,jrun,jdomain,jlevel,8)= & + sqrt(cfactor* & + (hemispheric(jgroup,jrun,jdomain,jlevel,7)**2-& + hemispheric(jgroup,jrun,jdomain,jlevel,6)**2) ) + end if + + if (hemispheric(jgroup,jrun,jdomain,jlevel,9)>0.5_jprb) then + hemispheric(jgroup,jrun,jdomain,jlevel,10)= & + hemispheric(jgroup,jrun,jdomain,jlevel,10)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,9) + hemispheric(jgroup,jrun,jdomain,jlevel,11)= & + sqrt(hemispheric(jgroup,jrun,jdomain,jlevel,11)/ & + hemispheric(jgroup,jrun,jdomain,jlevel,9)) + if (hemispheric(jgroup,jrun,jdomain,jlevel,9)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = hemispheric(jgroup,jrun,jdomain,jlevel,9) / & + (hemispheric(jgroup,jrun,jdomain,jlevel,9)-1) + endif + hemispheric(jgroup,jrun,jdomain,jlevel,12)= & + sqrt(cfactor* & + (hemispheric(jgroup,jrun,jdomain,jlevel,11)**2-& + hemispheric(jgroup,jrun,jdomain,jlevel,10)**2) ) + end if + + end do + end do domainloop + end do + end do + + +!--------------------------------------------------------------------------------------- +! Combine from many geographical domains + + global(:,:,:,:)=0.0 + do jgroup=1,nobgroups + do jrun=1,2 + do jlevel=1,nlevels + do jdomain=1,3 ! Derive global statistics from NH, TR and SH + + if (hemispheric(jgroup,jrun,jdomain,jlevel,1)>0.5) then + global(jgroup,jrun,jlevel,1)= & + global(jgroup,jrun,jlevel,1) + & + hemispheric(jgroup,jrun,jdomain,jlevel,1) + global(jgroup,jrun,jlevel,2)= & + global(jgroup,jrun,jlevel,2) + & + hemispheric(jgroup,jrun,jdomain,jlevel,1)* & + hemispheric(jgroup,jrun,jdomain,jlevel,2) + global(jgroup,jrun,jlevel,3)= & + global(jgroup,jrun,jlevel,3) + & + hemispheric(jgroup,jrun,jdomain,jlevel,1)* & + hemispheric(jgroup,jrun,jdomain,jlevel,3)**2 + end if + + if (hemispheric(jgroup,jrun,jdomain,jlevel,5)>0.5) then + global(jgroup,jrun,jlevel,5)= & + global(jgroup,jrun,jlevel,5) + & + hemispheric(jgroup,jrun,jdomain,jlevel,5) + global(jgroup,jrun,jlevel,6)= & + global(jgroup,jrun,jlevel,6) + & + hemispheric(jgroup,jrun,jdomain,jlevel,5)* & + hemispheric(jgroup,jrun,jdomain,jlevel,6) + global(jgroup,jrun,jlevel,7)= & + global(jgroup,jrun,jlevel,7) + & + hemispheric(jgroup,jrun,jdomain,jlevel,5)* & + hemispheric(jgroup,jrun,jdomain,jlevel,7)**2 + end if + + if (hemispheric(jgroup,jrun,jdomain,jlevel,9)>0.5) then + global(jgroup,jrun,jlevel,9)= & + global(jgroup,jrun,jlevel,9) + & + hemispheric(jgroup,jrun,jdomain,jlevel,9) + global(jgroup,jrun,jlevel,10)= & + global(jgroup,jrun,jlevel,10) + & + hemispheric(jgroup,jrun,jdomain,jlevel,9)* & + hemispheric(jgroup,jrun,jdomain,jlevel,10) + global(jgroup,jrun,jlevel,11)= & + global(jgroup,jrun,jlevel,11) + & + hemispheric(jgroup,jrun,jdomain,jlevel,9)* & + hemispheric(jgroup,jrun,jdomain,jlevel,11)**2 + end if + + end do + + if (global(jgroup,jrun,jlevel,1)>0.5) then + global(jgroup,jrun,jlevel,2)= & + global(jgroup,jrun,jlevel,2)/global(jgroup,jrun,jlevel,1) + global(jgroup,jrun,jlevel,3)= & + sqrt(global(jgroup,jrun,jlevel,3)/global(jgroup,jrun,jlevel,1)) + if (global(jgroup,jrun,jlevel,1)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = global(jgroup,jrun,jlevel,1) / & + ( global(jgroup,jrun,jlevel,1)-1) + endif + global(jgroup,jrun,jlevel,4)= & + sqrt(cfactor* & + (global(jgroup,jrun,jlevel,3)**2- & + global(jgroup,jrun,jlevel,2)**2) ) + end if + + if (global(jgroup,jrun,jlevel,5)>0.5) then + global(jgroup,jrun,jlevel,6)= & + global(jgroup,jrun,jlevel,6)/global(jgroup,jrun,jlevel,5) + global(jgroup,jrun,jlevel,7)= & + sqrt(global(jgroup,jrun,jlevel,7)/global(jgroup,jrun,jlevel,5)) + if (global(jgroup,jrun,jlevel,5)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = global(jgroup,jrun,jlevel,5) / & + ( global(jgroup,jrun,jlevel,5)-1) + endif + global(jgroup,jrun,jlevel,8)= & + sqrt(cfactor* & + (global(jgroup,jrun,jlevel,7)**2- & + global(jgroup,jrun,jlevel,6)**2) ) + end if + + if (global(jgroup,jrun,jlevel,9)>0.5) then + global(jgroup,jrun,jlevel,10)= & + global(jgroup,jrun,jlevel,10)/global(jgroup,jrun,jlevel,9) + global(jgroup,jrun,jlevel,11)= & + sqrt(global(jgroup,jrun,jlevel,11)/global(jgroup,jrun,jlevel,9)) + if (global(jgroup,jrun,jlevel,9)<1.5_jprb) then + cfactor=1.0_jprb + else + cfactor = global(jgroup,jrun,jlevel,9) / & + ( global(jgroup,jrun,jlevel,9)-1) + endif + global(jgroup,jrun,jlevel,12)= & + sqrt(cfactor* & + (global(jgroup,jrun,jlevel,11)**2- & + global(jgroup,jrun,jlevel,10)**2) ) + end if + + end do + end do + end do + +!--------------------------------------------------------------------------------------- +! Differentiating + hemispheric(:,3,:,:,:) = hemispheric(:,1,:,:,:)-hemispheric(:,2,:,:,:) + where (abs(hemispheric(:,2,:,:,:))>1.0e-9) & + hemispheric(:,4,:,:,:) = hemispheric(:,1,:,:,:)/hemispheric(:,2,:,:,:) + global(:,3,:,:) = global(:,1,:,:)-global(:,2,:,:) + where (abs(global(:,2,:,:))>1.0e-9) & + global(:,4,:,:) = global(:,1,:,:)/global(:,2,:,:) + + +end subroutine fetchOneTime + + +subroutine cris_ch2wn(x) + use parameters, only : jpim, jprb + implicit none + real(kind=jprb) :: x + + if (x<713.5) then + x=650.0+.625*(x-1.0) + else if (x<1578.5) then + x=1210.0+0.625*(x-714.0) + else + x=2155.0+0.625*(x-1579.0) + endif +end subroutine cris_ch2wn + +subroutine iasi_wn2ch(x,i) + use parameters, only : jpim, jprb + implicit none + integer(kind=jpim) :: i + real(kind=jprb) :: x + i=nint( (x-644.75)/.25) +end subroutine iasi_wn2ch diff --git a/src/getSensorNumber.F90 b/src/getSensorNumber.F90 new file mode 100755 index 0000000..d92aaae --- /dev/null +++ b/src/getSensorNumber.F90 @@ -0,0 +1,356 @@ +! Converting input character string into sensor and observation group +! indices. +! +! Supported jobgroup indices +! +! 1 TEMP U +! 2 TEMP V +! 3 TEMP U/V +! 4 TEMP T +! 5 TEMP Q +! 6 TEMP RH +! 7 AIREP U +! 8 AIREP V +! 9 AIREP U/V +! 10 AIREP T +! 11 TEMP/AIREP U +! 12 TEMP/AIREP V +! 13 TEMP/AIREP U/V +! 14 TEMP/AIREP T +! 15 SURFACE +! 16 AMSU-A +! 17 ATMS +! 18 MHS +! 19 MWHS2 +! 20 IASI LW +! 21 IASI WV +! 22 IASI LW Wavenumber space +! 23 CRIS LW +! 24 CRIS WV +! 25 CRIS LW Wavenumber space +! 26 Ground-based radar RH +! 27 Ground-based radar reflectivity +! 28 SEVIRI radiance +! 29 SATOB U +! 30 SATOB V +! 31 SATOB U/V +! 32 GEO AMV U +! 33 GEO AMV V +! 34 GEO AMV U/V +! 35 POL AMV U +! 36 POL AMV V +! 37 POL AMV U/V +! 38 Metop-A IASI +! 39 Metop-B IASI +! 40 Metop-C IASI +! 41 NPP CrIS +! 42 NOAA-20 CrIS +! 43 Ground-based radar radial wind +! 44 TEMP Z +! +!--------------------------------------------------------------------- + +subroutine getSensorNumber(csensor,jsensor,jobgroup,jposition) + use parameters, only : jpim, satinst + implicit none + character(len=100) :: csensor + integer(kind=jpim) :: jsensor, jobgroup(4), jposition + + jobgroup(:)=0_jpim + jposition=0 + + select case (trim(csensor)) + +!--- TEMP sounding + case ('TEMP U') + jsensor=1_jpim + jobgroup(1)=1_jpim + jobgroup(2)=3_jpim + jobgroup(3)=11_jpim + jobgroup(4)=13_jpim + case ('TEMP V') + jsensor=1_jpim + jobgroup(1)=2_jpim + jobgroup(2)=3_jpim + jobgroup(3)=12_jpim + jobgroup(4)=13_jpim + case ('TEMP T') + jsensor=1_jpim + jobgroup(1)=4_jpim + jobgroup(2)=14_jpim + case ('TEMP Q') + jsensor=1_jpim + jobgroup(1)=5_jpim + case ('TEMP RH') + jsensor=1_jpim + jobgroup(1)=6_jpim + case ('TEMP Z') + jsensor=1_jpim + jobgroup(1)=44_jpim + +!--- AIREP + case ('AMDAR U') + jsensor=2_jpim + jobgroup(1)=7_jpim + jobgroup(2)=9_jpim + jobgroup(3)=11_jpim + jobgroup(4)=13_jpim + case ('AMDAR V') + jsensor=2_jpim + jobgroup(1)=8_jpim + jobgroup(2)=9_jpim + jobgroup(3)=12_jpim + jobgroup(4)=13_jpim + case ('AMDAR T') + jsensor=2_jpim + jobgroup(1)=10_jpim + jobgroup(2)=14_jpim + +!--- SURFACE +! In-situ Zs go to position 1 +! In-situ U10m/V10m to position 2 +! Atmospheric Path Delay to position 3 +! In-situ RH2m to position 4 +! In-situ Q2m to position 5 +! In-situ T2m to position 6 +! In-situ Ts to position 7 +! Scatterometer winds to position 8 + case ('Zs') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=1 + case ('U10m','V10m') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=2 + case ('APD','Ground-based GNSS') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=3 + case ('RH2m') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=4 + case ('Q2m') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=5 + case ('T2m') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=6 + case ('Ts') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=7 + case ('Metop-A ASCAT u component', & + 'Metop-A ASCAT v component', & + 'Metop-B ASCAT u component', & + 'Metop-B ASCAT v component', & + 'Metop-C ASCAT u component', & + 'Metop-C ASCAT v component') + jsensor=1_jpim + jobgroup(1)=15_jpim + jposition=8 + +!===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + +!--- AMSU-A radiances + case ('NOAA-15 AMSU-A') + if (satinst%noaa15_amsua) then + jsensor=1_jpim + jobgroup(1)=16_jpim + endif + case ('NOAA-16 AMSU-A') + if (satinst%noaa16_amsua) then + jsensor=2_jpim + jobgroup(1)=16_jpim + endif + case ('NOAA-17 AMSU-A') + if (satinst%noaa17_amsua) then + jsensor=3_jpim + jobgroup(1)=16_jpim + endif + case ('NOAA-18 AMSU-A') + if (satinst%noaa18_amsua) then + jsensor=4_jpim + jobgroup(1)=16_jpim + endif + case ('NOAA-19 AMSU-A') + if (satinst%noaa19_amsua) then + jsensor=5_jpim + jobgroup(1)=16_jpim + endif + case ('Metop-A AMSU-A') + if (satinst%metopa_amsua) then + jsensor=6_jpim + jobgroup(1)=16_jpim + endif + case ('Metop-B AMSU-A') + if (satinst%metopb_amsua) then + jsensor=7_jpim + jobgroup(1)=16_jpim + endif + case ('Metop-C AMSU-A') + if (satinst%metopc_amsua) then + jsensor=8_jpim + jobgroup(1)=16_jpim + endif + +!--- ATMS radiances + case ('S-NPP ATMS') + if (satinst%snpp_atms) then + jsensor=1_jpim + jobgroup(1)=17_jpim + endif + case ('NOAA-20 ATMS') + if (satinst%noaa20_atms) then + jsensor=2_jpim + jobgroup(1)=17_jpim + endif + +!--- MHS radiances + case ('NOAA-18 AMSU-B','NOAA-18 MHS') + if (satinst%noaa18_amsub) then + jsensor=1_jpim + jobgroup(1)=18_jpim + endif + case ('NOAA-19 MHS') + if (satinst%noaa19_mhs) then + jsensor=2_jpim + jobgroup(1)=18_jpim + endif + case ('Metop-A MHS') + if (satinst%metopa_mhs) then + jsensor=3_jpim + jobgroup(1)=18_jpim + endif + case ('Metop-B MHS') + if (satinst%metopb_mhs) then + jsensor=4_jpim + jobgroup(1)=18_jpim + endif + case ('Metop-C MHS') + if (satinst%metopc_mhs) then + jsensor=5_jpim + jobgroup(1)=18_jpim + endif + +!--- MWHS2 radiances + case ('FY-3C MWHS2 Tb') + if (satinst%fy3c_mwhs2) then + jsensor=1_jpim + jobgroup(1)=19_jpim + endif + case ('FY-3D MWHS2') + if (satinst%fy3d_mwhs2) then + jsensor=2_jpim + jobgroup(1)=19_jpim + endif + +!--- IASI radiances +! jobgroup(1)s 20-22 are reserved for IASI; these correspond to +! long-wave band, water-vapour band, wavenumber space, respectively. + + case ('Metop-A IASI') + if (satinst%metopa_iasi) then + jsensor=1_jpim + jobgroup(1)=20_jpim + jobgroup(2)=22_jpim + jobgroup(3)=38_jpim + endif + case ('Metop-B IASI') + if (satinst%metopb_iasi) then + jsensor=2_jpim + jobgroup(1)=20_jpim + jobgroup(2)=22_jpim + jobgroup(3)=39_jpim + endif + case ('Metop-C IASI') + if (satinst%metopc_iasi) then + jsensor=3_jpim + jobgroup(1)=20_jpim + jobgroup(2)=22_jpim + jobgroup(3)=40_jpim + endif + +!--- CRIS radiances +! jobgroup(1)s 23-25 are reserved for CRIS; these correspond to +! long-wave band, water-vapour band, wavenumber space, respectively. + + case ('S-NPP CrIS') + if (satinst%snpp_cris) then + jsensor=1_jpim + jobgroup(1)=23_jpim + jobgroup(2)=25_jpim + jobgroup(3)=41_jpim + endif + case ('NOAA-20 CrIS') + if (satinst%noaa20_cris) then + jsensor=2_jpim + jobgroup(1)=23_jpim + jobgroup(2)=25_jpim + jobgroup(3)=42_jpim + endif + +!===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + +!--- Ground-based radar + case ('Radar RH') + jsensor=1_jpim + jobgroup(1)=26_jpim + case ('Radar reflectivity') + jsensor=1_jpim + jobgroup(1)=27_jpim + case ('Radar Doppler wind') + jsensor=1_jpim + jobgroup(1)=43_jpim + +!--- SEVIRI + case ('Meteosat-11 SEVIRI') + jsensor=1_jpim + jobgroup(1)=28_jpim + +!--- SATOB winds + case ('Meteosat-11 AMV U component') + jsensor=1_jpim + jobgroup(1)=32_jpim + jobgroup(2)=34_jpim + jobgroup(3)=29_jpim + jobgroup(4)=31_jpim + case ('Meteosat-11 AMV V component') + jsensor=1_jpim + jobgroup(1)=33_jpim + jobgroup(2)=34_jpim + jobgroup(3)=30_jpim + jobgroup(4)=31_jpim + case ('Metop-BC AMV U component') + jsensor=2_jpim + jobgroup(1)=35_jpim + jobgroup(2)=37_jpim + jobgroup(3)=29_jpim + jobgroup(4)=31_jpim + case ('Metop-BC AMV V component') + jsensor=2_jpim + jobgroup(1)=36_jpim + jobgroup(2)=37_jpim + jobgroup(3)=30_jpim + jobgroup(4)=31_jpim + case ('Metop-C AMV U component') + jsensor=3_jpim + jobgroup(1)=35_jpim + jobgroup(2)=37_jpim + jobgroup(3)=29_jpim + jobgroup(4)=31_jpim + case ('Metop-C AMV V component') + jsensor=3_jpim + jobgroup(1)=36_jpim + jobgroup(2)=37_jpim + jobgroup(3)=30_jpim + jobgroup(4)=31_jpim + + case default + jsensor=0_jpim + end select + +end subroutine getSensorNumber diff --git a/src/obstat.f90 b/src/obstat.f90 new file mode 100755 index 0000000..3bb92a6 --- /dev/null +++ b/src/obstat.f90 @@ -0,0 +1,838 @@ +program obstat + + use params, only : n_data_ids, n_vert_ids, n_stat_ids, n_data_elements + implicit none + + character(len=200) :: cline, infile, carg + character(len=100), dimension(n_data_ids) :: obtype_name + character(len=100) :: obtype + + integer :: i_rtype, i_satid, i_instid, i_obstyp, i_varno, i_vertc, i_tslot, i_time + integer :: i_rtype_varno, i_status + integer :: data_id, vert_id, vertind_inv + integer :: i, j, k, lok, ind1, ind2, jtype, jline, iargc, n_effective, tslot + + real, dimension(n_data_elements) :: data_array + real, dimension(n_data_ids,n_vert_ids,n_stat_ids) :: stat_array + + logical :: fok, activeonly + +! integer, parameter :: n_ign_reportypes=8 +! integer, dimension(n_ign_reportypes), parameter :: ign=(/ & +! 16001, & ! Automatic Land SYNOP +! 16002, & ! Manual Land SYNOP +! 16006, & ! Automatic SHIP +! 16026, & ! AIREP +! 16074, & ! BUFR SHIP SYNOP +! 16076, & ! BUFR LAND SYNOP +! 16083, & ! BUFR MOORED BUOYS +! 16084 /) ! BUFR DRIFTING BUOYS +! integer :: j_ign, icount_ign(n_ign_reportypes) +! character(len=20), dimension(n_ign_reportypes) :: c_ign + + +! Unsupported data type names +! c_ign(:) = (/ & +! 'Automatic Land SYNOP', & +! 'Manual Land SYNOP ', & +! 'Automatic SHIP ', & +! 'AIREP ', & +! 'BUFR SHIP SYNOP ', & +! 'BUFR LAND SYNOP ', & +! 'BUFR MOORED BUOYS ', & +! 'BUFR DRIFTING BUOYS ' /) + + + if (iargc()<1) then + n_effective=n_data_elements-1 + tslot=0 + else + call getarg(1,carg) + read (carg,*,iostat=i_status) tslot + if (i_status/=0 .or. tslot==-1) then + n_effective=n_data_elements-1 + tslot=0 + else + n_effective=n_data_elements + endif + endif + + activeonly=.true. + if (iargc()>1) activeonly=.false. + +! Initialize + stat_array(:,:,:)=0.0 + stat_array(:,:,4)=9.9e9 + stat_array(:,:,5)=-9.9e9 + stat_array(:,:,8)=9.9e9 + stat_array(:,:,9)=-9.9e9 + stat_array(:,:,12)=9.9e9 + stat_array(:,:,13)=-9.9e9 + stat_array(:,:,16)=9.9e9 + stat_array(:,:,17)=-9.9e9 + obtype_name(:)='' +! icount_ign(:)=0 + +! + open (111,file='obstat.out',status='replace') + open (112,file='obstat.log',status='replace') + write (112,'(a)') '---Start of header---' + + +! obtype_loop: do jtype=1,5 + obtype_loop: do jtype=1,3 + +! Input ASCII file + if (jtype==1) then + infile='extract_conv.dat' + elseif(jtype==2) then + infile='extract_radar.dat' + elseif(jtype==3) then + infile='extract_nonconv.dat' + else + cycle obtype_loop + endif + + inquire (file=trim(infile),exist=fok) + if (fok) then + write (112,'(a)') 'Reading input file: ' // trim(infile) + open (11,file=trim(infile), status='old') + jline=0 + else + write (112,'(a)') 'Input file not found: ' // trim(infile) + cycle + endif + + reading: do + +! Read new entry + read (11,'(a)',iostat=lok) cline + if (lok<0) exit reading + + jline=jline+1 + if (lok>0) cycle reading + + ind1=INDEX(cline,'NULL') + do while (ind1>0) + write (cline(ind1:ind1+3),'(a)') '-9.9' + ind1=INDEX(cline,'NULL') + enddo + + data_array(n_data_elements)=0.0 + read (cline,*,iostat=lok) data_array(1:n_effective) + if (lok>0) then + if (INDEX(cline,'lon@hdr')>0) cycle + write (112,'(a,i8)') 'Error reading input file on line ', jline + write (112,'(a)') '---' + write (112,'(a)') trim(cline) + write (112,'(a)') '---' + exit reading + endif + +! Extract data + if (tslot==0) then + i_tslot=0 + else + i_tslot=nint(data_array(n_data_elements)) + if (i_tslot==-3) then + i_time=nint(data_array(14)) + call tslot_from_time(i_time,i_tslot) + endif + endif + + if (i_tslot/=tslot) cycle + + i_status=nint(data_array(9)) + + i_rtype=nint(data_array(1)) + i_satid=nint(data_array(2)) + i_instid=nint(data_array(3)) + i_obstyp=nint(data_array(4)) + i_varno=nint(data_array(5)) + i_vertc=nint(data_array(6)) + + if (activeonly) then + if (i_status/=1) cycle ! Only care about active data ! + else + if (i_status>3) cycle ! Include both active and passive + endif + + if (i_varno==119) then ! Radiance + if (jtype<3) cycle ! Read radiances only on 3rd + i_rtype=0 + i_rtype_varno=i_satid*1000+i_instid + ! + elseif (i_obstyp==3) then + if (jtype<3) cycle + i_rtype=0 + i_rtype_varno=i_varno*1000+i_satid + elseif (i_obstyp==13) then ! Radar + if (jtype/=2) cycle ! Radar data in only on 2nd round + if (i_varno/=29 .and. i_varno/=192 .and. i_varno/=195) cycle + i_rtype_varno=i_obstyp*1000+i_varno + else + if (jtype/=1) cycle ! Conventional in only on 1st round + if (i_rtype<0) cycle ! Require sensible reportype for conv and scatterometer data + i_rtype_varno=i_rtype*1000+i_varno + endif + + +! Ignore unsupported data types +! if (i_rtype==-10) cycle +! do j_ign=1,n_ign_reportypes +! if (i_rtype==ign(j_ign)) then +! icount_ign(j_ign)=icount_ign(j_ign)+1 +! cycle reading +! endif +! enddo + +! write (*,*) i_rtype_varno + call identify(i_rtype_varno,i_vertc,data_id,obtype) +! write (*,*) data_id, obtype + + if (data_id==-1) then + write (112,*) '---' + write (112,'(a)') 'Unknown data type:' + write (112,'(a)') trim(cline) + write (112,*) '---' + cycle reading + else if (data_id==0) then + write (112,*) '---' + write (112,'(a)') 'Unsupported data type:' + write (112,'(a)') trim(cline) + write (112,*) '---' + cycle reading + endif + + obtype_name(data_id)=obtype + call vertind(data_id,i_vertc,vert_id) + + if (vert_id>n_vert_ids) then + write (112,'(a)') 'Vertical index out of range' + write (112,'(a,i8)') 'data_id=',data_id + write (112,'(a,i8)') 'i_vertc=',i_vertc + write (112,'(a,i8)') 'vert_id=',vert_id + exit + endif + + if (vert_id<1) cycle + +! Save some information + + ! Radar reflectivities not very meaningful for now + if (data_array(12)<-9.89 .and. data_id==72) cycle reading + + ! Data count + stat_array(data_id,vert_id,1) = & + stat_array(data_id,vert_id,1) + 1.0 + + ! Mean(obsvalue) + stat_array(data_id,vert_id,2) = & + stat_array(data_id,vert_id,2) + data_array(10) + ! RMS(obsvalue) + stat_array(data_id,vert_id,3) = & + stat_array(data_id,vert_id,3) + data_array(10)**2 + ! min(obsvalue) + stat_array(data_id,vert_id,4) = & + min(stat_array(data_id,vert_id,4),data_array(10)) + ! max(obsvalue) + stat_array(data_id,vert_id,5) = & + max(stat_array(data_id,vert_id,5),data_array(10)) + + ! Mean(fg_depar) + stat_array(data_id,vert_id,6) = & + stat_array(data_id,vert_id,6) + data_array(11) + ! RMS(fg_depar) + stat_array(data_id,vert_id,7) = & + stat_array(data_id,vert_id,7) + data_array(11)**2 + ! min(fg_depar) + stat_array(data_id,vert_id,8) = & + min(stat_array(data_id,vert_id,8),data_array(11)) + ! max(fg_depar) + stat_array(data_id,vert_id,9) = & + max(stat_array(data_id,vert_id,9),data_array(11)) + + ! Mean(an_depar) + stat_array(data_id,vert_id,10) = & + stat_array(data_id,vert_id,10) + data_array(12) + ! RMS(an_depar) + stat_array(data_id,vert_id,11) = & + stat_array(data_id,vert_id,11) + data_array(12)**2 + ! min(an_depar) + stat_array(data_id,vert_id,12) = & + min(stat_array(data_id,vert_id,12),data_array(12)) + ! max(an_depar) + stat_array(data_id,vert_id,13) = & + max(stat_array(data_id,vert_id,13),data_array(12)) + + ! Mean(biascorr_fg) + stat_array(data_id,vert_id,14) = & + stat_array(data_id,vert_id,14) + data_array(13) + ! RMS(biascorr_fg) + stat_array(data_id,vert_id,15) = & + stat_array(data_id,vert_id,15) + data_array(13)**2 + ! min(biascorr_fg) + stat_array(data_id,vert_id,16) = & + min(stat_array(data_id,vert_id,16),data_array(13)) + ! max(biascorr_fg) + stat_array(data_id,vert_id,17) = & + max(stat_array(data_id,vert_id,17),data_array(13)) + + enddo reading + + +! Closing + close (11) + write (112,'(a,i8,a)') 'Read ', jline, ' input lines' + + enddo obtype_loop + + +! Divide (mean, RMS) by data count + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,2) = stat_array(:,:,2)/stat_array(:,:,1) + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,3) = sqrt(stat_array(:,:,3)/stat_array(:,:,1)) + + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,6) = stat_array(:,:,6)/stat_array(:,:,1) + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,7) = sqrt(stat_array(:,:,7)/stat_array(:,:,1)) + + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,10) = stat_array(:,:,10)/stat_array(:,:,1) + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,11) = sqrt(stat_array(:,:,11)/stat_array(:,:,1)) + + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,14) = stat_array(:,:,14)/stat_array(:,:,1) + where (stat_array(:,:,1)>0.5) & + stat_array(:,:,15) = sqrt(stat_array(:,:,15)/stat_array(:,:,1)) + + +! Report + do i=1,n_data_ids + if (all(stat_array(i,:,1)<0.5)) cycle + if (len_trim(obtype_name(i))>0) then + write (111,'(a)') '' + write (111,'(a)') trim(obtype_name(i)) + endif + write (111,'(a)') 'OmB: Observation minus Background statistics' + do j=1,n_vert_ids + if (stat_array(i,j,1)<0.5) cycle + write (111,'(3(1x,i6),5(1x,f16.8))') & + i,j,vertind_inv(i,j), stat_array(i,j,1), stat_array(i,j,6:9) + enddo + write (111,'(a)') 'OmA: Observation minus Analysis statistics' + do j=1,n_vert_ids + if (stat_array(i,j,1)<0.5) cycle + write (111,'(3(1x,i6),5(1x,f16.8))') & + i,j,vertind_inv(i,j), stat_array(i,j,1), stat_array(i,j,10:13) + enddo + write (111,'(a)') 'Bcor: Bias correction statistics' + do j=1,n_vert_ids + if (stat_array(i,j,1)<0.5) cycle + write (111,'(3(1x,i6),5(1x,f16.8))') & + i,j,vertind_inv(i,j), stat_array(i,j,1), stat_array(i,j,14:17) + enddo + enddo + +! write (112,'(a)') 'Unsupported data counts:' +! do j_ign=1,n_ign_reportypes +! write (112,'(2(1x,i6),a)') ign(j_ign), icount_ign(j_ign), & +! ' '//trim(c_ign(j_ign)) +! enddo + write (112,'(a)') '---End of header---' + + close (111) + close (112) + +end program obstat + + + +subroutine vertind(data_id,ix,vert_id) + use params, only : ntemplev, templev, niasich, iasichannels, ncrisch, crischannels + implicit none + integer, intent(in) :: data_id, ix + integer, intent(out) :: vert_id + integer :: i + real :: rxx + + vert_id=-1 + + if (data_id>=1 .and. data_id<=10) then ! Conventional surface-based + vert_id=data_id + + elseif (data_id>=11 .and. data_id<=20) then ! Conventional upper-air + rxx=ix/100.0 + if (rxxtemplev(ntemplev)) then + vert_id=ntemplev + else + vert_id=1 + do i=2,ntemplev + if ( abs(rxx-templev(i)) < & + abs(rxx-templev(vert_id)) ) vert_id=i + enddo + endif + + elseif (data_id>=21 .and. data_id<=30) then ! AMSU-A + vert_id = ix + + elseif (data_id>=31 .and. data_id<=40) then ! MHS + vert_id = ix + + elseif (data_id>=41 .and. data_id<=50) then ! MWHS2 + vert_id = ix + + elseif (data_id>=51 .and. data_id<=60) then ! IASI + vert_id=0 + do i=1,niasich + if (iasichannels(i)==ix) then + vert_id=i + endif + enddo + + elseif (data_id>=61 .and. data_id<=70) then ! Scatterometer wind + vert_id=data_id + + elseif (data_id>=71 .and. data_id<=80) then ! Radar + rxx=ix/100.0 + if (rxxtemplev(ntemplev)) then + vert_id=ntemplev + else + vert_id=1 + do i=2,ntemplev + if ( abs(rxx-templev(i)) < & + abs(rxx-templev(vert_id)) ) vert_id=i + enddo + endif + + elseif (data_id>=81 .and. data_id<=90) then ! CRIS + vert_id=0 + do i=1,ncrisch + if (crischannels(i)==ix) then + vert_id=i + endif + enddo + + elseif (data_id>=91 .and. data_id<=100) then ! ATMS + vert_id = ix + + elseif (data_id>=101 .and. data_id<=110) then ! SEVIRI + vert_id = ix + + elseif (data_id>=111 .and. data_id<=120) then ! AMV + rxx=ix/100.0 + if (rxxtemplev(ntemplev)) then + vert_id=ntemplev + else + vert_id=1 + do i=2,ntemplev + if ( abs(rxx-templev(i)) < & + abs(rxx-templev(vert_id)) ) vert_id=i + enddo + endif + + else + return + + endif + +end subroutine vertind + +integer function vertind_inv(data_id,vert_id) + use params, only : ntemplev, templev, niasich, iasichannels, ncrisch, crischannels + implicit none + integer :: data_id, vert_id + + if (data_id>=1 .and. data_id<=10) then ! Conventional surface-based + vertind_inv=data_id + + elseif (data_id>=11 .and. data_id<=20) then ! Conventional upper-air + vertind_inv=templev(vert_id) + + elseif (data_id>=21 .and. data_id<=30) then ! AMSU-A + vertind_inv = vert_id + + elseif (data_id>=31 .and. data_id<=40) then ! MHS + vertind_inv = vert_id + + elseif (data_id>=41 .and. data_id<=50) then ! MWHS2 + vertind_inv = vert_id + + elseif (data_id>=51 .and. data_id<=60) then ! IASI + vertind_inv = iasichannels(vert_id) + + elseif (data_id>=61 .and. data_id<=70) then ! Scatterometer wind + vertind_inv=data_id + + elseif (data_id>=71 .and. data_id<=80) then ! Radar + vertind_inv=templev(vert_id) + + elseif (data_id>=81 .and. data_id<=90) then ! CRIS + vertind_inv = crischannels(vert_id) + + elseif (data_id>=91 .and. data_id<=100) then ! ATMS + vertind_inv = vert_id + + elseif (data_id>=101 .and. data_id<=110) then ! SEVIRI + vertind_inv = vert_id + + elseif (data_id>=111 .and. data_id<=120) then ! AMV + vertind_inv=templev(vert_id) + + else + vertind_inv=-1 + endif + +end function vertind_inv + + +subroutine identify(i_rtype_varno,i_vertc,data_id,obtype_name) + implicit none + integer :: i_rtype_varno, i_vertc + integer :: data_id + character(len=100) :: obtype_name + + select case (i_rtype_varno) + +! Conventional surface-based observations + case (16001001,16002001,16005001,16006001,16008001,16074001,16076001,16083001,16084001) + data_id=1 ! Geopotential + obtype_name = 'Zs' + case (16001039,16002039,16005039,16006039,16008039,16074039,16076039,16083039,16084039,16022039,16045039) + data_id=2 ! 2-meter temperature + obtype_name = 'T2m' + case (16001058,16002058,16006058,16074058,16076058,16083058,16084058,16022058,16045058) + data_id=3 ! 2-meter relative humidity + obtype_name = 'RH2m' + case (16001007,16002007,16006007,16008007,16074007,16076007,16083007,16084007) + data_id=4 ! 2-meter specific humidity + obtype_name = 'Q2m' + case (16001041,16002041,16005041,16006041,16008041,16074041,16076041,16083041,16084041) + data_id=5 ! 10-meter u component + obtype_name = 'U10m' + case (16001042,16002042,16005042,16006042,16008042,16074042,16076042,16083042,16084042) + data_id=6 ! 10-meter v component + obtype_name = 'V10m' + case (16001011,16002011,16005011,16006011,16008011,16074011,16076011,16083011,16084011) + data_id=7 ! surface temperature + obtype_name = 'Ts' + case (16012128) + data_id=8 ! GNSS ZTD + obtype_name = "Ground-based GNSS" + +! Conventional upper-air observations + case (16029002,16082002,16026002) + data_id=11 ! AMDAR/AIREP TEMPERATURE + obtype_name = 'AMDAR T' + case (16029003,16082003,16026003) + data_id=12 ! AMDAR/AIREP U COMPONENT + obtype_name = 'AMDAR U' + case (16029004,16082004,16026004) + data_id=13 ! AMDAR/AIREP V COMPONENT + obtype_name = 'AMDAR V' + case (16022002,16045002,16019002) + data_id=14 ! TEMP TEMPERATURE + obtype_name = 'TEMP T' + case (16022003,16045003,16019003) + data_id=15 ! TEMP U COMPONENT + obtype_name = 'TEMP U' + case (16022004,16045004,16019004) + data_id=16 ! TEMP V COMPONENT + obtype_name = 'TEMP V' + case (16022007,16045007,16019007) + data_id=17 ! TEMP SPECIFIC HUMIDITY + obtype_name = 'TEMP Q' + case (16022029,16045029,16019029) + data_id=18 ! TEMP RELATIVE HUMIDITY + obtype_name = 'TEMP RH' + case (16022001,16045001,16019001) + data_id=19 ! TEMP GEOPOTENTIAL + obtype_name = 'TEMP Z' + +!---------------------------------- +! Automatic Land SYNOP +! 16001 1 651 ! geopotential +! 16001 7 649 ! specific humidity +! 16001 39 888 ! 2m temperature +! 16001 41 812 ! 10m u component +! 16001 42 812 ! 10m v component +! 16001 58 842 ! 2m rel. humidity +! 16001 91 200 ! total amount of clouds +! 16001 108 651 ! mean sea-level pressure +! 16001 110 651 ! surface pressure +! +! Manual Land SYNOP +! 16002 1 228 ! geopotential +! 16002 7 228 ! specific humidity +! 16002 39 237 ! 2m temperature +! 16002 41 233 ! 10m u component +! 16002 42 233 ! 10m v component +! 16002 58 236 ! 2m rel. humidity +! 16002 91 224 ! total amount of clouds +! 16002 108 228 ! mean sea-level pressure +! 16002 110 228 ! surface pressure +! +! Automatic SHIP +! 16006 1 229 ! geopotential +! 16006 7 11 ! specific humidity +! 16006 11 47 ! surface temperature +! 16006 39 235 ! 2m temperature +! 16006 41 185 ! 10m u component +! 16006 42 185 ! 10m v component +! 16006 58 206 ! 2m rel. humidity +! 16006 91 1 ! total amount of clouds +! 16006 108 11 ! mean sea-level pressure +! 16006 110 229 ! surface pressure +! +! SHIP +! 16008 1 15 ! geopotential +! 16008 11 2 ! surface temperature +! 16008 39 15 ! 2m temperature +! 16008 41 15 ! 10m u component +! 16008 42 15 ! 10m v component +! 16008 58 14 ! 2m rel. humidity +! 16008 91 10 ! total amount of clouds +! 16008 108 2 ! mean sea-level pressure +! 16008 110 15 ! surface pressure +! +! Land TEMP +! 16022 1 515 ! geopotential +! 16022 2 632 ! upper air temperature +! 16022 3 867 ! upper air u component +! 16022 4 867 ! upper air v component +! 16022 7 647 ! specific humidity +! 16022 29 632 ! upper air relative humidity +! 16022 39 15 ! 2m temperature +! 16022 41 15 ! 10m u component +! 16022 42 15 ! 10m v component +! 16022 58 15 ! 2m rel. humidity +! +! BUFR SHIP SYNOP +! 16074 1 362 ! geopotential +! 16074 7 123 ! specific humidity +! 16074 11 109 ! surface temperature +! 16074 39 377 ! 2m temperature +! 16074 41 311 ! 10m u component +! 16074 42 311 ! 10m v component +! 16074 58 343 ! 2m rel. humidity +! 16074 91 12 ! total amount of clouds +! 16074 108 91 ! mean sea-level pressure +! 16074 110 362 ! surface pressure +! +! BUFR LAND SYNOP +! 16076 1 1909 ! geopotential +! 16076 7 1906 ! specific humidity +! 16076 39 2544 ! 2m temperature +! 16076 41 2308 ! 10m u component +! 16076 42 2308 ! 10m v component +! 16076 58 2474 ! 2m rel. humidity +! 16076 80 1483 ! 6hr rain +! 16076 91 1093 ! total amount of clouds +! 16076 92 403 ! 6hr snowfall +! 16076 108 1909 ! mean sea-level pressure +! 16076 110 1909 ! surface pressure +! +! BUFR MOORED BUOYS +! 16083 1 4 ! geopotential +! 16083 39 4 ! 2m temperature +! 16083 110 4 ! surface pressure +! +! BUFR DRIFTING BUOYS +! 16084 1 120 ! geopotential +! 16084 11 166 ! surface temperature +! 16084 41 30 ! 10m u component +! 16084 42 30 ! 10m v component +! 16084 110 120 ! surface pressure +!---------------------------------- +! +! WIGOS AMDAR +! 16082 + + + +! AMSU-A + case (4570,4003) + data_id=21 ! Metop-A AMSU-A + obtype_name = 'Metop-A AMSU-A' + case (3570,3003) + data_id=22 ! Metop-B AMSU-A + obtype_name = 'Metop-B AMSU-A' + case (5570,5003) + data_id=23 ! Metop-C AMSU-A + obtype_name = 'Metop-C AMSU-A' + case (206570,206003) + data_id=24 ! NOAA-15 AMSU-A + obtype_name = 'NOAA-15 AMSU-A' + case (209570,209003) + data_id=25 ! NOAA-18 AMSU-A + obtype_name = 'NOAA-18 AMSU-A' + case (223570,223003) + data_id=26 ! NOAA-19 AMSU-A + obtype_name = 'NOAA-19 AMSU-A' +! case (4990) +! if (i_vertc<6) then +! data_id=33 ! Metop-C MHS +! obtype_name = 'Metop-C MHS' +! elseif (i_vertc<16) then +! data_id=23 ! Metop-C AMSU-A +! obtype_name = 'Metop-C AMSU-A' +! elseif (i_vertc<9000) then +! data_id=53 ! Metop-C IASI +! obtype_name = 'Metop-C IASI' +! endif + + +! MHS + case (4203,4015) + data_id=31 ! Metop-A MHS + obtype_name = 'Metop-A MHS' + case (3203,3015) + data_id=32 ! Metop-B MHS + obtype_name = 'Metop-B MHS' + case (5203,5015) + data_id=33 ! Metop-C MHS + obtype_name = 'Metop-C MHS' + case (223203,223015) + data_id=34 ! NOAA-19 MHS + obtype_name = 'NOAA-19 MHS' + +! MWHS2 + case (521990,522620,522073) + data_id=41 ! FY3C MWHS2 + obtype_name = 'FY-3C MWHS2' + case (522990,523620,523953,523073) + data_id=42 ! FY3D MWHS2 + obtype_name = 'FY-3D MWHS2' + +! IASI + case (4221,4016) + data_id=51 ! Metop-A IASI + obtype_name = 'Metop-A IASI' + case (3221,3016) + data_id=52 ! Metop-B IASI + obtype_name = 'Metop-B IASI' + case (5221,5016) + data_id=53 ! Metop-C IASI + obtype_name = 'Metop-C IASI' + +! ASCAT + case (9005125) + data_id=61 + obtype_name = 'Metop-A ASCAT u component' + case (9005124) + data_id=62 + obtype_name = 'Metop-A ASCAT v component' + case (9007125) + data_id=63 + obtype_name = 'Metop-B ASCAT u component' + case (9007124) + data_id=64 + obtype_name = 'Metop-B ASCAT v component' + case (9011125) + data_id=65 + obtype_name = 'Metop-C ASCAT u component' + case (9011124) + data_id=66 + obtype_name = 'Metop-C ASCAT v component' + +! RADAR + case (13029) + data_id=71 + obtype_name = "Radar RH" + case (13192) + data_id=72 + obtype_name = "Radar reflectivity" + case (13195) + data_id=73 + obtype_name = "Radar Doppler wind" + +! CrIS + case (224620,224027) + data_id=81 ! S-NPP CrIS + obtype_name = 'S-NPP CrIS' + case (225620,225027) + data_id=82 ! NOAA-20 CrIS + obtype_name = 'NOAA-20 CrIS' + +! ATMS + case (224621,224019) + data_id=91 ! S-NPP ATMS + obtype_name = 'S-NPP ATMS' + case (225621,225019) + data_id=92 ! NOAA-20 ATMS + obtype_name = 'NOAA-20 ATMS' + +! +! SEVIRI + + case (57029) + data_id=101 + obtype_name = 'Meteosat-10 SEVIRI' + case (74207,73990,70029) + data_id=102 + obtype_name = 'Meteosat-11 SEVIRI' + +! +! AMV + case (3005) + data_id=111 + obtype_name = 'Metop-C AMV U component' + + case (4005) + data_id=112 + obtype_name = 'Metop-C AMV V component' + + case (3852) + data_id=113 + obtype_name = 'Metop-BC AMV U component' + + case (4852) + data_id=114 + obtype_name = 'Metop-BC AMV V component' + + case (3070) + data_id=115 + obtype_name = 'Meteosat-11 AMV U component' + + case (4070) + data_id=116 + obtype_name = 'Meteosat-11 AMV V component' + + case default + data_id=-1 + end select + +end subroutine identify + +subroutine tslot_from_time(i_time,i_tslot) + implicit none + integer :: i_time, i_tslot, i_timesec + integer, parameter :: idelta=10800 + integer :: hh, mm, ss, idum + + idum=i_time + ss=mod(idum,100) + idum=idum/100 + mm=mod(idum,100) + idum=idum/100 + hh=idum + + do while (hh>3) + hh=hh-3 + enddo + + idum=hh*3600 + mm*60 + ss + idum=idum-1860 + + i_tslot=idum/1200 + +end subroutine tslot_from_time diff --git a/src/parameters.F90 b/src/parameters.F90 new file mode 100755 index 0000000..29c1180 --- /dev/null +++ b/src/parameters.F90 @@ -0,0 +1,126 @@ +module parameters + implicit none + + integer, parameter :: jpim=selected_int_kind(9) + integer, parameter :: jprb=selected_real_kind(13,300) + + integer(kind=jpim), parameter :: interval=3 ! Hours btw. successive times +! integer(kind=jpim), parameter :: interval=24 ! Hours btw. successive times + integer(kind=jpim), parameter :: nobgroups=44 ! Number of obs. groups + integer(kind=jpim), parameter :: nsensors=10 ! Max. sensors in a group + integer(kind=jpim), parameter :: ndomains=8 ! Number of geogr. domains +! integer(kind=jpim), parameter :: nlevels_small=259 ! Number of plotting levels + integer(kind=jpim), parameter :: nlevels_small=174 ! Number of plotting levels + integer(kind=jpim), parameter :: nlevels_large=174 ! Number of wavenumber-space plotting levels + integer(kind=jpim), parameter :: nstat=12 ! Number of statistics + integer(kind=jpim), parameter :: maxtimes=732 ! Max. timeslots + integer(kind=jpim), parameter :: nlevels_temp=30 ! Number of TEMP pressures + integer(kind=jpim), parameter :: nlevels_rttov=43 ! Number of RTTOV pressures + integer(kind=jpim), parameter :: niasich=8461 ! Number of IASI channels +! integer(kind=jpim), parameter :: niasich_metcoop=259 + integer(kind=jpim), parameter :: niasich_metcoop=174 + integer(kind=jpim), dimension(niasich_metcoop), parameter :: iasich_metcoop = (/ & +! 16, 38, 49, 51, 55, 57, 59, 61, 63, 66, & +! 70, 72, 74, 79, 81, 83, 85, 87, 89, 101, & +! 104, 106, 109, 111, 113, 116, 119, 122, 125, 128, & +! 131, 133, 135, 138, 141, 144, 146, 148, 151, 154, & +! 157, 159, 161, 163, 165, 167, 170, 173, 176, 178, & +! 179, 180, 183, 185, 187, 189, 191, 193, 195, 197, & +! 199, 201, 203, 205, 207, 210, 212, 214, 217, 219, & +! 222, 224, 226, 228, 230, 232, 234, 236, 239, 241, & +! 242, 243, 246, 249, 252, 254, 256, 258, 260, 262, & +! 265, 267, 269, 271, 272, 273, 275, 278, 280, 282, & +! 284, 286, 288, 290, 292, 294, 296, 299, 301, 303, & +! 306, 308, 310, 312, 314, 316, 318, 320, 323, 325, & +! 327, 329, 331, 333, 335, 337, 341, 345, 347, 350, & +! 352, 354, 356, 358, 360, 362, 364, 366, 369, 371, & +! 373, 375, 377, 379, 381, 383, 386, 389, 398, 401, & +! 404, 407, 410, 414, 416, 426, 428, 432, 434, 439, & +! 445, 457, 515, 546, 552, 559, 566, 571, 573, 646, & +! 662, 668, 756, 867, 921, 1027, 1133, 1191, 1194, 1271, & +! 1479, 1509, 1513, 1521, 1536, 1574, 1578, 1579, 1585, 1587, & +! 1626, 1639, 1643, 1652, 1658, 1671, 1805, 1884, 1946, 1991, & +! 2094, 2239, 2701, 2819, 2889, 2907, 2910, 2919, 2939, 2944, & +! 2958, 2991, 2993, 3002, 3008, 3014, 3029, 3049, 3093, 3098, & +! 3105, 3107, 3110, 3160, 3165, 3168, 3207, 3244, 3248, 3252, & +! 3228, 3281, 3309, 3312, 3322, 3411, 3438, 3442, 3446, 3448, & +! 3452, 3484, 3491, 3499, 3506, 3509, 3575, 3580, 3582, 3653, & +! 3658, 4032, 5379, 5381, 5383, 5399, 5401, 5403, 5480 /) +! +! Those that remain after removing higher stratospheric and +! ozone channels: +! 38, 51, 57, 63, 85, 104, 109, 116, 122, 128, & +! 135, 141, 148, 154, 161, 167, 173, 180, 185, 187, & +! 193, 199, 205, 207, 212, 217, 219, 224, 226, 230, & +! 232, 236, 239, 241, 242, 243, 246, 249, 252, 254, & +! 256, 258, 260, 262, 265, 267, 269, 275, 278, 280, & +! 282, 284, 286, 288, 290, 292, 294, 296, 306, 308, & +! 310, 312, 314, 316, 318, 320, 323, 325, 327, 329, & +! 331, 333, 335, 337, 341, 345, 347, 350, 352, 354, & +! 356, 358, 360, 362, 364, 366, 369, 371, 373, 375, & +! 377, 379, 381, 383, 386, 389, 398, 401, 404, 407, & +! 410, 414, 416, 426, 428, 432, 434, 439, 445, 457, & +! 515, 546, 552, 559, 566, 571, 573, 646, 662, 668, & +! 756, 867, 921, 1027, 1133, 1191, 1194, 1271, 1805, 1884, & +! 1946, 1991, 2094, 2239, 2701, 2819, 2889, 2907, 2910, 2919, & +! 2939, 2944, 2958, 2991, 2993, 3002, 3008, 3014, 3029, 3049, & +! 3093, 3098, 3105, 3107, 3110, 3160, 3165, 3168, 3207, 3244, & +! 3248, 3252, 3228, 3281, 3309, 3312, 3322, 3411, 3438, 3442, & +! 3446, 3448, 3452, 3484, 3491, 3499, 3506, 3509, 3575, 3580, & +! 3582, 3653, 3658, 4032, 5379, 5381, 5383, 5399, 5401, 5403, & +! 5480 /) +! +! Those that remain after removing weak H2O, the excessive windows, +! or similar channels: + adding 337, 345 anyway for consistency + 38, 51, 57, 63, 85, 104, 109, 116, 122, 128, & + 135, 141, 148, 154, 161, 167, 173, 180, 185, 187, & + 193, 199, 205, 207, 212, 217, 219, 224, 226, 230, & + 232, 236, 239, 242, 243, 246, 249, 252, 254, & + 256, 258, 260, 262, 265, 267, 269, 275, 278, 280, & + 282, 284, 286, 288, 290, 292, 294, 296, 306, 308, & + 310, 312, 314, 316, 318, 320, 323, 325, 327, 329, & + 331, 333, 335, 337, 341, 345, 347, 350, 352, 354, & + 356, 358, 360, 362, 364, 366, 369, 371, 373, 375, & + 377, 379, 381, 386, 389, 404, 407, & + 410, 414, 416, 426, 428, 432, 434, 445, 457, & + 515, 546, 552, 566, 571, 573, 646, 662, 668, & + 756, 867, 921, 2701, 2819, 2889, 2907, 2910, 2919, 2939, & + 2944, 2958, 2991, 2993, 3002, 3008, 3014, 3029, 3049, 3093, & + 3098, 3105, 3107, 3110, 3160, 3165, 3168, 3207, 3244, 3248, & + 3252, 3228, 3281, 3309, 3312, 3322, 3411, 3438, 3442, 3446, & + 3448, 3452, 3484, 3491, 3499, 3506, 3509, 3575, 3580, 3582, & + 3653, 3658, 4032, 5379, 5381, 5383, 5399, 5401, 5403, 5480 /) + integer(kind=jpim), dimension(niasich) :: iasi_chanback + integer(kind=jpim), parameter :: ncrisch_metcoop=91 + integer(kind=jpim), dimension(ncrisch_metcoop), parameter :: crisch_metcoop = (/ & + 27, 59, 67, 69, 79, 80, 81, 82, 83, 84, & + 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, & + 97, 98, 99, 100, 103, 104, 105, 106, 107, 108, & + 109, 110, 111, 115, 116, 117, 118, 119, 120, 121, & + 122, 123, 124, 125, 126, 132, 133, 134, 135, 136, & + 137, 138, 139, 140, 141, 142, 143, 144, 147, 161, & + 173, 177, 181, 185, 195, 199, 242, 275, 295, 342, & + 404, 439, 449, 464, 475, 490, 501, 898, 914, 972, & + 988,1018,1029,1046,1053,1060,1064,1076,1112,1189, & + 1205 /) + + logical :: l_uncorrected ! Show un-bias-corrected mean departures + logical :: l_chisq_conf_intervals ! Confidence intervals based on chi-square distribution + + character(len=4) :: uid ! User ID + +! Satellite instruments to be included in output statistics + type type_satellite_instruments + logical :: noaa15_amsua, noaa16_amsua, noaa17_amsua, & + noaa18_amsua, noaa19_amsua, & + metopa_amsua, metopb_amsua, metopc_amsua + logical :: noaa18_amsub, noaa19_mhs, & + metopa_mhs, metopb_mhs, metopc_mhs + logical :: fy3c_mwhs2, fy3d_mwhs2 + logical :: snpp_atms, noaa20_atms + logical :: metopa_iasi, metopb_iasi, metopc_iasi + logical :: snpp_cris, noaa20_cris + end type type_satellite_instruments + type(type_satellite_instruments) :: satinst + +end module parameters diff --git a/src/prepare.F90 b/src/prepare.F90 new file mode 100755 index 0000000..aa411a4 --- /dev/null +++ b/src/prepare.F90 @@ -0,0 +1,229 @@ +! Check that input parameters are meaningful. +! Determine timeslots, prepare obsgroup names etc. + +subroutine prepare( flag ) + + use parameters, only : & + jpim, maxtimes, interval, niasich, nobgroups, uid, & + l_uncorrected, l_chisq_conf_intervals, iasi_chanback, & + niasich_metcoop, iasich_metcoop, satinst + + use array_definitions, only : & + ntimeslots, idate_array, groupid, & + cdate_first, cdate_last, & + expid, conid, & + levels_temp, levels_rttov, & + iasi_peakpres + + implicit none + integer(kind=jpim) :: flag + +! Local variables + character(len=10) :: cdate + character(len=200) :: filename + integer(kind=jpim) :: i, id1, id2 + integer(kind=jpim) :: yy, mm, dd, hh, dpm(12) + logical :: fok + namelist / satellite_instruments / satinst + + l_uncorrected=.false. +! l_uncorrected=.true. + l_chisq_conf_intervals=.false. ! Consistent with iver & obstat (ECMWF tools) + + flag=0 + do i=1,10 + if (ichar(cdate_first(i:i))<48 .or. ichar(cdate_first(i:i))>57) then + flag=1 + else if (ichar(cdate_last(i:i))<48 .or. ichar(cdate_last(i:i))>57) then + flag=2 + end if + if (flag/=0) exit + end do + if (flag/=0) return + + read (cdate_first,*) id1 + read (cdate_last,*) id2 + + if (id2=i) + + ntimeslots=ntimeslots+1 + if (ntimeslots>maxtimes) exit + idate_array(ntimeslots)=i + + hh=mod(i,100) + i=i/100 + dd=mod(i,100) + i=i/100 + mm=mod(i,100) + i=i/100 + yy=i + dpm(1:12) = (/ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /) + if (mod(yy,4)/=0 .or. ( mod(yy,100)==0 .and. mod(yy,400)/=0 ) ) then + dpm(2)=28 + end if + + hh=hh+interval + if (hh>23) then + dd=dd+1 + hh=hh-24 + if (dd>dpm(mm)) then + mm=mm+1 + dd=1 + if (mm>12) then + yy=yy+1 + mm=1 + end if + end if + end if + write (cdate,'(i4.4,3i2.2)') yy,mm,dd,hh + read (cdate,*) i + + end do + + +! Verify that available OBSTAT files cover the desired time interval in full + + do i=1,ntimeslots + + write (cdate,'(i10.10)') idate_array(i) + + filename= 'depstat_tmp_'//expid//'/'// & + expid//'_'//cdate//'.txt' + inquire (file=trim(filename),exist=fok) + if (.not. fok) then + flag=4 + write (*,*) trim(filename) + exit + endif + + filename= 'depstat_tmp_'//conid//'/'// & + conid//'_'//cdate//'.txt' + inquire (file=trim(filename),exist=fok) + if (.not. fok) then + flag=5 + exit + endif + end do + + if (flag/=0) return + +! Define observation groups + + groupid(1)='tempu' + groupid(2)='tempv' + groupid(3)='tempuv' + groupid(4)='tempt' + groupid(5)='tempq' + groupid(6)='temprh' + groupid(7)='airepu' + groupid(8)='airepv' + groupid(9)='airepuv' + groupid(10)='airept' + groupid(11)='tpau' + groupid(12)='tpav' + groupid(13)='tpauv' + groupid(14)='tat' + groupid(15)='surface' + groupid(16)='amsua' + groupid(17)='atms' + groupid(18)='mhs' + groupid(19)='mwhs2' + groupid(20)='iasilw' + groupid(21)='iasiwv' + groupid(22)='iasilw_wn' + groupid(23)='crislw' + groupid(24)='criswv' + groupid(25)='crislw_wn' + groupid(26)='radarrh' + groupid(27)='radarrefl' + groupid(28)='seviri' + groupid(29)='satobu' + groupid(30)='satobv' + groupid(31)='satobuv' + groupid(32)='geoamvu' + groupid(33)='geoamvv' + groupid(34)='geoamvuv' + groupid(35)='polamvu' + groupid(36)='polamvv' + groupid(37)='polamvuv' + groupid(38)='ma-iasi' + groupid(39)='mb-iasi' + groupid(40)='mc-iasi' + groupid(41)='npp-cris' + groupid(42)='n20-cris' + groupid(43)='radarwind' + groupid(44)='tempz' + +! Define peak pressures for IASI channels + open (11,file='dat/iasi_peak_pressures.dat',status='old') + read (11,*) iasi_peakpres(1:niasich) + close (11) + + +! Define TEMP pressure levels + levels_temp = (/ & + 5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 40.0, 50.0, 65.0, 70.0, & + 85.0, 100.0, 125.0, 150.0, 175.0, 200.0, 225.0, 250.0, 275.0, 300.0, & + 350.0, 400.0, 450.0, 500.0, 600.0, 700.0, 800.0, 850.0, 925.0, 1000.0 /) + +! Define RTTOV pressure levels + levels_rttov = (/ & + 0.10, 0.29, 0.69, 1.42, 2.611, & + 4.407, 6.95, 10.37, 14.81, 20.40, & + 27.26, 35.51, 45.29, 56.73, 69.97, & + 85.18, 102.05, 122.04, 143.84, 167.95, & + 194.36, 222.94, 253.71, 286.60, 321.50, & + 358.28, 396.81, 436.95, 478.54, 521.46, & + 565.54, 610.60, 656.43, 702.73, 749.12, & + 795.09, 839.95, 882.80, 922.46, 957.44, & + 985.88, 1005.43, 1013.25 /) + + iasi_chanback(:)=0 + do i=1,niasich_metcoop + iasi_chanback(iasich_metcoop(i))=i + enddo + +! where (iasi_chanback(:)==0) iasi_peakpres(:)=0.0 + +! Default use of satellite instruments (i.e. use none) + satinst%noaa15_amsua=.false. + satinst%noaa16_amsua=.false. + satinst%noaa17_amsua=.false. + satinst%noaa18_amsua=.false. + satinst%noaa19_amsua=.false. + satinst%metopa_amsua=.false. + satinst%metopb_amsua=.false. + satinst%metopc_amsua=.false. + satinst%noaa18_amsub=.false. + satinst%noaa19_mhs=.false. + satinst%metopa_mhs=.false. + satinst%metopb_mhs=.false. + satinst%metopc_mhs=.false. + satinst%fy3c_mwhs2=.false. + satinst%fy3d_mwhs2=.false. + satinst%snpp_atms=.false. + satinst%noaa20_atms=.false. + satinst%metopa_iasi=.false. + satinst%metopb_iasi=.false. + satinst%metopc_iasi=.false. + satinst%snpp_cris=.false. + satinst%noaa20_cris=.false. + +! Read in namelist if it exists + filename='nam/satellite_instruments.nml' + inquire (file=trim(filename),exist=fok) + if (fok) then + open (111,file=trim(filename),status='old') + read (111,nml=satellite_instruments) + close (111) + endif + +end subroutine prepare diff --git a/src/report.F90 b/src/report.F90 new file mode 100755 index 0000000..26b6549 --- /dev/null +++ b/src/report.F90 @@ -0,0 +1,290 @@ +subroutine report + + use parameters, only : & + jpim, jprb, & + nobgroups, ndomains, & + nlevels_temp, nlevels_rttov, & + l_chisq_conf_intervals + + use array_definitions, only : & + expid, conid, nlevels, & + statistic, stat95l, stat95u, stat99l, stat99u, & + stat95_bg, stat95_an, & + groupid, irank + + implicit none + + integer(kind=jpim) :: jgroup, jdomain, jlevel + character(len=200) :: filename_base + real(kind=jprb) :: vcoordinate_back, offset + logical :: separation1, separation2 + + do jgroup=1,nobgroups +!--------------------------------------------------------- + +! Skip those observation types that we don't currently have in MetCoOp + if (jgroup==27) cycle ! Radar refl + if (jgroup==28) cycle ! SEVIRI + if (jgroup==29) cycle ! SATOBU + if (jgroup==30) cycle ! SATOBV + if (jgroup==31) cycle ! SATOBUV + if (jgroup==32) cycle ! GEOAMVU + if (jgroup==33) cycle ! GEOAMVV + if (jgroup==34) cycle ! GEOAMVUV + if (jgroup==35) cycle ! POLAMVU + if (jgroup==36) cycle ! POLAMVV + if (jgroup==37) cycle ! POLAMVUV + if (jgroup==38) cycle ! M-A IASI + + + offset=0.0 + separation1=.false. + separation2=.false. + +! Logarithmic offsets + if (jgroup== 1) offset=-1000000.04_jprb ! TEMPU + if (jgroup== 2) offset=-1000000.04_jprb ! TEMPV + if (jgroup== 3) offset=-1000000.04_jprb ! TEMPUV + if (jgroup== 4) offset=-1000000.04_jprb ! TEMPT + if (jgroup==44) offset=-1000000.04_jprb ! TEMPZ + if (jgroup==11) offset=-1000000.04_jprb ! TPAU + if (jgroup==12) offset=-1000000.04_jprb ! TPAV + if (jgroup==13) offset=-1000000.04_jprb ! TPAUV + if (jgroup==14) offset=-1000000.04_jprb ! TAT + if (jgroup==20) offset=-1000000.04_jprb ! IASILW + if (jgroup==23) offset=-1000000.04_jprb ! CRISLW + +! Linear offsets + if (jgroup==5) offset=-12._jprb ! TEMPQ + if (jgroup==6) offset=-12._jprb ! TEMPRH + if (jgroup==7) offset=-12._jprb ! AIREPU + if (jgroup==8) offset=-12._jprb ! AIREPV + if (jgroup==9) offset=-12._jprb ! AIREPUV + if (jgroup==10) offset=-12._jprb ! AIREPT + if (jgroup==15) offset=0.10_jprb ! SURFACE + if (jgroup==16) offset=0.12_jprb ! AMSUA + if (jgroup==17) offset=0.20_jprb ! ATMS + if (jgroup==18) offset=0.06_jprb ! MHS + if (jgroup==19) offset=0.12_jprb ! MWHS2 + if (jgroup==21) offset=-12._jprb ! IASIWV + if (jgroup==24) offset=-12._jprb ! CRISWV + if (jgroup==26) offset=-12._jprb ! RADAR RH + if (jgroup==28) offset=0.12_jprb ! SEVIRI + if (jgroup==29) offset=-12._jprb ! SATOBU + if (jgroup==30) offset=-12._jprb ! SATOBV + if (jgroup==31) offset=-12._jprb ! SATOBUV + if (jgroup==43) offset=-12._jprb ! RADAR WIND + +! Departure statistics + filename_base=expid//'_'//conid//'_'//trim(groupid(jgroup))//'_omb_norm' + open (109,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//conid//'_'//trim(groupid(jgroup))//'_oma_norm' + open (119,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//conid//'_'//trim(groupid(jgroup))//'_omb_count' + open (129,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//trim(groupid(jgroup))//'_omb_mean' + open (139,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//trim(groupid(jgroup))//'_oma_mean' + open (149,file=trim(filename_base),status='replace') + + filename_base=conid//'_'//trim(groupid(jgroup))//'_omb_mean' + open (159,file=trim(filename_base),status='replace') + + filename_base=conid//'_'//trim(groupid(jgroup))//'_oma_mean' + open (169,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//trim(groupid(jgroup))//'_omb_sdev' + open (179,file=trim(filename_base),status='replace') + + filename_base=conid//'_'//trim(groupid(jgroup))//'_omb_sdev' + open (189,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//trim(groupid(jgroup))//'_oma_sdev' + open (199,file=trim(filename_base),status='replace') + + filename_base=conid//'_'//trim(groupid(jgroup))//'_oma_sdev' + open (209,file=trim(filename_base),status='replace') + + filename_base=expid//'_'//trim(groupid(jgroup))//'_bcor_mean' + open (219,file=trim(filename_base),status='replace') + + filename_base=conid//'_'//trim(groupid(jgroup))//'_bcor_mean' + open (229,file=trim(filename_base),status='replace') + + do jdomain=ndomains+1,ndomains+1 + do jlevel=1,nlevels + + if (statistic(jgroup,1,jdomain,jlevel,1)<1.0e-1) cycle + if ( (jgroup==17 .and. jlevel==18) .or. & + ((.not. separation1) .and. jgroup==17 .and. jlevel==19) ) then ! Separate ATMS WV channels + + separation1=.true. + write (100+jdomain,*) '' + write (110+jdomain,*) '' + write (120+jdomain,*) '' + write (130+jdomain,*) '' + write (140+jdomain,*) '' + write (150+jdomain,*) '' + write (160+jdomain,*) '' + write (170+jdomain,*) '' + write (180+jdomain,*) '' + write (190+jdomain,*) '' + write (200+jdomain,*) '' + write (210+jdomain,*) '' + write (220+jdomain,*) '' + end if + + if (l_chisq_conf_intervals) then + write (100+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,4,jdomain,jlevel,4), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + stat99l(jgroup,4,jdomain,jlevel,4)-statistic(jgroup,4,jdomain,jlevel,4), & + stat99u(jgroup,4,jdomain,jlevel,4)-statistic(jgroup,4,jdomain,jlevel,4) + write (110+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,4,jdomain,jlevel,8), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + stat99l(jgroup,4,jdomain,jlevel,8)-statistic(jgroup,4,jdomain,jlevel,8), & + stat99u(jgroup,4,jdomain,jlevel,8)-statistic(jgroup,4,jdomain,jlevel,8) + else + write (100+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,4,jdomain,jlevel,4), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + -stat95_bg(jgroup,jdomain,jlevel), & + stat95_bg(jgroup,jdomain,jlevel) + write (110+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,4,jdomain,jlevel,8), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + -stat95_an(jgroup,jdomain,jlevel), & + stat95_an(jgroup,jdomain,jlevel) + end if + + write (120+jdomain,'(2(1x,f18.10,1x,f18.5))') & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + statistic(jgroup,1,jdomain,jlevel,1) + write (130+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,1,jdomain,jlevel,2), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (140+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,1,jdomain,jlevel,6), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (150+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,2,jdomain,jlevel,2), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (160+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,2,jdomain,jlevel,6), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (170+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,1,jdomain,jlevel,4), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (180+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,2,jdomain,jlevel,4), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (190+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,1,jdomain,jlevel,8), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (200+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,2,jdomain,jlevel,8), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (210+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,1,jdomain,jlevel,10), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + write (220+jdomain,'(4(1x,f18.10))') & + statistic(jgroup,2,jdomain,jlevel,10), & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + 0.0, 0.0 + + end do + + write (120+jdomain,'(a)') '' + + do jlevel=1,nlevels + + if (statistic(jgroup,1,jdomain,jlevel,1)<1.0e-1) cycle + if ( (jgroup==17 .and. jlevel==18) .or. & + ((.not. separation2) .and. jgroup==17 .and. jlevel==19) ) then ! Separate ATMS WV channels + + separation2=.true. + write (100+jdomain,*) '' + write (110+jdomain,*) '' + write (120+jdomain,*) '' + write (130+jdomain,*) '' + write (140+jdomain,*) '' + write (150+jdomain,*) '' + write (160+jdomain,*) '' + write (170+jdomain,*) '' + write (180+jdomain,*) '' + write (190+jdomain,*) '' + write (200+jdomain,*) '' + write (210+jdomain,*) '' + write (220+jdomain,*) '' + end if + + write (120+jdomain,'(2(1x,f18.10,1x,f18.5))') & + Vcoordinate_back(jlevel,jgroup,irank,offset), & + statistic(jgroup,2,jdomain,jlevel,1) + end do + + end do + + close (109) + close (119) + close (129) + close (139) + close (149) + close (159) + close (169) + close (179) + close (189) + close (199) + close (209) + close (219) + close (229) + + end do + + filename_base=expid//'_'//conid//'_datacount_summary' + open (99,file=trim(filename_base),status='replace') + do jgroup=1,nobgroups + do jdomain=ndomains+1,ndomains+1 + do jlevel=1,nlevels + if ( statistic(jgroup,1,jdomain,jlevel,1)>1.0e-1 .and. & + statistic(jgroup,2,jdomain,jlevel,1)>1.0e-1 ) then + write (99,'(2(1x,i2),1x,i4,2(1x,i8),1x,f12.6,1x,a)') & + jgroup, jdomain, jlevel, & + nint(statistic(jgroup,1,jdomain,jlevel,1)), & + nint(statistic(jgroup,2,jdomain,jlevel,1)), & + statistic(jgroup,1,jdomain,jlevel,1) / & + statistic(jgroup,2,jdomain,jlevel,1), & + trim(groupid(jgroup)) + elseif (statistic(jgroup,1,jdomain,jlevel,1)>1.0e-1) then + write (99,'(3(1x,i2),2(1x,i8),1x,a)') & + jgroup, jdomain, jlevel, & + nint(statistic(jgroup,1,jdomain,jlevel,1)), & + nint(statistic(jgroup,2,jdomain,jlevel,1)), & + trim(groupid(jgroup)) + elseif (statistic(jgroup,2,jdomain,jlevel,1)>1.0e-1) then + write (99,'(3(1x,i2),2(1x,i8),1x,a)') & + jgroup, jdomain, jlevel, & + nint(statistic(jgroup,1,jdomain,jlevel,1)), & + nint(statistic(jgroup,2,jdomain,jlevel,1)), & + trim(groupid(jgroup)) + endif + enddo + enddo + enddo + close (99) + +end subroutine report diff --git a/src/vcoordinate.F90 b/src/vcoordinate.F90 new file mode 100755 index 0000000..c6bee89 --- /dev/null +++ b/src/vcoordinate.F90 @@ -0,0 +1,459 @@ +function vcoordinate(level,jgroup) result(vindex) + +! Converting vertical coordinate from whatever is given into array +! index. + + use parameters, only : & + jpim, jprb, & + nlevels_temp, & + nlevels_rttov, & + iasi_chanback + use array_definitions, only : & + levels_temp, levels_rttov + + implicit none + real(kind=jprb) :: level + integer(kind=jpim) :: jgroup, jlevel, vindex + + vindex=0_jpim + + if ( (jgroup>= 1_jpim .and. jgroup<= 6_jpim) .or. & ! TEMP + (jgroup==44_jpim) .or. & ! TEMPZ + (jgroup>= 7_jpim .and. jgroup<=10_jpim) .or. & ! AIREP + (jgroup>=11_jpim .and. jgroup<=14_jpim) .or. & ! TEMP+AIREP U+V + (jgroup>=26_jpim .and. jgroup<=27_jpim) .or. & ! RADAR RH/REFL + (jgroup==43_jpim) .or. & ! RADAR WIND + (jgroup>=29_jpim .and. jgroup<=37) ) then ! SATOB + do jlevel=1,nlevels_temp + if (nint(level)==nint(levels_temp(jlevel))) then + vindex=jlevel + exit + end if + end do + + else if (jgroup==15_jpim) then ! SURFACE + vindex=nint(level) + + else if (jgroup==16_jpim) then ! AMSU-A + vindex=nint(level) + + else if (jgroup==17_jpim) then ! ATMS + vindex=nint(level) + if (vindex==5 .or. vindex==17) vindex=0 + + else if (jgroup==18_jpim) then ! MHS + vindex=nint(level) + + else if (jgroup==19_jpim) then ! MWHS2 + vindex=nint(level) + + else if (jgroup==28_jpim) then ! SEVIRI + vindex=nint(level) + + else if ( (jgroup>=20_jpim .and. jgroup<=21_jpim) .or. & ! IASI + (jgroup>=23_jpim .and. jgroup<=24_jpim) ) then ! CRIS + vindex=1 + do jlevel=2,nlevels_temp + if (abs(level-levels_temp(jlevel)) < abs(level-levels_temp(vindex))) then + vindex=jlevel + end if + end do + + else if ( (jgroup==22_jpim .or. jgroup==25_jpim) .or. & ! IR Wavenumber space + (jgroup>=38_jpim .and. jgroup<=40_jpim) .or. & ! IASI individuals + (jgroup>=41_jpim .and. jgroup<=42_jpim) ) then ! CRIS individuals + vindex=nint((level-644.75)/.25) +!* + if (jgroup==22_jpim .or. (jgroup>=38_jpim .and. jgroup<=40_jpim)) then + + vindex=iasi_chanback(vindex) + +! select case (vindex) +! case (38) +! vindex=1 +! case (51) +! vindex=2 +! case (63) +! vindex=3 +! case (85) +! vindex=4 +! case (104) +! vindex=5 +! case (109) +! vindex=6 +! case (167) +! vindex=7 +! case (173) +! vindex=8 +! case (180) +! vindex=9 +! case (185) +! vindex=10 +! case (193) +! vindex=11 +! case (199) +! vindex=12 +! case (205) +! vindex=13 +! case (207) +! vindex=14 +! case (212) +! vindex=15 +! case (224) +! vindex=16 +! case (230) +! vindex=17 +! case (236) +! vindex=18 +! case (239) +! vindex=19 +! case (242) +! vindex=20 +! case (243) +! vindex=21 +! case (249) +! vindex=22 +! case (296) +! vindex=23 +! case (333) +! vindex=24 +! case (337) +! vindex=25 +! case (345) +! vindex=26 +! case (352) +! vindex=27 +! case (386) +! vindex=28 +! case (389) +! vindex=29 +! case (432) +! vindex=30 +! case (2701) +! vindex=31 +! case (2819) +! vindex=32 +! case (2910) +! vindex=33 +! case (2919) +! vindex=34 +! case (2991) +! vindex=35 +! case (2993) +! vindex=36 +! case (3002) +! vindex=37 +! case (3008) +! vindex=38 +! case (3014) +! vindex=39 +! case (3098) +! vindex=40 +! case (3207) +! vindex=41 +! case (3228) +! vindex=42 +! case (3281) +! vindex=43 +! case (3309) +! vindex=44 +! case (3322) +! vindex=45 +! case (3438) +! vindex=46 +! case (3442) +! vindex=47 +! case (3484) +! vindex=48 +! case (3491) +! vindex=49 +! case (3499) +! vindex=50 +! case (3506) +! vindex=51 +! case (3575) +! vindex=52 +! case (3582) +! vindex=53 +! case (3658) +! vindex=54 +! case (4032) +! vindex=55 +! case default +! vindex=0 +! end select + + elseif (jgroup==25_jpim .or. (jgroup>=41_jpim .and. jgroup<=42_jpim)) then + if (level<1100.0) then + vindex=nint((level-649.375)/.625) + elseif (level<1800.0) then + vindex=nint((level-1209.375)/.625)+713 + else + vindex=nint((level-2154.375)/.625)+1578 + endif + select case (vindex) + case (27) + vindex=1 + case (59) + vindex=2 + case (67) + vindex=3 + case (69) + vindex=4 + case (79) + vindex=5 + case (80) + vindex=6 + case (81) + vindex=7 + case (82) + vindex=8 + case (83) + vindex=9 + case (84) + vindex=10 + case (85) + vindex=11 + case (86) + vindex=12 + case (87) + vindex=13 + case (88) + vindex=14 + case (91) + vindex=15 + case (92) + vindex=16 + case (93) + vindex=17 + case (94) + vindex=18 + case (95) + vindex=19 + case (96) + vindex=20 + case (97) + vindex=21 + case (98) + vindex=22 + case (99) + vindex=23 + case (100) + vindex=24 + case (103) + vindex=25 + case (104) + vindex=26 + case (105) + vindex=27 + case (106) + vindex=28 + case (107) + vindex=29 + case (108) + vindex=30 + case (109) + vindex=31 + case (110) + vindex=32 + case (111) + vindex=33 + case (115) + vindex=34 + case (116) + vindex=35 + case (117) + vindex=36 + case (118) + vindex=37 + case (119) + vindex=38 + case (120) + vindex=39 + case (121) + vindex=40 + case (122) + vindex=41 + case (123) + vindex=42 + case (124) + vindex=43 + case (125) + vindex=44 + case (126) + vindex=45 + case (132) + vindex=46 + case (133) + vindex=47 + case (134) + vindex=48 + case (135) + vindex=49 + case (136) + vindex=50 + case (137) + vindex=51 + case (138) + vindex=52 + case (139) + vindex=53 + case (140) + vindex=54 + case (141) + vindex=55 + case (142) + vindex=56 + case (143) + vindex=57 + case (144) + vindex=58 + case (147) + vindex=59 + case (161) + vindex=60 + case (173) + vindex=61 + case (177) + vindex=62 + case (181) + vindex=63 + case (185) + vindex=64 + case (195) + vindex=65 + case (199) + vindex=66 + case (242) + vindex=67 + case (275) + vindex=68 + case (295) + vindex=69 + case (342) + vindex=70 + case (404) + vindex=71 + case (439) + vindex=72 + case (449) + vindex=73 + case (464) + vindex=74 + case (475) + vindex=75 + case (490) + vindex=76 + case (501) + vindex=77 + case (898) + vindex=78 + case (914) + vindex=79 + case (972) + vindex=80 + case (988) + vindex=81 + case (1018) + vindex=82 + case (1029) + vindex=83 + case (1046) + vindex=84 + case (1053) + vindex=85 + case (1060) + vindex=86 + case (1064) + vindex=87 + case (1076) + vindex=88 + case (1112) + vindex=89 + case (1189) + vindex=90 + case (1205) + vindex=91 + case default + vindex=0 + end select + endif +!* + end if +end function vcoordinate + + + +function vcoordinate_back(jlevel,jgroup,irank,offset) result(level) + +! Converting array index into the vertical coordinate used in visual +! plotting + + use parameters, only : & + jpim, jprb, & + nlevels_temp, & + nlevels_rttov, & + niasich_metcoop, & + iasich_metcoop, & + ncrisch_metcoop, & + crisch_metcoop + use array_definitions, only : & + levels_temp, levels_rttov + + implicit none + integer(kind=jpim) :: jlevel, jgroup, irank + real(kind=jprb) :: level, offset, offs + + level=0.0_jprb + + if ( (jgroup>= 1_jpim .and. jgroup<= 6_jpim) .or. & ! TEMP + (jgroup==44_jpim) .or. & ! TEMPZ + (jgroup>= 7_jpim .and. jgroup<=10_jpim) .or. & ! AIREP + (jgroup>=11_jpim .and. jgroup<=14_jpim) .or. & ! TEMP+AIREP U+V + (jgroup>=26_jpim .and. jgroup<=27_jpim) .or. & ! RADAR RH/REFL + (jgroup==43_jpim) .or. & ! RADAR WIND + (jgroup>=29_jpim .and. jgroup<=37_jpim) ) then ! SATOB + level=levels_temp(jlevel) + + else if (jgroup==15_jpim) then ! SURFACE + level=jlevel*1.0_jprb + + else if (jgroup==16_jpim) then ! AMSU-A + level=jlevel*1.0_jprb + + else if (jgroup==17_jpim) then ! ATMS + level=jlevel*1.0_jprb + if (jlevel==5 .or. jlevel==17) level=0.0 + + else if (jgroup==18_jpim) then ! MHS + level=jlevel*1.0_jprb + + else if (jgroup==19_jpim) then ! MWHS2 + level=jlevel*1.0_jprb + + else if ( (jgroup>=20_jpim .and. jgroup<=21_jpim) .or. & ! IASI + (jgroup>=23_jpim .and. jgroup<=24_jpim) ) then ! CRIS + level=levels_temp(jlevel) + + else if ( (jgroup>=22_jpim .and. jgroup<=25_jpim) .or. & ! IR wavenumber space + (jgroup>=38_jpim .and. jgroup<=40_jpim) .or. & ! IASI individuals + (jgroup>=41_jpim .and. jgroup<=42_jpim) ) then ! CRIS individuals + level=644.75+.25*jlevel +!* + if (jgroup==22_jpim) level=1.0*iasich_metcoop(jlevel) + if (jgroup==25_jpim) level=1.0*crisch_metcoop(jlevel) +!* + + else if (jgroup==28_jpim) then ! SEVIRI + level=jlevel*1.0_jprb + end if + + if (abs(offset)<1000000.0_jprb) then ! linear offset + level=level+(irank-1)*offset + else + offs=(irank-1)*(abs(offset)-1000000.0_jprb) + if (offset<0.0_jprb) offs=-1_jpim*offs + level=exp(log(level)+offs) + end if + +end function vcoordinate_back