SURFEX v8.1
General documentation of Surfex
interpol_sst_mth.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 interpol_sst_mth (S,HFLAG)
7 ! #######################################################
8 !
9 !!**** *INTERPOL_SST_MTH* - Interpolation of monthly SST, SSS, SIT or SIC
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 ! B.Decharme Meteo-France
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 28/01/10
36 !! Modified 02/2014 S. Senesi : allow to work on SSS, SIT and SIC fields
37 !! Modified 07/2015 B. Decharme : new linear interpolation
38 !-------------------------------------------------------------------------------
39 !
40 !* 0. DECLARATIONS
41 ! ------------
42 !
43 USE modd_seaflux_n, ONLY : seaflux_t
44 !
45 USE modi_abor1_sfx
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 IMPLICIT NONE
51 !
52 !* 0.1 Declaration of arguments
53 !------------------------
54 !
55 !
56 TYPE(seaflux_t), INTENT(INOUT) :: S
57 !
58  CHARACTER(LEN=1), INTENT(IN) :: HFLAG ! 'T' for SST, 'S' for SSS, 'H' for SIT, 'C' for SIC
59 
60 !
61 !* 0.2 Declaration of local variables
62 ! ------------------------------
63 !
64 REAL :: ZDAT ! current day in the current month
65 REAL :: ZNDAT ! number of days in the current month
66 INTEGER :: IMTH0 ! previous month
67 INTEGER :: IMTH1 ! current month
68 INTEGER :: IMTH2 ! next month
69 INTEGER :: INDAYS ! number of days in KMONTH
70 !
71 INTEGER :: IDELTA
72 !
73 REAL(KIND=JPRB) :: ZHOOK_HANDLE
74 !-------------------------------------------------------------------------------
75 !
76 !* 1. Number of days in a month
77 ! -------------------------
78 !
79 IF (lhook) CALL dr_hook('INTERPOL_SST_MTH',0,zhook_handle)
80 IF ( (hflag/='S') .AND. (hflag/='T') .AND. (hflag/='H') .AND. (hflag/='C') )THEN
81  CALL abor1_sfx('FATAL ERROR in INTERPOL_SST_MTH : HFLAG not S nor T nor C nor H. !')
82 ENDIF
83 SELECT CASE (s%TTIME%TDATE%MONTH)
84  CASE(4,6,9,11)
85  indays=30
86  CASE(1,3,5,7:8,10,12)
87  indays=31
88  CASE(2)
89  IF( ((mod(s%TTIME%TDATE%YEAR,4)==0).AND.(mod(s%TTIME%TDATE%YEAR,100)/=0)) &
90  .OR. (mod(s%TTIME%TDATE%YEAR,400)==0))THEN
91  indays=29
92  ELSE
93  indays=28
94  ENDIF
95 END SELECT
96 !
97 !
98 !-------------------------------------------------------------------------------
99 !
100 !* 2. SST or SSS Interpolation using previous, current and next month
101 ! --------------------------------------------------------
102 !
103 zdat = REAL(s%ttime%tdate%day)
104 zndat= REAL(indays)
105 !
106 ! The current month correspond to the indice 2 (or 3 if next month)
107 !
108 IF (s%TTIME%TDATE%MONTH==s%TZTIME%TDATE%MONTH) THEN
109  idelta=0
110 ELSE
111  idelta=1
112 END IF
113 !
114 imth0=1+idelta
115 imth1=2+idelta
116 imth2=3+idelta
117 !
118 IF (hflag =='T') THEN
119  CALL interpol_local(s%CINTERPOL_SST,s%XSST_MTH(:,imth0),s%XSST_MTH(:,imth1),s%XSST_MTH(:,imth2),s%XSST)
120 ELSEIF (hflag =='S') THEN
121  CALL interpol_local(s%CINTERPOL_SSS,s%XSSS_MTH(:,imth0),s%XSSS_MTH(:,imth1),s%XSSS_MTH(:,imth2),s%XSSS)
122  s%XSSS(:) = max(0.0,s%XSSS(:))
123 ELSEIF (hflag =='H') THEN
124  CALL interpol_local(s%CINTERPOL_SIT,s%XSIT_MTH(:,imth0),s%XSIT_MTH(:,imth1),s%XSIT_MTH(:,imth2),s%XFSIT)
125  s%XFSIT(:) = max(0.0,s%XFSIT(:))
126 ELSEIF (hflag =='C') THEN
127  CALL interpol_local(s%CINTERPOL_SIC,s%XSIC_MTH(:,imth0),s%XSIC_MTH(:,imth1),s%XSIC_MTH(:,imth2),s%XFSIC)
128  s%XFSIC(:) = max(0.0,min(1.0,s%XFSIC(:)))
129 ENDIF
130 !
131 IF (lhook) CALL dr_hook('INTERPOL_SST_MTH',1,zhook_handle)
132 !
133 !=======================================================================================
134 !
135 CONTAINS
136 !
137 !=======================================================================================
138 !
139 SUBROUTINE interpol_local(HMETHOD,PMTH0,PMTH1,PMTH2,POUT)
140 !
141 USE modi_interpol_quadra
142 USE modi_interpol_linear
143 !
144 IMPLICIT NONE
145 !
146  CHARACTER(LEN=6), INTENT(IN) :: HMETHOD
147 REAL, DIMENSION(:) , INTENT(IN) :: PMTH0
148 REAL, DIMENSION(:) , INTENT(IN) :: PMTH1
149 REAL, DIMENSION(:) , INTENT(IN) :: PMTH2
150 REAL, DIMENSION(:), INTENT(OUT) :: POUT
151 !
152 REAL(KIND=JPRB) :: ZHOOK_HANDLE
153 !
154 IF (lhook) CALL dr_hook('INTERPOL_SST_MTH:INTERPOL_LOCAL',0,zhook_handle)
155 !
156 IF(hmethod=='QUADRA')THEN
157  CALL interpol_quadra(zdat,zndat,pmth0,pmth1,pmth2,pout)
158 ELSEIF(hmethod=='LINEAR')THEN
159  CALL interpol_linear(zdat,zndat,pmth0,pmth1,pmth2,pout)
160 ELSEIF(hmethod=='UNIF')THEN
161  pout(:) = pmth1(:)
162 ELSE
163  CALL abor1_sfx('INTERPOL_SST_MTH:INTERPOL_LOCAL: interpolation method not supported')
164 ENDIF
165 !
166 IF (lhook) CALL dr_hook('INTERPOL_SST_MTH:INTERPOL_LOCAL',1,zhook_handle)
167 !
168 END SUBROUTINE interpol_local
169 !
170 !-------------------------------------------------------------------------------
171 !
172 END SUBROUTINE interpol_sst_mth
subroutine interpol_local(HMETHOD, PMTH0, PMTH1, PMTH2, POUT)
subroutine interpol_quadra(PDAT, PNDAT, PVAL0, PVAL1, PVAL2, POUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine interpol_sst_mth(S, HFLAG)
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine interpol_linear(PDAT, PNDAT, PVAL0, PVAL1, PVAL2, POUT)