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

Last change on this file since 310 was 270, checked in by millour, 10 years ago

Added features for the Saturn case:

  • Added possibility to run without startfi or restartfi.nc files
  • Added reference temperature "temp_profile.txt" profile to start from
  • More XIOS outputs, and put them on "presnivs (pressure) vertical coordinate
  • Added "-openmp-threadprivate compat" OpenMP option in Ada arch file

EM

File size: 3.6 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
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     
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
38    CALL gather_omp(rlond,lon_mpi)
39    CALL gather_omp(rlatd,lat_mpi)
40    CALL gather_omp(rbounds_lon,bounds_lon_mpi)
41    CALL gather_omp(rbounds_lat,bounds_lat_mpi)
42   
43!$OMP BARRIER   
44!$OMP MASTER
45    CALL xios_context_initialize(context_id,comm_lmdz_phy)
46    CALL xios_get_handle(context_id, ctx_hdl)
47    CALL xios_set_current_context(ctx_hdl)
48   
49!    lev_value(:) = (/ (l,l=1,klev) /)     
50!    CALL xios_set_axis_attr("altitude",size=klev ,value=lev_value)
51   
52    ! build presnivs "pseudo-pressure" at mid-layers
53    DO l=1,klev
54      presnivs(l)=0.5*(ap(l)+bp(l)*preff+ap(l+1)+bp(l+1)*preff)
55    ENDDO
56    CALL xios_set_axis_attr("presnivs",size=klev,value=presnivs,unit="Pa",positive="down")
57 
58    CALL xios_set_domain_attr("horiz_domain",ni_glo=klon_glo, ibegin=klon_mpi_begin, ni=klon_mpi)
59    CALL xios_set_domain_attr("horiz_domain", data_dim=1, type='unstructured' , nvertex=6)
60    CALL xios_set_domain_attr("horiz_domain", lonvalue=lon_mpi*180/Pi, latvalue=lat_mpi*180/Pi)
61    CALL xios_set_domain_attr("horiz_domain", bounds_lon=reshape(bounds_lon_mpi,(/nvertex,klon_mpi/),order=(/2,1/))*180./Pi )
62    CALL xios_set_domain_attr("horiz_domain", bounds_lat=reshape(bounds_lat_mpi,(/nvertex,klon_mpi/),order=(/2,1/))*180./Pi )
63 
64    dtime%second=dtphys
65    CALL xios_set_timestep(dtime)
66    time_it = 0 
67    CALL xios_close_context_definition()
68!$OMP END MASTER   
69!$OMP BARRIER   
70   
71  END SUBROUTINE initialize_xios_output
72
73  SUBROUTINE finalize_xios_output
74  USE xios
75
76!$OMP BARRIER   
77!$OMP MASTER
78    CALL xios_context_finalize
79!$OMP END MASTER   
80!$OMP BARRIER   
81 
82  END SUBROUTINE finalize_xios_output
83
84
85  SUBROUTINE update_xios_timestep
86  USE xios
87  IMPLICIT NONE
88    CALL set_xios_context
89!$OMP MASTER
90    time_it=time_it+1
91    CALL xios_update_calendar(time_it)
92!$OMP END MASTER   
93  END SUBROUTINE update_xios_timestep
94
95
96  SUBROUTINE set_xios_context
97  USE XIOS
98  IMPLICIT NONE
99    TYPE(xios_context) :: ctx_hdl
100
101!$OMP MASTER
102    CALL xios_get_handle(context_id,ctx_hdl)
103    CALL xios_set_current_context(ctx_hdl)
104!$OMP END MASTER   
105  END SUBROUTINE set_xios_context
106
107
108 
109  SUBROUTINE write_xios_field_2d(field_id,field)
110  USE xios
111  USE mod_phys_lmdz_para
112  IMPLICIT NONE
113    CHARACTER(LEN=*) :: field_id
114    REAL,INTENT(IN)  :: field(:)
115    REAL             :: field_mpi(klon_mpi)
116 
117    CALL gather_omp(field,field_mpi)
118
119!$OMP MASTER
120    CALL xios_send_field(field_id,field_mpi)
121!$OMP END MASTER   
122   
123  END SUBROUTINE write_xios_field_2d
124
125  SUBROUTINE write_xios_field_3d(field_id,field)
126  USE xios
127  USE mod_phys_lmdz_para
128  IMPLICIT NONE
129    CHARACTER(LEN=*) :: field_id
130    REAL,INTENT(IN)  :: field(:,:)
131    REAL             :: field_mpi(klon_mpi,SIZE(field,2))
132 
133    CALL gather_omp(field,field_mpi)
134
135!$OMP MASTER
136    CALL xios_send_field(field_id,field_mpi)
137!$OMP END MASTER   
138   
139  END SUBROUTINE write_xios_field_3d
140 
141END MODULE xios_output_mod
142 
143 
Note: See TracBrowser for help on using the repository browser.