source: XIOS/trunk/src/test/test_expand_domain.f90 @ 1083

Last change on this file since 1083 was 1083, checked in by mhnguyen, 4 years ago

Correcting the bug on expanding domain by using data read from file

+) Make sure that data_dim is taken account on expanding domain

Test
+) Add a new test: test_expand_domain
+) On Ubuntu 16.04
+) Work.

  • Property svn:executable set to *
File size: 5.6 KB
Line 
1! This program is for testing expanding a domain
2! There are two parts:
3! +) Simulate data from model then do expand domain on these data
4! +) Read data from file then do expand domain on these data
5PROGRAM test_expand_domain
6
7  USE xios
8  USE mod_wait
9  IMPLICIT NONE
10  INCLUDE "mpif.h"
11  INTEGER :: rank
12  INTEGER :: size
13  INTEGER :: ierr
14
15  CHARACTER(len=*),PARAMETER :: id="client"
16  INTEGER :: comm
17  TYPE(xios_duration) :: dtime
18  CHARACTER(len=20) :: dtime_str
19  TYPE(xios_date) :: date
20  CHARACTER(len=20) :: date_str
21  CHARACTER(len=15) :: calendar_type
22  TYPE(xios_context) :: ctx_hdl
23  INTEGER,PARAMETER :: ni_glo=10
24  INTEGER,PARAMETER :: nj_glo=10
25  INTEGER,PARAMETER :: llm=5
26  DOUBLE PRECISION  :: lval(llm)=1
27  TYPE(xios_field) :: field_hdl
28  TYPE(xios_fieldgroup) :: fieldgroup_hdl
29  TYPE(xios_file) :: file_hdl
30  LOGICAL :: ok
31
32  DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo
33  DOUBLE PRECISION :: field_A_glo(ni_glo,nj_glo,llm)
34  DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A(:,:,:), lonvalue(:,:)
35  INTEGER, ALLOCATABLE :: data_i_index(:), data_j_index(:), i_index(:), j_index(:) ;
36  INTEGER :: ni,ibegin,iend,nj,jbegin,jend
37  INTEGER :: data_ni,data_ibegin,data_iend,data_nj,data_jbegin,data_jend, data_dim
38  INTEGER :: i,j,l,ts,n
39
40!!! MPI Initialization
41  CALL MPI_INIT(ierr)
42
43  CALL init_wait
44
45!!! XIOS Initialization (get the local communicator)
46  CALL xios_initialize(id,return_comm=comm)
47
48  CALL MPI_COMM_RANK(comm,rank,ierr)
49  CALL MPI_COMM_SIZE(comm,size,ierr)
50
51!!! Simulate some data from models
52  DO j=1,nj_glo
53    DO i=1,ni_glo
54      lon_glo(i,j)=(i-1)+(j-1)*ni_glo
55      lat_glo(i,j)=1000+(i-1)+(j-1)*ni_glo
56      DO l=1,llm
57        field_A_glo(i,j,l)=(i-1)+(j-1)*ni_glo+10000*l
58      ENDDO
59    ENDDO
60  ENDDO
61  ni=ni_glo ; ibegin=0
62
63  jbegin=0
64  DO n=0,size-1
65    nj=nj_glo/size
66    IF (n<MOD(nj_glo,size)) nj=nj+1
67    IF (n==rank) exit
68    jbegin=jbegin+nj
69  ENDDO
70  iend=ibegin+ni-1 ; jend=jbegin+nj-1
71
72  ALLOCATE(lon(ni,nj),lat(ni,nj),field_A(0:ni+1,-1:nj+2,llm),lonvalue(ni,nj))
73  lon(:,:)=lon_glo(ibegin+1:iend+1,jbegin+1:jend+1)
74  lat(:,:)=lat_glo(ibegin+1:iend+1,jbegin+1:jend+1)
75  field_A(1:ni,1:nj,:)=field_A_glo(ibegin+1:iend+1,jbegin+1:jend+1,:)
76
77  ! Expand domain on using data from model
78  CALL xios_context_initialize("write",comm)
79  CALL xios_get_handle("write",ctx_hdl)
80  CALL xios_set_current_context(ctx_hdl)
81
82  CALL xios_set_axis_attr("axis_A",n_glo=llm ,value=lval) ;
83  CALL xios_set_domain_attr("domain_A",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, ni=ni,jbegin=jbegin,nj=nj,type='curvilinear')
84  CALL xios_set_domain_attr("domain_A",data_dim=2, data_ibegin=-1, data_ni=ni+2, data_jbegin=-2, data_nj=nj+4)
85  CALL xios_set_domain_attr("domain_A",lonvalue_2D=lon,latvalue_2D=lat)
86 
87  dtime%second = 3600
88  CALL xios_set_timestep(dtime)
89  CALL xios_close_context_definition()
90
91  DO ts=1,24
92    CALL xios_update_calendar(ts)
93    CALL xios_send_field("field_A",field_A)
94    CALL wait_us(5000) ;
95  ENDDO
96
97  CALL xios_context_finalize()
98  DEALLOCATE(lon, lat, field_A)
99
100  ! Expand domain on using data read from a file
101  CALL xios_context_initialize("read",comm)
102  CALL xios_get_handle("read",ctx_hdl)
103  CALL xios_set_current_context(ctx_hdl)
104
105  CALL xios_set_axis_attr("axis_A",n_glo=llm ,value=lval)
106  CALL xios_set_domain_attr("domain_A",ni_glo=ni_glo, nj_glo=nj_glo, type='rectilinear')
107 
108  dtime%second = 3600
109  CALL xios_set_timestep(dtime) 
110  CALL xios_close_context_definition()
111
112  ! Read some attributes of source domain
113  CALL xios_get_domain_attr("domain_A", ni=ni, nj=nj)
114
115  ALLOCATE(field_A(ni,nj,llm))
116  ALLOCATE(data_i_index(ni*nj))
117  ALLOCATE(data_j_index(ni*nj))
118  ALLOCATE(i_index(ni*nj))
119  ALLOCATE(j_index(ni*nj))
120  CALL xios_get_domain_attr("domain_A", data_dim=data_dim, data_ni=data_ni, data_nj=data_nj, &
121                             data_ibegin=data_ibegin, data_jbegin=data_jbegin, data_i_index=data_i_index, &
122                             i_index=i_index, j_index=j_index, data_j_index=data_j_index) 
123  print *, "ni = ", ni
124  print *, "nj = ", nj
125  print *, "data_dim = ", data_dim
126  print *, "data_ni  = ", data_ni, " data_ibegin = ", data_ibegin
127  print *, "data_nj  = ", data_nj, " data_ibegin = ", data_jbegin
128  print *, "data_i_index = ", data_i_index
129  print *, "data_j_index = ", data_j_index
130  print *, "i_index = ", i_index
131  print *, "j_index = ", j_index
132
133 
134  DEALLOCATE(data_i_index)
135  DEALLOCATE(data_j_index)
136  DEALLOCATE(i_index)
137  DEALLOCATE(j_index)
138
139  ! Verify some attributes of expanded domain
140  CALL xios_get_domain_attr("domain_A_expand", ni=ni, nj=nj)
141  ALLOCATE(data_i_index(ni*nj))
142  ALLOCATE(data_j_index(ni*nj))
143  ALLOCATE(i_index(ni*nj))
144  ALLOCATE(j_index(ni*nj))
145  CALL xios_get_domain_attr("domain_A_expand", data_dim=data_dim, data_ni=data_ni, data_nj=data_nj, &
146                             data_ibegin=data_ibegin, data_jbegin=data_jbegin, data_i_index=data_i_index, &
147                             i_index=i_index, j_index=j_index, data_j_index=data_j_index)
148  print *, "ni_expand = ", ni
149  print *, "nj_expand = ", nj
150  print *, "data_dim_expand = ", data_dim
151  print *, "data_ni_expand = ", data_ni, " data_ibegin_expand = ", data_ibegin
152  print *, "data_nj_expand = ", data_nj, " data_ibegin_expand = ", data_jbegin
153  print *, "data_i_index_expand = ", data_i_index
154  print *, "data_j_index_expand = ", data_j_index
155  print *, "i_index = ", i_index
156  print *, "j_index = ", j_index
157
158  DO ts=1,24
159    CALL xios_recv_field("field_A",field_A) 
160    CALL xios_update_calendar(ts)
161    CALL wait_us(5000) ;
162    CALL xios_send_field("field_B",field_A)   
163  ENDDO
164 
165  CALL xios_context_finalize() 
166
167  CALL MPI_COMM_FREE(comm, ierr)
168
169  CALL xios_finalize()
170
171  CALL MPI_FINALIZE(ierr)
172
173END PROGRAM test_expand_domain
Note: See TracBrowser for help on using the repository browser.