source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_xios_dyn3dmem.F90 @ 5159

Last change on this file since 5159 was 5159, checked in by abarral, 7 weeks ago

Put dimensions.h and paramet.h into modules

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
14MODULE mod_xios_dyn3dmem
15
16     USE lmdz_xios
17     USE lmdz_wxios, ONLY: g_comm
18     CHARACTER(len=100), SAVE :: dyn3d_ctx_name = "LMDZDYN"
19     TYPE(xios_context), SAVE :: dyn3d_ctx_handle
20!$OMP THREADPRIVATE(dyn3d_ctx_name, dyn3d_ctx_handle)
21 
22  INTERFACE writefield_dyn_u
23     MODULE PROCEDURE writefield_dyn1d_u, writefield_dyn2d_u
24  END INTERFACE writefield_dyn_u
25
26  INTERFACE writefield_dyn_v
27     MODULE PROCEDURE writefield_dyn1d_v, writefield_dyn2d_v
28  END INTERFACE writefield_dyn_v
29
30     REAL, ALLOCATABLE, SAVE :: NewField_U(:,:,:), NewField_V(:,:,:)
31 
32
33   CONTAINS
34
35   SUBROUTINE xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an, mois, jour, heure, zdtvr)
36
37
38     USE comvert_mod, ONLY: presnivs
39     USE parallel_lmdz
40     USE lmdz_comgeom
41
42USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
43  USE lmdz_paramet
44     IMPLICIT NONE
45
46
47
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
136USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
137  USE lmdz_paramet
138     IMPLICIT NONE
139
140
141     CHARACTER(LEN=*)   :: name
142     REAL, DIMENSION(ij_begin:ij_end) :: Field
143     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
144      LOGICAL,SAVE :: debuglf=.TRUE.
145!$OMP THREADPRIVATE(debuglf)
146     
147     NewField(:,jj_begin:jj_end)=reshape(Field(ij_begin:ij_end),(/iip1,jj_nb/))
148
149!$OMP BARRIER       
150!$OMP MASTER
151     CALL xios_send_field(name, NewField)
152!$OMP END MASTER   
153 
154   END SUBROUTINE  writefield_dyn1d_u
155
156   SUBROUTINE  writefield_dyn2d_u(name,Field)
157
158     USE parallel_lmdz
159USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
160  USE lmdz_paramet
161     IMPLICIT NONE
162
163
164     CHARACTER(LEN=*)   :: name
165     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
166!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
167     INTEGER :: i,j,l, count
168
169!!!!!$OMP BARRIER
170!!!!!$OMP MASTER
171!!!!     allocate(NewField(iip1, jj_begin:jj_end, llm))
172!!!!!$OMP END MASTER
173!!!!!$OMP BARRIER
174
175
176!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
177     DO l = 1, llm
178       NewField_U(:,jj_begin:jj_end,l)=reshape(Field(ij_begin:ij_end,l),(/iip1,jj_nb/))
179     ENDDO
180!$OMP ENDDO
181!$OMP BARRIER
182
183!$OMP MASTER
184     CALL xios_send_field(name, NewField_U)
185!!!!     DEALLOCATE(NewField)
186!$OMP END MASTER   
187!$OMP BARRIER
188 
189   END SUBROUTINE  writefield_dyn2d_u
190
191   SUBROUTINE  writefield_dyn1d_v(name,Field)
192
193     USE parallel_lmdz
194USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
195  USE lmdz_paramet
196     IMPLICIT NONE
197
198
199     CHARACTER(LEN=*)   :: name
200     REAL, DIMENSION(ij_begin:ij_end) :: Field
201     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
202     INTEGER ::  jje, ije, jjn
203
204     IF (pole_sud) THEN
205       jje=jj_end-1
206       ije=ij_end-iip1
207       jjn=jj_nb-1
208     ELSE
209       jje=jj_end
210       ije=ij_end
211       jjn=jj_nb
212     ENDIF
213
214     NewField(:,jj_begin:jje)=reshape(Field(ij_begin:ije),(/iip1,jjn/))
215
216!$OMP BARRIER       
217!$OMP MASTER
218     CALL xios_send_field(name, NewField(:,jj_begin:jje))
219!$OMP END MASTER   
220 
221   END SUBROUTINE  writefield_dyn1d_v
222
223   SUBROUTINE  writefield_dyn2d_v(name,Field)
224
225     USE parallel_lmdz
226USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
227  USE lmdz_paramet
228     IMPLICIT NONE
229
230
231     CHARACTER(LEN=*)   :: name
232     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
233!!!!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
234     INTEGER :: l, jje, ije, jjn
235
236!!!!!$OMP BARRIER
237!!!!!$OMP MASTER
238!!!!     allocate(NewField(iip1,  jj_begin:jj_end,llm))
239!!!!!$OMP END MASTER
240!!!!!$OMP BARRIER
241
242     IF (pole_sud) THEN
243       jje=jj_end-1
244       ije=ij_end-iip1
245       jjn=jj_nb-1
246     ELSE
247       jje=jj_end
248       ije=ij_end
249       jjn=jj_nb
250     ENDIF
251
252
253!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
254     DO l = 1, llm
255        NewField_V(:,jj_begin:jje,l)=reshape(Field(ij_begin:ije,l),(/iip1,jjn/))
256     ENDDO
257!$OMP ENDDO
258!$OMP BARRIER       
259
260!$OMP MASTER
261     CALL xios_send_field(name, NewField_V(:,jj_begin:jje,:))
262!!!!     DEALLOCATE(NewField)
263!$OMP END MASTER   
264!$OMP BARRIER
265 
266   END SUBROUTINE  writefield_dyn2d_v
267   
268END MODULE mod_xios_dyn3dmem
269
Note: See TracBrowser for help on using the repository browser.