New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
mod_interface_ioipsl.f90 in branches/nemo_v3_3_beta/NEMOGCM/EXTERNAL/XMLIO_SERVER/src/IOSERVER – NEMO

source: branches/nemo_v3_3_beta/NEMOGCM/EXTERNAL/XMLIO_SERVER/src/IOSERVER/mod_interface_ioipsl.f90 @ 2364

Last change on this file since 2364 was 2364, checked in by acc, 13 years ago

Added basic NetCDF4 chunking and compression support (key_netcdf4). See ticket #754

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