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_domain.f90 in branches/DEV_r1879_FCM/NEMOGCM/EXTERNAL/XMLIO_SERVER/src/XMLIO – NEMO

source: branches/DEV_r1879_FCM/NEMOGCM/EXTERNAL/XMLIO_SERVER/src/XMLIO/mod_domain.f90 @ 1916

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

importing XMLIO_SERVER vendor

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