! $Id: ropp_io_fields_compare.f90 2197 2009-06-23 09:11:17Z idculv $ !****si* Test/ropp_io_fields_compare * ! ! NAME ! ropp_io_fields_compare - Compares two ROPP profiles for meaningful differences. ! ! SYNOPSIS ! CALL ropp_io_fields_compare (prof1, prof2, ndiff, sprof, & ! bg, GEOref, Lev1a, Lev1b, Lev2a, Lev2b, Lev2c, Lev2d, & ! L1L2=L1L2, onedvar=onedvar, spectra=spectra) ! ! DESCRIPTION ! Compares two ROPP profiles. ! Used by ropp_/tests/ropp__compare.f90 to compare output. ! ! INPUTS ! ROprofs prof1 and prof2, and a set of logicals which define the ! 'blocks' of data to be compared. ! ! OUTPUT ! The (updated) number of 'significantly' different elements of the two profiles. ! ! NOTES ! The various thresholds for defining differences as significant ! are subject to change, depending on experience with this routine. ! ! SEE ALSO ! ropp_/tests/ropp__compare.f90 ! ! AUTHOR ! Met Office, Exeter, UK. ! Any comments on this software should be given via the ROM SAF ! Helpdesk at http://www.romsaf.org ! ! COPYRIGHT ! (c) EUMETSAT. All rights reserved. ! For further details please refer to the file COPYRIGHT ! which you should have received as part of this distribution. ! !**** SUBROUTINE ropp_io_fields_compare(prof1, prof2, ndiff, sprof, & bg, qa, GEOref, Lev1a, Lev1b, Lev2a, Lev2b, Lev2c, Lev2d, & L1L2, onedvar, spectra, tdry) USE typesizes, wp => EightByteReal USE ropp_io_types, ONLY: ROprof USE ropp_io, ONLY: ropp_io_diff USE messages ! Input/output variables TYPE(ROprof), INTENT(in) :: prof1 ! RO profile from file1.nc TYPE(ROprof), INTENT(in) :: prof2 ! RO profile from file2.nc CHARACTER(LEN=4), INTENT(in) :: sprof ! Profile number INTEGER, INTENT(inout) :: ndiff ! Number of differences LOGICAL, INTENT(in) :: bg, qa, GEOref, & ! The substructures of Lev1a, Lev1b, & ! ROprof to be compared Lev2a, Lev2b, & Lev2c, Lev2d LOGICAL, OPTIONAL, INTENT(in) :: L1L2 ! False when comparing -direct_ion and ! neutral L1 and L2 fields LOGICAL, OPTIONAL, INTENT(in) :: onedvar ! True to relax difference ! tolerance for retrievals LOGICAL, OPTIONAL, INTENT(in) :: spectra ! True to define variables for spectra tests LOGICAL, OPTIONAL, INTENT(in) :: tdry ! True to relax tdry tolerances for occ and rs tests ! Local variables LOGICAL :: L1L2_local ! Local version of L1L2 LOGICAL :: onedvar_local ! Local version of onedvar LOGICAL :: spectra_local ! Local version of spectra LOGICAL :: tdry_local ! Local version of tdry CHARACTER(LEN=256) :: routine ! Routine name for diagnostics CHARACTER(LEN=256) :: sinfo ! Information for diagnostics ! ------------------------------------------------------------------------------ ! 0. Initialise ! ------------------------------------------------------------------------------ ! 0.1 Set routine for error messages ! ---------------------------------- CALL message_get_routine(routine) CALL message_set_routine('ropp_io_fields_compare') ! 0.2 Define local logical variables ! ---------------------------------- L1L2_local = .TRUE. IF ( PRESENT(L1L2) ) L1L2_local = L1L2 onedvar_local = .FALSE. IF ( PRESENT(onedvar) ) onedvar_local = onedvar spectra_local = .FALSE. IF ( PRESENT(spectra) ) spectra_local = spectra tdry_local = .FALSE. IF ( PRESENT(tdry) ) tdry_local = tdry ! 0.3 Define local character variables ! ------------------------------------ sinfo = 'Profile ' // TRIM(ADJUSTL(sprof)) ! ------------------------------------------------------------------------------ ! 1. Compare the elements of the profiles ! ------------------------------------------------------------------------------ ! 1.1 Background ! -------------- IF (bg) THEN CALL ropp_io_diff(prof1%bg%source, prof2%bg%source, & ndiff, TRIM(ADJUSTL(sinfo))//' bg%source') CALL ropp_io_diff(prof1%bg%year, prof2%bg%year, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' bg%year') CALL ropp_io_diff(prof1%bg%month, prof2%bg%month, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' bg%month') CALL ropp_io_diff(prof1%bg%day, prof2%bg%day, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' bg%day') CALL ropp_io_diff(prof1%bg%hour, prof2%bg%hour, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' bg%hour') CALL ropp_io_diff(prof1%bg%minute, prof2%bg%minute, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' bg%minute') CALL ropp_io_diff(prof1%bg%Fcperiod, prof2%bg%Fcperiod, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' bg%Fcperiod') ENDIF ! bg ! 1.1.1 QA indictor ! ------------------ IF (qa) THEN CALL ropp_io_diff(prof1%QA%snr1avg, prof2%QA%snr1avg, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%snr1avg') CALL ropp_io_diff(prof1%QA%snr2avg, prof2%QA%snr2avg, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%snr2avg') CALL ropp_io_diff(prof1%QA%irs, prof2%QA%irs, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' QA%irs') CALL ropp_io_diff(prof1%QA%smean, prof2%QA%smean, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%smean') CALL ropp_io_diff(prof1%QA%stdv, prof2%QA%stdv, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%stdv') CALL ropp_io_diff(prof1%QA%smean1, prof2%QA%smean1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%smean1') CALL ropp_io_diff(prof1%QA%stdv1, prof2%QA%stdv1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%stdv1') CALL ropp_io_diff(prof1%QA%reldevmax, prof2%QA%reldevmax, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%reldevmax') CALL ropp_io_diff(prof1%QA%reldevstd, prof2%QA%reldevstd, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%reldevstd') CALL ropp_io_diff(prof1%QA%reldevmax1, prof2%QA%reldevmax1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%reldevmax1') CALL ropp_io_diff(prof1%QA%reldevstd1, prof2%QA%reldevstd1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%reldevstd1') CALL ropp_io_diff(prof1%QA%difmaxref, prof2%QA%difmaxref, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%difmaxref') CALL ropp_io_diff(prof1%QA%maxdifphase, prof2%QA%maxdifphase, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' QA%maxdifphase') CALL ropp_io_diff(prof1%QA%finalQA, prof2%QA%finalQA, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' QA%finalQA') ENDIF ! qa ! 1.2 Georeferencing ! ------------------ IF (GEOref) THEN CALL ropp_io_diff(prof1%GEOref%time_offset, prof2%GEOref%time_offset, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%time_offset') CALL ropp_io_diff(prof1%GEOref%lat, prof2%GEOref%lat, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%lat') CALL ropp_io_diff(prof1%GEOref%lon, prof2%GEOref%lon, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%lon') CALL ropp_io_diff(prof1%GEOref%roc, prof2%GEOref%roc, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%roc') CALL ropp_io_diff(prof1%GEOref%r_alt, prof2%GEOref%r_alt, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%r_alt') CALL ropp_io_diff(prof1%GEOref%viewang, prof2%GEOref%viewang, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%viewang') CALL ropp_io_diff(prof1%GEOref%azimuth, prof2%GEOref%azimuth, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%azimuth') CALL ropp_io_diff(prof1%GEOref%undulation, prof2%GEOref%undulation, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%undulation') IF ( ABS(prof1%GEOref%undulation - prof2%GEOref%undulation) > 1.0e-6_wp ) & CALL message ( msg_info, 'Suggest checking that GEOPOT_COEF and GEOPOT_CORR ' // & 'have been set correctly. (See grib2bgrasc man page.) \n') CALL ropp_io_diff(prof1%GEOref%r_coc, prof2%GEOref%r_coc, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%r_coc') CALL ropp_io_diff(prof1%GEOref%leo_pod%pos, prof2%GEOref%leo_pod%pos, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%leo_pod%pos') CALL ropp_io_diff(prof1%GEOref%leo_pod%vel, prof2%GEOref%leo_pod%vel, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%leo_pod%vel') CALL ropp_io_diff(prof1%GEOref%leo_pod%pos_frame, prof2%GEOref%leo_pod%pos_frame, & ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%leo_pod%pos_frame') CALL ropp_io_diff(prof1%GEOref%leo_pod%vel_frame, prof2%GEOref%leo_pod%vel_frame, & ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%leo_pod%vel_frame') CALL ropp_io_diff(prof1%GEOref%gns_pod%pos, prof2%GEOref%gns_pod%pos, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%gns_pod%pos') CALL ropp_io_diff(prof1%GEOref%gns_pod%vel, prof2%GEOref%gns_pod%vel, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%gns_pod%vel') CALL ropp_io_diff(prof1%GEOref%gns_pod%pos_frame, prof2%GEOref%gns_pod%pos_frame, & ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%gns_pod%pos_frame') CALL ropp_io_diff(prof1%GEOref%gns_pod%vel_frame, prof2%GEOref%gns_pod%vel_frame, & ndiff, TRIM(ADJUSTL(sinfo))//' GEOref%gns_pod%vel_frame') ENDIF ! GEOref ! 1.3 Level 1a ! ------------ IF (Lev1a) THEN CALL ropp_io_diff(prof1%Lev1a%Npoints, prof2%Lev1a%Npoints, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%Npoints') IF ( prof1%Lev1a%Npoints /= prof2%Lev1a%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF CALL ropp_io_diff(prof1%Lev1a%dtime, prof2%Lev1a%dtime, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%dtime') CALL ropp_io_diff(prof1%Lev1a%snr_L1ca, prof2%Lev1a%snr_L1ca, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%snr_L1ca') CALL ropp_io_diff(prof1%Lev1a%snr_L1p, prof2%Lev1a%snr_L1p, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%snr_L1p') CALL ropp_io_diff(prof1%Lev1a%snr_L2p, prof2%Lev1a%snr_L2p, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%snr_L2p') ! Relax tolerance here to +/- 5*2pi ~ 1 m, because different compilers can introduce ! such phase jumps when calculating (eg) MODULO functions in accumulate_phase. ! CALL ropp_io_diff(prof1%Lev1a%phase_L1, prof2%Lev1a%phase_L1, 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%phase_L1') ! CALL ropp_io_diff(prof1%Lev1a%phase_L2, prof2%Lev1a%phase_L2, 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%phase_L2') CALL ropp_io_diff(prof1%Lev1a%phase_L1, prof2%Lev1a%phase_L1, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%phase_L1') CALL ropp_io_diff(prof1%Lev1a%phase_L2, prof2%Lev1a%phase_L2, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%phase_L2') CALL ropp_io_diff(prof1%Lev1a%phase_qual, prof2%Lev1a%phase_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%phase_qual') ! Open_loop_lcf is not (yet) part of standard Lev1a substructure. ! Instead, if present, it is (probably) held in ROprof%vlist%VlistD1d%DATA. IF ( ASSOCIATED(prof1%vlist%VlistD1d) .AND. & ASSOCIATED(prof2%vlist%VlistD1d) ) THEN IF ( TRIM(ADJUSTL(prof1%vlist%VlistD1d%name)) == 'open_loop_lcf' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD1d%name)) == 'open_loop_lcf' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD1d%DATA, prof2%vlist%VlistD1d%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%open_loop_lcf') ENDIF ENDIF CALL ropp_io_diff(prof1%Lev1a%r_gns, prof2%Lev1a%r_gns, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%r_gns') CALL ropp_io_diff(prof1%Lev1a%v_gns, prof2%Lev1a%v_gns, & 1.0e-3_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%v_gns') CALL ropp_io_diff(prof1%Lev1a%r_leo, prof2%Lev1a%r_leo, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%r_leo') CALL ropp_io_diff(prof1%Lev1a%v_leo, prof2%Lev1a%v_leo, & 1.0e-3_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1a%v_leo') ENDIF ! Lev1a ! 1.4 Level 1b ! ------------ IF (Lev1b) THEN CALL ropp_io_diff(prof1%Lev1b%Npoints, prof2%Lev1b%Npoints, 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%Npoints') IF ( prof1%Lev1b%Npoints /= prof2%Lev1b%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF IF ( onedvar_local ) THEN ! Relax difference thresholds CALL ropp_io_diff(prof1%Lev1b%lat_tp, prof2%Lev1b%lat_tp, & 1.0e-4_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%lat_tp') CALL ropp_io_diff(prof1%Lev1b%lon_tp, prof2%Lev1b%lon_tp, & 1.0e-4_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%lon_tp') CALL ropp_io_diff(prof1%Lev1b%azimuth_tp, prof2%Lev1b%azimuth_tp, & 1.0e-2_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%azimuth_tp') CALL ropp_io_diff(prof1%Lev1b%impact, prof2%Lev1b%impact, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact') CALL ropp_io_diff(prof1%Lev1b%impact_opt, prof2%Lev1b%impact_opt, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_opt') CALL ropp_io_diff(prof1%Lev1b%bangle, prof2%Lev1b%bangle, & 1.0e-5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle') CALL ropp_io_diff(prof1%Lev1b%bangle_sigma, prof2%Lev1b%bangle_sigma, & 2.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_opt, prof2%Lev1b%bangle_opt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt') CALL ropp_io_diff(prof1%Lev1b%bangle_opt_sigma, prof2%Lev1b%bangle_opt_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_qual, prof2%Lev1b%bangle_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_qual') CALL ropp_io_diff(prof1%Lev1b%bangle_opt_qual, prof2%Lev1b%bangle_opt_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt_qual') IF (L1L2_local) THEN ! These tests need to be switched off when comparing -direct_ion results CALL ropp_io_diff(prof1%Lev1b%impact_L1, prof2%Lev1b%impact_L1, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_L1') CALL ropp_io_diff(prof1%Lev1b%bangle_L1, prof2%Lev1b%bangle_L1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1') CALL ropp_io_diff(prof1%Lev1b%bangle_L1_sigma, prof2%Lev1b%bangle_L1_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_L1_qual, prof2%Lev1b%bangle_L1_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1_qual') CALL ropp_io_diff(prof1%Lev1b%impact_L2, prof2%Lev1b%impact_L2, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_L2') CALL ropp_io_diff(prof1%Lev1b%bangle_L2, prof2%Lev1b%bangle_L2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2') CALL ropp_io_diff(prof1%Lev1b%bangle_L2_sigma, prof2%Lev1b%bangle_L2_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_L2_qual, prof2%Lev1b%bangle_L2_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2_qual') ENDIF ! L1 and L2 testing ELSE CALL ropp_io_diff(prof1%Lev1b%lat_tp, prof2%Lev1b%lat_tp, & 1.0e-4_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%lat_tp') CALL ropp_io_diff(prof1%Lev1b%lon_tp, prof2%Lev1b%lon_tp, & 1.0e-4_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%lon_tp') CALL ropp_io_diff(prof1%Lev1b%azimuth_tp, prof2%Lev1b%azimuth_tp, & 1.0e-2_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%azimuth_tp') CALL ropp_io_diff(prof1%Lev1b%impact, prof2%Lev1b%impact, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact') CALL ropp_io_diff(prof1%Lev1b%impact_opt, prof2%Lev1b%impact_opt, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_opt') CALL ropp_io_diff(prof1%Lev1b%bangle, prof2%Lev1b%bangle, & 1.0e-5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle') CALL ropp_io_diff(prof1%Lev1b%bangle_sigma, prof2%Lev1b%bangle_sigma, & 2.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_opt, prof2%Lev1b%bangle_opt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt') CALL ropp_io_diff(prof1%Lev1b%bangle_opt_sigma, prof2%Lev1b%bangle_opt_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_qual, prof2%Lev1b%bangle_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_qual') CALL ropp_io_diff(prof1%Lev1b%bangle_opt_qual, prof2%Lev1b%bangle_opt_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_opt_qual') IF (L1L2_local) THEN ! These tests need to be switched off when comparing -direct_ion results CALL ropp_io_diff(prof1%Lev1b%impact_L1, prof2%Lev1b%impact_L1, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_L1') CALL ropp_io_diff(prof1%Lev1b%bangle_L1, prof2%Lev1b%bangle_L1, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1') CALL ropp_io_diff(prof1%Lev1b%bangle_L1_sigma, prof2%Lev1b%bangle_L1_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_L1_qual, prof2%Lev1b%bangle_L1_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L1_qual') CALL ropp_io_diff(prof1%Lev1b%impact_L2, prof2%Lev1b%impact_L2, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%impact_L2') CALL ropp_io_diff(prof1%Lev1b%bangle_L2, prof2%Lev1b%bangle_L2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2') CALL ropp_io_diff(prof1%Lev1b%bangle_L2_sigma, prof2%Lev1b%bangle_L2_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2_sigma') CALL ropp_io_diff(prof1%Lev1b%bangle_L2_qual, prof2%Lev1b%bangle_L2_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev1b%bangle_L2_qual') ENDIF ! L1 and L2 testing ENDIF ENDIF ! Lev1b ! 1.5 Level 2a ! ------------ IF (Lev2a) THEN CALL ropp_io_diff(prof1%Lev2a%Npoints, prof2%Lev2a%Npoints, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%Npoints') IF ( prof1%Lev2a%Npoints /= prof2%Lev2a%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF IF ( onedvar_local ) THEN ! Relax difference thresholds CALL ropp_io_diff(prof1%Lev2a%refrac, prof2%Lev2a%refrac, & 0.5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%refrac') ! Very high, but necessary CALL ropp_io_diff(prof1%Lev2a%refrac_sigma, prof2%Lev2a%refrac_sigma, & 2.0e-2_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%refrac_sigma') ELSE CALL ropp_io_diff(prof1%Lev2a%refrac, prof2%Lev2a%refrac, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%refrac') CALL ropp_io_diff(prof1%Lev2a%refrac_sigma, prof2%Lev2a%refrac_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%refrac_sigma') ENDIF IF ( tdry_local ) THEN ! Relax tdry tolerances for invert, occ, GNOS, rs and spectra tests CALL ropp_io_diff(prof1%Lev2a%dry_temp, prof2%Lev2a%dry_temp, & 1.0e-4_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%dry_temp') ELSE CALL ropp_io_diff(prof1%Lev2a%dry_temp, prof2%Lev2a%dry_temp, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%dry_temp') ENDIF CALL ropp_io_diff(prof1%Lev2a%alt_refrac, prof2%Lev2a%alt_refrac, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%alt_refrac') CALL ropp_io_diff(prof1%Lev2a%geop_refrac, prof2%Lev2a%geop_refrac, & 1.0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%geop_refrac') CALL ropp_io_diff(prof1%Lev2a%refrac_qual, prof2%Lev2a%refrac_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%refrac_qual') CALL ropp_io_diff(prof1%Lev2a%dry_temp_sigma, prof2%Lev2a%dry_temp_sigma, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%dry_temp_sigma') CALL ropp_io_diff(prof1%Lev2a%dry_temp_qual, prof2%Lev2a%dry_temp_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2a%dry_temp_qual') ENDIF ! Lev2a ! 1.6 Level 2b ! ------------ IF (Lev2b) THEN CALL ropp_io_diff(prof1%Lev2b%Npoints, prof2%Lev2b%Npoints, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%Npoints') IF ( prof1%Lev2b%Npoints /= prof2%Lev2b%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF IF ( onedvar_local ) THEN ! Relax difference thresholds CALL ropp_io_diff(prof1%Lev2b%press, prof2%Lev2b%press, & 2.0e-1_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%press') CALL ropp_io_diff(prof1%Lev2b%temp, prof2%Lev2b%temp, & 1.0e-1_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%temp') CALL ropp_io_diff(prof1%Lev2b%shum, prof2%Lev2b%shum, & 1.0e-1_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%shum') CALL ropp_io_diff(prof1%Lev2b%geop, prof2%Lev2b%geop, & 2.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%geop') CALL ropp_io_diff(prof1%Lev2b%meteo_qual, prof2%Lev2b%meteo_qual, & 1.0e-3_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%meteo_qual') ELSE CALL ropp_io_diff(prof1%Lev2b%press, prof2%Lev2b%press, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%press') CALL ropp_io_diff(prof1%Lev2b%temp, prof2%Lev2b%temp, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%temp') CALL ropp_io_diff(prof1%Lev2b%shum, prof2%Lev2b%shum, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%shum') CALL ropp_io_diff(prof1%Lev2b%geop, prof2%Lev2b%geop, & 1.0e-3_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%geop') CALL ropp_io_diff(prof1%Lev2b%meteo_qual, prof2%Lev2b%meteo_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2b%meteo_qual') ENDIF ENDIF ! Lev2b ! 1.7 Level 2c ! ------------ IF (Lev2c) THEN CALL ropp_io_diff(prof1%Lev2c%Npoints, prof2%Lev2c%Npoints, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%Npoints') IF ( prof1%Lev2c%Npoints /= prof2%Lev2c%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF CALL ropp_io_diff(prof1%Lev2c%geop_sfc, prof2%Lev2c%geop_sfc, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%geop_sfc') CALL ropp_io_diff(prof1%Lev2c%press_sfc, prof2%Lev2c%press_sfc, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%press_sfc') CALL ropp_io_diff(prof1%Lev2c%press_sfc_qual, prof2%Lev2c%press_sfc_qual, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%press_sfc_qual') CALL ropp_io_diff(prof1%Lev2c%ne_max, prof2%Lev2c%ne_max, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%ne_max') CALL ropp_io_diff(prof1%Lev2c%h_peak, prof2%Lev2c%h_peak, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%h_peak') CALL ropp_io_diff(prof1%Lev2c%h_width, prof2%Lev2c%h_width, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%h_width') CALL ropp_io_diff(prof1%Lev2c%tph_bangle, prof2%Lev2c%tph_bangle, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_bangle') CALL ropp_io_diff(prof1%Lev2c%tpa_bangle, prof2%Lev2c%tpa_bangle, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpa_bangle') CALL ropp_io_diff(prof1%Lev2c%tph_bangle_flag, prof2%Lev2c%tph_bangle_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_bangle_flag') CALL ropp_io_diff(prof1%Lev2c%tph_refrac, prof2%Lev2c%tph_refrac, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_refrac') CALL ropp_io_diff(prof1%Lev2c%tpn_refrac, prof2%Lev2c%tpn_refrac, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpn_refrac') CALL ropp_io_diff(prof1%Lev2c%tph_refrac_flag, prof2%Lev2c%tph_refrac_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_refrac_flag') CALL ropp_io_diff(prof1%Lev2c%tph_tdry_lrt, prof2%Lev2c%tph_tdry_lrt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_tdry_lrt') CALL ropp_io_diff(prof1%Lev2c%tpt_tdry_lrt, prof2%Lev2c%tpt_tdry_lrt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpt_tdry_lrt') CALL ropp_io_diff(prof1%Lev2c%tph_tdry_lrt_flag, prof2%Lev2c%tph_tdry_lrt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_tdry_lrt_flag') CALL ropp_io_diff(prof1%Lev2c%tph_tdry_cpt, prof2%Lev2c%tph_tdry_cpt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_tdry_cpt') CALL ropp_io_diff(prof1%Lev2c%tpt_tdry_cpt, prof2%Lev2c%tpt_tdry_cpt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpt_tdry_cpt') CALL ropp_io_diff(prof1%Lev2c%tph_tdry_cpt_flag, prof2%Lev2c%tph_tdry_cpt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_tdry_cpt_flag') CALL ropp_io_diff(prof1%Lev2c%prh_tdry_cpt, prof2%Lev2c%prh_tdry_cpt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prh_tdry_cpt') CALL ropp_io_diff(prof1%Lev2c%prt_tdry_cpt, prof2%Lev2c%prt_tdry_cpt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prt_tdry_cpt') CALL ropp_io_diff(prof1%Lev2c%prh_tdry_cpt_flag, prof2%Lev2c%prh_tdry_cpt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prh_tdry_cpt_flag') CALL ropp_io_diff(prof1%Lev2c%tph_temp_lrt, prof2%Lev2c%tph_temp_lrt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_temp_lrt') CALL ropp_io_diff(prof1%Lev2c%tpt_temp_lrt, prof2%Lev2c%tpt_temp_lrt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpt_temp_lrt') CALL ropp_io_diff(prof1%Lev2c%tph_temp_lrt_flag, prof2%Lev2c%tph_temp_lrt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_temp_lrt_flag') CALL ropp_io_diff(prof1%Lev2c%tph_temp_cpt, prof2%Lev2c%tph_temp_cpt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_temp_cpt') CALL ropp_io_diff(prof1%Lev2c%tpt_temp_cpt, prof2%Lev2c%tpt_temp_cpt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tpt_temp_cpt') CALL ropp_io_diff(prof1%Lev2c%tph_temp_cpt_flag, prof2%Lev2c%tph_temp_cpt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%tph_temp_cpt_flag') CALL ropp_io_diff(prof1%Lev2c%prh_temp_cpt, prof2%Lev2c%prh_temp_cpt, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prh_temp_cpt') CALL ropp_io_diff(prof1%Lev2c%prt_temp_cpt, prof2%Lev2c%prt_temp_cpt, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prt_temp_cpt') CALL ropp_io_diff(prof1%Lev2c%prh_temp_cpt_flag, prof2%Lev2c%prh_temp_cpt_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%prh_temp_cpt_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_bangle, prof2%Lev2c%pblh_bangle, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_bangle') CALL ropp_io_diff(prof1%Lev2c%pblh_bangle2, prof2%Lev2c%pblh_bangle2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_bangle2') CALL ropp_io_diff(prof1%Lev2c%pbla_bangle, prof2%Lev2c%pbla_bangle, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pbla_bangle') CALL ropp_io_diff(prof1%Lev2c%pbla_bangle2, prof2%Lev2c%pbla_bangle2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pbla_bangle2') CALL ropp_io_diff(prof1%Lev2c%pblh_bangle_flag, prof2%Lev2c%pblh_bangle_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_bangle_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_refrac, prof2%Lev2c%pblh_refrac, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_refrac') CALL ropp_io_diff(prof1%Lev2c%pblh_refrac2, prof2%Lev2c%pblh_refrac2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_refrac2') CALL ropp_io_diff(prof1%Lev2c%pbln_refrac, prof2%Lev2c%pbln_refrac, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pbln_refrac') CALL ropp_io_diff(prof1%Lev2c%pbln_refrac2, prof2%Lev2c%pbln_refrac2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pbln_refrac2') CALL ropp_io_diff(prof1%Lev2c%pblh_refrac_flag, prof2%Lev2c%pblh_refrac_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_refrac_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_tdry, prof2%Lev2c%pblh_tdry, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_tdry') CALL ropp_io_diff(prof1%Lev2c%pblh_tdry2, prof2%Lev2c%pblh_tdry2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_tdry2') CALL ropp_io_diff(prof1%Lev2c%pblt_tdry, prof2%Lev2c%pblt_tdry, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblt_tdry') CALL ropp_io_diff(prof1%Lev2c%pblt_tdry2, prof2%Lev2c%pblt_tdry2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblt_tdry2') CALL ropp_io_diff(prof1%Lev2c%pblh_tdry_flag, prof2%Lev2c%pblh_tdry_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_tdry_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_temp, prof2%Lev2c%pblh_temp, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_temp') CALL ropp_io_diff(prof1%Lev2c%pblh_temp2, prof2%Lev2c%pblh_temp2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_temp2') CALL ropp_io_diff(prof1%Lev2c%pblt_temp, prof2%Lev2c%pblt_temp, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblt_temp') CALL ropp_io_diff(prof1%Lev2c%pblt_temp2, prof2%Lev2c%pblt_temp2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblt_temp2') CALL ropp_io_diff(prof1%Lev2c%pblh_temp_flag, prof2%Lev2c%pblh_temp_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_temp_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_shum, prof2%Lev2c%pblh_shum, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_shum') CALL ropp_io_diff(prof1%Lev2c%pblh_shum2, prof2%Lev2c%pblh_shum2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_shum2') CALL ropp_io_diff(prof1%Lev2c%pblq_shum, prof2%Lev2c%pblq_shum, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblq_shum') CALL ropp_io_diff(prof1%Lev2c%pblq_shum2, prof2%Lev2c%pblq_shum2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblq_shum2') CALL ropp_io_diff(prof1%Lev2c%pblh_shum_flag, prof2%Lev2c%pblh_shum_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_shum_flag') CALL ropp_io_diff(prof1%Lev2c%pblh_rhum, prof2%Lev2c%pblh_rhum, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_rhum') CALL ropp_io_diff(prof1%Lev2c%pblh_rhum2, prof2%Lev2c%pblh_rhum2, & 1.0e0_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_rhum2') CALL ropp_io_diff(prof1%Lev2c%pblr_rhum, prof2%Lev2c%pblr_rhum, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblr_rhum') CALL ropp_io_diff(prof1%Lev2c%pblr_rhum2, prof2%Lev2c%pblr_rhum2, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblr_rhum2') CALL ropp_io_diff(prof1%Lev2c%pblh_rhum_flag, prof2%Lev2c%pblh_rhum_flag, & 1, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2c%pblh_rhum_flag') ENDIF ! Lev2c ! 1.8 Level 2d ! ------------ IF (Lev2d) THEN CALL ropp_io_diff(prof1%Lev2d%Npoints, prof2%Lev2d%Npoints, & 0, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2d%Npoints') IF ( prof1%Lev2d%Npoints /= prof2%Lev2d%Npoints ) THEN ! Or we may get a seg fault below CALL message_set_routine(routine) RETURN ENDIF CALL ropp_io_diff(prof1%Lev2d%level_type, prof2%Lev2d%level_type, & ndiff, TRIM(ADJUSTL(sinfo))//' Lev2d%level_type') CALL ropp_io_diff(prof1%Lev2d%level_coeff_a, prof2%Lev2d%level_coeff_a, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2d%level_coeff_a') CALL ropp_io_diff(prof1%Lev2d%level_coeff_b, prof2%Lev2d%level_coeff_b, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' Lev2d%level_coeff_b') ENDIF ! Lev2d ! 1.9 Spectra ! ----------- IF (spectra_local) THEN ! NB: need to nest these extra data searches ! 1.9.1 1D fields IF ( ASSOCIATED(prof1%vlist%VlistD1d) .AND. & ASSOCIATED(prof2%vlist%VlistD1d) ) THEN IF ( TRIM(ADJUSTL(prof1%vlist%VlistD1d%name)) == 'freq' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD1d%name)) == 'freq' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD1d%DATA, & prof2%vlist%VlistD1d%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_freq') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD1d%name)) == 'stime' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD1d%name)) == 'stime' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD1d%DATA, & prof2%vlist%VlistD1d%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_time') ENDIF IF ( ASSOCIATED(prof1%vlist%VlistD1d%next) .AND. & ASSOCIATED(prof2%vlist%VlistD1d%next) ) THEN IF ( TRIM(ADJUSTL(prof1%vlist%VlistD1d%next%name)) == 'freq' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD1d%next%name)) == 'freq' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD1d%next%DATA, & prof2%vlist%VlistD1d%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_freq') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD1d%next%name)) == 'stime' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD1d%next%name)) == 'stime' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD1d%next%DATA, & prof2%vlist%VlistD1d%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_time') ENDIF ENDIF ! Second 1d extra variable ENDIF ! First 1d extra variable ! 1.9.2 2D fields IF ( ASSOCIATED(prof1%vlist%VlistD2d) .AND. & ASSOCIATED(prof2%vlist%VlistD2d) ) THEN IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%name)) == 'amp' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%name)) == 'amp' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%DATA, & prof2%vlist%VlistD2d%DATA, & 1.0e-5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_amp') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%name)) == 'bangle' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%name)) == 'bangle' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%DATA, & prof2%vlist%VlistD2d%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_bangle') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%name)) == 'impact' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%name)) == 'impact' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%DATA, & prof2%vlist%VlistD2d%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_impact') ENDIF IF ( ASSOCIATED(prof1%vlist%VlistD2d%next) .AND. & ASSOCIATED(prof2%vlist%VlistD2d%next) ) THEN IF (TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%name)) == 'amp' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%name)) == 'amp') THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%DATA, & prof2%vlist%VlistD2d%next%DATA, & 1.0e-5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_amp') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%name)) == 'bangle' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%name)) == 'bangle' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%DATA, & prof2%vlist%VlistD2d%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_bangle') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%name)) == 'impact' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%name)) == 'impact' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%DATA, & prof2%vlist%VlistD2d%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_impact') ENDIF IF (ASSOCIATED(prof1%vlist%VlistD2d%next%next) .AND. & ASSOCIATED(prof2%vlist%VlistD2d%next%next)) THEN IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%next%name)) == 'amp' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%next%name)) == 'amp' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%next%DATA, & prof2%vlist%VlistD2d%next%next%DATA, & 1.0e-5_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_amp') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%next%name)) == 'bangle' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%next%name)) == 'bangle' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%next%DATA, & prof2%vlist%VlistD2d%next%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_bangle') ENDIF IF ( TRIM(ADJUSTL(prof1%vlist%VlistD2d%next%next%name)) == 'impact' .AND. & TRIM(ADJUSTL(prof2%vlist%VlistD2d%next%next%name)) == 'impact' ) THEN CALL ropp_io_diff(prof1%vlist%VlistD2d%next%next%DATA, & prof2%vlist%VlistD2d%next%next%DATA, & 1.0e-6_wp, ndiff, TRIM(ADJUSTL(sinfo))//' spectra_impact') ENDIF ENDIF ! Third 2d extra variable ENDIF ! Second 2d extra variable ENDIF ! First 2d extra variable ENDIF ! spectra ! ------------------------------------------------------------------------------ ! 2. Clean up ! ------------------------------------------------------------------------------ CALL message_set_routine(routine) END SUBROUTINE ropp_io_fields_compare