source: XMLIO_SERVER/trunk/src/XMLIO/mod_domain.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.3 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    ALLOCATE(pt_domain%i_index(nbp))
126    ALLOCATE(pt_domain%j_index(nbp))
127       
128    DO i=1,nbp
129      Pt_domain%i_index(i)=(index(i)+offset)/pt_domain%nj+1+pt_domain%ibegin-1
130      Pt_domain%j_index(i)=MOD(index(i)+offset,pt_domain%nj)+1+pt_domain%jbegin-1
131    ENDDO
132
133    Pt_domain%mask(:)=.TRUE.
134
135  END SUBROUTINE domain__set_type_orange
136
137
138   
139  SUBROUTINE domain__print(pt_domain)
140  IMPLICIT NONE
141    TYPE(domain),POINTER   :: Pt_domain
142
143    PRINT *,"---- DOMAIN ----"
144   
145    IF (pt_domain%is_defined) THEN
146      PRINT *,"rank :",pt_domain%rank
147      PRINT *,"ni :",pt_domain%ni
148      PRINT *,"nj :",pt_domain%nj
149      PRINT *,"ibegin",pt_domain%ibegin
150      PRINT *,"iend",pt_domain%iend
151    ELSE
152      PRINT *,"  ---> domain undefined"
153    ENDIF
154   
155    PRINT *,"-----------------"
156  END SUBROUTINE domain__print
157 
158  SUBROUTINE domain__copy(Pt_in,pt_out)
159  IMPLICIT NONE
160    TYPE(domain),POINTER   :: Pt_in
161    TYPE(domain),POINTER   :: Pt_out
162 
163    IF (pt_in%is_defined) THEN
164      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)
165    ENDIF
166  END SUBROUTINE domain__copy
167 
168END MODULE mod_domain
Note: See TracBrowser for help on using the repository browser.