New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6857 – NEMO

Changeset 6857


Ignore:
Timestamp:
2016-08-08T17:49:27+02:00 (8 years ago)
Author:
dford
Message:

Initial implementation of observation operator for pCO2.

Location:
branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS
Files:
4 edited
4 copied

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90

    r6856 r6857  
    3333   USE obs_read_spm             ! Reading and allocation of spm observations 
    3434   USE obs_read_fco2            ! Reading and allocation of fco2 observations 
     35   USE obs_read_pco2            ! Reading and allocation of pco2 observations 
    3536   USE obs_prep                 ! Preparation of obs. (grid search etc). 
    3637   USE obs_oper                 ! Observation operators 
     
    4748   USE obs_spm                  ! spm data storage 
    4849   USE obs_fco2                 ! fco2 data storage 
     50   USE obs_pco2                 ! pco2 data storage 
    4951   USE obs_types                ! Definitions for observation types 
    5052   USE mpp_map                  ! MPP mapping 
     
    9496   LOGICAL, PUBLIC :: ln_fco2        !: Logical switch for fco2 
    9597   LOGICAL, PUBLIC :: ln_fco2fb      !: Logical switch for fco2 from feedback files 
     98   LOGICAL, PUBLIC :: ln_pco2        !: Logical switch for pco2 
     99   LOGICAL, PUBLIC :: ln_pco2fb      !: Logical switch for pco2 from feedback files 
    96100   LOGICAL, PUBLIC :: ln_ssh         !: Logical switch for sea surface height 
    97101   LOGICAL, PUBLIC :: ln_sss         !: Logical switch for sea surface salinity 
     
    183187      CHARACTER(len=128) :: fco2files(MaxNumFiles) 
    184188      CHARACTER(len=128) :: fco2fbfiles(MaxNumFiles) 
     189      CHARACTER(len=128) :: pco2files(MaxNumFiles) 
     190      CHARACTER(len=128) :: pco2fbfiles(MaxNumFiles) 
    185191      CHARACTER(LEN=128) :: reysstname 
    186192      CHARACTER(LEN=12)  :: reysstfmt 
     
    213219         &            ln_fco2, ln_fco2fb,                             & 
    214220         &            fco2files, fco2fbfiles,                         & 
     221         &            ln_pco2, ln_pco2fb,                             & 
     222         &            pco2files, pco2fbfiles,                         & 
    215223         &            ln_profb_enatim, ln_ignmis, ln_cl4,             & 
    216224         &            ln_sstbias, sstbias_files 
     
    240248      INTEGER :: jnumfco2 
    241249      INTEGER :: jnumfco2fb 
     250      INTEGER :: jnumpco2 
     251      INTEGER :: jnumpco2fb 
    242252      INTEGER :: ji 
    243253      INTEGER :: jset 
     
    255265      ln_fco2     = .FALSE. 
    256266      ln_fco2fb   = .FALSE. 
     267      ln_pco2     = .FALSE. 
     268      ln_pco2fb   = .FALSE. 
    257269       
    258270      !Initalise all values in namelist arrays 
     
    281293      fco2files(:) = '' 
    282294      fco2fbfiles(:) = '' 
     295      pco2files(:) = '' 
     296      pco2fbfiles(:) = '' 
    283297      sstbias_files(:) = '' 
    284298      endailyavtypes(:) = -1 
     
    409423         WHERE (fco2fbfiles(:) /= '') lmask(:) = .TRUE. 
    410424         jnumfco2fb = COUNT(lmask) 
     425      ENDIF 
     426      IF (ln_pco2) THEN 
     427         lmask(:) = .FALSE. 
     428         WHERE (pco2files(:) /= '') lmask(:) = .TRUE. 
     429         jnumpco2 = COUNT(lmask) 
     430      ENDIF 
     431      IF (ln_pco2fb) THEN 
     432         lmask(:) = .FALSE. 
     433         WHERE (pco2fbfiles(:) /= '') lmask(:) = .TRUE. 
     434         jnumpco2fb = COUNT(lmask) 
    411435      ENDIF 
    412436       
     
    445469         WRITE(numout,*) '             Logical switch for feedback spm data             ln_spmfb = ', ln_spmfb 
    446470         WRITE(numout,*) '             Logical switch for fco2 observations              ln_fco2 = ', ln_fco2 
     471         WRITE(numout,*) '             Logical switch for pco2 observations              ln_pco2 = ', ln_pco2 
     472         WRITE(numout,*) '             Logical switch for feedback pco2 data           ln_pco2fb = ', ln_pco2fb 
    447473         WRITE(numout,*) '             Logical switch for feedback fco2 data           ln_fco2fb = ', ln_fco2fb 
    448474         WRITE(numout,*) '             Global distribtion of observations         ln_grid_global = ',ln_grid_global 
     
    570596         IF (ln_fco2) THEN 
    571597            DO ji = 1, jnumfco2 
    572                WRITE(numout,'(1X,2A)') '             fco2 input observation file name  fco2files = ', & 
     598               WRITE(numout,'(1X,2A)') '             fco2 input observation file name            fco2files = ', & 
    573599                  TRIM(fco2files(ji)) 
    574600            END DO 
     
    576602         IF (ln_fco2fb) THEN 
    577603            DO ji = 1, jnumfco2fb 
    578                WRITE(numout,'(1X,2A)') '             Feedback fco2 input observation file name  fco2fbfiles = ', & 
     604               WRITE(numout,'(1X,2A)') '            Feedback fco2 input observation file name  fco2fbfiles = ', & 
    579605                  TRIM(fco2fbfiles(ji)) 
     606            END DO 
     607         ENDIF 
     608         IF (ln_pco2) THEN 
     609            DO ji = 1, jnumpco2 
     610               WRITE(numout,'(1X,2A)') '             pco2 input observation file name            pco2files = ', & 
     611                  TRIM(pco2files(ji)) 
     612            END DO 
     613         ENDIF 
     614         IF (ln_pco2fb) THEN 
     615            DO ji = 1, jnumpco2fb 
     616               WRITE(numout,'(1X,2A)') '            Feedback pco2 input observation file name  pco2fbfiles = ', & 
     617                  TRIM(pco2fbfiles(ji)) 
    580618            END DO 
    581619         ENDIF 
     
    615653         & ( .NOT. ln_ssh ).AND.( .NOT. ln_sst ).AND.( .NOT. ln_sss ).AND. & 
    616654         & ( .NOT. ln_seaice ).AND.( .NOT. ln_vel3d ).AND.( .NOT. ln_logchl ).AND. & 
    617          & ( .NOT. ln_spm ).AND.( .NOT. ln_fco2 ) ) THEN 
     655         & ( .NOT. ln_spm ).AND.( .NOT. ln_fco2 ).AND.( .NOT. ln_pco2 ) ) THEN 
    618656         IF(lwp) WRITE(numout,cform_war) 
    619657         IF(lwp) WRITE(numout,*) ' key_diaobs is activated but logical flags', & 
    620658            &                    ' ln_t3d, ln_s3d, ln_sla, ln_ssh, ln_sst, ln_sss, ln_seaice, ln_vel3d,', & 
    621             &                    ' ln_logchl, ln_spm, ln_fco2 are all set to .FALSE.' 
     659            &                    ' ln_logchl, ln_spm, ln_fco2, ln_pco2 are all set to .FALSE.' 
    622660         nwarn = nwarn + 1 
    623661      ENDIF 
     
    12821320  
    12831321      ENDIF 
     1322 
     1323      !  - pco2 
     1324       
     1325      IF ( ln_pco2 ) THEN 
     1326 
     1327         ! Set the number of variables for pco2 to 1 
     1328         npco2vars = 1 
     1329 
     1330         ! Set the number of extra variables for pco2 to 0 
     1331         npco2extr = 0 
     1332          
     1333         IF ( ln_pco2fb ) THEN 
     1334            npco2sets = jnumpco2fb 
     1335         ELSE 
     1336            npco2sets = 1 
     1337         ENDIF 
     1338 
     1339         ALLOCATE(pco2data(npco2sets)) 
     1340         ALLOCATE(pco2datqc(npco2sets)) 
     1341         pco2data(:)%nsurf=0 
     1342         pco2datqc(:)%nsurf=0 
     1343 
     1344         npco2sets = 0 
     1345 
     1346         IF ( ln_pco2fb ) THEN             ! Feedback file format 
     1347 
     1348            DO jset = 1, jnumpco2fb 
     1349             
     1350               npco2sets = npco2sets + 1 
     1351 
     1352               CALL obs_rea_pco2( 0, pco2data(npco2sets), 1, & 
     1353                  &                 pco2fbfiles(jset:jset), & 
     1354                  &                 npco2vars, npco2extr, nitend-nit000+2, & 
     1355                  &                 dobsini, dobsend, ln_ignmis, .FALSE. ) 
     1356 
     1357               CALL obs_pre_pco2( pco2data(npco2sets), pco2datqc(npco2sets), & 
     1358                  &                 ln_pco2, ln_nea ) 
     1359             
     1360            ENDDO 
     1361 
     1362         ELSE                              ! Original file format 
     1363 
     1364            npco2sets = npco2sets + 1 
     1365 
     1366            CALL obs_rea_pco2( 1, pco2data(npco2sets), jnumpco2, & 
     1367               &                 pco2files(1:jnumpco2), & 
     1368               &                 npco2vars, npco2extr, nitend-nit000+2, & 
     1369               &                 dobsini, dobsend, ln_ignmis, .FALSE. ) 
     1370 
     1371            CALL obs_pre_pco2( pco2data(npco2sets), pco2datqc(npco2sets), & 
     1372               &                 ln_pco2, ln_nea ) 
     1373 
     1374         ENDIF 
     1375  
     1376      ENDIF 
    12841377      
    12851378   END SUBROUTINE dia_obs_init 
     
    13021395      !!               - Sea surface spm 
    13031396      !!               - Sea surface fco2 
     1397      !!               - Sea surface pco2 
    13041398      !! 
    13051399      !! ** Action  :  
     
    13401434#endif 
    13411435#if defined key_hadocc 
    1342       USE trc, ONLY :  &                ! HadOCC chlorophyll and fCO2 
     1436      USE trc, ONLY :  &                ! HadOCC chlorophyll, fCO2 and pCO2 
    13431437         & HADOCC_CHL, & 
    13441438         & HADOCC_FCO2, & 
     1439         & HADOCC_PCO2, & 
    13451440         & HADOCC_FILL_FLT 
    13461441#elif defined key_medusa && defined key_foam_medusa 
    1347       USE trc, ONLY :  &                ! MEDUSA chlorophyll and fCO2 
     1442      USE trc, ONLY :  &                ! MEDUSA chlorophyll, fCO2 and pCO2 
    13481443         & MEDUSA_CHL, & 
    13491444         & MEDUSA_FCO2, & 
     1445         & MEDUSA_PCO2, & 
    13501446         & MEDUSA_FILL_FLT 
    13511447#elif defined key_fabm 
    1352       !USE ???                           ! ERSEM chlorophyll and fCO2 
     1448      !USE ???                           ! ERSEM chlorophyll, fCO2 and pCO2 
    13531449#endif 
    13541450#if defined key_spm 
     
    13701466      INTEGER :: jspmset                ! spm data set loop variable 
    13711467      INTEGER :: jfco2set               ! fco2 data set loop variable 
     1468      INTEGER :: jpco2set               ! pco2 data set loop variable 
    13721469      INTEGER :: jvar                   ! Variable number     
    13731470#if ! defined key_lim2 && ! defined key_lim3 
     
    13851482      REAL(wp), DIMENSION(jpi,jpj) :: & 
    13861483         maskfco2                       ! array for special fco2 mask 
     1484      REAL(wp), DIMENSION(jpi,jpj) :: & 
     1485         pco2                           ! array for pco2 
     1486      REAL(wp), DIMENSION(jpi,jpj) :: & 
     1487         maskpco2                       ! array for special pco2 mask 
    13871488      INTEGER :: jn                     ! loop index 
    13881489      CHARACTER(LEN=20) :: datestr=" ",timestr=" " 
     
    15821683      ENDIF 
    15831684 
     1685      IF ( ln_pco2 ) THEN 
     1686         maskpco2(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things 
     1687#if defined key_hadocc 
     1688         pco2(:,:) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC 
     1689         IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ).AND.( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 
     1690            pco2(:,:) = obfillflt 
     1691            maskpco2(:,:) = 0 
     1692            CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 
     1693               &           ' on timestep ' // TRIM(STR(kstp)),                              & 
     1694               &           ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 
     1695         ENDIF 
     1696#elif defined key_medusa && defined key_foam_medusa 
     1697         pco2(:,:) = MEDUSA_PCO2(:,:)    ! pCO2 from MEDUSA 
     1698         IF ( ( MINVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ).AND.( MAXVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ) ) THEN 
     1699            pco2(:,:) = obfillflt 
     1700            maskpco2(:,:) = 0 
     1701            CALL ctl_warn( ' MEDUSA pCO2 values masked out for observation operator', & 
     1702               &           ' on timestep ' // TRIM(STR(kstp)),                              & 
     1703               &           ' as MEDUSA_PCO2(:,:) == MEDUSA_FILL_FLT' ) 
     1704         ENDIF 
     1705#elif defined key_fabm 
     1706         !pco2(:,:)  =  ???                 ! pCO2 from ERSEM 
     1707         CALL ctl_stop( ' Trying to run pCO2 observation operator', & 
     1708            &           ' but not properly implemented for FABM-ERSEM yet' ) 
     1709#else 
     1710         CALL ctl_stop( ' Trying to run pCO2 observation operator', & 
     1711            &           ' but no biogeochemical model appears to have been defined' ) 
     1712#endif 
     1713 
     1714         DO jpco2set = 1, npco2sets 
     1715             CALL obs_pco2_opt( pco2datqc(jpco2set),                      & 
     1716               &                kstp, jpi, jpj, nit000, pco2(:,:), & 
     1717               &                maskpco2(:,:), n2dint ) 
     1718         END DO 
     1719      ENDIF 
     1720 
    15841721#if ! defined key_lim2 && ! defined key_lim3 
    15851722      CALL wrk_dealloc(jpi,jpj,frld)  
     
    16171754      INTEGER :: jspmset                  ! spm data set loop variable 
    16181755      INTEGER :: jfco2set                 ! fco2 data set loop variable 
     1756      INTEGER :: jpco2set                 ! pco2 data set loop variable 
    16191757      INTEGER :: jset 
    16201758      INTEGER :: jfbini 
     
    19392077            WRITE(cdtmp,'(A,I2.2)')'fco2fb_',jfco2set 
    19402078            CALL obs_wri_fco2( cdtmp, fco2data(jfco2set) ) 
     2079 
     2080         END DO 
     2081 
     2082      ENDIF 
     2083 
     2084      !  - pco2 
     2085      IF ( ln_pco2 ) THEN 
     2086 
     2087         ! Copy data from pco2datqc to pco2data structures 
     2088         DO jpco2set = 1, npco2sets 
     2089 
     2090            CALL obs_surf_decompress( pco2datqc(jpco2set), & 
     2091                 &                    pco2data(jpco2set), .TRUE., numout ) 
     2092 
     2093         END DO 
     2094          
     2095         ! Mark as bad observations with no valid model counterpart due to pco2 not being in the restart 
     2096         ! Seem to need to set to fill value rather than marking as bad to be effective, so do both 
     2097         DO jpco2set = 1, npco2sets 
     2098            WHERE ( pco2data(jpco2set)%rmod(:,1) == obfillflt ) 
     2099               pco2data(jpco2set)%nqc(:)    = 1 
     2100               pco2data(jpco2set)%robs(:,1) = obfillflt 
     2101            END WHERE 
     2102         END DO 
     2103 
     2104         ! Write the pco2 data 
     2105         DO jpco2set = 1, npco2sets 
     2106       
     2107            WRITE(cdtmp,'(A,I2.2)')'pco2fb_',jpco2set 
     2108            CALL obs_wri_pco2( cdtmp, pco2data(jpco2set) ) 
    19412109 
    19422110         END DO 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90

    r6856 r6857  
    2828   !!                    observations 
    2929   !!   obs_fco2_opt :   Compute the model counterpart of fco2 
     30   !!                    observations 
     31   !!   obs_pco2_opt :   Compute the model counterpart of pco2 
    3032   !!                    observations 
    3133   !!---------------------------------------------------------------------- 
     
    7274      &   obs_logchl_opt, & ! Compute the model counterpart of logchl data 
    7375      &   obs_spm_opt, &  ! Compute the model counterpart of spm data 
    74       &   obs_fco2_opt    ! Compute the model counterpart of fco2 data 
     76      &   obs_fco2_opt, & ! Compute the model counterpart of fco2 data 
     77      &   obs_pco2_opt    ! Compute the model counterpart of pco2 data 
    7578 
    7679   INTEGER, PARAMETER, PUBLIC :: imaxavtypes = 20 ! Max number of daily avgd obs types 
     
    25412544   END SUBROUTINE obs_fco2_opt 
    25422545 
     2546   SUBROUTINE obs_pco2_opt( pco2datqc, kt, kpi, kpj, kit000, & 
     2547      &                    ppco2n, ppco2mask, k2dint ) 
     2548 
     2549      !!----------------------------------------------------------------------- 
     2550      !! 
     2551      !!                     ***  ROUTINE obs_pco2_opt  *** 
     2552      !! 
     2553      !! ** Purpose : Compute the model counterpart of pco2 
     2554      !!              data by interpolating from the model grid to the  
     2555      !!              observation point. 
     2556      !! 
     2557      !! ** Method  : Linearly interpolate to each observation point using  
     2558      !!              the model values at the corners of the surrounding grid box. 
     2559      !! 
     2560      !!    The now model pco2 is first computed at the obs (lon, lat) point. 
     2561      !! 
     2562      !!    Several horizontal interpolation schemes are available: 
     2563      !!        - distance-weighted (great circle) (k2dint = 0) 
     2564      !!        - distance-weighted (small angle)  (k2dint = 1) 
     2565      !!        - bilinear (geographical grid)     (k2dint = 2) 
     2566      !!        - bilinear (quadrilateral grid)    (k2dint = 3) 
     2567      !!        - polynomial (quadrilateral grid)  (k2dint = 4) 
     2568      !! 
     2569      !! 
     2570      !! ** Action  : 
     2571      !! 
     2572      !! History : 
     2573      !!       
     2574      !!----------------------------------------------------------------------- 
     2575 
     2576      !! * Modules used 
     2577      USE obs_surf_def  ! Definition of storage space for surface observations 
     2578 
     2579      IMPLICIT NONE 
     2580 
     2581      !! * Arguments 
     2582      TYPE(obs_surf), INTENT(INOUT) :: pco2datqc     ! Subset of surface data not failing screening 
     2583      INTEGER, INTENT(IN) :: kt       ! Time step 
     2584      INTEGER, INTENT(IN) :: kpi      ! Model grid parameters 
     2585      INTEGER, INTENT(IN) :: kpj 
     2586      INTEGER, INTENT(IN) :: kit000   ! Number of the first time step  
     2587                                      !   (kit000-1 = restart time) 
     2588      INTEGER, INTENT(IN) :: k2dint   ! Horizontal interpolation type (see header) 
     2589      REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 
     2590         & ppco2n,  &    ! Model pco2 field 
     2591         & ppco2mask     ! Land-sea mask 
     2592          
     2593      !! * Local declarations 
     2594      INTEGER :: ji 
     2595      INTEGER :: jj 
     2596      INTEGER :: jobs 
     2597      INTEGER :: inrc 
     2598      INTEGER :: ipco2 
     2599      INTEGER :: iobs 
     2600        
     2601      REAL(KIND=wp) :: zlam 
     2602      REAL(KIND=wp) :: zphi 
     2603      REAL(KIND=wp) :: zext(1), zobsmask(1) 
     2604      REAL(kind=wp), DIMENSION(2,2,1) :: & 
     2605         & zweig 
     2606      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 
     2607         & zmask, & 
     2608         & zpco2l, & 
     2609         & zglam, & 
     2610         & zgphi 
     2611      INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: & 
     2612         & igrdi, & 
     2613         & igrdj 
     2614 
     2615      !------------------------------------------------------------------------ 
     2616      ! Local initialization  
     2617      !------------------------------------------------------------------------ 
     2618      ! ... Record and data counters 
     2619      inrc = kt - kit000 + 2 
     2620      ipco2 = pco2datqc%nsstp(inrc) 
     2621 
     2622      ! Get the data for interpolation 
     2623       
     2624      ALLOCATE( & 
     2625         & igrdi(2,2,ipco2), & 
     2626         & igrdj(2,2,ipco2), & 
     2627         & zglam(2,2,ipco2), & 
     2628         & zgphi(2,2,ipco2), & 
     2629         & zmask(2,2,ipco2), & 
     2630         & zpco2l(2,2,ipco2)  & 
     2631         & ) 
     2632       
     2633      DO jobs = pco2datqc%nsurfup + 1, pco2datqc%nsurfup + ipco2 
     2634         iobs = jobs - pco2datqc%nsurfup 
     2635         igrdi(1,1,iobs) = pco2datqc%mi(jobs)-1 
     2636         igrdj(1,1,iobs) = pco2datqc%mj(jobs)-1 
     2637         igrdi(1,2,iobs) = pco2datqc%mi(jobs)-1 
     2638         igrdj(1,2,iobs) = pco2datqc%mj(jobs) 
     2639         igrdi(2,1,iobs) = pco2datqc%mi(jobs) 
     2640         igrdj(2,1,iobs) = pco2datqc%mj(jobs)-1 
     2641         igrdi(2,2,iobs) = pco2datqc%mi(jobs) 
     2642         igrdj(2,2,iobs) = pco2datqc%mj(jobs) 
     2643      END DO 
     2644       
     2645      CALL obs_int_comm_2d( 2, 2, ipco2, & 
     2646         &                  igrdi, igrdj, glamt, zglam ) 
     2647      CALL obs_int_comm_2d( 2, 2, ipco2, & 
     2648         &                  igrdi, igrdj, gphit, zgphi ) 
     2649      CALL obs_int_comm_2d( 2, 2, ipco2, & 
     2650         &                  igrdi, igrdj, ppco2mask, zmask ) 
     2651      CALL obs_int_comm_2d( 2, 2, ipco2, & 
     2652         &                  igrdi, igrdj, ppco2n, zpco2l ) 
     2653       
     2654      DO jobs = pco2datqc%nsurfup + 1, pco2datqc%nsurfup + ipco2 
     2655          
     2656         iobs = jobs - pco2datqc%nsurfup 
     2657          
     2658         IF ( kt /= pco2datqc%mstp(jobs) ) THEN 
     2659             
     2660            IF(lwp) THEN 
     2661               WRITE(numout,*) 
     2662               WRITE(numout,*) ' E R R O R : Observation',              & 
     2663                  &            ' time step is not consistent with the', & 
     2664                  &            ' model time step' 
     2665               WRITE(numout,*) ' =========' 
     2666               WRITE(numout,*) 
     2667               WRITE(numout,*) ' Record  = ', jobs,                & 
     2668                  &            ' kt      = ', kt,                  & 
     2669                  &            ' mstp    = ', pco2datqc%mstp(jobs), & 
     2670                  &            ' ntyp    = ', pco2datqc%ntyp(jobs) 
     2671            ENDIF 
     2672            CALL ctl_stop( 'obs_pco2_opt', 'Inconsistent time' ) 
     2673             
     2674         ENDIF 
     2675          
     2676         zlam = pco2datqc%rlam(jobs) 
     2677         zphi = pco2datqc%rphi(jobs) 
     2678          
     2679         ! Get weights to interpolate the model pco2 to the observation point 
     2680         CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi,         & 
     2681            &                   zglam(:,:,iobs), zgphi(:,:,iobs), & 
     2682            &                   zmask(:,:,iobs), zweig, zobsmask ) 
     2683          
     2684         ! ... Interpolate the model pco2 to the observation point 
     2685         CALL obs_int_h2d( 1, 1,      & 
     2686            &              zweig, zpco2l(:,:,iobs),  zext ) 
     2687          
     2688         pco2datqc%rmod(jobs,1) = zext(1) 
     2689          
     2690      END DO 
     2691       
     2692      ! Deallocate the data for interpolation 
     2693      DEALLOCATE( & 
     2694         & igrdi,    & 
     2695         & igrdj,    & 
     2696         & zglam,    & 
     2697         & zgphi,    & 
     2698         & zmask,    & 
     2699         & zpco2l  & 
     2700         & ) 
     2701       
     2702      pco2datqc%nsurfup = pco2datqc%nsurfup + ipco2 
     2703 
     2704   END SUBROUTINE obs_pco2_opt 
     2705 
    25432706END MODULE obs_oper 
    25442707 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_pco2.F90

    r6856 r6857  
    1 MODULE obs_fco2 
     1MODULE obs_pco2 
    22   !!===================================================================== 
    3    !!                       ***  MODULE  obs_fco2  *** 
    4    !! Observation diagnostics: Storage space for fco2 observations 
     3   !!                       ***  MODULE  obs_pco2  *** 
     4   !! Observation diagnostics: Storage space for pco2 observations 
    55   !!                          arrays and additional flags etc. 
    66   !!===================================================================== 
     
    2222   PRIVATE 
    2323 
    24    PUBLIC nfco2vars, nfco2extr, nfco2sets, fco2data, fco2datqc 
     24   PUBLIC npco2vars, npco2extr, npco2sets, pco2data, pco2datqc 
    2525 
    2626   !! * Shared Module variables 
    27    INTEGER :: nfco2vars                               ! Number of fco2data variables 
    28    INTEGER :: nfco2extr                               ! Number of fco2data extra  
     27   INTEGER :: npco2vars                               ! Number of pco2data variables 
     28   INTEGER :: npco2extr                               ! Number of pco2data extra  
    2929                                                      ! variables 
    30    INTEGER :: nfco2sets                               ! Number of fco2data sets 
    31    TYPE(obs_surf), POINTER, DIMENSION(:) :: fco2data  ! Initial fco2 data 
    32    TYPE(obs_surf), POINTER, DIMENSION(:) :: fco2datqc ! Sea ice data after quality control 
     30   INTEGER :: npco2sets                               ! Number of pco2data sets 
     31   TYPE(obs_surf), POINTER, DIMENSION(:) :: pco2data  ! Initial pco2 data 
     32   TYPE(obs_surf), POINTER, DIMENSION(:) :: pco2datqc ! Sea ice data after quality control 
    3333 
    34 END MODULE obs_fco2 
     34END MODULE obs_pco2 
    3535 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_pco2_io.F90

    r6856 r6857  
    1 MODULE obs_fco2_io 
     1MODULE obs_pco2_io 
    22   !!====================================================================== 
    3    !!                       ***  MODULE obs_fco2_io  *** 
    4    !! Observation operators : I/O for fco2 files 
     3   !!                       ***  MODULE obs_pco2_io  *** 
     4   !! Observation operators : I/O for pco2 files 
    55   !!====================================================================== 
    66   !! History :  
     
    88   !!---------------------------------------------------------------------- 
    99   !!---------------------------------------------------------------------- 
    10    !!   read_fco2file    :  Read a obfbdata structure from a fco2 file 
     10   !!   read_pco2file    :  Read a obfbdata structure from a pco2 file 
    1111   !!---------------------------------------------------------------------- 
    1212   USE par_kind 
     
    2626CONTAINS 
    2727 
    28 #include "obsfco2_io.h90" 
     28#include "obspco2_io.h90" 
    2929 
    30 END MODULE obs_fco2_io 
     30END MODULE obs_pco2_io 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90

    r6856 r6857  
    1515   !!   obs_pre_spm  : First level check and screening of spm obs. 
    1616   !!   obs_pre_fco2 : First level check and screening of fco2 obs. 
     17   !!   obs_pre_pco2 : First level check and screening of pco2 obs. 
    1718   !!   obs_scr      : Basic screening of the observations 
    1819   !!   obs_coo_tim  : Compute number of time steps to the observation time 
     
    4748      & obs_pre_spm, &    ! First level check and screening of spm data 
    4849      & obs_pre_fco2, &   ! First level check and screening of fco2 data 
     50      & obs_pre_pco2, &   ! First level check and screening of pco2 data 
    4951      & calc_month_len     ! Calculate the number of days in the months of a year   
    5052 
     
    17411743   END SUBROUTINE obs_pre_fco2 
    17421744 
     1745   SUBROUTINE obs_pre_pco2( pco2data, pco2datqc, ld_pco2, ld_nea ) 
     1746      !!---------------------------------------------------------------------- 
     1747      !!                    ***  ROUTINE obs_pre_pco2  *** 
     1748      !! 
     1749      !! ** Purpose : First level check and screening of pco2 observations 
     1750      !! 
     1751      !! ** Method  : First level check and screening of pco2 observations 
     1752      !! 
     1753      !! ** Action  :  
     1754      !! 
     1755      !! References : 
     1756      !!    
     1757      !! History : 
     1758      !!---------------------------------------------------------------------- 
     1759      !! * Modules used 
     1760      USE domstp              ! Domain: set the time-step 
     1761      USE par_oce             ! Ocean parameters 
     1762      USE dom_oce, ONLY : &   ! Geographical information 
     1763         & glamt,   & 
     1764         & gphit,   & 
     1765         & tmask 
     1766      !! * Arguments 
     1767      TYPE(obs_surf), INTENT(INOUT) :: pco2data     ! Full set of pco2 data 
     1768      TYPE(obs_surf), INTENT(INOUT) :: pco2datqc    ! Subset of pco2 data not failing screening 
     1769      LOGICAL :: ld_pco2     ! Switch for pco2 data 
     1770      LOGICAL :: ld_nea        ! Switch for rejecting observation near land 
     1771      !! * Local declarations 
     1772      INTEGER :: iyea0         ! Initial date 
     1773      INTEGER :: imon0         !  - (year, month, day, hour, minute) 
     1774      INTEGER :: iday0     
     1775      INTEGER :: ihou0     
     1776      INTEGER :: imin0 
     1777      INTEGER :: icycle       ! Current assimilation cycle 
     1778                              ! Counters for observations that 
     1779      INTEGER :: iotdobs      !  - outside time domain 
     1780      INTEGER :: iosdsobs     !  - outside space domain 
     1781      INTEGER :: ilansobs     !  - within a model land cell 
     1782      INTEGER :: inlasobs     !  - close to land 
     1783      INTEGER :: igrdobs      !  - fail the grid search 
     1784                              ! Global counters for observations that 
     1785      INTEGER :: iotdobsmpp   !  - outside time domain 
     1786      INTEGER :: iosdsobsmpp  !  - outside space domain 
     1787      INTEGER :: ilansobsmpp  !  - within a model land cell 
     1788      INTEGER :: inlasobsmpp  !  - close to land 
     1789      INTEGER :: igrdobsmpp   !  - fail the grid search 
     1790      LOGICAL, DIMENSION(:), ALLOCATABLE :: &  
     1791         & llvalid            ! data selection 
     1792      INTEGER :: jobs         ! Obs. loop variable 
     1793      INTEGER :: jstp         ! Time loop variable 
     1794      INTEGER :: inrc         ! Time index variable 
     1795 
     1796      IF (lwp) WRITE(numout,*)'obs_pre_pco2 : Preparing the pco2 observations...' 
     1797 
     1798      ! Initial date initialization (year, month, day, hour, minute) 
     1799      iyea0 =   ndate0 / 10000 
     1800      imon0 = ( ndate0 - iyea0 * 10000 ) / 100 
     1801      iday0 =   ndate0 - iyea0 * 10000 - imon0 * 100 
     1802      ihou0 = 0 
     1803      imin0 = 0 
     1804 
     1805      icycle = no     ! Assimilation cycle 
     1806 
     1807      ! Diagnostics counters for various failures. 
     1808 
     1809      iotdobs  = 0 
     1810      igrdobs  = 0 
     1811      iosdsobs = 0 
     1812      ilansobs = 0 
     1813      inlasobs = 0 
     1814 
     1815      ! ----------------------------------------------------------------------- 
     1816      ! Find time coordinate for pco2 data 
     1817      ! ----------------------------------------------------------------------- 
     1818 
     1819      CALL obs_coo_tim( icycle, & 
     1820         &              iyea0,   imon0,   iday0,   ihou0,   imin0,      & 
     1821         &              pco2data%nsurf,   pco2data%nyea, pco2data%nmon, & 
     1822         &              pco2data%nday,    pco2data%nhou, pco2data%nmin, & 
     1823         &              pco2data%nqc,     pco2data%mstp, iotdobs        ) 
     1824      CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 
     1825      ! ----------------------------------------------------------------------- 
     1826      ! Check for pco2 data failing the grid search 
     1827      ! ----------------------------------------------------------------------- 
     1828 
     1829      CALL obs_coo_grd( pco2data%nsurf,   pco2data%mi, pco2data%mj, & 
     1830         &              pco2data%nqc,     igrdobs                         ) 
     1831      CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 
     1832 
     1833      ! ----------------------------------------------------------------------- 
     1834      ! Check for land points.  
     1835      ! ----------------------------------------------------------------------- 
     1836 
     1837      CALL obs_coo_spc_2d( pco2data%nsurf,                 & 
     1838         &                 jpi,             jpj,             & 
     1839         &                 pco2data%mi,   pco2data%mj,   &  
     1840         &                 pco2data%rlam, pco2data%rphi, & 
     1841         &                 glamt,           gphit,           & 
     1842         &                 tmask(:,:,1),    pco2data%nqc,  & 
     1843         &                 iosdsobs,        ilansobs,        & 
     1844         &                 inlasobs,        ld_nea           )  
     1845          
     1846      CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 
     1847      CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 
     1848      CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 
     1849 
     1850      ! ----------------------------------------------------------------------- 
     1851      ! Copy useful data from the pco2data data structure to 
     1852      ! the pco2datqc data structure  
     1853      ! ----------------------------------------------------------------------- 
     1854 
     1855      ! Allocate the selection arrays 
     1856 
     1857      ALLOCATE( llvalid(pco2data%nsurf) ) 
     1858       
     1859      ! We want all data which has qc flags <= 0 
     1860 
     1861      llvalid(:)  = ( pco2data%nqc(:)  <= 10 ) 
     1862 
     1863      ! The actual copying 
     1864 
     1865      CALL obs_surf_compress( pco2data,     pco2datqc,       .TRUE.,  numout, & 
     1866         &                    lvalid=llvalid ) 
     1867 
     1868      ! Dellocate the selection arrays 
     1869      DEALLOCATE( llvalid ) 
     1870 
     1871      ! ----------------------------------------------------------------------- 
     1872      ! Print information about what observations are left after qc 
     1873      ! ----------------------------------------------------------------------- 
     1874 
     1875      ! Update the total observation counter array 
     1876       
     1877      IF(lwp) THEN 
     1878         WRITE(numout,*) 
     1879         WRITE(numout,*) 'obs_pre_pco2 :' 
     1880         WRITE(numout,*) '~~~~~~~~~~~' 
     1881         WRITE(numout,*) 
     1882         WRITE(numout,*) ' pco2 data outside time domain                  = ', & 
     1883            &            iotdobsmpp 
     1884         WRITE(numout,*) ' Remaining pco2 data that failed grid search    = ', & 
     1885            &            igrdobsmpp 
     1886         WRITE(numout,*) ' Remaining pco2 data outside space domain       = ', & 
     1887            &            iosdsobsmpp 
     1888         WRITE(numout,*) ' Remaining pco2 data at land points             = ', & 
     1889            &            ilansobsmpp 
     1890         IF (ld_nea) THEN 
     1891            WRITE(numout,*) ' Remaining pco2 data near land points (removed) = ', & 
     1892               &            inlasobsmpp 
     1893         ELSE 
     1894            WRITE(numout,*) ' Remaining pco2 data near land points (kept)    = ', & 
     1895               &            inlasobsmpp 
     1896         ENDIF 
     1897         WRITE(numout,*) ' pco2 data accepted                             = ', & 
     1898            &            pco2datqc%nsurfmpp 
     1899 
     1900         WRITE(numout,*) 
     1901         WRITE(numout,*) ' Number of observations per time step :' 
     1902         WRITE(numout,*) 
     1903         WRITE(numout,1997) 
     1904         WRITE(numout,1998) 
     1905      ENDIF 
     1906       
     1907      DO jobs = 1, pco2datqc%nsurf 
     1908         inrc = pco2datqc%mstp(jobs) + 2 - nit000 
     1909         pco2datqc%nsstp(inrc)  = pco2datqc%nsstp(inrc) + 1 
     1910      END DO 
     1911       
     1912      CALL obs_mpp_sum_integers( pco2datqc%nsstp, pco2datqc%nsstpmpp, & 
     1913         &                       nitend - nit000 + 2 ) 
     1914 
     1915      IF ( lwp ) THEN 
     1916         DO jstp = nit000 - 1, nitend 
     1917            inrc = jstp - nit000 + 2 
     1918            WRITE(numout,1999) jstp, pco2datqc%nsstpmpp(inrc) 
     1919         END DO 
     1920      ENDIF 
     1921 
     19221997  FORMAT(10X,'Time step',5X,'pco2 data') 
     19231998  FORMAT(10X,'---------',5X,'------------') 
     19241999  FORMAT(10X,I9,5X,I17) 
     1925       
     1926   END SUBROUTINE obs_pre_pco2 
     1927 
    17431928   SUBROUTINE obs_coo_tim( kcycle, & 
    17441929      &                    kyea0,   kmon0,   kday0,   khou0,   kmin0,     & 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_pco2.F90

    r6856 r6857  
    1 MODULE obs_read_fco2 
     1MODULE obs_read_pco2 
    22   !!====================================================================== 
    3    !!                       ***  MODULE obs_read_fco2  *** 
    4    !! Observation diagnostics: Read the along track fco2 data from 
    5    !!                          GHRSST or any fco2 data from feedback files 
     3   !!                       ***  MODULE obs_read_pco2  *** 
     4   !! Observation diagnostics: Read the along track pco2 data from 
     5   !!                          GHRSST or any pco2 data from feedback files 
    66   !!====================================================================== 
    77 
    88   !!---------------------------------------------------------------------- 
    9    !!   obs_rea_fco2 : Driver for reading fco2 data from the feedback 
     9   !!   obs_rea_pco2 : Driver for reading pco2 data from the feedback 
    1010   !!---------------------------------------------------------------------- 
    1111 
     
    2121   USE obs_surf_def             ! Surface observation definitions 
    2222   USE obs_types                ! Observation type definitions 
    23    USE obs_fco2_io            ! I/O for fco2 files 
     23   USE obs_pco2_io            ! I/O for pco2 files 
    2424   USE iom                      ! I/O 
    2525   USE netcdf                   ! NetCDF library 
     
    3030   PRIVATE 
    3131 
    32    PUBLIC obs_rea_fco2      ! Read the fco2 observations from the point data 
     32   PUBLIC obs_rea_pco2      ! Read the pco2 observations from the point data 
    3333    
    3434   !!---------------------------------------------------------------------- 
     
    4040CONTAINS 
    4141 
    42    SUBROUTINE obs_rea_fco2( kformat, & 
    43       &                    fco2data, knumfiles, cfilenames, & 
     42   SUBROUTINE obs_rea_pco2( kformat, & 
     43      &                    pco2data, knumfiles, cfilenames, & 
    4444      &                    kvars, kextr, kstp, ddobsini, ddobsend, & 
    4545      &                    ldignmis, ldmod ) 
    4646      !!--------------------------------------------------------------------- 
    4747      !! 
    48       !!                   *** ROUTINE obs_rea_fco2 *** 
    49       !! 
    50       !! ** Purpose : Read from file the fco2 data 
     48      !!                   *** ROUTINE obs_rea_pco2 *** 
     49      !! 
     50      !! ** Purpose : Read from file the pco2 data 
    5151      !! 
    5252      !! ** Method  : Depending on kformat either old or new style 
     
    6666      !                    ! 1: Old-style feedback 
    6767      TYPE(obs_surf), INTENT(INOUT) :: & 
    68          & fco2data     ! fco2 data to be read 
     68         & pco2data     ! pco2 data to be read 
    6969      INTEGER, INTENT(IN) :: knumfiles   ! Number of corio format files to read in 
    7070      CHARACTER(LEN=128), INTENT(IN) :: cfilenames(knumfiles) ! File names to read in 
    71       INTEGER, INTENT(IN) :: kvars    ! Number of variables in fco2data 
    72       INTEGER, INTENT(IN) :: kextr    ! Number of extra fields for each var in fco2data 
     71      INTEGER, INTENT(IN) :: kvars    ! Number of variables in pco2data 
     72      INTEGER, INTENT(IN) :: kextr    ! Number of extra fields for each var in pco2data 
    7373      INTEGER, INTENT(IN) :: kstp     ! Ocean time-step index 
    7474      LOGICAL, INTENT(IN) :: ldignmis   ! Ignore missing files 
     
    7878          
    7979      !! * Local declarations 
    80       CHARACTER(LEN=14), PARAMETER :: cpname='obs_rea_fco2' 
     80      CHARACTER(LEN=14), PARAMETER :: cpname='obs_rea_pco2' 
    8181      INTEGER :: ji 
    8282      INTEGER :: jj 
     
    9595         & irefdate 
    9696      INTEGER :: iobsmpp 
    97       INTEGER, PARAMETER :: ifco2maxtype = 1024 
    98       INTEGER, DIMENSION(0:ifco2maxtype) :: & 
     97      INTEGER, PARAMETER :: ipco2maxtype = 1024 
     98      INTEGER, DIMENSION(0:ipco2maxtype) :: & 
    9999         & ityp, & 
    100100         & itypmpp 
     
    105105         & iindx,    & 
    106106         & ifileidx, & 
    107          & ifco2idx 
     107         & ipco2idx 
    108108      INTEGER :: itype 
    109109      REAL(wp), DIMENSION(:), ALLOCATABLE :: & 
     
    143143      ALLOCATE( inpfiles(inobf) ) 
    144144 
    145       fco2_files : DO jj = 1, inobf 
     145      pco2_files : DO jj = 1, inobf 
    146146           
    147147         !--------------------------------------------------------------------- 
     
    150150         IF(lwp) THEN 
    151151            WRITE(numout,*) 
    152             WRITE(numout,*) ' obs_rea_fco2 : Reading from file = ', & 
     152            WRITE(numout,*) ' obs_rea_pco2 : Reading from file = ', & 
    153153               & TRIM( TRIM( cfilenames(jj) ) ) 
    154154            WRITE(numout,*) ' ~~~~~~~~~~~~~~' 
     
    200200               ENDIF 
    201201            ELSEIF ( kformat == 1) THEN 
    202                CALL read_fco2( TRIM( cfilenames(jj) ), inpfiles(jj), & 
     202               CALL read_pco2( TRIM( cfilenames(jj) ), inpfiles(jj), & 
    203203               &                 numout, lwp, .TRUE. ) 
    204204            ELSE 
     
    291291         ENDIF 
    292292 
    293       END DO fco2_files 
     293      END DO pco2_files 
    294294 
    295295      !----------------------------------------------------------------------- 
     
    311311 
    312312      ALLOCATE( iindx(iobstot), ifileidx(iobstot), & 
    313          &      ifco2idx(iobstot), zdat(iobstot) ) 
     313         &      ipco2idx(iobstot), zdat(iobstot) ) 
    314314      jk = 0 
    315315      DO jj = 1, inobf 
     
    319319               jk = jk + 1 
    320320               ifileidx(jk) = jj 
    321                ifco2idx(jk) = ji 
     321               ipco2idx(jk) = ji 
    322322               zdat(jk)     = inpfiles(jj)%ptim(ji) 
    323323            ENDIF 
     
    328328         &               iindx   ) 
    329329       
    330       CALL obs_surf_alloc( fco2data, iobs, &  
     330      CALL obs_surf_alloc( pco2data, iobs, &  
    331331                           kvars, kextr, kstp, jpi, jpj ) 
    332332       
    333       ! * Read obs/positions, QC, all variable and assign to fco2data 
     333      ! * Read obs/positions, QC, all variable and assign to pco2data 
    334334  
    335335      iobs = 0 
     
    343343          
    344344         jj = ifileidx(iindx(jk)) 
    345          ji = ifco2idx(iindx(jk)) 
     345         ji = ipco2idx(iindx(jk)) 
    346346         IF ( ( inpfiles(jj)%ptim(ji) >  djulini(jj) ) .AND.  & 
    347347            & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 
     
    370370 
    371371 
    372                ! fco2 time coordinates 
    373                fco2data%nyea(iobs) = iyea 
    374                fco2data%nmon(iobs) = imon 
    375                fco2data%nday(iobs) = iday 
    376                fco2data%nhou(iobs) = ihou 
    377                fco2data%nmin(iobs) = imin 
     372               ! pco2 time coordinates 
     373               pco2data%nyea(iobs) = iyea 
     374               pco2data%nmon(iobs) = imon 
     375               pco2data%nday(iobs) = iday 
     376               pco2data%nhou(iobs) = ihou 
     377               pco2data%nmin(iobs) = imin 
    378378                
    379                ! fco2 space coordinates 
    380                fco2data%rlam(iobs) = inpfiles(jj)%plam(ji) 
    381                fco2data%rphi(iobs) = inpfiles(jj)%pphi(ji) 
     379               ! pco2 space coordinates 
     380               pco2data%rlam(iobs) = inpfiles(jj)%plam(ji) 
     381               pco2data%rphi(iobs) = inpfiles(jj)%pphi(ji) 
    382382 
    383383               ! Coordinate search parameters 
    384                fco2data%mi  (iobs) = inpfiles(jj)%iobsi(ji,1) 
    385                fco2data%mj  (iobs) = inpfiles(jj)%iobsj(ji,1) 
     384               pco2data%mi  (iobs) = inpfiles(jj)%iobsi(ji,1) 
     385               pco2data%mj  (iobs) = inpfiles(jj)%iobsj(ji,1) 
    386386                
    387387               ! Instrument type 
     
    392392                  itype = 0 
    393393               ENDIF 
    394                fco2data%ntyp(iobs) = itype 
    395                IF ( itype < ifco2maxtype + 1 ) THEN 
     394               pco2data%ntyp(iobs) = itype 
     395               IF ( itype < ipco2maxtype + 1 ) THEN 
    396396                  ityp(itype+1) = ityp(itype+1) + 1 
    397397               ELSE 
    398                   IF(lwp)WRITE(numout,*)'WARNING:Increase ifco2maxtype in ',& 
     398                  IF(lwp)WRITE(numout,*)'WARNING:Increase ipco2maxtype in ',& 
    399399                     &                  cpname 
    400400               ENDIF 
    401401 
    402402               ! Bookkeeping data to match observations 
    403                fco2data%nsidx(iobs) = iobs 
    404                fco2data%nsfil(iobs) = iindx(jk) 
     403               pco2data%nsidx(iobs) = iobs 
     404               pco2data%nsfil(iobs) = iindx(jk) 
    405405 
    406406               ! QC flags 
    407                fco2data%nqc(iobs) = inpfiles(jj)%ivqc(ji,1) 
     407               pco2data%nqc(iobs) = inpfiles(jj)%ivqc(ji,1) 
    408408 
    409409               ! Observed value 
    410                fco2data%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 
     410               pco2data%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 
    411411 
    412412 
    413413               ! Model and MDT is set to fbrmdi unless read from file 
    414414               IF ( ldmod ) THEN 
    415                   fco2data%rmod(iobs,1) = inpfiles(jj)%padd(1,ji,1,1) 
     415                  pco2data%rmod(iobs,1) = inpfiles(jj)%padd(1,ji,1,1) 
    416416               ELSE 
    417                   fco2data%rmod(iobs,1) = fbrmdi 
     417                  pco2data%rmod(iobs,1) = fbrmdi 
    418418               ENDIF 
    419419            ENDIF 
     
    434434 
    435435         WRITE(numout,*) 
    436          WRITE(numout,'(1X,A)')'fco2 data types' 
     436         WRITE(numout,'(1X,A)')'pco2 data types' 
    437437         WRITE(numout,'(1X,A)')'-----------------' 
    438438         DO jj = 1,8 
     
    450450      ! Deallocate temporary data 
    451451      !----------------------------------------------------------------------- 
    452       DEALLOCATE( ifileidx, ifco2idx, zdat ) 
     452      DEALLOCATE( ifileidx, ipco2idx, zdat ) 
    453453 
    454454      !----------------------------------------------------------------------- 
     
    460460      DEALLOCATE( inpfiles ) 
    461461 
    462    END SUBROUTINE obs_rea_fco2 
    463  
    464 END MODULE obs_read_fco2 
    465  
     462   END SUBROUTINE obs_rea_pco2 
     463 
     464END MODULE obs_read_pco2 
     465 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90

    r6856 r6857  
    1414   !!   obs_wri_spm   : Write spm observation related diagnostics 
    1515   !!   obs_wri_fco2  : Write fco2 observation related diagnostics 
     16   !!   obs_wri_pco2  : Write fco2 observation related diagnostics 
    1617   !!   obs_wri_stats : Print basic statistics on the data being written out 
    1718   !!---------------------------------------------------------------------- 
     
    5152      &   obs_wri_spm, &    ! Write spm observation related diagnostics 
    5253      &   obs_wri_fco2, &   ! Write fco2 observation related diagnostics 
     54      &   obs_wri_pco2, &   ! Write pco2 observation related diagnostics 
    5355      &   obswriinfo 
    5456    
     
    13831385   END SUBROUTINE obs_wri_fco2 
    13841386 
     1387   SUBROUTINE obs_wri_pco2( cprefix, pco2data, padd, pext ) 
     1388      !!----------------------------------------------------------------------- 
     1389      !! 
     1390      !!                     *** ROUTINE obs_wri_pco2  *** 
     1391      !! 
     1392      !! ** Purpose : Write pco2 observation diagnostics 
     1393      !!              related  
     1394      !! 
     1395      !! ** Method  : NetCDF 
     1396      !!  
     1397      !! ** Action  : 
     1398      !! 
     1399      !!----------------------------------------------------------------------- 
     1400 
     1401      !! * Modules used 
     1402      IMPLICIT NONE 
     1403 
     1404      !! * Arguments 
     1405      CHARACTER(LEN=*), INTENT(IN) :: cprefix       ! Prefix for output files 
     1406      TYPE(obs_surf), INTENT(INOUT) :: pco2data   ! Full set of pco2 
     1407      TYPE(obswriinfo), OPTIONAL :: padd            ! Additional info for each variable 
     1408      TYPE(obswriinfo), OPTIONAL :: pext            ! Extra info 
     1409 
     1410      !! * Local declarations  
     1411      TYPE(obfbdata) :: fbdata 
     1412      CHARACTER(LEN=40) :: cfname             ! netCDF filename 
     1413      CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_pco2' 
     1414      INTEGER :: jo 
     1415      INTEGER :: ja 
     1416      INTEGER :: je 
     1417      INTEGER :: nadd 
     1418      INTEGER :: next 
     1419 
     1420      IF ( PRESENT( padd ) ) THEN 
     1421         nadd = padd%inum 
     1422      ELSE 
     1423         nadd = 0 
     1424      ENDIF 
     1425 
     1426      IF ( PRESENT( pext ) ) THEN 
     1427         next = pext%inum 
     1428      ELSE 
     1429         next = 0 
     1430      ENDIF 
     1431 
     1432      CALL init_obfbdata( fbdata ) 
     1433 
     1434      CALL alloc_obfbdata( fbdata, 1, pco2data%nsurf, 1, & 
     1435         &                 1 + nadd, next, .TRUE. ) 
     1436 
     1437      fbdata%cname(1)      = 'pco2' 
     1438      fbdata%coblong(1)    = 'pco2' 
     1439      fbdata%cobunit(1)    = 'uatm' 
     1440      DO je = 1, next 
     1441         fbdata%cextname(je) = pext%cdname(je) 
     1442         fbdata%cextlong(je) = pext%cdlong(je,1) 
     1443         fbdata%cextunit(je) = pext%cdunit(je,1) 
     1444      END DO 
     1445      fbdata%caddname(1)   = 'Hx' 
     1446      fbdata%caddlong(1,1) = 'Model interpolated pco2' 
     1447      fbdata%caddunit(1,1) = 'uatm' 
     1448      fbdata%cgrid(1)      = 'T' 
     1449      DO ja = 1, nadd 
     1450         fbdata%caddname(1+ja) = padd%cdname(ja) 
     1451         fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 
     1452         fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 
     1453      END DO 
     1454 
     1455      WRITE(cfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(cprefix), nproc 
     1456 
     1457      IF(lwp) THEN 
     1458         WRITE(numout,*) 
     1459         WRITE(numout,*)'obs_wri_pco2 :' 
     1460         WRITE(numout,*)'~~~~~~~~~~~~~~~~' 
     1461         WRITE(numout,*)'Writing pco2 feedback file : ',TRIM(cfname) 
     1462      ENDIF 
     1463 
     1464      ! Transform obs_prof data structure into obfbdata structure 
     1465      fbdata%cdjuldref = '19500101000000' 
     1466      DO jo = 1, pco2data%nsurf 
     1467         fbdata%plam(jo)      = pco2data%rlam(jo) 
     1468         fbdata%pphi(jo)      = pco2data%rphi(jo) 
     1469         WRITE(fbdata%cdtyp(jo),'(I4)') pco2data%ntyp(jo) 
     1470         fbdata%ivqc(jo,:)    = 0 
     1471         fbdata%ivqcf(:,jo,:) = 0 
     1472         IF ( pco2data%nqc(jo) > 10 ) THEN 
     1473            fbdata%ioqc(jo)    = 4 
     1474            fbdata%ioqcf(1,jo) = 0 
     1475            fbdata%ioqcf(2,jo) = pco2data%nqc(jo) - 10 
     1476         ELSE 
     1477            fbdata%ioqc(jo)    = MAX(pco2data%nqc(jo),1) 
     1478            fbdata%ioqcf(:,jo) = 0 
     1479         ENDIF 
     1480         fbdata%ipqc(jo)      = 0 
     1481         fbdata%ipqcf(:,jo)   = 0 
     1482         fbdata%itqc(jo)      = 0 
     1483         fbdata%itqcf(:,jo)   = 0 
     1484         fbdata%cdwmo(jo)     = '' 
     1485         fbdata%kindex(jo)    = pco2data%nsfil(jo) 
     1486         IF (ln_grid_global) THEN 
     1487            fbdata%iobsi(jo,1) = pco2data%mi(jo) 
     1488            fbdata%iobsj(jo,1) = pco2data%mj(jo) 
     1489         ELSE 
     1490            fbdata%iobsi(jo,1) = mig(pco2data%mi(jo)) 
     1491            fbdata%iobsj(jo,1) = mjg(pco2data%mj(jo)) 
     1492         ENDIF 
     1493         CALL greg2jul( 0, & 
     1494            &           pco2data%nmin(jo), & 
     1495            &           pco2data%nhou(jo), & 
     1496            &           pco2data%nday(jo), & 
     1497            &           pco2data%nmon(jo), & 
     1498            &           pco2data%nyea(jo), & 
     1499            &           fbdata%ptim(jo),   & 
     1500            &           krefdate = 19500101 ) 
     1501         fbdata%padd(1,jo,1,1) = pco2data%rmod(jo,1) 
     1502         fbdata%pob(1,jo,1)    = pco2data%robs(jo,1) 
     1503         fbdata%pdep(1,jo)     = 0.0 
     1504         fbdata%idqc(1,jo)     = 0 
     1505         fbdata%idqcf(:,1,jo)  = 0 
     1506         IF ( pco2data%nqc(jo) > 10 ) THEN 
     1507            fbdata%ivlqc(1,jo,1) = 4 
     1508            fbdata%ivlqcf(1,1,jo,1) = 0 
     1509            fbdata%ivlqcf(2,1,jo,1) = pco2data%nqc(jo) - 10 
     1510         ELSE 
     1511            fbdata%ivlqc(1,jo,1) = MAX(pco2data%nqc(jo),1) 
     1512            fbdata%ivlqcf(:,1,jo,1) = 0 
     1513         ENDIF 
     1514         fbdata%iobsk(1,jo,1)  = 0 
     1515         DO ja = 1, nadd 
     1516            fbdata%padd(1,jo,1+ja,1) = & 
     1517               & pco2data%rext(jo,padd%ipoint(ja)) 
     1518         END DO 
     1519         DO je = 1, next 
     1520            fbdata%pext(1,jo,je) = & 
     1521               & pco2data%rext(jo,pext%ipoint(je)) 
     1522         END DO 
     1523 
     1524      END DO 
     1525 
     1526      ! Write the obfbdata structure 
     1527      CALL write_obfbdata( cfname, fbdata ) 
     1528       
     1529      ! Output some basic statistics 
     1530      CALL obs_wri_stats( fbdata ) 
     1531 
     1532      CALL dealloc_obfbdata( fbdata ) 
     1533 
     1534   END SUBROUTINE obs_wri_pco2 
     1535 
    13851536   SUBROUTINE obs_wri_stats( fbdata ) 
    13861537      !!----------------------------------------------------------------------- 
  • branches/UKMO/dev_r4650_general_vert_coord_obsoper_surf_bgc/NEMOGCM/NEMO/OPA_SRC/OBS/obspco2_io.h90

    r6856 r6857  
    55   !!---------------------------------------------------------------------- 
    66 
    7    SUBROUTINE read_fco2( cdfilename, inpfile, kunit, ldwp, ldgrid ) 
     7   SUBROUTINE read_pco2( cdfilename, inpfile, kunit, ldwp, ldgrid ) 
    88      !!--------------------------------------------------------------------- 
    99      !! 
    10       !!                     ** ROUTINE read_fco2 ** 
    11       !! 
    12       !! ** Purpose : Read from file the fco2 observations. 
     10      !!                     ** ROUTINE read_pco2 ** 
     11      !! 
     12      !! ** Purpose : Read from file the pco2 observations. 
    1313      !! 
    1414      !! ** Method  : The data file is a NetCDF file.  
     
    2828      LOGICAL          :: ldgrid     ! Save grid info in data structure 
    2929      !! * Local declarations 
    30       CHARACTER(LEN=12),PARAMETER :: cpname = 'read_fco2' 
     30      CHARACTER(LEN=12),PARAMETER :: cpname = 'read_pco2' 
    3131      INTEGER :: i_file_id    ! netcdf IDS 
    3232      INTEGER :: i_time_id 
     
    4141         & i_dtime, &       ! Offset in seconds since reference time 
    4242         & i_qc,    &       ! Quality control flag. 
    43          & i_type           ! Type of fco2 measurement.             
     43         & i_type           ! Type of pco2 measurement.             
    4444      REAL(wp), DIMENSION(:), POINTER :: & 
    4545         & z_phi,   &       ! Latitudes 
    4646         & z_lam            ! Longitudes 
    4747      REAL(wp), DIMENSION(:,:), POINTER :: & 
    48          & z_fco2         ! fco2 data      
     48         & z_pco2         ! pco2 data      
    4949      INTEGER, PARAMETER :: imaxdim = 2    ! Assumed maximum for no. dims. in file 
    5050      INTEGER, DIMENSION(2) :: idims       ! Dimensions in file 
     
    9494         & z_phi        ( i_data                 ), &    
    9595         & z_lam        ( i_data                 ), &   
    96          & z_fco2        ( i_data,i_time  )  & 
     96         & z_pco2        ( i_data,i_time  )  & 
    9797         & ) 
    9898       
     
    124124      ! Get list of times for each ob in seconds relative to reference time 
    125125       
    126       CALL chkerr( nf90_inq_varid( i_file_id, 'fco2_dtime', i_var_id ), &  
     126      CALL chkerr( nf90_inq_varid( i_file_id, 'pco2_dtime', i_var_id ), &  
    127127         &       cpname, __LINE__ ) 
    128128      idims(1) = i_data 
     
    164164         &         cpname, __LINE__ ) 
    165165       
    166       ! Get fco2 data 
    167        
    168       CALL chkerr( nf90_inq_varid( i_file_id, 'fco2', & 
     166      ! Get pco2 data 
     167       
     168      CALL chkerr( nf90_inq_varid( i_file_id, 'pco2', & 
    169169         &                         i_var_id ), &  
    170170         &         cpname, __LINE__ ) 
     
    172172      idims(2) = i_time 
    173173      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ ) 
    174       CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_fco2), & 
     174      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_pco2), & 
    175175         &       cpname, __LINE__ ) 
    176176      zoff = 0. 
     
    192192            &                       "_FillValue",zfill), cpname, __LINE__ ) 
    193193      ENDIF 
    194       WHERE(z_fco2(:,:) /=  zfill) 
    195          z_fco2(:,:) = (zsca * z_fco2(:,:)) + zoff 
     194      WHERE(z_pco2(:,:) /=  zfill) 
     195         z_pco2(:,:) = (zsca * z_pco2(:,:)) + zoff 
    196196      ELSEWHERE 
    197          z_fco2(:,:) = fbrmdi 
     197         z_pco2(:,:) = fbrmdi 
    198198      END WHERE 
    199199       
     
    208208            &       cpname, __LINE__ ) 
    209209       
    210       ! Get fco2 obs type 
     210      ! Get pco2 obs type 
    211211       
    212212      i_type(:,:)=1 
     
    223223      CALL init_obfbdata( inpfile ) 
    224224      CALL alloc_obfbdata( inpfile, 1, iobs, 1, 0, 0, ldgrid ) 
    225       inpfile%cname(1) = 'fco2' 
     225      inpfile%cname(1) = 'pco2' 
    226226 
    227227      ! Fill the obfbdata structure from input data 
     
    233233            iobs = iobs + 1 
    234234            ! Characters 
    235             WRITE(inpfile%cdwmo(iobs),'(A6,A2)') 'fco2','  ' 
     235            WRITE(inpfile%cdwmo(iobs),'(A6,A2)') 'pco2','  ' 
    236236            WRITE(inpfile%cdtyp(iobs),'(I4)') i_type(jobs,jtim) 
    237237            ! Real values 
    238238            inpfile%plam(iobs)         = z_lam(jobs) 
    239239            inpfile%pphi(iobs)         = z_phi(jobs) 
    240             inpfile%pob(1,iobs,1)      = z_fco2(jobs,jtim) 
     240            inpfile%pob(1,iobs,1)      = z_pco2(jobs,jtim) 
    241241            inpfile%ptim(iobs)         = & 
    242242               & REAL(i_reftime(jtim))/(60.*60.*24.) + & 
     
    245245            ! Integers 
    246246            inpfile%kindex(iobs)       = iobs 
    247             IF ( z_fco2(jobs,jtim) == fbrmdi ) THEN 
     247            IF ( z_pco2(jobs,jtim) == fbrmdi ) THEN 
    248248               inpfile%ioqc(iobs)      = 4 
    249249               inpfile%ivqc(iobs,1)    = 4  
     
    266266      END DO 
    267267 
    268    END SUBROUTINE read_fco2 
    269  
    270  
     268   END SUBROUTINE read_pco2 
     269 
     270 
Note: See TracChangeset for help on using the changeset viewer.