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 4030 – NEMO

Changeset 4030


Ignore:
Timestamp:
2013-09-20T16:40:51+02:00 (11 years ago)
Author:
djlea
Message:

Initial version of the offline observation operator and the required (online) observation operator changes.

Location:
branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO
Files:
8 added
3 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90

    r3651 r4030  
    2121   USE par_oce 
    2222   USE dom_oce                  ! Ocean space and time domain variables 
     23   USE obs_fbm, ONLY: ln_cl4    ! Class 4 diagnostic switch 
    2324   USE obs_read_prof            ! Reading and allocation of observations (Coriolis) 
    2425   USE obs_read_sla             ! Reading and allocation of SLA observations   
     
    4849   PUBLIC dia_obs_init, &  ! Initialize and read observations 
    4950      &   dia_obs,      &  ! Compute model equivalent to observations 
    50       &   dia_obs_wri      ! Write model equivalent to observations 
     51      &   dia_obs_wri,  &  ! Write model equivalent to observations 
     52      &   dia_obs_dealloc  ! Deallocate dia_obs data 
    5153 
    5254   !! * Shared Module variables 
     
    176178         &            ln_velhradcp, velhradcpfiles,                   & 
    177179         &            ln_velfb, velfbfiles, ln_velfb_av,              & 
    178          &            ln_profb_enatim, ln_ignmis 
     180         &            ln_profb_enatim, ln_ignmis, ln_cl4 
    179181 
    180182      INTEGER :: jprofset 
     
    230232      ln_grid_global = .FALSE. 
    231233      ln_s_at_t = .TRUE. 
     234      ln_cl4 = .FALSE. 
    232235      grid_search_file = 'xypos' 
    233236      bias_file='bias.nc' 
     
    14141417   END SUBROUTINE dia_obs_wri 
    14151418 
     1419   SUBROUTINE dia_obs_dealloc 
     1420      IMPLICIT NONE 
     1421      !!---------------------------------------------------------------------- 
     1422      !!                    *** ROUTINE dia_obs_dealloc *** 
     1423      !! 
     1424      !!  ** Purpose : To deallocate data to enable the obs_oper online loop. 
     1425      !!               Specifically: dia_obs_init --> dia_obs --> dia_obs_wri 
     1426      !! 
     1427      !!  ** Method : Clean up various arrays left behind by the obs_oper. 
     1428      !! 
     1429      !!  ** Action : 
     1430      !! 
     1431      !!---------------------------------------------------------------------- 
     1432      !! obs_grid deallocation 
     1433      CALL obs_grid_deallocate 
     1434 
     1435      !! diaobs deallocation 
     1436      IF ( nprofsets > 0 ) THEN 
     1437          DEALLOCATE(ld_enact, & 
     1438                  &  profdata, & 
     1439                  &  prodatqc) 
     1440      END IF 
     1441      IF ( ln_sla ) THEN 
     1442          DEALLOCATE(sladata, & 
     1443                  &  sladatqc) 
     1444      END IF 
     1445      IF ( ln_seaice ) THEN 
     1446          DEALLOCATE(sladata, & 
     1447                  &  sladatqc) 
     1448      END IF 
     1449      IF ( ln_sst ) THEN 
     1450          DEALLOCATE(sstdata, & 
     1451                  &  sstdatqc) 
     1452      END IF 
     1453      IF ( ln_vel3d ) THEN 
     1454          DEALLOCATE(ld_velav, & 
     1455                  &  velodata, & 
     1456                  &  veldatqc) 
     1457      END IF 
     1458   END SUBROUTINE dia_obs_dealloc 
     1459 
    14161460   SUBROUTINE ini_date( ddobsini ) 
    14171461      !!---------------------------------------------------------------------- 
  • branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO/OPA_SRC/OBS/mpp_map.F90

    r2363 r4030  
    5252      !!---------------------------------------------------------------------- 
    5353 
    54       ALLOCATE( & 
    55          & mppmap(jpiglo,jpjglo) & 
    56          & ) 
    57  
     54      IF (.NOT. ALLOCATED(mppmap)) THEN 
     55         ALLOCATE( & 
     56            & mppmap(jpiglo,jpjglo) & 
     57            & ) 
     58      ENDIF 
    5859      ! Initialize local imppmap 
    5960 
  • branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO/OPA_SRC/OBS/obs_fbm.F90

    r2287 r4030  
    4545   INTEGER, PARAMETER    :: fbimdi = -99999   !: Integers 
    4646   REAL(fbsp), PARAMETER :: fbrmdi =  99999   !: Reals 
    47     
     47 
     48   ! Output stream choice 
     49   LOGICAL               :: ln_cl4 = .FALSE.  !: Logical switch for 
     50                                              !: class 4 file outputs 
     51  
    4852   ! Main data structure for observation feedback data. 
    4953 
     
    10261030 
    10271031   SUBROUTINE write_obfbdata( cdfilename, fbdata ) 
     1032      !!---------------------------------------------------------------------- 
     1033      !!                    ***  ROUTINE write_obfbdata  *** 
     1034      !! 
     1035      !! ** Purpose :   Write an obfbdata structure into a netCDF file. 
     1036      !! 
     1037      !! ** Method  :   Decides which output wrapper to use.  
     1038      !! 
     1039      !! ** Action  :  
     1040      !! 
     1041      !!---------------------------------------------------------------------- 
     1042      !! * Arguments 
     1043      CHARACTER(len=*) :: cdfilename ! Output filename 
     1044      TYPE(obfbdata)   :: fbdata     ! obsfbdata structure 
     1045      IF (ln_cl4) THEN 
     1046          WRITE(*,*) "DEBUG: Writing class 4 file outputs" 
     1047          ! Class 4 file output stream 
     1048          CALL write_obfbdata_cl( cdfilename, fbdata ) 
     1049      ELSE 
     1050          WRITE(*,*) "DEBUG: Writing feedback file outputs" 
     1051          ! Standard feedback file output stream 
     1052          CALL write_obfbdata_fb( cdfilename, fbdata ) 
     1053      ENDIF   
     1054   END SUBROUTINE write_obfbdata 
     1055 
     1056   SUBROUTINE write_obfbdata_fb( cdfilename, fbdata ) 
    10281057      !!---------------------------------------------------------------------- 
    10291058      !!                    ***  ROUTINE write_obfbdata  *** 
     
    15241553 
    15251554       
    1526    END SUBROUTINE write_obfbdata 
     1555   END SUBROUTINE write_obfbdata_fb 
     1556 
     1557   SUBROUTINE write_obfbdata_cl(cdfilename, fbdata) 
     1558      !!---------------------------------------------------------------------- 
     1559      !!                    ***  ROUTINE write_obfbdata_cl  *** 
     1560      !! 
     1561      !! ** Purpose : Write an obfbdata structure into a class 4 file. 
     1562      !! 
     1563      !! ** Method  : 1. Allocate memory needed by off_wri_netcdf 
     1564      !!              2. Map obfbdata into allocated memory 
     1565      !!              3. Pass mapped data to off_wri_netcdf 
     1566      !!              4. Deallocate memory 
     1567      !!---------------------------------------------------------------------- 
     1568      USE dom_oce, ONLY: narea 
     1569      USE off_write 
     1570      USE off_data 
     1571      IMPLICIT NONE 
     1572      !! * Arguments 
     1573      CHARACTER(len=*) :: cdfilename ! Feedback filename 
     1574      TYPE(obfbdata)   :: fbdata     ! obsfbdata structure 
     1575      !! * Local variables 
     1576      CHARACTER(len=17), PARAMETER :: cpname = 'write_obfbdata_cl' 
     1577      CHARACTER(len=64) :: & 
     1578              & cdate, &   !: class 4 file validity date  
     1579              & cconf, &   !: model configuration 
     1580              & csys, &    !: model system 
     1581              & cversion   !: model version 
     1582      CHARACTER(len=8) :: & 
     1583              & ckind      !: observation kind 
     1584      CHARACTER(len=3) :: cfield 
     1585      INTEGER :: kobs, &   !: number of observations 
     1586              &  kvars, &  !: number of physical variables 
     1587              &  kdeps, &  !: number of observed depths 
     1588              &  kfcst, &  !: number of forecasts 
     1589              &  kifcst, & !: current forecast number 
     1590              &  kproc     !: processor number 
     1591      INTEGER, DIMENSION(:, :, :), ALLOCATABLE :: & 
     1592              &  kqc       !: quality control counterpart 
     1593      INTEGER(KIND=2), DIMENSION(:, :, :), ALLOCATABLE :: & 
     1594              &  k2qc       !: quality control counterpart 
     1595      REAL(kind=fbdp) :: & 
     1596              &  pmodjuld  !: model Julian day 
     1597      REAL(kind=fbdp), DIMENSION(:), ALLOCATABLE :: & 
     1598              &  plead, &  !: forecast lead time 
     1599              &  plam, &   !: longitude of observation 
     1600              &  pphi, &   !: latitude of observation 
     1601              &  ptim      !: time of observation 
     1602      REAL(kind=fbdp), DIMENSION(:, :), ALLOCATABLE :: & 
     1603              &  pdep      !: depths of observations 
     1604      REAL(kind=fbdp), DIMENSION(:, :, :), ALLOCATABLE :: & 
     1605              &  pob, &    !: observation counterpart 
     1606              &  pextra    !: extra field counterpart 
     1607      REAL(kind=fbdp), DIMENSION(:, :, :), ALLOCATABLE :: & 
     1608              &  pmod      !: model counterpart 
     1609      CHARACTER(len=128) :: & 
     1610              &  clfilename  !: class 4 file name 
     1611      CHARACTER(len=128), DIMENSION(:), ALLOCATABLE :: & 
     1612              &  ctype       !: Instrument type 
     1613      CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: & 
     1614              &  cwmo, &     !: Instrument WMO ID 
     1615              &  cunit, &    !: Instrument WMO ID 
     1616              &  cvarname    !: Instrument WMO ID 
     1617      INTEGER :: & 
     1618              &  idep, &     !: Loop variable 
     1619              &  ivar, &     !: Loop variable 
     1620              &  iobs, &     !: Loop variable 
     1621              &  ii, &       !: Loop variable 
     1622              &  ij, &       !: Loop variable 
     1623              &  ik, &       !: Loop variable 
     1624              &  il          !: Loop variable 
     1625      cconf = TRIM(cl4_cfg) 
     1626      csys = TRIM(cl4_sys) 
     1627      cversion = TRIM(cl4_vn) 
     1628      cdate = TRIM(cl4_date) 
     1629      CALL locate_kind(cdfilename, ckind) 
     1630      kproc = narea 
     1631      kfcst = cl4_fclen 
     1632      kobs = fbdata%nobs 
     1633      kdeps = fbdata%nlev 
     1634      kvars = fbdata%nvar 
     1635      IF (kobs .GT. 0) THEN 
     1636         ALLOCATE(plam(kobs), & 
     1637               &  pphi(kobs), & 
     1638               &  ptim(kobs), & 
     1639               &  plead(kfcst), & 
     1640               &  pdep(kdeps, kobs), & 
     1641               &  kqc(kdeps, kvars, kobs), & 
     1642               &  k2qc(kdeps, kvars, kobs), & 
     1643               &  pob(kdeps, kvars, kobs), & 
     1644               &  pmod(kdeps, kvars, kobs), & 
     1645               &  pextra(kdeps, kvars, kobs), & 
     1646               &  ctype(kobs), & 
     1647               &  cwmo(kobs), & 
     1648               &  cunit(kvars), & 
     1649               &  cvarname(kvars)) 
     1650         plam(:) = fbdata%plam(:) 
     1651         pphi(:) = fbdata%pphi(:) 
     1652         ptim(:) = fbdata%ptim(:) 
     1653         pdep(:, :) = fbdata%pdep(:, :) 
     1654         kqc(:,:,:) = 1. 
     1655         DO ii = 1, kvars 
     1656            cvarname(ii)  = fbdata%cname(ii) 
     1657            cunit(ii)     = fbdata%cobunit(ii) 
     1658         END DO 
     1659 
     1660         ! Quality control algorithm 
     1661         k2qc(:,:,:) = NF90_FILL_SHORT 
     1662         DO idep = 1,kdeps 
     1663            DO ivar = 1, kvars 
     1664               DO iobs = 1, kobs 
     1665                   ! 1 symbolises good for fbdata 
     1666                   ! fbimdi symbolises that qc has not been set 
     1667                   ! Essentially, if any fbdata flag is not an element of {1, fbimdi} 
     1668                   ! then set the class 4 flag to bad. 
     1669                   ! Note: fbdata%ioqc is marked good if zero. 
     1670                   IF (((fbdata%ioqc(iobs) /= 0) .AND. & 
     1671                             & (fbdata%ioqc(iobs) /= fbimdi)) .OR. & 
     1672                     & ((fbdata%ipqc(iobs) /= 1) .AND. & 
     1673                             & (fbdata%ipqc(iobs) /= fbimdi)) .OR. & 
     1674                     & ((fbdata%idqc(idep,iobs) /= 1) .AND. & 
     1675                             & (fbdata%idqc(idep,iobs) /= fbimdi)) .OR. & 
     1676                     & ((fbdata%ivqc(iobs,ivar) /= 1) .AND. & 
     1677                             & (fbdata%ivqc(iobs,ivar) /= fbimdi)) .OR. & 
     1678                     & ((fbdata%ivlqc(idep,iobs,ivar) /= 1) .AND. & 
     1679                             & (fbdata%ivlqc(idep,iobs,ivar) /= fbimdi)) .OR. & 
     1680                     & ((fbdata%itqc(iobs) /= 1) .AND. & 
     1681                             & (fbdata%itqc(iobs) /= fbimdi))) THEN 
     1682                      ! 1 symbolises bad for class 4 file 
     1683                      k2qc(idep, ivar, iobs) = 1 
     1684                   ELSE 
     1685                      ! 0 symbolises good for class 4 file 
     1686                      k2qc(idep, ivar, iobs) = 0 
     1687                   END IF  
     1688               END DO 
     1689            END DO 
     1690         END DO 
     1691 
     1692         ! Permute observation dimensions 
     1693         pob(:,:,:) = RESHAPE(fbdata%pob, (/kdeps, kvars, kobs/), & 
     1694                            & ORDER=(/1, 3, 2/)) 
     1695 
     1696         ! Explicit model counterpart dimension permutation 
     1697         ! 1,2,3,4 --> 1,4,2,3 
     1698         pmod(:,:,:) = fbrmdi 
     1699         ij = nn_forecast(jimatch) 
     1700         DO ii = 1,kdeps 
     1701            DO ik = 1, kvars 
     1702               DO il = 1, kobs 
     1703                  pmod(ii,ik,il) = fbdata%padd(ii,il,1,ik) 
     1704               END DO 
     1705            END DO 
     1706         END DO 
     1707 
     1708         ! Extra fields set to missing for now 
     1709         pextra(:,:,:) = fbrmdi 
     1710 
     1711         ! Lead time of class 4 file is a global parameter 
     1712         plead = cl4_leadtime(1:cl4_fclen) 
     1713 
     1714         ! Model Julian day 
     1715         pmodjuld = cl4_modjuld 
     1716 
     1717         ! Observation types 
     1718         ctype(:) = 'X' 
     1719         DO ii = 1,kobs 
     1720            ctype(ii) = fbdata%cdtyp(ii) 
     1721         END DO 
     1722 
     1723         ! World Meteorology Organisation codes 
     1724         cwmo(:) = fbdata%cdwmo(:) 
     1725 
     1726         ! Initialise class 4 file 
     1727         CALL off_wri_init(cconf, csys, ckind, cversion, cdate, & 
     1728                         & kproc, kobs, kvars, kdeps, kfcst, & 
     1729                         & clfilename) 
     1730 
     1731         ! Write standard variables 
     1732         CALL off_wri_default(clfilename, kobs, kvars, kfcst, kdeps, & 
     1733                            & ctype, cwmo, cunit, cvarname, & 
     1734                            & plam, pphi, pdep, ptim, pob, plead, & 
     1735                            & k2qc, pmodjuld) 
     1736 
     1737         !! Write to optional variables 
     1738         CALL off_wri_extra(clfilename, TRIM(cl4_vars(jimatch)), kdeps, kfcst, & 
     1739                         &  kvars, kobs, (/ 1,ij,1,1 /), (/ kdeps,1,kvars,kobs /), pmod) 
     1740 
     1741         DEALLOCATE(plam, pphi, ptim, pdep, plead, kqc, k2qc, & 
     1742                  & pob, pmod, pextra, ctype, cwmo, & 
     1743                  & cunit, cvarname) 
     1744      END IF 
     1745   END SUBROUTINE write_obfbdata_cl 
     1746 
     1747   SUBROUTINE locate_kind(cdfilename, ckind) 
     1748      !!---------------------------------------------------------------------- 
     1749      !!                    ***  ROUTINE locate_kind  *** 
     1750      !! 
     1751      !! ** Purpose : Detect which kind of class 4 file is being produced. 
     1752      !! 
     1753      !! ** Method  : 1. Inspect cdfilename for observation kind. 
     1754      !!---------------------------------------------------------------------- 
     1755      IMPLICIT NONE 
     1756      CHARACTER(len=*) :: cdfilename ! Feedback filename 
     1757      CHARACTER(len=8) :: ckind 
     1758      IF (cdfilename(1:3) == 'sst') THEN 
     1759         ckind = 'SST' 
     1760      ELSE IF (cdfilename(1:3) == 'sla') THEN 
     1761         ckind = 'SLA' 
     1762      ELSE IF (cdfilename(1:3) == 'pro') THEN 
     1763         ckind = 'profile' 
     1764      ELSE IF (cdfilename(1:3) == 'ena') THEN 
     1765         ckind = 'profile' 
     1766      ELSE IF (cdfilename(1:3) == 'sea') THEN 
     1767         ckind = 'seaice' 
     1768      ELSE 
     1769         ckind = 'unknown' 
     1770      END IF 
     1771   END SUBROUTINE locate_kind 
    15271772 
    15281773   SUBROUTINE putvaratt_obfbdata( idfile, idvar, cdlongname, cdunits, & 
Note: See TracChangeset for help on using the changeset viewer.