source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/xios_output.F90 @ 1057

Last change on this file since 1057 was 313, checked in by ymipsl, 10 years ago
  • implement splitting of XIOS file for lmdz physics
  • Termination is done properly in parallel by calling MPI_ABORT instead of abort or stop

YM

File size: 4.3 KB
Line 
1MODULE xios_output_mod
2
3
4 INTEGER :: time_it
5 CHARACTER(LEN=*), PARAMETER :: context_id= "lmdz_physics"
6 
7 PRIVATE :: time_it
8
9 INTERFACE write_xios_field
10    MODULE PROCEDURE write_xios_field_2d,write_xios_field_3d
11  END INTERFACE
12 
13
14CONTAINS
15
16  SUBROUTINE initialize_xios_output(time)
17  USE comgeomphy
18  USE xios
19  USE dimphy
20  USE mod_phys_lmdz_para
21  USE mod_grid_phy_lmdz
22  USE planete_mod, ONLY: ap,bp,preff
23 
24  IMPLICIT NONE
25    INCLUDE "comcstfi.h" 
26    INTEGER,INTENT(IN) :: time 
27    TYPE(xios_context) :: ctx_hdl
28    TYPE(xios_time)      :: dtime
29    REAL :: lev_value(klev)
30
31    REAL :: lon_mpi(klon_mpi)
32    REAL :: lat_mpi(klon_mpi)
33    REAL :: bounds_lon_mpi(klon_mpi,nvertex)
34    REAL :: bounds_lat_mpi(klon_mpi,nvertex)
35    INTEGER :: l
36    REAL :: presnivs(klev)
37    INTEGER :: time0
38    CHARACTER(LEN=256) :: start_date
39    INTEGER :: year,month,day,hour,minute,second
40
41    CALL gather_omp(rlond,lon_mpi)
42    CALL gather_omp(rlatd,lat_mpi)
43    CALL gather_omp(rbounds_lon,bounds_lon_mpi)
44    CALL gather_omp(rbounds_lat,bounds_lat_mpi)
45   
46!$OMP BARRIER   
47!$OMP MASTER
48    time0=time
49    year=time0/(86400*360)
50    time0=time0-year*(86400*360)
51    month=time0/(86400*30)
52    time0=time0-month*(86400*30)
53    month=month+1
54    day=time0/86400
55    time0=time0-day*86400
56    day=day+1
57    hour=time0/3600
58    time0=time0-hour*3600
59    minute=time0/60
60    time0=time0-minute*60
61    second=time0
62    write(start_date,'(i0.4,"-",i0.2,"-",i0.2," ",i0.2,":",i0.2,":",i0.2)'),year,month,day,hour,minute,second
63   
64    PRINT *,"time0  ",time," Start Date ",TRIM(start_date)
65    CALL xios_context_initialize(context_id,comm_lmdz_phy)
66    CALL xios_get_handle(context_id, ctx_hdl)
67    CALL xios_set_current_context(ctx_hdl)
68    CALL xios_set_attr(ctx_hdl,start_date=TRIM(start_date))
69   
70!    lev_value(:) = (/ (l,l=1,klev) /)     
71!    CALL xios_set_axis_attr("altitude",size=klev ,value=lev_value)
72   
73    ! build presnivs "pseudo-pressure" at mid-layers
74    DO l=1,klev
75      presnivs(l)=0.5*(ap(l)+bp(l)*preff+ap(l+1)+bp(l+1)*preff)
76    ENDDO
77    CALL xios_set_axis_attr("presnivs",size=klev,value=presnivs,unit="Pa",positive="down")
78 
79    CALL xios_set_domain_attr("horiz_domain",ni_glo=klon_glo, ibegin=klon_mpi_begin, ni=klon_mpi)
80    CALL xios_set_domain_attr("horiz_domain", data_dim=1, type='unstructured' , nvertex=6)
81    CALL xios_set_domain_attr("horiz_domain", lonvalue=lon_mpi*180/Pi, latvalue=lat_mpi*180/Pi)
82    CALL xios_set_domain_attr("horiz_domain", bounds_lon=reshape(bounds_lon_mpi,(/nvertex,klon_mpi/),order=(/2,1/))*180./Pi )
83    CALL xios_set_domain_attr("horiz_domain", bounds_lat=reshape(bounds_lat_mpi,(/nvertex,klon_mpi/),order=(/2,1/))*180./Pi )
84 
85    dtime%second=dtphys
86    CALL xios_set_timestep(dtime)
87    time_it = 0 
88    CALL xios_close_context_definition()
89!$OMP END MASTER   
90!$OMP BARRIER   
91   
92  END SUBROUTINE initialize_xios_output
93
94  SUBROUTINE finalize_xios_output
95  USE xios
96
97!$OMP BARRIER   
98!$OMP MASTER
99    CALL xios_context_finalize
100!$OMP END MASTER   
101!$OMP BARRIER   
102 
103  END SUBROUTINE finalize_xios_output
104
105
106  SUBROUTINE update_xios_timestep
107  USE xios
108  IMPLICIT NONE
109    CALL set_xios_context
110!$OMP MASTER
111    time_it=time_it+1
112    CALL xios_update_calendar(time_it)
113!$OMP END MASTER   
114  END SUBROUTINE update_xios_timestep
115
116
117  SUBROUTINE set_xios_context
118  USE XIOS
119  IMPLICIT NONE
120    TYPE(xios_context) :: ctx_hdl
121
122!$OMP MASTER
123    CALL xios_get_handle(context_id,ctx_hdl)
124    CALL xios_set_current_context(ctx_hdl)
125!$OMP END MASTER   
126  END SUBROUTINE set_xios_context
127
128
129 
130  SUBROUTINE write_xios_field_2d(field_id,field)
131  USE xios
132  USE mod_phys_lmdz_para
133  IMPLICIT NONE
134    CHARACTER(LEN=*) :: field_id
135    REAL,INTENT(IN)  :: field(:)
136    REAL             :: field_mpi(klon_mpi)
137 
138    CALL gather_omp(field,field_mpi)
139
140!$OMP MASTER
141    CALL xios_send_field(field_id,field_mpi)
142!$OMP END MASTER   
143   
144  END SUBROUTINE write_xios_field_2d
145
146  SUBROUTINE write_xios_field_3d(field_id,field)
147  USE xios
148  USE mod_phys_lmdz_para
149  IMPLICIT NONE
150    CHARACTER(LEN=*) :: field_id
151    REAL,INTENT(IN)  :: field(:,:)
152    REAL             :: field_mpi(klon_mpi,SIZE(field,2))
153 
154    CALL gather_omp(field,field_mpi)
155
156!$OMP MASTER
157    CALL xios_send_field(field_id,field_mpi)
158!$OMP END MASTER   
159   
160  END SUBROUTINE write_xios_field_3d
161 
162END MODULE xios_output_mod
163 
164 
Note: See TracBrowser for help on using the repository browser.