source: codes/icosagcm/trunk/src/field.f90 @ 15

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

dynamico tree creation

YM

File size: 5.8 KB
Line 
1MODULE field_mod
2  USE genmod
3 
4  INTEGER,PARAMETER :: field_T=1
5  INTEGER,PARAMETER :: field_U=2
6  INTEGER,PARAMETER :: field_Z=3
7
8  INTEGER,PARAMETER :: type_integer=1
9  INTEGER,PARAMETER :: type_real=2
10  INTEGER,PARAMETER :: type_logical=3
11   
12  TYPE t_field
13    REAL(rstd),POINTER :: rval2d(:)
14    REAL(rstd),POINTER :: rval3d(:,:)
15    REAL(rstd),POINTER :: rval4d(:,:,:)
16
17    INTEGER,POINTER :: ival2d(:)
18    INTEGER,POINTER :: ival3d(:,:)
19    INTEGER,POINTER :: ival4d(:,:,:)
20   
21    LOGICAL,POINTER :: lval2d(:)
22    LOGICAL,POINTER :: lval3d(:,:)
23    LOGICAL,POINTER :: lval4d(:,:,:)
24
25    INTEGER :: ndim
26    INTEGER :: field_type
27    INTEGER :: data_type 
28  END TYPE t_field   
29
30  INTERFACE get_val
31    MODULE PROCEDURE getval_r2d,getval_r3d,getval_r4d, &
32                     getval_i2d,getval_i3d,getval_i4d, &
33                     getval_l2d,getval_l3d,getval_l4d
34  END INTERFACE
35                   
36  INTERFACE ASSIGNMENT(=)
37    MODULE PROCEDURE getval_r2d,getval_r3d,getval_r4d, &
38                     getval_i2d,getval_i3d,getval_i4d, &
39                     getval_l2d,getval_l3d,getval_l4d 
40  END INTERFACE
41
42
43CONTAINS
44
45  SUBROUTINE allocate_field(field,field_type,data_type,dim1,dim2)
46  USE domain_mod
47  IMPLICIT NONE
48    TYPE(t_field),POINTER :: field(:)
49    INTEGER,INTENT(IN) :: field_type
50    INTEGER,INTENT(IN) :: data_type
51    INTEGER,OPTIONAL :: dim1,dim2
52    INTEGER :: ind
53    INTEGER :: ii_size,jj_size
54
55    ALLOCATE(field(ndomain))   
56
57    DO ind=1,ndomain
58 
59      IF (PRESENT(dim2)) THEN
60        field(ind)%ndim=4 
61      ELSE IF (PRESENT(dim1)) THEN
62        field(ind)%ndim=3
63      ELSE
64        field(ind)%ndim=2
65      ENDIF
66   
67   
68      field(ind)%data_type=data_type
69      field(ind)%field_type=field_type
70   
71      IF (field_type==field_T) THEN
72        jj_size=domain(ind)%jjm
73      ELSE IF (field_type==field_U) THEN
74        jj_size=3*domain(ind)%jjm
75      ELSE IF (field_type==field_Z) THEN
76        jj_size=2*domain(ind)%jjm
77      ENDIF
78     
79      ii_size=domain(ind)%iim
80       
81      IF (field(ind)%ndim==4) THEN
82        IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ii_size*jj_size,dim1,dim2))
83        IF (data_type==type_real)    ALLOCATE(field(ind)%rval4d(ii_size*jj_size,dim1,dim2))
84        IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ii_size*jj_size,dim1,dim2))
85      ELSE IF (field(ind)%ndim==3) THEN
86        IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ii_size*jj_size,dim1))
87        IF (data_type==type_real)    ALLOCATE(field(ind)%rval3d(ii_size*jj_size,dim1))
88        IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ii_size*jj_size,dim1))
89      ELSE IF (field(ind)%ndim==2) THEN
90        IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ii_size*jj_size))
91        IF (data_type==type_real)    ALLOCATE(field(ind)%rval2d(ii_size*jj_size))
92        IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ii_size*jj_size))
93      ENDIF
94     
95   ENDDO
96   
97  END SUBROUTINE allocate_field
98 
99  SUBROUTINE getval_r2d(field_pt,field)
100  IMPLICIT NONE 
101    REAL(rstd),POINTER,INTENT(INOUT) :: field_pt(:)
102    TYPE(t_field),INTENT(IN) :: field
103   
104    IF (field%ndim/=2 .OR. field%data_type/=type_real) STOP 'get_val_r2d : bad pointer assignation'       
105    field_pt=>field%rval2d
106  END SUBROUTINE  getval_r2d
107
108  SUBROUTINE getval_r3d(field_pt,field)
109  IMPLICIT NONE 
110    REAL(rstd),POINTER,INTENT(INOUT) :: field_pt(:,:)
111    TYPE(t_field),INTENT(IN) :: field
112   
113    IF (field%ndim/=3 .OR. field%data_type/=type_real) STOP 'get_val_r3d : bad pointer assignation'       
114    field_pt=>field%rval3d
115  END SUBROUTINE  getval_r3d
116
117  SUBROUTINE getval_r4d(field_pt,field)
118  IMPLICIT NONE 
119    REAL(rstd),POINTER,INTENT(INOUT) :: field_pt(:,:,:)
120    TYPE(t_field),INTENT(IN) :: field
121   
122    IF (field%ndim/=4 .OR. field%data_type/=type_real) STOP 'get_val_r4d : bad pointer assignation'       
123    field_pt=>field%rval4d
124  END SUBROUTINE  getval_r4d
125 
126
127 
128  SUBROUTINE getval_i2d(field_pt,field)
129  IMPLICIT NONE 
130    INTEGER,POINTER,INTENT(INOUT) :: field_pt(:)
131    TYPE(t_field),INTENT(IN) :: field
132   
133    IF (field%ndim/=2 .OR. field%data_type/=type_integer) STOP 'get_val_i2d : bad pointer assignation'       
134    field_pt=>field%ival2d
135  END SUBROUTINE  getval_i2d
136
137  SUBROUTINE getval_i3d(field_pt,field)
138  IMPLICIT NONE 
139    INTEGER,POINTER,INTENT(INOUT) :: field_pt(:,:)
140    TYPE(t_field),INTENT(IN) :: field
141   
142    IF (field%ndim/=3 .OR. field%data_type/=type_integer) STOP 'get_val_i3d : bad pointer assignation'       
143    field_pt=>field%ival3d
144  END SUBROUTINE  getval_i3d
145
146  SUBROUTINE getval_i4d(field_pt,field)
147  IMPLICIT NONE 
148    INTEGER,POINTER,INTENT(INOUT) :: field_pt(:,:,:)
149    TYPE(t_field),INTENT(IN) :: field
150   
151    IF (field%ndim/=4 .OR. field%data_type/=type_integer) STOP 'get_val_i4d : bad pointer assignation'       
152    field_pt=>field%ival4d
153  END SUBROUTINE  getval_i4d
154
155  SUBROUTINE getval_l2d(field_pt,field)
156  IMPLICIT NONE 
157    LOGICAL,POINTER,INTENT(INOUT) :: field_pt(:)
158    TYPE(t_field),INTENT(IN) :: field
159   
160    IF (field%ndim/=2 .OR. field%data_type/=type_logical) STOP 'get_val_l2d : bad pointer assignation'       
161    field_pt=>field%lval2d
162  END SUBROUTINE  getval_l2d
163
164  SUBROUTINE getval_l3d(field_pt,field)
165  IMPLICIT NONE 
166    LOGICAL,POINTER,INTENT(INOUT) :: field_pt(:,:)
167    TYPE(t_field),INTENT(IN) :: field
168   
169    IF (field%ndim/=3 .OR. field%data_type/=type_logical) STOP 'get_val_l3d : bad pointer assignation'       
170    field_pt=>field%lval3d
171  END SUBROUTINE  getval_l3d
172
173  SUBROUTINE getval_l4d(field_pt,field)
174  IMPLICIT NONE 
175    LOGICAL,POINTER,INTENT(INOUT) :: field_pt(:,:,:)
176    TYPE(t_field),INTENT(IN) :: field
177   
178    IF (field%ndim/=4 .OR. field%data_type/=type_logical) STOP 'get_val_l4d : bad pointer assignation'       
179    field_pt=>field%lval4d
180  END SUBROUTINE  getval_l4d   
181
182END MODULE field_mod   
Note: See TracBrowser for help on using the repository browser.