source: XIOS/trunk/src/test/test_tiled_domain.f90 @ 2131

Last change on this file since 2131 was 2131, checked in by oabramkina, 3 years ago

Merging branch dev_oa with tiling into trunk

File size: 5.3 KB
Line 
1PROGRAM test_tiled_domain
2
3  USE xios
4  USE mod_wait
5  IMPLICIT NONE
6  INCLUDE "mpif.h"
7  INTEGER :: rank
8  INTEGER :: size
9  INTEGER :: ierr
10
11  CHARACTER(len=*),PARAMETER :: id="client"
12  INTEGER :: comm
13  TYPE(xios_duration) :: dtime
14  CHARACTER(len=20) :: dtime_str
15  TYPE(xios_date) :: date
16  CHARACTER(len=20) :: date_str
17  CHARACTER(len=15) :: calendar_type
18  TYPE(xios_context) :: ctx_hdl
19  INTEGER,PARAMETER :: ni_glo=10!100
20  INTEGER,PARAMETER :: nj_glo=10!100
21  INTEGER,PARAMETER :: llm=5
22  DOUBLE PRECISION  :: lval(llm)=1, scalar = 5
23
24  integer, parameter :: ntiles=2
25  integer, dimension (ntiles) :: tile_ni, tile_nj, tile_ibegin, tile_jbegin
26  integer, dimension (ntiles) :: tile_data_ni, tile_data_nj, tile_data_ibegin, tile_data_jbegin 
27
28  TYPE(xios_field) :: field_hdl
29  TYPE(xios_fieldgroup) :: fieldgroup_hdl
30  TYPE(xios_file) :: file_hdl
31  LOGICAL :: ok
32
33  DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo
34  DOUBLE PRECISION :: field_3d_glo(ni_glo,nj_glo,llm)
35  DOUBLE PRECISION,ALLOCATABLE :: field_3d(:,:,:)
36  DOUBLE PRECISION,ALLOCATABLE :: field_3d_tile(:,:,:)
37  INTEGER :: ni,ibegin,iend,nj,jbegin,jend
38  INTEGER :: i,j,l,ts,n
39  INTEGER :: ioffset, joffset
40
41  namelist /tile_data_def/ ioffset, joffset
42
43!!! MPI Initialization
44
45  CALL MPI_INIT(ierr)
46
47  CALL init_wait
48
49!!! XIOS Initialization (get the local communicator)
50
51  CALL xios_initialize(id,return_comm=comm)
52
53  CALL MPI_COMM_RANK(comm,rank,ierr)
54  CALL MPI_COMM_SIZE(comm,size,ierr)
55
56!!! Fill in global data array
57
58  DO l=1,llm
59    DO j=1,nj_glo
60      DO i=1,ni_glo
61        field_3d_glo(i,j,l)=(l-1)*ni_glo*nj_glo+(j-1)*ni_glo+(i-1)
62      ENDDO
63    ENDDO
64  ENDDO
65  ni=ni_glo ; ibegin=0
66
67!!! MPI domain decomposition
68
69  jbegin=0
70  DO n=0,size-1
71    nj=nj_glo/size
72    IF (n<MOD(nj_glo,size)) nj=nj+1
73    IF (n==rank) exit
74    jbegin=jbegin+nj
75  ENDDO
76
77  iend=ibegin+ni-1 ; jend=jbegin+nj-1
78
79!!! Fill in local data array
80
81  ALLOCATE(field_3d(ni,nj,llm))
82  field_3d(1:ni,1:nj,:)=field_3d_glo(ibegin+1:iend+1,jbegin+1:jend+1,:)
83
84!!! Tile domain decomposition
85  tile_ni(:)=ni
86  tile_ibegin(:)=0
87  tile_jbegin(1)=0
88  do n=0,ntiles-1
89    tile_nj(n+1)=nj/ntiles
90    if (n<MOD(nj,ntiles)) tile_nj(n+1)=tile_nj(n+1)+1
91  enddo
92
93  do n=2,ntiles
94    tile_jbegin(n)=tile_jbegin(n-1)+tile_nj(n-1)
95  enddo
96
97!!! Define tile data size
98
99  open(10,file='tile_data_def.nml')
100  read(10,nml=tile_data_def)
101  close(10)
102
103  ! Option 1: data correspond in size to a tile
104  if (ioffset == 0) then
105    tile_data_ni(:)=tile_ni(:)
106    tile_data_nj(:)=tile_nj(:)
107    tile_data_ibegin(:)=0
108    tile_data_jbegin(:)=0
109 
110  ! Option 2: masked data
111  else if (ioffset > 0) then
112    do n=1,ntiles
113      tile_data_ni(n)=tile_ni(n)-ioffset*2
114      tile_data_nj(n)=tile_nj(n)-joffset*2
115    enddo
116    tile_data_ibegin(:)=ioffset
117    tile_data_jbegin(:)=joffset
118
119  ! Option 3: data contain ghost zones
120  else
121    do n=1,ntiles
122      tile_data_ni(n)=tile_ni(n)+abs(ioffset)*2
123      tile_data_nj(n)=tile_nj(n)+abs(joffset)*2
124    enddo
125    tile_data_ibegin(:)=ioffset
126    tile_data_jbegin(:)=joffset
127  endif
128
129  CALL xios_context_initialize("test",comm)
130  CALL xios_get_handle("test",ctx_hdl)
131  CALL xios_set_current_context(ctx_hdl)
132
133  CALL xios_set_axis_attr("axis",n_glo=llm ,value=lval) ;
134  CALL xios_set_domain_attr("domain",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, ni=ni,jbegin=jbegin,nj=nj,type='curvilinear')
135  CALL xios_set_domain_attr("domain",ntiles=ntiles, tile_ni=tile_ni, tile_nj=tile_nj, tile_ibegin=tile_ibegin, tile_jbegin=tile_jbegin)
136  CALL xios_set_domain_attr("domain",tile_data_ni=tile_data_ni,tile_data_nj=tile_data_nj)
137  CALL xios_set_domain_attr("domain",tile_data_ibegin=tile_data_ibegin,tile_data_jbegin=tile_data_jbegin)
138
139  dtime%second = 3600
140  CALL xios_set_timestep(dtime)
141
142  ! The calendar is created as soon as the calendar type is defined. This way
143  ! calendar operations can be used before the context definition is closed
144  dtime%timestep = 1
145  dtime = 0.5 * dtime
146 
147  CALL xios_close_context_definition()
148  PRINT *,"close context definition: ok "
149
150  DO ts=1,10
151    CALL xios_update_calendar(ts)
152
153    do n=1,ntiles
154      ALLOCATE(field_3d_tile(tile_data_ibegin(n):tile_data_ibegin(n)+tile_data_ni(n)-1,&
155                             tile_data_jbegin(n):tile_data_jbegin(n)+tile_data_nj(n)-1,llm))
156     
157      if (ioffset == 0) then
158      ! Option 1: data correspond in size to a tile
159      field_3d_tile(:,:,:)=field_3d(tile_ibegin(n)+1:tile_ibegin(n)+1+tile_ni(n),&
160                                  tile_jbegin(n)+1:tile_jbegin(n)+1+tile_nj(n),:)
161     
162      else if (ioffset > 0) then
163      ! Option 2: masked data
164      field_3d_tile(:,:,:)=field_3d(tile_ibegin(n)+1:tile_ibegin(n)+1+tile_ni(n),&
165                                  tile_jbegin(n)+1:tile_jbegin(n)+1+tile_nj(n),:)
166
167      else
168      ! Option 3: data contain ghost zones
169      field_3d_tile(:,:,:)=2.0
170      field_3d_tile(0:tile_ni(n)-1, 0:tile_nj(n)-1,:)=&
171                    field_3d(tile_ibegin(n)+1:tile_ibegin(n)+tile_ni(n),&
172                             tile_jbegin(n)+1:tile_jbegin(n)+tile_nj(n),:)
173      end if
174
175      CALL xios_send_field("field_3d",field_3d_tile,n-1)
176      DEALLOCATE(field_3d_tile)
177    enddo
178
179    CALL wait_us(5000) ;
180  ENDDO
181
182  CALL xios_context_finalize()
183
184  DEALLOCATE(field_3d)
185
186  CALL MPI_COMM_FREE(comm, ierr)
187
188  CALL xios_finalize()
189
190  CALL MPI_FINALIZE(ierr)
191
192END PROGRAM test_tiled_domain
193
194
195
196
197
Note: See TracBrowser for help on using the repository browser.