[4848] | 1 | MODULE sao_read |
---|
[7646] | 2 | !!====================================================================== |
---|
| 3 | !! *** MODULE sao_read *** |
---|
[4846] | 4 | !! Read routines : I/O for Stand Alone Observation operator |
---|
[7646] | 5 | !!====================================================================== |
---|
[4110] | 6 | USE mppini |
---|
| 7 | USE lib_mpp |
---|
| 8 | USE in_out_manager |
---|
| 9 | USE par_kind, ONLY: lc |
---|
| 10 | USE netcdf |
---|
| 11 | USE oce, ONLY: tsn, sshn |
---|
[13286] | 12 | USE dom_oce, ONLY: nimpp, njmpp, tmask |
---|
[4110] | 13 | USE par_oce, ONLY: jpi, jpj, jpk |
---|
[7646] | 14 | ! |
---|
[4110] | 15 | USE obs_fbm, ONLY: fbimdi, fbrmdi, fbsp, fbdp |
---|
[4849] | 16 | USE sao_data |
---|
[4030] | 17 | |
---|
[4110] | 18 | IMPLICIT NONE |
---|
| 19 | PRIVATE |
---|
[4030] | 20 | |
---|
[4848] | 21 | PUBLIC sao_rea_dri |
---|
[4030] | 22 | |
---|
[7646] | 23 | !!---------------------------------------------------------------------- |
---|
[9598] | 24 | !! NEMO/OCE 4.0 , NEMO Consortium (2018) |
---|
[10069] | 25 | !! $Id$ |
---|
[10068] | 26 | !! Software governed by the CeCILL license (see ./LICENSE) |
---|
[7646] | 27 | !!---------------------------------------------------------------------- |
---|
[4030] | 28 | CONTAINS |
---|
[7646] | 29 | |
---|
| 30 | SUBROUTINE sao_rea_dri( kfile ) |
---|
[4084] | 31 | !!------------------------------------------------------------------------ |
---|
[4848] | 32 | !! *** sao_rea_dri *** |
---|
[4084] | 33 | !! |
---|
| 34 | !! Purpose : To choose appropriate read method |
---|
[5063] | 35 | !! Method : |
---|
[4084] | 36 | !! |
---|
| 37 | !! Author : A. Ryan Oct 2013 |
---|
| 38 | !! |
---|
| 39 | !!------------------------------------------------------------------------ |
---|
[7646] | 40 | INTEGER, INTENT(in) :: kfile ! File number |
---|
| 41 | ! |
---|
| 42 | CHARACTER(len=lc) :: cdfilename ! File name |
---|
| 43 | INTEGER :: kindex ! File index to read |
---|
| 44 | !!------------------------------------------------------------------------ |
---|
| 45 | ! |
---|
| 46 | cdfilename = TRIM( sao_files(kfile) ) |
---|
[4846] | 47 | kindex = nn_sao_idx(kfile) |
---|
[7646] | 48 | CALL sao_read_file( TRIM( cdfilename ), kindex ) |
---|
| 49 | ! |
---|
[4848] | 50 | END SUBROUTINE sao_rea_dri |
---|
[4030] | 51 | |
---|
[7646] | 52 | |
---|
| 53 | SUBROUTINE sao_read_file( filename, ifcst ) |
---|
[4084] | 54 | !!------------------------------------------------------------------------ |
---|
[7646] | 55 | !! *** sao_read_file *** |
---|
[4084] | 56 | !! |
---|
| 57 | !! Purpose : To fill tn and sn with dailymean field from netcdf files |
---|
| 58 | !! Method : Use subdomain indices to create start and count matrices |
---|
| 59 | !! for netcdf read. |
---|
| 60 | !! |
---|
| 61 | !! Author : A. Ryan Oct 2010 |
---|
| 62 | !!------------------------------------------------------------------------ |
---|
[7646] | 63 | INTEGER, INTENT(in) :: ifcst |
---|
| 64 | CHARACTER(len=*), INTENT(in) :: filename |
---|
| 65 | INTEGER :: ncid, varid, istat, ntimes |
---|
| 66 | INTEGER :: tdim, xdim, ydim, zdim |
---|
| 67 | INTEGER :: ii, ij, ik |
---|
| 68 | INTEGER, DIMENSION(4) :: start_n, count_n |
---|
| 69 | INTEGER, DIMENSION(3) :: start_s, count_s |
---|
| 70 | REAL(fbdp) :: fill_val |
---|
| 71 | REAL(fbdp), DIMENSION(:,:,:), ALLOCATABLE :: temp_tn, temp_sn |
---|
| 72 | REAL(fbdp), DIMENSION(:,:) , ALLOCATABLE :: temp_sshn |
---|
[4030] | 73 | |
---|
| 74 | ! DEBUG |
---|
[7646] | 75 | INTEGER :: istage |
---|
| 76 | !!------------------------------------------------------------------------ |
---|
[4030] | 77 | |
---|
| 78 | IF (TRIM(filename) == 'nofile') THEN |
---|
[7646] | 79 | tsn (:,:,:,:) = fbrmdi |
---|
| 80 | sshn(:,:) = fbrmdi |
---|
[4030] | 81 | ELSE |
---|
[4108] | 82 | WRITE(numout,*) "Opening :", TRIM(filename) |
---|
[4030] | 83 | ! Open Netcdf file to find dimension id |
---|
[4031] | 84 | istat = nf90_open(path=TRIM(filename), mode=nf90_nowrite, ncid=ncid) |
---|
[4030] | 85 | IF ( istat /= nf90_noerr ) THEN |
---|
[4108] | 86 | WRITE(numout,*) "WARNING: Could not open ", trim(filename) |
---|
| 87 | WRITE(numout,*) "ERROR: ", nf90_strerror(istat) |
---|
[4030] | 88 | ENDIF |
---|
| 89 | istat = nf90_inq_dimid(ncid,'x',xdim) |
---|
| 90 | istat = nf90_inq_dimid(ncid,'y',ydim) |
---|
| 91 | istat = nf90_inq_dimid(ncid,'deptht',zdim) |
---|
| 92 | istat = nf90_inq_dimid(ncid,'time_counter',tdim) |
---|
| 93 | istat = nf90_inquire_dimension(ncid, tdim, len=ntimes) |
---|
[5063] | 94 | IF (ifcst .LE. ntimes) THEN |
---|
[4030] | 95 | ! Allocate temporary temperature array |
---|
[13286] | 96 | ALLOCATE(temp_tn(jpi,jpj,jpk)) |
---|
| 97 | ALLOCATE(temp_sn(jpi,jpj,jpk)) |
---|
| 98 | ALLOCATE(temp_sshn(jpi,jpj)) |
---|
[5063] | 99 | |
---|
[4030] | 100 | ! Set temp_tn, temp_sn to 0. |
---|
| 101 | temp_tn(:,:,:) = fbrmdi |
---|
| 102 | temp_sn(:,:,:) = fbrmdi |
---|
| 103 | temp_sshn(:,:) = fbrmdi |
---|
[5063] | 104 | |
---|
[4030] | 105 | ! Create start and count arrays |
---|
[13286] | 106 | start_n = (/ nimpp, njmpp, 1, ifcst /) |
---|
| 107 | count_n = (/ jpi, jpj, jpk, 1 /) |
---|
| 108 | start_s = (/ nimpp, njmpp , ifcst /) |
---|
| 109 | count_s = (/ jpi, jpj, 1 /) |
---|
[5063] | 110 | |
---|
[4030] | 111 | ! Read information into temporary arrays |
---|
| 112 | ! retrieve varid and read in temperature |
---|
| 113 | istat = nf90_inq_varid(ncid,'votemper',varid) |
---|
| 114 | istat = nf90_get_att(ncid, varid, '_FillValue', fill_val) |
---|
| 115 | istat = nf90_get_var(ncid, varid, temp_tn, start_n, count_n) |
---|
| 116 | WHERE(temp_tn(:,:,:) == fill_val) temp_tn(:,:,:) = fbrmdi |
---|
[5063] | 117 | |
---|
[4030] | 118 | ! retrieve varid and read in salinity |
---|
| 119 | istat = nf90_inq_varid(ncid,'vosaline',varid) |
---|
| 120 | istat = nf90_get_att(ncid, varid, '_FillValue', fill_val) |
---|
| 121 | istat = nf90_get_var(ncid, varid, temp_sn, start_n, count_n) |
---|
| 122 | WHERE(temp_sn(:,:,:) == fill_val) temp_sn(:,:,:) = fbrmdi |
---|
[5063] | 123 | |
---|
[4030] | 124 | ! retrieve varid and read in SSH |
---|
| 125 | istat = nf90_inq_varid(ncid,'sossheig',varid) |
---|
| 126 | IF (istat /= nf90_noerr) THEN |
---|
| 127 | ! Altimeter bias |
---|
| 128 | istat = nf90_inq_varid(ncid,'altbias',varid) |
---|
| 129 | END IF |
---|
[5063] | 130 | |
---|
[4030] | 131 | istat = nf90_get_att(ncid, varid, '_FillValue', fill_val) |
---|
| 132 | istat = nf90_get_var(ncid, varid, temp_sshn, start_s, count_s) |
---|
| 133 | WHERE(temp_sshn(:,:) == fill_val) temp_sshn(:,:) = fbrmdi |
---|
[5063] | 134 | |
---|
[4030] | 135 | ! Initialise tsn, sshn to fbrmdi |
---|
| 136 | tsn(:,:,:,:) = fbrmdi |
---|
[5063] | 137 | sshn(:,:) = fbrmdi |
---|
[4030] | 138 | |
---|
| 139 | ! Mask out missing data index |
---|
[13286] | 140 | tsn(1:jpi,1:jpj,1:jpk,1) = temp_tn(:,:,:) * tmask(1:jpi,1:jpj,1:jpk) |
---|
| 141 | tsn(1:jpi,1:jpj,1:jpk,2) = temp_sn(:,:,:) * tmask(1:jpi,1:jpj,1:jpk) |
---|
| 142 | sshn(1:jpi,1:jpj) = temp_sshn(:,:) * tmask(1:jpi,1:jpj,1) |
---|
| 143 | |
---|
[4030] | 144 | ! Deallocate arrays |
---|
| 145 | DEALLOCATE(temp_tn, temp_sn, temp_sshn) |
---|
[5063] | 146 | ELSE |
---|
[4030] | 147 | ! Mark all as missing data |
---|
| 148 | tsn(:,:,:,:) = fbrmdi |
---|
[5063] | 149 | sshn(:,:) = fbrmdi |
---|
[4030] | 150 | ENDIF |
---|
| 151 | ! Close netcdf file |
---|
[4108] | 152 | WRITE(numout,*) "Closing :", TRIM(filename) |
---|
[4030] | 153 | istat = nf90_close(ncid) |
---|
| 154 | END IF |
---|
[7646] | 155 | ! |
---|
[4848] | 156 | END SUBROUTINE sao_read_file |
---|
[7646] | 157 | |
---|
| 158 | !!------------------------------------------------------------------------ |
---|
[5063] | 159 | END MODULE sao_read |
---|