SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
assim_sean.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_sea_n (S, U, &
7  hprogram,ki,pts_in,psst_in,psic_in,pitm,htest, &
8  olkeepextzone,od_maskext,plon_in,plat_in)
9 
10 ! ###############################################################################
11 !
12 !!**** *ASSIM_SEA_n * - Chooses the surface assimilation schemes for SEA tile
13 !!
14 !! PURPOSE
15 !! -------
16 !!
17 !!** METHOD
18 !! ------
19 !!
20 !! REFERENCE
21 !! ---------
22 !!
23 !!
24 !! AUTHOR
25 !! ------
26 !! T. Aspelien
27 !!
28 !! MODIFICATIONS
29 !! -------------
30 !! Original 04/2012
31 !! Trygve Aspelien, Separating IO 06/2013
32 !!--------------------------------------------------------------------
33 !
34 !
35 USE modd_seaflux_n, ONLY : seaflux_t
36 USE modd_surf_atm_n, ONLY : surf_atm_t
37 !
38 USE modd_surfex_mpi, ONLY : nrank, npio
39 !
40 USE modd_surf_par, ONLY : xundef
41 USE modd_assim, ONLY : nprintlev,laesst,lextrap_sea
42 !
43 !
44 USE yomhook, ONLY : lhook,dr_hook
45 USE parkind1, ONLY : jprb
46 !
47 USE modi_abor1_sfx
49 USE modi_oi_hor_extrapol_surf
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 declarations of arguments
54 !
55 !
56 TYPE(seaflux_t), INTENT(INOUT) :: s
57 TYPE(surf_atm_t), INTENT(INOUT) :: u
58 !
59  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
60 INTEGER, INTENT(IN) :: ki
61 REAL,DIMENSION(KI), INTENT(IN) :: pts_in
62 REAL,DIMENSION(KI), INTENT(IN) :: psst_in
63 REAL,DIMENSION(KI), INTENT(IN) :: psic_in
64 REAL,DIMENSION(KI), INTENT(IN) :: pitm
65  CHARACTER(LEN=2), INTENT(IN) :: htest ! must be equal to 'OK'
66 LOGICAL, INTENT(IN) :: olkeepextzone
67 LOGICAL, DIMENSION(KI), INTENT(IN) :: od_maskext
68 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plon_in
69 REAL(KIND=JPRB), DIMENSION (:), INTENT(IN) :: plat_in
70 !
71 !* 0.2 declarations of local variables
72 !
73 !-------------------------------------------------------------------------------------
74 !
75 REAL, DIMENSION(KI) :: zalt
76 REAL, DIMENSION(KI) :: zsst
77 REAL, DIMENSION(KI) :: zsst0
78 REAL, DIMENSION(KI) :: zsstinc
79 REAL, DIMENSION(:), ALLOCATABLE :: zsst01, zsst1, zlon1, zlat1, zalt1
80 REAL :: zfmax, zfmin, zfmean
81 LOGICAL, DIMENSION(KI) :: ginterp_sst
82 LOGICAL, DIMENSION(:), ALLOCATABLE :: ginterp_sst1
83 INTEGER :: iresp, i, j, j1, is1
84 REAL(KIND=JPRB) :: zhook_handle
85 
86 IF (lhook) CALL dr_hook('ASSIM_SEA_N',0,zhook_handle)
87 !
88 IF (htest/='OK') THEN
89  CALL abor1_sfx('ASSIM_SEA_n: FATAL ERROR DURING ARGUMENT TRANSFER')
90 END IF
91 !
92 IF (nrank==npio) WRITE(*,*) 'UPDATING SST FOR SCHEME: ',trim(u%CSEA)
93 IF (u%CSEA=="NONE") THEN
94  IF (lhook) CALL dr_hook('ASSIM_SEA_N',1,zhook_handle)
95  RETURN
96 ENDIF
97 !
98  CALL pack_same_rank(u%NR_SEA,u%XZS,zalt)
99 !
100 ! Read SST from file or set it to input SST
101 IF ( .NOT.laesst ) THEN
102  ! Set SST to input
103  zsst(:) = psst_in(:)
104  !
105 ELSE
106  ! SST analysed in CANARI
107  zsst(:) = xundef
108  DO i=1,ki
109  IF (pitm(i)<0.5 .AND. u%XSEA(u%NR_SEA(i))/=0. ) THEN
110  zsst(i) = pts_in(i) ! set SST analysis from CANARI
111  ENDIF
112  END DO
113  !
114  zfmin = minval(zsst)
115  zfmax = maxval(zsst)
116  zfmean = sum(zsst)/float(ki)
117  WRITE(*,*) ' SST analysis from CANARI '
118  WRITE(*,'(" ZSST - min, mean, max: ",3E13.4)') zfmin, zfmean, zfmax
119 ENDIF
120 !* PSST updated at all sea points with ZSST where ZSST is available
121 ginterp_sst(:) = .false.
122 ! Set SST from watfluxn
123 DO i=1,ki
124  !
125  IF ( zsst(i)/=xundef ) THEN
126  zsst0(i) = zsst(i)
127  ELSEIF ( lextrap_sea ) THEN
128  zsst0(i) = xundef
129  ginterp_sst(i) = .true.
130  ELSE
131  zsst0(i) = s%XSST(i)
132  ENDIF
133  !
134 ENDDO
135 !
136 IF ( lextrap_sea ) THEN
137  !
138  IF (olkeepextzone) THEN
139  !
140  zsst(:) = zsst0(:)
141  WHERE ( od_maskext(:) ) zsst0(:) = xundef
142  CALL oi_hor_extrapol_surf(ki,plat_in,plon_in,zsst0,plat_in,plon_in,zsst,ginterp_sst,zalt)
143  !
144  ELSE
145  !
146  is1 = count(.NOT. od_maskext)
147  ALLOCATE (zsst1(is1), zsst01(is1), zlat1(is1), zlon1(is1), zalt1(is1), ginterp_sst1(is1))
148  !
149  ! remove extension zone
150  j = 1
151  DO j1 = 1, ki
152  IF (.NOT. od_maskext(j1)) THEN
153  zsst01(j) = zsst0(j1)
154  zlat1(j) = plat_in(j1)
155  zlon1(j) = plon_in(j1)
156  zalt1(j) = u%XZS (j1)
157  ginterp_sst1(j) = ginterp_sst(j1)
158  j = j + 1
159  ENDIF
160  ENDDO
161 
162  zsst1(:) = zsst01(:)
163  CALL oi_hor_extrapol_surf(is1,zlat1,zlon1,zsst01,zlat1,zlon1,zsst1,ginterp_sst1,zalt1)
164 
165  ! copy back
166  j = 1
167  DO j1 = 1, ki
168  IF (.NOT. od_maskext(j1)) THEN
169  zsst(j1) = zsst1(j)
170  j = j + 1
171  ENDIF
172  ENDDO
173  !
174  DEALLOCATE (zsst01, zsst1, zlat1, zlon1, zalt1, ginterp_sst1)
175  !
176  ENDIF
177  !
178 ENDIF
179 !
180 !* Print values produced by OI_HO_EXTRAPOL_SURF
181 IF ( nprintlev > 2 ) THEN
182  DO i=1,ki
183  IF (ginterp_sst(i)) THEN
184  print *,'Sea surface temperature set to ',zsst(i),'from nearest neighbour at I=',u%NR_SEA(i)
185  ENDIF
186  ENDDO
187 ENDIF
188 !
189 ! Sum the increments
190 zsstinc(:) = zsst(:) - s%XSST(:)
191 IF (ki>0) WRITE(*,*) 'Mean SST increments over SEA ',sum(zsstinc)/ki
192 !
193 ! Setting modified variables
194 s%XSST(:) = zsst(:)
195 !
196 IF (lhook) CALL dr_hook('ASSIM_SEA_N',1,zhook_handle)
197 !
198 !-------------------------------------------------------------------------------------
199 !
200 END SUBROUTINE assim_sea_n
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine oi_hor_extrapol_surf(NDIM, PLAT_IN, PLON_IN, PFIELD_IN, PLAT, PLON, PFIELD, OINTERP, PZS, NDIM2)
subroutine assim_sea_n(S, U, HPROGRAM, KI, PTS_IN, PSST_IN, PSIC_IN, PITM, HTEST, OLKEEPEXTZONE, OD_MASKEXT, PLON_IN, PLAT_IN)
Definition: assim_sean.F90:6