source: LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.f90

Last change on this file was 5272, checked in by abarral, 27 hours ago

Turn paramet.h into a module

File size: 7.8 KB
Line 
1!
2! $Id$
3!
4! This module contains the interface between the LMDZ dynamics dyn3dmem module and XIOS.
5!
6! Lists of subroutines
7!      xios_dyn3dmem_init : context / calendar / domain / axis initialisations
8!
9! Initialisation of communicator between LMDZ and XIOS is done elsewhere: wxios_init called by init_const_mpi
10!                                                                         (one of the first calls in gcm.F90)
11! L. Fairhead 11/2017
12!
13!
14
15MODULE mod_xios_dyn3dmem
16
17     USE lmdz_xios
18     USE wxios, ONLY : g_comm
19     CHARACTER(len=100), SAVE :: dyn3d_ctx_name = "LMDZDYN"
20     TYPE(xios_context), SAVE :: dyn3d_ctx_handle
21!$OMP THREADPRIVATE(dyn3d_ctx_name, dyn3d_ctx_handle)
22 
23  INTERFACE writefield_dyn_u
24     MODULE PROCEDURE writefield_dyn1d_u, writefield_dyn2d_u
25  END INTERFACE writefield_dyn_u
26
27  INTERFACE writefield_dyn_v
28     MODULE PROCEDURE writefield_dyn1d_v, writefield_dyn2d_v
29  END INTERFACE writefield_dyn_v
30
31     REAL, ALLOCATABLE, SAVE :: NewField_U(:,:,:), NewField_V(:,:,:)
32 
33
34   CONTAINS
35
36   SUBROUTINE xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an, mois, jour, heure, zdtvr)
37
38
39     USE comvert_mod, ONLY: presnivs
40     USE parallel_lmdz
41
42     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
43USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
44          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
45IMPLICIT NONE
46
47
48
49     INCLUDE 'comgeom.h'
50
51     TYPE(xios_duration) :: tstep_xios
52     TYPE(xios_date)                :: start_date
53     TYPE(xios_date)                :: time_origin
54     INTEGER :: an, mois, jour
55     REAL :: heure
56     CHARACTER (len=10) :: xios_cal_type
57     INTEGER :: anref, moisref, jourref
58     REAL :: heureref
59     REAL :: zdtvr
60     TYPE(xios_domain) :: dom_grid_U, dom_grid_V, dom_grid_T
61     REAL :: rlong(iip1), rlat(jjp1)
62     REAL :: pi
63     INTEGER :: ii, jj, jjb, jje, jjn
64
65!      WRITE(*,*)'Entree mod_xios_dyn3dmem'
66
67! 0 Initialisations
68     pi = 4. * ATAN (1.)
69! allocation of fields passed to xios
70!$OMP BARRIER
71!$OMP MASTER
72     allocate(NewField_U(iip1, jj_begin:jj_end, llm))
73     allocate(NewField_V(iip1, jj_begin:jj_end, llm))     
74!$OMP END MASTER
75!$OMP BARRIER
76
77! 1 Context initialisation
78!$OMP MASTER
79     CALL xios_context_initialize(dyn3d_ctx_name, g_comm)
80     CALL xios_get_handle(dyn3d_ctx_name, dyn3d_ctx_handle)
81     CALL xios_set_current_context(dyn3d_ctx_handle) 
82
83!     WRITE(*,*)'apres context initialisation mod_xios_dyn3dmem'
84
85! 2 calendar stuff
86
87     tstep_xios%second=zdtvr
88     CALL xios_define_calendar(type=xios_cal_type, start_date=xios_date(an, mois, jour,INT(heure),0,0), &
89            time_origin=xios_date(anref,moisref,jourref,INT(heureref),0,0), timestep=tstep_xios)
90
91!     WRITE(*,*)'apres  calendrier mod_xios_dyn3dmem'
92
93! 3 domain / grids / axis
94! Domains:
95      rlong(:) = rlonu(:) * 180. / pi
96      rlat(:) = rlatu(:) * 180. / pi
97
98      CALL xios_set_domain_attr("domain_U", ni_glo=iip1, nj_glo=jjp1,          &
99          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
100          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
101
102      jjb=jj_begin
103      jje=jj_end
104      jjn=jj_nb
105      IF (pole_sud) jjn=jjn-1
106      IF (pole_sud) jje=jje-1
107
108
109      rlong(:) = rlonv(:) * 180. / pi
110      do jj = jjb, jje
111        rlat(jj) = rlatv(jj) * 180. / pi
112      enddo
113     
114      CALL xios_set_domain_attr("domain_V", ni_glo=iip1, nj_glo=jjm,            &
115          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jjn,   &
116          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jjb:jje))
117
118
119      rlong(:) = rlonv(:) * 180. / pi
120      rlat(:) = rlatu(:) * 180. / pi
121      CALL xios_set_domain_attr("domain_T", ni_glo=iip1, nj_glo=jjp1,          &
122          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
123          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
124     
125!     WRITE(*,*)'apres  domaine mod_xios_dyn3dmem'
126! Vertical axis
127       CALL xios_set_axis_attr("presnivs",n_glo=llm,value=presnivs)
128!     WRITE(*,*)'apres  vertical axis mod_xios_dyn3dmem'
129! 4 end of context definition
130       CALL xios_close_context_definition()
131!     WRITE(*,*)'apres close context init. axis mod_xios_dyn3dmem'
132!$OMP END MASTER
133   END SUBROUTINE xios_dyn3dmem_init
134
135   SUBROUTINE  writefield_dyn1d_u(name,Field)
136
137     USE parallel_lmdz
138     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
139USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
140          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
141IMPLICIT NONE
142
143
144     CHARACTER(LEN=*)   :: name
145     REAL, DIMENSION(ij_begin:ij_end) :: Field
146     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
147      LOGICAL,SAVE :: debuglf=.true.
148!$OMP THREADPRIVATE(debuglf)
149     
150     NewField(:,jj_begin:jj_end)=reshape(Field(ij_begin:ij_end),(/iip1,jj_nb/))
151
152!$OMP BARRIER       
153!$OMP MASTER
154     CALL xios_send_field(name, NewField)
155!$OMP END MASTER   
156 
157   END SUBROUTINE  writefield_dyn1d_u
158
159   SUBROUTINE  writefield_dyn2d_u(name,Field)
160
161     USE parallel_lmdz
162     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
163USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
164          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
165IMPLICIT NONE
166
167
168     CHARACTER(LEN=*)   :: name
169     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
170!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
171     INTEGER :: i,j,l, count
172
173!!!!!$OMP BARRIER
174!!!!!$OMP MASTER
175!!!!     allocate(NewField(iip1, jj_begin:jj_end, llm))
176!!!!!$OMP END MASTER
177!!!!!$OMP BARRIER
178
179
180!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
181     DO l = 1, llm
182       NewField_U(:,jj_begin:jj_end,l)=reshape(Field(ij_begin:ij_end,l),(/iip1,jj_nb/))
183     ENDDO
184!$OMP ENDDO
185!$OMP BARRIER
186
187!$OMP MASTER
188     CALL xios_send_field(name, NewField_U)
189!!!!     DEALLOCATE(NewField)
190!$OMP END MASTER   
191!$OMP BARRIER
192 
193   END SUBROUTINE  writefield_dyn2d_u
194
195   SUBROUTINE  writefield_dyn1d_v(name,Field)
196
197     USE parallel_lmdz
198     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
199USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
200          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
201IMPLICIT NONE
202
203
204     CHARACTER(LEN=*)   :: name
205     REAL, DIMENSION(ij_begin:ij_end) :: Field
206     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
207     INTEGER ::  jje, ije, jjn
208
209     IF (pole_sud) THEN
210       jje=jj_end-1
211       ije=ij_end-iip1
212       jjn=jj_nb-1
213     ELSE
214       jje=jj_end
215       ije=ij_end
216       jjn=jj_nb
217     ENDIF
218
219     NewField(:,jj_begin:jje)=reshape(Field(ij_begin:ije),(/iip1,jjn/))
220
221!$OMP BARRIER       
222!$OMP MASTER
223     CALL xios_send_field(name, NewField(:,jj_begin:jje))
224!$OMP END MASTER   
225 
226   END SUBROUTINE  writefield_dyn1d_v
227
228   SUBROUTINE  writefield_dyn2d_v(name,Field)
229
230     USE parallel_lmdz
231     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
232USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
233          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
234IMPLICIT NONE
235
236
237     CHARACTER(LEN=*)   :: name
238     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
239!!!!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
240     INTEGER :: l, jje, ije, jjn
241
242!!!!!$OMP BARRIER
243!!!!!$OMP MASTER
244!!!!     allocate(NewField(iip1,  jj_begin:jj_end,llm))
245!!!!!$OMP END MASTER
246!!!!!$OMP BARRIER
247
248     IF (pole_sud) THEN
249       jje=jj_end-1
250       ije=ij_end-iip1
251       jjn=jj_nb-1
252     ELSE
253       jje=jj_end
254       ije=ij_end
255       jjn=jj_nb
256     ENDIF
257
258
259!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
260     DO l = 1, llm
261        NewField_V(:,jj_begin:jje,l)=reshape(Field(ij_begin:ije,l),(/iip1,jjn/))
262     ENDDO
263!$OMP ENDDO
264!$OMP BARRIER       
265
266!$OMP MASTER
267     CALL xios_send_field(name, NewField_V(:,jj_begin:jje,:))
268!!!!     DEALLOCATE(NewField)
269!$OMP END MASTER   
270!$OMP BARRIER
271 
272   END SUBROUTINE  writefield_dyn2d_v
273   
274END MODULE mod_xios_dyn3dmem
275
Note: See TracBrowser for help on using the repository browser.