SURFEX v8.1
General documentation of Surfex
prep_hor_ocean_field.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 prep_hor_ocean_field (DTCO, UG, U, GCP, O, OR, KLAT, HPROGRAM, &
7  HFILE,HFILETYPE,KLUOUT,OUNIF, &
8  HSURF,HNCVARNAME )
9 ! #######################################################
10 !
11 !!**** *PREP_HOR_OCEAN_FIELD* -reads, interpolates and prepares oceanic fields
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! C. Lebeaupin Brossier
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 01/2008
30 !! Modified 07/2012, P. Le Moigne : CMO1D phasing
31 !!------------------------------------------------------------------
32 !
33 !
35 !
38 USE modd_surf_atm_n, ONLY : surf_atm_t
39 !
40 USE modd_ocean_n, ONLY : ocean_t
41 USE modd_ocean_rel_n, ONLY : ocean_rel_t
42 !
43 USE modd_csts, ONLY : xtt
44 USE modd_surf_par, ONLY : xundef
47 !
48 USE modi_prep_ocean_unif
49 USE modi_prep_ocean_netcdf
50 USE modi_prep_ocean_ascllv
51 !
52 USE modi_hor_interpol
53 !
54 USE yomhook ,ONLY : lhook, dr_hook
55 USE parkind1 ,ONLY : jprb
56 !
57 USE modi_abor1_sfx
58 IMPLICIT NONE
59 !
60 !* 0.1 declarations of arguments
61 !
62 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
63 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
64 TYPE(surf_atm_t), INTENT(INOUT) :: U
65 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
66 !
67 TYPE(ocean_t), INTENT(INOUT) :: O
68 TYPE(ocean_rel_t), INTENT(INOUT) :: OR
69 INTEGER, INTENT(IN) :: KLAT
70 !
71  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
72  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! file name
73  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! file type
74 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
75 LOGICAL, INTENT(IN) :: OUNIF ! flag for prescribed uniform field
76  CHARACTER(LEN=7) :: HSURF ! type of field
77  CHARACTER(LEN=28), INTENT(IN), OPTIONAL :: HNCVARNAME!var to read
78 !
79 !
80 !* 0.2 declarations of local variables
81 !
82 REAL, POINTER, DIMENSION(:,:,:) ::ZFIELDIN=>null()!field to interpolate horizontally
83 REAL, POINTER, DIMENSION(:,:) ::ZFIELD=>null() !field to interpolate horizontally
84 REAL, ALLOCATABLE, DIMENSION(:,:,:)::ZFIELDOUT!field interpolated horizontally
85 !
86 INTEGER :: JLEV ! loop on oceanic vertical level
87 INTEGER :: IK1
88 REAL(KIND=JPRB) :: ZHOOK_HANDLE
89 !----------------------------------------------------------------------------
90 !* 1. Does the field exist?
91 !
92 !* 2. Reading of input configuration (Grid and interpolation type)
93 !
94 IF (lhook) CALL dr_hook('PREP_HOR_OCEAN_FIELD',0,zhook_handle)
95 !
96 IF (ounif) THEN
97  WRITE(kluout,*) '*****warning*****: you ask for uniform oceanic variables'
98  CALL prep_ocean_unif(kluout,hsurf,zfieldin)
99 ELSE IF (hfiletype=='NETCDF') THEN
100  CALL prep_ocean_netcdf(hprogram,hsurf,hfile,hfiletype,kluout,hncvarname,zfieldin)
101 ELSE IF (hfiletype=='ASCII') THEN
102  WRITE(kluout,*) 'PERSONAL LIB TEST FOR READING ',hfiletype,'file type'
103  WRITE(kluout,*) 'ASCII FILE MUST CONTAIN LAT,LON,DEPTH,T,S,U,V'
104  CALL prep_ocean_ascllv(dtco, ug, u, hprogram,hsurf,hfile,kluout,zfieldin)
105 ELSE
106  CALL abor1_sfx('PREP_OCEAN_HOR_FIELD: data file type not supported : '//hfiletype)
107 END IF
108 !
109 !-------------------------------------------------------------------------------
110 !
111 !* 3. Horizontal interpolation
112 !
113 ALLOCATE(zfieldout(klat,SIZE(zfieldin,2),SIZE(zfieldin,3)) )
114 ALLOCATE(zfield(SIZE(zfieldin,1),SIZE(zfieldin,3)))
115 !
116 DO jlev=1,SIZE(zfieldin,2)
117  zfield(:,:)=zfieldin(:,jlev,:)
118  CALL hor_interpol(dtco, u, gcp, kluout,zfield,zfieldout(:,jlev,:))
119 ENDDO
120 !
121 !* 5. Return to historical variable
122 !
123 ik1=nockmin+1
124 SELECT CASE (hsurf)
125  CASE('TEMP_OC')
126  ALLOCATE(o%XSEAT(SIZE(zfieldout,1),nockmin:nockmax))
127  ALLOCATE(or%XSEAT_REL(SIZE(zfieldout,1),nockmin:nockmax))
128  DO jlev=ik1,nockmax
129  o%XSEAT(:,jlev) = zfieldout(:,jlev,1)
130  !prevoir interpolation sur la grille verticale si niveau diffĂ©rents
131  ENDDO
132  o%XSEAT(:,nockmin)=o%XSEAT(:,ik1)
133  !
134  ! Relaxation Profile = initial profile for the steady regime
135  ! Change it for seasonal cycle!!
136  or%XSEAT_REL(:,:) = o%XSEAT(:,:)
137  !
138  CASE('SALT_OC')
139  ALLOCATE(o%XSEAS(SIZE(zfieldout,1),nockmin:nockmax))
140  ALLOCATE(or%XSEAS_REL(SIZE(zfieldout,1),nockmin:nockmax))
141  DO jlev=ik1,nockmax
142  o%XSEAS(:,jlev) = zfieldout(:,jlev,1)
143  ENDDO
144  o%XSEAS(:,nockmin)=o%XSEAS(:,ik1)
145  !
146  ! Relaxation Profile = initial profile for the steady regime
147  ! Change it for seasonal cycle!!
148  or%XSEAS_REL(:,:) = o%XSEAS(:,:)
149  !
150  CASE('UCUR_OC')
151  ALLOCATE(o%XSEAU(SIZE(zfieldout,1),nockmin:nockmax))
152  ALLOCATE(or%XSEAU_REL(SIZE(zfieldout,1),nockmin:nockmax))
153  DO jlev=ik1,nockmax
154  o%XSEAU(:,jlev) = zfieldout(:,jlev,1)
155  ENDDO
156  o%XSEAU(:,nockmin)=o%XSEAU(:,ik1)
157  !
158  IF (.NOT.o%LCURRENT) o%XSEAU(:,:)=0.
159  !
160  or%XSEAU_REL(:,:) = o%XSEAU(:,:)
161  !
162  CASE('VCUR_OC')
163  ALLOCATE(o%XSEAV(SIZE(zfieldout,1),nockmin:nockmax))
164  ALLOCATE(or%XSEAV_REL(SIZE(zfieldout,1),nockmin:nockmax))
165  DO jlev=ik1,nockmax
166  o%XSEAV(:,jlev) = zfieldout(:,jlev,1)
167  ENDDO
168  o%XSEAV(:,nockmin)=o%XSEAV(:,ik1)
169  !
170  IF (.NOT.o%LCURRENT) o%XSEAV(:,:)=0.
171  !
172  or%XSEAV_REL(:,:) = o%XSEAV(:,:)
173  !
174 END SELECT
175 !
176 !------------------------------------------------------------------------------
177 !
178 !* 6. Deallocations
179 !
180 DEALLOCATE(zfield )
181 DEALLOCATE(zfieldout)
182 IF (lhook) CALL dr_hook('PREP_HOR_OCEAN_FIELD',1,zhook_handle)
183 !
184 END SUBROUTINE prep_hor_ocean_field
character(len=10) cingrid_type
Definition: modd_prep.F90:39
subroutine prep_ocean_netcdf(HPROGRAM, HSURF, HFILE, HFILETYPE, KLUOUT, HNCVARNAME, PFIELD)
subroutine prep_ocean_unif(KLUOUT, HSURF, PFIELD)
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine prep_ocean_ascllv(DTCO, UG, U, HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
subroutine prep_hor_ocean_field(DTCO, UG, U, GCP, O, OR, KLAT, HPROGRAM, HFILE, HFILETYPE, KLUOUT, OUNIF, HSURF, HNCVARNAME)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
integer, save nockmax
real, save xtt
Definition: modd_csts.F90:66
integer, save nockmin