source: XMLIO_SERVER/trunk/src/IOSERVER/mod_box_grid.f90 @ 8

Last change on this file since 8 was 8, checked in by ymipsl, 15 years ago

Importation des sources du serveur XMLIO

File size: 4.8 KB
Line 
1MODULE box_grid
2 
3  INTEGER, PARAMETER :: nb_grid_max=100
4  INTEGER            :: nb_grid=0
5
6  TYPE domain
7    INTEGER :: ni
8    INTEGER :: nj
9    INTEGER :: ibegin
10    INTEGER :: iend
11    INTEGER :: jbegin
12    INTEGER :: jend
13    REAL,POINTER :: lon(:,:)
14    REAL,POINTER :: lat(:,:)
15  END TYPE domain
16 
17  TYPE grid
18    TYPE(domain)         :: local_domain
19    TYPE(domain),POINTER :: task_domain(:)
20    INTEGER                          :: ni
21    INTEGER                          :: nj
22    INTEGER                          :: nb_task
23  END TYPE grid
24 
25  TYPE(grid),SAVE,TARGET :: grids(nb_grid_max)
26 
27  INTEGER,SAVE :: max_ni
28  INTEGER,SAVE :: max_nj
29  INTEGER,SAVE :: max_vert_size = 100
30  REAL,SAVE,ALLOCATABLE :: Field_buffer(:,:,:) 
31 
32CONTAINS
33
34  SUBROUTINE create_new_grid(ni_glo,nj_glo,nb_task,id)
35  IMPLICIT NONE
36    INTEGER,INTENT(IN)  :: ni_glo
37    INTEGER,INTENT(IN)  :: nj_glo
38    INTEGER,INTENT(IN)  :: nb_task
39    INTEGER,INTENT(OUT) :: id
40 
41    nb_grid=nb_grid+1
42    id=nb_grid
43   
44    grids(id)%ni=ni_glo
45    grids(id)%nj=nj_glo
46    grids(id)%nb_task=nb_task
47   
48    ALLOCATE(grids(id)%task_domain(nb_task))
49 
50  END SUBROUTINE create_new_grid
51 
52  SUBROUTINE Init_task_domain(id,task,ni,nj,ibegin,jbegin,lon,lat)
53  IMPLICIT NONE
54    INTEGER, INTENT(IN) :: id
55    INTEGER, INTENT(IN) :: task
56    INTEGER, INTENT(IN) :: ni
57    INTEGER, INTENT(IN) :: nj
58    INTEGER, INTENT(IN) :: ibegin
59    INTEGER, INTENT(IN) :: jbegin
60    REAL,    INTENT(IN) :: lon(ni,nj)
61    REAL,    INTENT(IN) :: lat(ni,nj)
62 
63    TYPE(domain), POINTER :: Pt_dom
64   
65    Pt_dom=>grids(id)%task_domain(task)
66   
67    Pt_dom%ni=ni
68    Pt_dom%nj=nj
69    Pt_dom%ibegin=ibegin
70    Pt_dom%jbegin=jbegin   
71    Pt_dom%iend=ibegin+ni-1
72    Pt_dom%jend=jbegin+nj-1
73    ALLOCATE(Pt_dom%lon(ni,nj))
74    ALLOCATE(Pt_dom%lat(ni,nj))
75    Pt_dom%lon(:,:)=lon(:,:)
76    Pt_dom%lat(:,:)=lat(:,:)
77 
78  END SUBROUTINE Init_task_domain
79
80 
81  SUBROUTINE Init_grids
82  IMPLICIT NONE
83    INTEGER :: rank
84    INTEGER :: ib,ie,jb,je
85    TYPE(grid),POINTER :: Pt_grid
86    TYPE(domain),POINTER :: local_domain
87    TYPE(domain),POINTER :: task_domain(:)
88    INTEGER :: id
89   
90      max_ni=0
91      max_nj=0
92   
93      DO id=1,nb_grid
94        pt_grid=>grids(id)
95        local_domain=>pt_grid%local_domain
96        task_domain=>pt_grid%task_domain
97       
98        local_domain%ibegin=task_domain(1)%ibegin
99        local_domain%iend=task_domain(1)%iend
100        local_domain%jbegin=task_domain(1)%jbegin
101        local_domain%jend=task_domain(1)%jend
102     
103      DO rank=1,pt_grid%nb_task
104        IF (task_domain(rank)%ibegin < local_domain%ibegin)   local_domain%ibegin = task_domain(rank)%ibegin
105        IF (task_domain(rank)%iend   > local_domain%iend  )   local_domain%iend   = task_domain(rank)%iend
106        IF (task_domain(rank)%jbegin < local_domain%jbegin)   local_domain%jbegin = task_domain(rank)%jbegin
107        IF (task_domain(rank)%jend   > local_domain%jend  )   local_domain%jend   = task_domain(rank)%jend
108      ENDDO
109   
110      local_domain%ni = local_domain%iend-local_domain%ibegin+1
111      local_domain%nj = local_domain%jend-local_domain%jbegin+1
112      ALLOCATE(local_domain%lon(local_domain%ni,local_domain%nj))
113      ALLOCATE(local_domain%lat(local_domain%ni,local_domain%nj))
114     
115      DO rank=1,pt_grid%nb_task
116        ib=task_domain(rank)%ibegin-local_domain%ibegin+1
117        ie=task_domain(rank)%iend-local_domain%ibegin+1
118        jb=task_domain(rank)%jbegin-local_domain%jbegin+1
119        je=task_domain(rank)%jend-local_domain%jbegin+1
120
121        task_domain(rank)%ibegin=ib
122        task_domain(rank)%iend=ie
123        task_domain(rank)%jbegin=jb
124        task_domain(rank)%jend=je
125     
126        local_domain%lon(ib:ie,jb:je)=task_domain(rank)%lon(:,:)
127        local_domain%lat(ib:ie,jb:je)=task_domain(rank)%lat(:,:)
128      ENDDO
129 
130      IF (local_domain%ni > max_ni) max_ni=local_domain%ni
131      IF (local_domain%nj > max_nj) max_nj=local_domain%nj
132    ENDDO
133 
134    ALLOCATE(field_buffer(max_ni,max_nj,max_vert_size))
135   
136  END SUBROUTINE Init_grids
137 
138  SUBROUTINE bufferize_field2d(field,id,task)
139  IMPLICIT NONE
140    REAL,INTENT(IN) :: field(:,:)
141    INTEGER,INTENT(IN) :: id
142    INTEGER,INTENT(IN) :: task
143    TYPE(domain), POINTER :: Pt
144
145    Pt=>grids(id)%task_domain(task)
146    field_buffer(Pt%ibegin:Pt%iend,Pt%jbegin:Pt%jend,1)=field(:,:)
147     
148  END SUBROUTINE bufferize_field2d
149 
150 
151  SUBROUTINE bufferize_field3d(field,id,task)
152  IMPLICIT NONE
153    REAL,INTENT(IN) :: field(:,:,:)
154    INTEGER,INTENT(IN) :: id
155    INTEGER,INTENT(IN) :: task
156    TYPE(domain), POINTER :: Pt
157   
158    Pt=>grids(id)%task_domain(task)
159
160    IF (size(field,3)>max_vert_size) THEN
161      DEALLOCATE(field_buffer)
162      max_vert_size=max_vert_size*2
163      ALLOCATE(field_buffer(max_ni,max_nj,max_vert_size))
164    ENDIF
165   
166    field_buffer(Pt%ibegin:Pt%iend,Pt%jbegin:Pt%jend,1:size(field,3))=field(:,:,:)
167     
168  END SUBROUTINE bufferize_field3d
169   
170END MODULE box_grid
Note: See TracBrowser for help on using the repository browser.