source: trunk/LMDZ.VENUS/libf/phyvenus/xios_output_mod.F90 @ 1675

Last change on this file since 1675 was 1642, checked in by slebonnois, 9 years ago

SL: implementation of XIOS outputs + removal of deltatemp (chemistry) + bug correction in radlwsw

File size: 8.5 KB
Line 
1MODULE xios_output_mod
2
3 IMPLICIT NONE
4 
5 INTEGER,PRIVATE,SAVE :: time_it=0 ! store number of iterations with calls to XIOS since start
6! does not need to be threadprivate; managed by omp master
7
8 CHARACTER(LEN=*), PARAMETER :: context_id= "LMDZ" ! same as in context_lmdz_physics.xml
9 
10#ifdef CPP_XIOS
11
12 INTERFACE send_xios_field
13    MODULE PROCEDURE histwrite0d_xios,histwrite2d_xios,histwrite3d_xios
14 END INTERFACE
15 
16
17CONTAINS
18
19  SUBROUTINE initialize_xios_output(day,timeofday,dtphys,daysec,&
20                                    presnivs,pseudoalt)
21!  USE mod_phys_lmdz_para, only: gather, bcast, &
22!                                jj_nb, jj_begin, jj_end, ii_begin, ii_end, &
23!                                mpi_size, mpi_rank, klon_mpi, &
24!                                is_sequential, is_south_pole_dyn
25  USE mod_phys_lmdz_para, ONLY: jj_nb, jj_begin, jj_end, ii_begin, ii_end, &
26                                mpi_size, mpi_rank, klon_mpi, &
27                                is_sequential, is_south_pole_dyn
28  USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo
29  USE print_control_mod, ONLY: lunout, prt_level
30  USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
31  USE regular_lonlat_mod, ONLY: lon_reg, lat_reg
32  USE nrtype, ONLY: pi
33  USE wxios
34  IMPLICIT NONE
35 
36  REAL,INTENT(IN) :: day ! Number of elapsed sols since reference Ls=0.
37  REAL,INTENT(IN) :: timeofday ! "Universal time", given as fraction of sol (e.g.: 0.5 for noon).
38  REAL,INTENT(IN) :: dtphys ! physics time step (s)
39  REAL,INTENT(IN) :: daysec ! lengthof a standard day (s)
40  REAL,INTENT(IN) :: presnivs(:) ! vertical grid approximate pressure (Pa)
41  REAL,INTENT(IN) :: pseudoalt(:) ! vertical grid approximate altitude (km)
42 
43 
44  INTEGER :: data_ibegin, data_iend
45  TYPE(xios_duration) :: timestep
46  TYPE(xios_date) :: time_origin
47  TYPE(xios_date) :: start_date
48 
49!$OMP BARRIER
50!$OMP MASTER
51
52    ! 1. Declare available vertical axes to be used in output files:
53    IF (prt_level>=10) WRITE(lunout,*) "initialize_xios_output: call xios_set_axis_attr for presnivs"
54    CALL xios_set_axis_attr("presnivs", n_glo=size(presnivs), value=presnivs,&
55                            unit="Pa",positive="down")
56    IF (prt_level>=10) WRITE(lunout,*) "initialize_xios_output: call xios_set_axis_attr for altitude"
57    CALL xios_set_axis_attr("altitude", n_glo=size(pseudoalt), value=pseudoalt,&
58                            unit="km",positive="up")
59   
60    ! 2. Declare horizontal domain
61    ! Set values for the mask:
62    IF (mpi_rank == 0) THEN
63        data_ibegin = 0
64    ELSE
65        data_ibegin = ii_begin - 1
66    END IF
67
68    IF (mpi_rank == mpi_size-1) THEN
69        data_iend = nbp_lon
70    ELSE
71        data_iend = ii_end + 1
72    END IF
73
74    if (prt_level>=10) then
75      write(lunout,*) "initialize_xios_output: mpirank=",mpi_rank," iibegin=",ii_begin , " ii_end=",ii_end," jjbegin=",jj_begin," jj_nb=",jj_nb," jj_end=",jj_end
76      write(lunout,*) "initialize_xios_output: mpirank=",mpi_rank," nbp_lon=",nbp_lon," nbp_lat=",nbp_lat
77      write(lunout,*) "initialize_xios_output: mpirank=",mpi_rank," data_ibegin=",data_ibegin," data_iend=",data_iend
78      write(lunout,*) "initialize_xios_output: mpirank=",mpi_rank," data_ibegin=",data_ibegin," data_iend=",data_iend
79      write(lunout,*) "initialize_xios_output: mpirank=",mpi_rank," is_south_pole=",is_south_pole_dyn
80    endif
81
82    ! Initialize the XIOS domain corresponding to this process:
83    if (prt_level>=10) write(lunout,*) "initialize_xios_output: call wxios_domain_param"
84    CALL wxios_domain_param("dom_glo", is_sequential, nbp_lon, jj_nb, nbp_lon, nbp_lat, &
85                            1, nbp_lon, ii_begin, ii_end, jj_begin, jj_end,             &
86                            klon_mpi+2*(nbp_lon-1), data_ibegin, data_iend,             &
87! VENUS IS SEEN UPSIDE DOWN, SO CENTRAL SYMMETRY TO PUT NORTH UP AGAIN
88                           -1.*lat_reg*(180./pi), -1.*lon_reg*(180./pi),                &
89                            is_south_pole_dyn,mpi_rank)
90
91    ! 3. Declare calendar and time step
92    if (prt_level>=10) write(lunout,*) "initialize_xios_output: build calendar"
93    timestep%second=dtphys
94    ! time origin of the simulation (default: 1st year/1st month/1st day, Ls=0)
95    time_origin=xios_date(1,1,1,0,0,0)
96    ! start date of the simulation (i.e time elapsed since last Ls=0)
97    start_date=xios_date(1,1,1,0,0,nint((day+timeofday)*daysec))
98    CALL xios_define_calendar(type="user_defined", &
99                              timestep=timestep, &
100                              day_length=nint(daysec), &
101                              start_date=start_date, &
102                              time_origin=time_origin, &
103                              month_lengths=[2])
104   
105    ! 4. Finalize the context:
106    if (prt_level>=10) write(*,*) "initialize_xios_output: call wxios_closedef"
107    CALL wxios_closedef()
108
109!$OMP END MASTER
110!$OMP BARRIER
111 
112  END SUBROUTINE initialize_xios_output
113
114!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
115
116  SUBROUTINE finalize_xios_output
117  USE xios
118  IMPLICIT NONE
119!$OMP BARRIER   
120!$OMP MASTER
121    CALL xios_context_finalize
122!$OMP END MASTER   
123!$OMP BARRIER   
124 
125  END SUBROUTINE finalize_xios_output
126
127!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
128
129  SUBROUTINE update_xios_timestep
130  USE xios
131  IMPLICIT NONE
132    CALL set_xios_context
133!$OMP MASTER
134    time_it=time_it+1
135    CALL xios_update_calendar(time_it)
136!$OMP END MASTER   
137  END SUBROUTINE update_xios_timestep
138
139!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
140
141  SUBROUTINE set_xios_context
142  USE XIOS
143  IMPLICIT NONE
144    TYPE(xios_context) :: ctx_hdl
145
146!$OMP MASTER
147    CALL xios_get_handle(context_id,ctx_hdl)
148    CALL xios_set_current_context(ctx_hdl)
149!$OMP END MASTER   
150  END SUBROUTINE set_xios_context
151
152!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
153
154  SUBROUTINE histwrite0d_xios(field_name,field)
155  USE xios, ONLY: xios_send_field
156  USE print_control_mod, ONLY: prt_level, lunout
157  IMPLICIT NONE
158 
159    CHARACTER(LEN=*), INTENT(IN) :: field_name
160    REAL, INTENT(IN) :: field
161   
162    IF (prt_level >= 10) WRITE(lunout,*)'Begin histrwrite0d_xios ',trim(field_name)
163   
164!$OMP MASTER
165    CALL xios_send_field(field_name,field)
166!$OMP END MASTER
167   
168    IF (prt_level >= 10) WRITE(lunout,*)'End histrwrite0d_xios ',trim(field_name)
169   
170  END SUBROUTINE histwrite0d_xios
171
172!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
173
174  SUBROUTINE histwrite2d_xios(field_name,field)
175  USE dimphy, only: klon
176  USE mod_phys_lmdz_para, only: gather_omp, grid1Dto2D_mpi, &
177                                jj_nb, klon_mpi
178  USE xios, only: xios_send_field
179  USE print_control_mod, ONLY: prt_level, lunout
180  USE mod_grid_phy_lmdz, ONLY: nbp_lon
181  IMPLICIT NONE
182
183    CHARACTER(LEN=*), INTENT(IN) :: field_name
184    REAL, DIMENSION(:), INTENT(IN) :: field
185     
186    REAL,DIMENSION(klon_mpi) :: buffer_omp
187    REAL :: Field2d(nbp_lon,jj_nb)
188
189    IF (prt_level >= 10) WRITE(lunout,*)'Begin histrwrite2d_xios ',trim(field_name)
190
191    IF (SIZE(field)/=klon) CALL abort_physic('iophy::histwrite2d_xios','Field first DIMENSION not equal to klon',1)
192   
193    CALL Gather_omp(field,buffer_omp)   
194!$OMP MASTER
195    CALL grid1Dto2D_mpi(buffer_omp,Field2d)
196   
197    CALL xios_send_field(field_name, Field2d)
198!$OMP END MASTER   
199
200    IF (prt_level >= 10) WRITE(lunout,*)'End histrwrite2d_xios ',trim(field_name)
201  END SUBROUTINE histwrite2d_xios
202
203!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
204
205  SUBROUTINE histwrite3d_xios(field_name, field)
206  USE dimphy, only: klon, klev
207  USE mod_phys_lmdz_para, only: gather_omp, grid1Dto2D_mpi, &
208                                jj_nb, klon_mpi
209  USE xios, only: xios_send_field
210  USE print_control_mod, ONLY: prt_level,lunout
211  USE mod_grid_phy_lmdz, ONLY: nbp_lon
212
213  IMPLICIT NONE
214
215    CHARACTER(LEN=*), INTENT(IN) :: field_name
216    REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:)
217
218    REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp
219    REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2))
220    INTEGER :: ip, n, nlev
221
222  IF (prt_level >= 10) write(lunout,*)'Begin histrwrite3d_xios ',trim(field_name)
223
224    !Et on.... écrit
225    IF (SIZE(field,1)/=klon) CALL abort_physic('iophy::histwrite3d','Field first DIMENSION not equal to klon',1)
226    nlev=SIZE(field,2)
227
228
229    CALL Gather_omp(field,buffer_omp)
230!$OMP MASTER
231    CALL grid1Dto2D_mpi(buffer_omp,field3d)
232
233    CALL xios_send_field(field_name, Field3d(:,:,1:nlev))
234!$OMP END MASTER   
235
236    IF (prt_level >= 10) write(lunout,*)'End histrwrite3d_xios ',trim(field_name)
237  END SUBROUTINE histwrite3d_xios
238
239#endif
240
241END MODULE xios_output_mod
Note: See TracBrowser for help on using the repository browser.