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

Last change on this file since 5271 was 5271, checked in by abarral, 26 hours ago

Move dimensions.h into a module
Nb: doesn't compile yet

File size: 7.2 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
43IMPLICIT NONE
44
45
46     INCLUDE "paramet.h"
47     INCLUDE 'comgeom.h'
48
49     TYPE(xios_duration) :: tstep_xios
50     TYPE(xios_date)                :: start_date
51     TYPE(xios_date)                :: time_origin
52     INTEGER :: an, mois, jour
53     REAL :: heure
54     CHARACTER (len=10) :: xios_cal_type
55     INTEGER :: anref, moisref, jourref
56     REAL :: heureref
57     REAL :: zdtvr
58     TYPE(xios_domain) :: dom_grid_U, dom_grid_V, dom_grid_T
59     REAL :: rlong(iip1), rlat(jjp1)
60     REAL :: pi
61     INTEGER :: ii, jj, jjb, jje, jjn
62
63!      WRITE(*,*)'Entree mod_xios_dyn3dmem'
64
65! 0 Initialisations
66     pi = 4. * ATAN (1.)
67! allocation of fields passed to xios
68!$OMP BARRIER
69!$OMP MASTER
70     allocate(NewField_U(iip1, jj_begin:jj_end, llm))
71     allocate(NewField_V(iip1, jj_begin:jj_end, llm))     
72!$OMP END MASTER
73!$OMP BARRIER
74
75! 1 Context initialisation
76!$OMP MASTER
77     CALL xios_context_initialize(dyn3d_ctx_name, g_comm)
78     CALL xios_get_handle(dyn3d_ctx_name, dyn3d_ctx_handle)
79     CALL xios_set_current_context(dyn3d_ctx_handle) 
80
81!     WRITE(*,*)'apres context initialisation mod_xios_dyn3dmem'
82
83! 2 calendar stuff
84
85     tstep_xios%second=zdtvr
86     CALL xios_define_calendar(type=xios_cal_type, start_date=xios_date(an, mois, jour,INT(heure),0,0), &
87            time_origin=xios_date(anref,moisref,jourref,INT(heureref),0,0), timestep=tstep_xios)
88
89!     WRITE(*,*)'apres  calendrier mod_xios_dyn3dmem'
90
91! 3 domain / grids / axis
92! Domains:
93      rlong(:) = rlonu(:) * 180. / pi
94      rlat(:) = rlatu(:) * 180. / pi
95
96      CALL xios_set_domain_attr("domain_U", ni_glo=iip1, nj_glo=jjp1,          &
97          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
98          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
99
100      jjb=jj_begin
101      jje=jj_end
102      jjn=jj_nb
103      IF (pole_sud) jjn=jjn-1
104      IF (pole_sud) jje=jje-1
105
106
107      rlong(:) = rlonv(:) * 180. / pi
108      do jj = jjb, jje
109        rlat(jj) = rlatv(jj) * 180. / pi
110      enddo
111     
112      CALL xios_set_domain_attr("domain_V", ni_glo=iip1, nj_glo=jjm,            &
113          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jjn,   &
114          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jjb:jje))
115
116
117      rlong(:) = rlonv(:) * 180. / pi
118      rlat(:) = rlatu(:) * 180. / pi
119      CALL xios_set_domain_attr("domain_T", ni_glo=iip1, nj_glo=jjp1,          &
120          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
121          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
122     
123!     WRITE(*,*)'apres  domaine mod_xios_dyn3dmem'
124! Vertical axis
125       CALL xios_set_axis_attr("presnivs",n_glo=llm,value=presnivs)
126!     WRITE(*,*)'apres  vertical axis mod_xios_dyn3dmem'
127! 4 end of context definition
128       CALL xios_close_context_definition()
129!     WRITE(*,*)'apres close context init. axis mod_xios_dyn3dmem'
130!$OMP END MASTER
131   END SUBROUTINE xios_dyn3dmem_init
132
133   SUBROUTINE  writefield_dyn1d_u(name,Field)
134
135     USE parallel_lmdz
136     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
137IMPLICIT NONE
138
139     include 'paramet.h'
140     CHARACTER(LEN=*)   :: name
141     REAL, DIMENSION(ij_begin:ij_end) :: Field
142     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
143      LOGICAL,SAVE :: debuglf=.true.
144!$OMP THREADPRIVATE(debuglf)
145     
146     NewField(:,jj_begin:jj_end)=reshape(Field(ij_begin:ij_end),(/iip1,jj_nb/))
147
148!$OMP BARRIER       
149!$OMP MASTER
150     CALL xios_send_field(name, NewField)
151!$OMP END MASTER   
152 
153   END SUBROUTINE  writefield_dyn1d_u
154
155   SUBROUTINE  writefield_dyn2d_u(name,Field)
156
157     USE parallel_lmdz
158     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
159IMPLICIT NONE
160
161     include 'paramet.h'
162     CHARACTER(LEN=*)   :: name
163     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
164!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
165     INTEGER :: i,j,l, count
166
167!!!!!$OMP BARRIER
168!!!!!$OMP MASTER
169!!!!     allocate(NewField(iip1, jj_begin:jj_end, llm))
170!!!!!$OMP END MASTER
171!!!!!$OMP BARRIER
172
173
174!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
175     DO l = 1, llm
176       NewField_U(:,jj_begin:jj_end,l)=reshape(Field(ij_begin:ij_end,l),(/iip1,jj_nb/))
177     ENDDO
178!$OMP ENDDO
179!$OMP BARRIER
180
181!$OMP MASTER
182     CALL xios_send_field(name, NewField_U)
183!!!!     DEALLOCATE(NewField)
184!$OMP END MASTER   
185!$OMP BARRIER
186 
187   END SUBROUTINE  writefield_dyn2d_u
188
189   SUBROUTINE  writefield_dyn1d_v(name,Field)
190
191     USE parallel_lmdz
192     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
193IMPLICIT NONE
194
195     include 'paramet.h'
196     CHARACTER(LEN=*)   :: name
197     REAL, DIMENSION(ij_begin:ij_end) :: Field
198     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
199     INTEGER ::  jje, ije, jjn
200
201     IF (pole_sud) THEN
202       jje=jj_end-1
203       ije=ij_end-iip1
204       jjn=jj_nb-1
205     ELSE
206       jje=jj_end
207       ije=ij_end
208       jjn=jj_nb
209     ENDIF
210
211     NewField(:,jj_begin:jje)=reshape(Field(ij_begin:ije),(/iip1,jjn/))
212
213!$OMP BARRIER       
214!$OMP MASTER
215     CALL xios_send_field(name, NewField(:,jj_begin:jje))
216!$OMP END MASTER   
217 
218   END SUBROUTINE  writefield_dyn1d_v
219
220   SUBROUTINE  writefield_dyn2d_v(name,Field)
221
222     USE parallel_lmdz
223     USE dimensions_mod, ONLY: iim, jjm, llm, ndm
224IMPLICIT NONE
225
226     include 'paramet.h'
227     CHARACTER(LEN=*)   :: name
228     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
229!!!!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
230     INTEGER :: l, jje, ije, jjn
231
232!!!!!$OMP BARRIER
233!!!!!$OMP MASTER
234!!!!     allocate(NewField(iip1,  jj_begin:jj_end,llm))
235!!!!!$OMP END MASTER
236!!!!!$OMP BARRIER
237
238     IF (pole_sud) THEN
239       jje=jj_end-1
240       ije=ij_end-iip1
241       jjn=jj_nb-1
242     ELSE
243       jje=jj_end
244       ije=ij_end
245       jjn=jj_nb
246     ENDIF
247
248
249!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
250     DO l = 1, llm
251        NewField_V(:,jj_begin:jje,l)=reshape(Field(ij_begin:ije,l),(/iip1,jjn/))
252     ENDDO
253!$OMP ENDDO
254!$OMP BARRIER       
255
256!$OMP MASTER
257     CALL xios_send_field(name, NewField_V(:,jj_begin:jje,:))
258!!!!     DEALLOCATE(NewField)
259!$OMP END MASTER   
260!$OMP BARRIER
261 
262   END SUBROUTINE  writefield_dyn2d_v
263   
264END MODULE mod_xios_dyn3dmem
265
Note: See TracBrowser for help on using the repository browser.