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_boxed_domain.f90 in vendors/XMLIO_SERVER/current/src/IOSERVER – NEMO

source: vendors/XMLIO_SERVER/current/src/IOSERVER/mod_boxed_domain.f90 @ 1897

Last change on this file since 1897 was 1897, checked in by flavoni, 14 years ago

importing XMLIO_SERVER vendor

File size: 3.5 KB
Line 
1MODULE boxed_domain
2
3  INTEGER,SAVE :: ni_glo
4  INTEGER,SAVE :: nj_glo
5  INTEGER,SAVE :: nb_proc
6 
7  TYPE local_domain
8    INTEGER :: ni
9    INTEGER :: nj
10    INTEGER :: ibegin
11    INTEGER :: iend
12    INTEGER :: jbegin
13    INTEGER :: jend
14    REAL,POINTER :: lon(:,:)
15    REAL,POINTER :: lat(:,:)
16  END TYPE local_domain
17 
18  TYPE(local_domain),ALLOCATABLE,SAVE,TARGET :: domains(:)
19 
20 
21  INTEGER,SAVE :: ni
22  INTEGER,SAVE :: nj
23  INTEGER,SAVE :: ibegin
24  INTEGER,SAVE :: iend
25  INTEGER,SAVE :: jbegin
26  INTEGER,SAVE :: jend
27 
28  REAL,SAVE,ALLOCATABLE :: lon(:,:)
29  REAL,SAVE,ALLOCATABLE :: lat(:,:)
30 
31  INTEGER,SAVE :: max_vert_size = 100
32  REAL,SAVE,ALLOCATABLE :: Field_buffer(:,:,:) 
33 
34CONTAINS
35
36  SUBROUTINE Init_global_domain(ni_glo_,nj_glo_,nb_proc_)
37  IMPLICIT NONE
38  INTEGER, INTENT(IN) :: ni_glo_
39  INTEGER, INTENT(IN) :: nj_glo_
40  INTEGER, INTENT(IN) :: nb_proc_
41 
42    ni_glo=ni_glo_
43    nj_glo=nj_glo_
44    nb_proc=nb_proc_
45   
46    ALLOCATE(domains(nb_proc))
47 
48  END SUBROUTINE Init_global_domain
49
50
51  SUBROUTINE Init_local_domain(rank,ni,nj,ibegin,jbegin,lon,lat)
52  IMPLICIT NONE
53    INTEGER, INTENT(IN) :: rank
54    INTEGER, INTENT(IN) :: ni
55    INTEGER, INTENT(IN) :: nj
56    INTEGER, INTENT(IN) :: ibegin   
57    INTEGER, INTENT(IN) :: jbegin
58    REAL, INTENT(IN)    :: lon(ni,nj)
59    REAL, INTENT(IN)    :: lat(ni,nj)
60   
61    domains(rank)%ni=ni
62    domains(rank)%nj=nj
63    domains(rank)%ibegin=ibegin
64    domains(rank)%jbegin=jbegin   
65    domains(rank)%iend=ibegin+ni-1
66    domains(rank)%jend=jbegin+nj-1
67    ALLOCATE(domains(rank)%lon(ni,nj))
68    ALLOCATE(domains(rank)%lat(ni,nj))
69    domains(rank)%lon(:,:)=lon(:,:)
70    domains(rank)%lat(:,:)=lat(:,:)
71 
72  END SUBROUTINE Init_local_domain
73 
74 
75  SUBROUTINE Init_domain
76  IMPLICIT NONE
77    INTEGER :: rank
78    INTEGER :: ib,ie,jb,je
79    ibegin=domains(1)%ibegin
80    iend=domains(1)%iend
81    jbegin=domains(1)%jbegin
82    jend=domains(1)%jend
83   
84    DO rank=1,nb_proc
85      IF (domains(rank)%ibegin<ibegin) ibegin=domains(rank)%ibegin
86      IF (domains(rank)%iend>iend) iend=domains(rank)%iend
87      IF (domains(rank)%jbegin<jbegin) jbegin=domains(rank)%jbegin
88      IF (domains(rank)%jend>jend) jend=domains(rank)%jend
89    ENDDO
90   
91    ni=iend-ibegin+1
92    nj=jend-jbegin+1
93    ALLOCATE(lon(ni,nj))
94    ALLOCATE(lat(ni,nj))
95   
96    DO rank=1,nb_proc
97      ib=domains(rank)%ibegin-ibegin+1
98      ie=domains(rank)%iend-ibegin+1
99      jb=domains(rank)%jbegin-jbegin+1
100      je=domains(rank)%jend-jbegin+1
101
102      domains(rank)%ibegin=ib
103      domains(rank)%iend=ie
104      domains(rank)%jbegin=jb
105      domains(rank)%jend=je
106     
107      lon(ib:ie,jb:je)=domains(rank)%lon(:,:)
108      lat(ib:ie,jb:je)=domains(rank)%lat(:,:)
109    ENDDO
110 
111    ALLOCATE(field_buffer(ni,nj,max_vert_size))
112   
113  END SUBROUTINE
114 
115  SUBROUTINE bufferize_field2d(field,rank)
116  IMPLICIT NONE
117    REAL,INTENT(IN) :: field(:,:)
118    INTEGER,INTENT(IN) :: rank
119    TYPE(local_domain), POINTER :: Pt
120
121    Pt=>domains(rank)
122    field_buffer(Pt%ibegin:Pt%iend,Pt%jbegin:Pt%jend,1)=field(:,:)
123     
124  END SUBROUTINE bufferize_field2d
125 
126 
127  SUBROUTINE bufferize_field3d(field,rank)
128  IMPLICIT NONE
129    REAL,INTENT(IN) :: field(:,:,:)
130    INTEGER,INTENT(IN) :: rank
131    TYPE(local_domain), POINTER :: Pt
132   
133    Pt=>domains(rank)
134    IF (size(field,3)>max_vert_size) THEN
135      DEALLOCATE(field_buffer)
136      max_vert_size=max_vert_size*2
137      ALLOCATE(field_buffer(ni,nj,max_vert_size))
138    ENDIF
139   
140    field_buffer(Pt%ibegin:Pt%iend,Pt%jbegin:Pt%jend,1:size(field,3))=field(:,:,:)
141     
142  END SUBROUTINE bufferize_field3d
143
144   
145END MODULE boxed_domain
Note: See TracBrowser for help on using the repository browser.