SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
assim_set_sst.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ###############################################################################
6 SUBROUTINE assim_set_sst (DTCO, DGU, S, U, &
7  ki,pitm,psst,psic,htest)
8 
9 ! ###############################################################################
10 !
11 !!**** *ASSIM_SET_SST * - Reads SST from file
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! T. Aspelien
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 04/2012
30 !!--------------------------------------------------------------------
31 !
34 USE modd_seaflux_n, ONLY : seaflux_t
35 USE modd_surf_atm_n, ONLY : surf_atm_t
36 !
37 USE modd_surfex_mpi, ONLY : nrank, npio, nproc
38 !
39 USE modd_assim, ONLY : lecsst, lread_sst_from_file, cfile_format_sst, nprintlev
40 USE modd_surf_par, ONLY : xundef
41 !
42 #ifdef SFX_FA
43 USE modd_io_surf_fa, ONLY : cfilein_fa, cdnomc
44 #endif
45 !
46 USE modi_abor1_sfx
47 USE modi_init_io_surf_n
51 USE modi_end_io_surf_n
52 USE modi_io_buff_clean
54 !
55 USE yomhook, ONLY : lhook,dr_hook
56 USE parkind1, ONLY : jprb
57 !
58 IMPLICIT NONE
59 !
60 !* 0.1 declarations of arguments
61 !
62 !
63 !
64 TYPE(data_cover_t), INTENT(INOUT) :: dtco
65 TYPE(diag_surf_atm_t), INTENT(INOUT) :: dgu
66 TYPE(seaflux_t), INTENT(INOUT) :: s
67 TYPE(surf_atm_t), INTENT(INOUT) :: u
68 !
69 INTEGER, INTENT(IN) :: ki
70 REAL,DIMENSION(KI), INTENT(IN) :: pitm
71 REAL,DIMENSION(KI), INTENT(OUT) :: psst
72 REAL,DIMENSION(KI), INTENT(OUT) :: psic ! Not used at the moment
73  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
74 !
75 !* 0.2 declarations of local variables
76 !
77 !-------------------------------------------------------------------------------------
78 !
79 REAL,ALLOCATABLE, DIMENSION(:,:) :: zwork,zwork2
80 REAL,ALLOCATABLE, DIMENSION(:) :: zsea
81  CHARACTER(LEN=200) :: ymfile ! Name of the SST file
82  CHARACTER(LEN=6) :: yprogram2 = 'FA '
83 REAL, DIMENSION(SIZE(PSST)) :: zsst
84 REAL :: zfmax, zfmin, zfmean
85 INTEGER :: iresp,istat
86 INTEGER :: ji,jj,icpt
87 REAL(KIND=JPRB) :: zhook_handle
88 
89 IF (lhook) CALL dr_hook('ASSIM_SET_SST',0,zhook_handle)
90 
91 IF (htest/='OK') THEN
92  CALL abor1_sfx('ASSIM_SET_SST: FATAL ERROR DURING ARGUMENT TRANSFER')
93 END IF
94 !
95 IF (u%CSEA=="NONE" .OR. u%NDIM_SEA == 0) THEN
96  IF (lhook) CALL dr_hook('ASSIM_SET_SST_N',1,zhook_handle)
97  RETURN
98 ENDIF
99 !
100 psic(:) = 0.
101 !
102 IF ( lread_sst_from_file ) THEN
103  !
104  IF ( trim(cfile_format_sst) == "ASCII" ) THEN
105  !
106  ALLOCATE(zsea(u%NDIM_FULL))
107  ALLOCATE(zwork(u%NDIM_FULL,2))
108  ALLOCATE(zwork2(u%NSIZE_FULL,2))
109  !
110  IF (nproc>1) CALL gather_and_write_mpi(u%XSEA,zsea)
111  !
112  IF (nrank==npio) THEN
113  ymfile = 'SST_SIC'
114  IF (nprintlev > 0 .AND. nrank==npio ) &
115  WRITE(*,*) "READING SST/SIC from file "//trim(ymfile)//".DAT for ",&
116  u%NDIM_SEA," sea points",u%NDIM_FULL
117  istat = 0
118  OPEN(unit=55,file=trim(ymfile)//".DAT",form='FORMATTED',status='OLD',iostat=istat)
119  IF ( istat /= 0 ) CALL abor1_sfx("Can not open "//trim(ymfile))
120 
121  zwork(:,:) = xundef
122  ! Read SST/SIC values
123  DO ji = 1,u%NDIM_FULL
124  IF ( zsea(ji) > 0. ) THEN
125  READ (55,*,iostat=istat) (zwork(ji,jj),jj=1,2)
126  IF ( istat /= 0 ) CALL abor1_sfx("Error reading file "//trim(ymfile))
127  ENDIF
128  ENDDO
129  CLOSE(55)
130  ENDIF
131 
132  ! Distribute ZWORK to all processors
133  IF (nproc>1) THEN
134  CALL read_and_send_mpi(zwork(:,1),zwork2(:,1))
135  CALL read_and_send_mpi(zwork(:,2),zwork2(:,2))
136  ELSE
137  zwork2=zwork
138  ENDIF
139 
140  ! Set SST/SIC variables
141  DO ji = 1,u%NSIZE_FULL
142  psst(ji)=zwork2(ji,1)
143  psic(ji)=zwork2(ji,2)
144  ENDDO
145 
146  DEALLOCATE(zwork)
147  DEALLOCATE(zwork2)
148  DEALLOCATE(zsea)
149 
150  ELSEIF ( trim(cfile_format_sst) == "FA" ) THEN
151  !
152  ! Read SST from boundaries when SST analysis NOT is performed in CANARI
153  !
154  ! Define FA file name for SST analysis interpolated from boundary file
155  !
156 #ifdef SFX_FA
157  cfilein_fa = 'SST_SIC' ! input SST and SIC analysis
158  cdnomc = 'CADRE SST' ! new frame name
159  IF (nrank==npio .AND. nprintlev>0) WRITE(*,*) 'READING SST FROM ',trim(cfilein_fa)
160 #endif
161  !
162  ! Open FA file
163  !
164  CALL init_io_surf_n(dtco, dgu, u, &
165  yprogram2,'EXTZON','SURF ','READ ')
166  !
167  ! Read SST_SIC
168  !
169  IF ( lecsst ) THEN
170  ! SST field interpolated from ECMWF SST ANALYSIS to model domain
171  CALL read_surf(&
172  yprogram2,'SURFSEA.TEMPERA',psst,iresp)
173  ELSE
174  ! Surface temperature from boundary in SST_SIC
175  CALL read_surf(&
176  yprogram2,'SURFTEMPERATURE',psst,iresp)
177  ENDIF
178  !
179  ! Close SST_SIC file
180  !
181  CALL end_io_surf_n(yprogram2)
182  CALL io_buff_clean
183  IF (nrank==npio) WRITE(*,*) 'READ SST_SIC OK'
184 
185  zfmin = minval(psst)
186  zfmax = maxval(psst)
187  IF ( ki > 0 ) THEN
188  zfmean = sum(psst)/float(ki)
189  ELSE
190  zfmean=xundef
191  ENDIF
192 
193  IF ( lecsst ) THEN
194 
195  IF (nrank==npio .AND. nprintlev>0) THEN
196  WRITE(*,*) ' ECMWF_SST_SIC'
197  WRITE(*,'(" SURFSEA.TEMPERA - min, mean, max: ",3E13.4)') zfmin, zfmean, zfmax
198  ENDIF
199 
200  ! Replace -9999. with UNDEF
201  WHERE ( psst(:)< 0. )
202  psst(:) = xundef
203  ENDWHERE
204 
205  ELSE
206 
207  IF (nrank==npio .AND. nprintlev>0) THEN
208  WRITE(*,*) ' Boundary file'
209  WRITE(*,'(" SURFTEMPERATURE - min, mean, max: ",3E13.4)') zfmin, zfmean, zfmax
210  ENDIF
211  ! To avoid surface temperatures influenced by land, NATURE points are replaced with UNDEF
212  WHERE ( pitm(:)>0.5 )
213  psst(:) = xundef
214  ENDWHERE
215 
216  ENDIF
217 
218  zfmin = minval(psst)
219  zfmax = maxval(psst)
220  IF ( ki > 0 ) THEN
221  zfmean = sum(psst)/float(ki)
222  ELSE
223  zfmean=xundef
224  ENDIF
225 
226  IF (nrank==npio .AND. nprintlev>0) THEN
227  WRITE(*,*) ' Replaced land by UNDEF '
228  WRITE(*,'(" SST - min, mean, max: ",3E13.4)') zfmin, zfmean, zfmax
229  ENDIF
230 
231  ELSE
232  CALL abor1_sfx("CFILE_FORMAT_SST="//trim(cfile_format_sst)//" not implemented!")
233  ENDIF
234 
235 ELSE
236  !
237  IF ( u%NSIZE_SEA>0 .AND. u%CSEA/="NONE") THEN
238  CALL unpack_same_rank(u%NR_SEA,s%XSST,zsst)
239  psst(:) = zsst(:)
240  ELSE
241  psst(:) = xundef
242  ENDIF
243  !
244 ENDIF
245 !
246 IF (lhook) CALL dr_hook('ASSIM_SET_SST',1,zhook_handle)
247 !
248 !-------------------------------------------------------------------------------------
249 !
250 END SUBROUTINE assim_set_sst
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine io_buff_clean
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine assim_set_sst(DTCO, DGU, S, U, KI, PITM, PSST, PSIC, HTEST)