source: XMLIO_SERVER/trunk/src/XMLIO/mod_domain.f90 @ 26

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

Mise à jour importante :

  • ajout de la grille type LMDZ
  • ajout des context
  • ajout de namelist pour parametrer l'utilisation du server : avec/sans MPI, en utlisant ou pas OASIS
File size: 4.4 KB
Line 
1MODULE mod_domain
2   USE mod_xmlio_parameters
3
4   INTEGER, PARAMETER :: box=1
5   INTEGER, PARAMETER :: orange=2
6   
7  TYPE domain
8    INTEGER :: rank
9    INTEGER :: ni
10    INTEGER :: nj
11    INTEGER :: ibegin
12    INTEGER :: iend
13    INTEGER :: jbegin
14    INTEGER :: jend
15    REAL,POINTER :: lon(:,:)
16    REAL,POINTER :: lat(:,:)
17   
18    INTEGER         :: type
19    LOGICAL,POINTER :: mask(:)
20    INTEGER,POINTER :: i_index(:)
21    INTEGER,POINTER :: j_index(:)
22    INTEGER         :: nbp
23    LOGICAL         :: is_defined
24  END TYPE domain
25 
26  INCLUDE 'vector_domain_def.inc'
27
28CONTAINS
29
30  INCLUDE 'vector_domain_contains.inc'
31
32  SUBROUTINE domain__new(Pt_domain)
33  IMPLICIT NONE
34    TYPE(domain),POINTER  :: Pt_domain
35   
36    Pt_domain%is_defined=.FALSE.
37   
38  END SUBROUTINE domain__new
39 
40  SUBROUTINE domain__set(Pt_domain,rank,ni,nj,ibegin,jbegin,lon,lat)
41  IMPLICIT NONE
42    TYPE(domain),POINTER  :: Pt_domain
43    INTEGER,INTENT(IN) :: rank
44    INTEGER,INTENT(IN) :: ni
45    INTEGER,INTENT(IN) :: nj
46    INTEGER,INTENT(IN) :: ibegin
47    INTEGER,INTENT(IN) :: jbegin
48    REAL,INTENT(IN)    :: lon(ni,nj)
49    REAL,INTENT(IN)    :: lat(ni,nj)
50
51    Pt_domain%rank=rank
52    Pt_domain%ni=ni
53    Pt_domain%nj=nj
54    Pt_domain%ibegin=ibegin
55    Pt_domain%jbegin=jbegin   
56    Pt_domain%iend=ibegin+ni-1
57    Pt_domain%jend=jbegin+nj-1
58    ALLOCATE(Pt_domain%lon(ni,nj))
59    ALLOCATE(Pt_domain%lat(ni,nj))
60    Pt_domain%lon(:,:)=lon(:,:)
61    Pt_domain%lat(:,:)=lat(:,:)
62    Pt_domain%is_defined=.TRUE.
63  END SUBROUTINE domain__set
64
65
66  SUBROUTINE domain__set_type_box(Pt_domain,mask)
67  USE error_msg
68  IMPLICIT NONE
69    TYPE(domain),POINTER  :: Pt_domain
70    LOGICAL,INTENT(IN),OPTIONAL :: mask(:,:)
71    INTEGER                     :: i,j
72 
73    Pt_domain%type=box
74    pt_domain%nbp=pt_domain%ni*pt_domain%nj
75    ALLOCATE(Pt_domain%i_index(pt_domain%nbp))
76    ALLOCATE(Pt_domain%j_index(pt_domain%nbp))
77    ALLOCATE(pt_domain%mask(pt_domain%nbp))
78
79    IF (PRESENT(mask)) THEN
80      IF ( size(mask,1)==pt_domain%ni .AND. size(mask,2)==pt_domain%nj) THEN
81        DO i=1,pt_domain%ni
82          DO j=1,pt_domain%nj
83            pt_domain%mask((j-1)*pt_domain%ni+i)=mask(i,j)
84          ENDDO
85        ENDDO
86      ELSE
87        WRITE (message,*) "mask dimensions are not compliant with domain dimensions :",   &
88                           size(mask,1),",",size(mask,2),"/=",Pt_domain%ni,",",Pt_domain%nj
89        CALL error("domain__set_type_box")
90      ENDIF
91    ELSE
92      pt_domain%mask(:)=.TRUE.
93    ENDIF
94   
95    DO i=1,pt_domain%ni
96      DO j=1,pt_domain%nj
97        pt_domain%i_index((j-1)*pt_domain%ni+i) = i
98        pt_domain%j_index((j-1)*pt_domain%ni+i) = j
99      ENDDO
100    ENDDO
101
102  END SUBROUTINE domain__set_type_box
103
104
105  SUBROUTINE domain__set_type_orange(Pt_domain,nbp,offset,opt_index)
106  IMPLICIT NONE
107    TYPE(domain),POINTER        :: Pt_domain
108    INTEGER,INTENT(IN)          :: nbp
109    INTEGER,INTENT(IN)          :: offset
110    INTEGER,INTENT(IN),OPTIONAL :: opt_index(:)
111   
112    INTEGER  :: index(nbp)
113    INTEGER  :: i
114   
115    Pt_domain%type=orange
116   
117    IF (PRESENT(opt_index)) THEN
118      index(:)=opt_index(:)       
119    ELSE
120      DO i=1,nbp
121        index(i)=i
122      ENDDO
123    ENDIF
124
125    pt_domain%nbp=nbp
126    ALLOCATE(pt_domain%i_index(nbp))
127    ALLOCATE(pt_domain%j_index(nbp))
128    ALLOCATE(pt_domain%mask(nbp))
129       
130    DO i=1,nbp
131!      Pt_domain%i_index(i)=(index(i)+offset)/pt_domain%ni+1+pt_domain%ibegin-1
132!      Pt_domain%j_index(i)=MOD(index(i)+offset,pt_domain%ni)+1+pt_domain%jbegin-1
133      Pt_domain%i_index(i)=MOD(index(i)+offset-1,pt_domain%ni)+1
134      Pt_domain%j_index(i)=(index(i)+offset-1)/pt_domain%ni+1
135     
136    ENDDO
137
138    Pt_domain%mask(:)=.TRUE.
139
140  END SUBROUTINE domain__set_type_orange
141
142
143   
144  SUBROUTINE domain__print(pt_domain)
145  IMPLICIT NONE
146    TYPE(domain),POINTER   :: Pt_domain
147
148    PRINT *,"---- DOMAIN ----"
149   
150    IF (pt_domain%is_defined) THEN
151      PRINT *,"rank :",pt_domain%rank
152      PRINT *,"ni :",pt_domain%ni
153      PRINT *,"nj :",pt_domain%nj
154      PRINT *,"ibegin",pt_domain%ibegin
155      PRINT *,"iend",pt_domain%iend
156    ELSE
157      PRINT *,"  ---> domain undefined"
158    ENDIF
159   
160    PRINT *,"-----------------"
161  END SUBROUTINE domain__print
162 
163  SUBROUTINE domain__copy(Pt_in,pt_out)
164  IMPLICIT NONE
165    TYPE(domain),POINTER   :: Pt_in
166    TYPE(domain),POINTER   :: Pt_out
167 
168    IF (pt_in%is_defined) THEN
169      CALL domain__set(pt_out,pt_in%rank,pt_in%ni,pt_in%nj,pt_in%ibegin,pt_in%jbegin,pt_in%lon,pt_in%lat)
170    ENDIF
171  END SUBROUTINE domain__copy
172 
173END MODULE mod_domain
Note: See TracBrowser for help on using the repository browser.