source: XMLIO_SERVER/trunk/src/IOSERVER/mod_interface_ioipsl.f90 @ 29

Last change on this file since 29 was 29, checked in by ymipsl, 13 years ago

New Features :

  • Les zoom sont maintenant utilisables.
  • Lorsqu'un serveur ne sort pas de données dans un fichier, le fichier n'est pas crée.
  • Lorsqu'un serveur est le seul a sortir un fichier, l'indexation par numero de process est supprimé.
  • Les axes verticaux ont maintenant un attribut << positive [TRUE/FALSE]>>
File size: 8.3 KB
Line 
1MODULE mod_interface_ioipsl
2
3 
4  INTEGER,PARAMETER     :: id_file=1
5
6
7CONTAINS
8
9  SUBROUTINE init_interface_ioipsl
10  USE xmlio
11  IMPLICIT NONE
12 
13   
14  END SUBROUTINE init_interface_ioipsl
15
16
17  SUBROUTINE set_time_parameters(ini_timestep0,zjulian0,timestep0)
18  USE xmlio
19  IMPLICIT NONE
20    INTEGER :: ini_timestep0
21    REAL :: zjulian0, timestep0
22
23    timestep_value=timestep0
24    initial_timestep=ini_timestep0
25    initial_date=zjulian0
26
27  END SUBROUTINE set_time_parameters
28
29  SUBROUTINE Create_file_definition(nb_server,server_rank)
30  USE ioipsl
31  USE xmlio
32  IMPLICIT NONE
33    INTEGER,INTENT(IN)  :: nb_server
34    INTEGER,INTENT(IN)  :: server_rank
35   
36    TYPE(file_dep),POINTER :: pt_file_dep
37    TYPE(file),POINTER     :: pt_file
38    TYPE(field),POINTER    :: pt_field
39    TYPE(grid),POINTER     :: pt_grid
40    TYPE(zoom),POINTER     :: pt_zoom
41    TYPE(axis),POINTER     :: pt_axis
42    TYPE(domain),POINTER   :: pt_domain
43
44    TYPE(sorted_list),POINTER :: axis_id
45    LOGICAL :: found                 
46    INTEGER :: ioipsl_axis_id
47    INTEGER :: ioipsl_file_id
48    INTEGER :: ioipsl_hori_id
49    INTEGER :: ioipsl_domain_id
50    INTEGER :: i,j
51    CHARACTER(LEN=20) :: direction
52     
53    CALL xmlio__close_definition 
54   
55    ALLOCATE(axis_id)
56   
57    DO i=1,file_enabled%size
58      CALL sorted_list__new(axis_id)
59     
60      pt_file_dep=>file_enabled%at(i)%pt
61      pt_file=>pt_file_dep%file
62     
63      pt_grid=>pt_file_dep%grids%at(1)%pt
64      pt_domain=>pt_grid%domain
65      pt_zoom=>pt_file_dep%zooms%at(1)%pt
66!      print *,TRIM(pt_file%name),' ',TRIM(pt_zoom%id)
67!      print*,'Global --->',pt_zoom%ni_glo,pt_zoom%nj_glo,pt_zoom%ibegin_glo,pt_zoom%jbegin_glo
68!      print*,'Local  --->',pt_zoom%ni_loc,pt_zoom%nj_loc,pt_zoom%ibegin_loc,pt_zoom%jbegin_loc
69     
70      IF (pt_zoom%ni_loc*pt_zoom%nj_loc > 0) THEN
71       
72        IF ( (pt_zoom%ni_loc == pt_zoom%ni_glo) .AND. (pt_zoom%nj_loc == pt_zoom%nj_glo) ) THEN
73
74          CALL histbeg(TRIM(pt_file%name),pt_domain%ni,pt_domain%lon, pt_domain%nj, pt_domain%lat,  &
75                     pt_zoom%ibegin_loc, pt_zoom%ni_loc,pt_zoom%jbegin_loc,pt_zoom%nj_loc,        &                                            &
76                     initial_timestep, initial_date, timestep_value,                              &
77                     ioipsl_hori_id, ioipsl_file_id)
78         ELSE                                             
79
80          CALL set_ioipsl_domain_id(pt_grid,nb_server,server_rank,ioipsl_domain_id)
81          CALL histbeg(TRIM(pt_file%name),pt_domain%ni,pt_domain%lon, pt_domain%nj, pt_domain%lat,  &
82                     pt_zoom%ibegin_loc, pt_zoom%ni_loc,pt_zoom%jbegin_loc,pt_zoom%nj_loc,        &                                            &
83                     initial_timestep, initial_date, timestep_value,                              &
84                     ioipsl_hori_id, ioipsl_file_id,domain_id=ioipsl_domain_id)                                             
85       
86         ENDIF
87       
88     
89        DO j=1,pt_file_dep%axis%size
90          pt_axis=>pt_file_dep%axis%at(j)%pt
91          CALL sorted_list__find(axis_id,hash(Pt_axis%name),ioipsl_axis_id,found)
92          IF (.NOT. found) THEN
93            IF (TRIM(pt_axis%name) /= "none") THEN
94             
95              IF (pt_axis%has_positive) THEN
96                IF (pt_axis%positive) THEN
97                  direction="up"
98                ELSE
99                  direction="down"
100                ENDIF
101              ELSE
102                direction='unknown'
103              ENDIF
104
105              CALL histvert(ioipsl_file_id, TRIM(pt_axis%name),TRIM(pt_axis%description),    &
106                           TRIM(pt_axis%unit), pt_axis%size,pt_axis%values, ioipsl_axis_id,  &
107                           pdirect=direction)
108              CALL sorted_list__add(axis_id,hash(Pt_axis%name),ioipsl_axis_id)
109            ENDIF
110          ENDIF
111        ENDDO
112       
113        DO j=1,pt_file_dep%fields%size
114          pt_field=>pt_file_dep%fields%at(j)%pt
115          IF (pt_field%axis%name=="none") THEN
116            pt_field%internal(id_file)=ioipsl_file_id
117            CALL histdef(ioipsl_file_id, TRIM(pt_field%name), pt_field%description,            &
118                      &  pt_field%unit, pt_field%grid%domain%ni, pt_field%grid%domain%nj,      &
119                      &  ioipsl_hori_id, 1, 1, 1, -99, 32, pt_field%operation,                 &
120                      &  real(pt_field%freq_op), real(pt_file%output_freq) )
121          ELSE
122            pt_field%internal(id_file)=ioipsl_file_id
123            CALL sorted_list__find(axis_id,hash(Pt_field%axis%name),ioipsl_axis_id,found)
124            CALL histdef(ioipsl_file_id, TRIM(pt_field%name), pt_field%description,          &
125                       & pt_field%unit, pt_field%grid%domain%ni, pt_field%grid%domain%nj,    &
126                       & ioipsl_hori_id, pt_field%axis%size, 1, pt_field%axis%size,          &
127                       & ioipsl_axis_id, 32, pt_field%operation, real(pt_field%freq_op),     &
128                       & real(pt_file%output_freq) )
129          ENDIF
130        ENDDO
131        CALL histend(ioipsl_file_id)
132      ENDIF
133      CALL sorted_list__delete(axis_id)
134    ENDDO
135   
136    DEALLOCATE(axis_id)
137     
138  END SUBROUTINE Create_file_definition 
139
140
141
142   SUBROUTINE write_ioipsl_2d(varname,var)
143   USE ioipsl
144   USE xmlio
145   IMPLICIT NONE
146     CHARACTER(len=*),INTENT(IN) :: varname
147     REAL            ,INTENT(IN) :: var(:,:)
148     
149     TYPE(field_dep),POINTER :: pt_field_base
150     TYPE(field)    ,POINTER :: pt_field
151     INTEGER :: nindex(size(var))
152     INTEGER :: ioipsl_file_id
153     INTEGER :: pos
154     LOGICAL :: found
155     INTEGER :: i
156     
157     CALL sorted_list__find(sorted_id,hash(varname),pos,found)
158
159     IF (found) THEN
160       pt_field_base=>field_id%at(pos)%pt
161     
162       DO i=1,pt_field_base%field_out%size
163         pt_field=>pt_field_base%field_out%at(i)%pt%field
164         IF ( pt_field%zoom%ni_loc * pt_field%zoom%nj_loc > 0) THEN           
165           ioipsl_file_id=pt_field%internal(id_file)
166           CALL histwrite(ioipsl_file_id, TRIM(pt_field%name), timestep_number, var, size(var), nindex)
167         ENDIF
168       ENDDO
169     ENDIF
170     
171   END SUBROUTINE write_ioipsl_2d
172       
173     
174   SUBROUTINE write_ioipsl_3d(varname,var)
175   USE ioipsl
176   USE xmlio
177   IMPLICIT NONE
178     CHARACTER(len=*),INTENT(IN) :: varname
179     REAL            ,INTENT(IN) :: var(:,:,:)
180     
181     TYPE(field_dep),POINTER :: pt_field_base
182     TYPE(field)    ,POINTER :: pt_field
183     INTEGER :: nindex(size(var))
184     INTEGER :: ioipsl_file_id
185     INTEGER :: pos
186     LOGICAL :: found
187     INTEGER :: i
188       
189     CALL sorted_list__find(sorted_id,hash(varname),pos,found)
190
191     IF (found) THEN
192       pt_field_base=>field_id%at(pos)%pt
193     
194       DO i=1,pt_field_base%field_out%size
195         pt_field=>pt_field_base%field_out%at(i)%pt%field
196         IF ( pt_field%zoom%ni_loc * pt_field%zoom%nj_loc > 0) THEN           
197           ioipsl_file_id=pt_field%internal(id_file)
198           CALL histwrite(ioipsl_file_id, TRIM(pt_field%name), timestep_number, var, size(var), nindex)
199         ENDIF
200       ENDDO
201     ENDIF
202   END SUBROUTINE write_ioipsl_3d
203           
204
205  SUBROUTINE set_timestep(timestep_nb0)
206  USE xmlio
207  IMPLICIT NONE
208    INTEGER,INTENT(IN) :: timestep_nb0
209     
210    timestep_number=timestep_nb0
211
212  END SUBROUTINE set_timestep
213
214
215  SUBROUTINE set_ioipsl_domain_id(pt_grid, nb_server,server_rank,domain_id)
216  USE xmlio
217  USE mod_ioserver_para
218  USE ioipsl
219  IMPLICIT NONE
220    TYPE(grid), POINTER :: pt_grid
221    INTEGER,INTENT(IN)  :: nb_server
222    INTEGER,INTENT(IN)  :: server_rank
223    INTEGER,INTENT(OUT) :: domain_id
224    TYPE(domain), POINTER :: pt_domain
225               
226    INTEGER,DIMENSION(2) :: ddid
227    INTEGER,DIMENSION(2) :: dsg
228    INTEGER,DIMENSION(2) :: dsl
229    INTEGER,DIMENSION(2) :: dpf
230    INTEGER,DIMENSION(2) :: dpl
231    INTEGER,DIMENSION(2) :: dhs
232    INTEGER,DIMENSION(2) :: dhe 
233   
234    pt_domain=>pt_grid%domain
235
236    ddid = (/ 1,2 /)
237    dsg  = (/ pt_grid%ni, pt_grid%nj /)
238    dsl  = (/ pt_domain%ni, pt_domain%nj /)
239    dpf  = (/ pt_domain%ibegin,pt_domain%jbegin /)
240    dpl  = (/ pt_domain%iend, pt_domain%jend /)
241    dhs  = (/ 0,0 /)
242    dhe  = (/ 0,0 /)
243   
244    call flio_dom_set(nb_server,server_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
245                      'BOX',domain_id)
246 
247  END SUBROUTINE set_ioipsl_domain_id
248
249
250  SUBROUTINE ioipsl_finalize
251  USE ioipsl
252  IMPLICIT NONE
253
254    CALL histclo
255   
256  END SUBROUTINE ioipsl_finalize
257 
258END MODULE mod_interface_ioipsl
Note: See TracBrowser for help on using the repository browser.