source: codes/icosagcm/branches/SATURN_DYNAMICO/ICOSAGCM/src/vertical_interp.f90 @ 314

Last change on this file since 314 was 221, checked in by ymipsl, 10 years ago

Creating temporary dynamico/lmdz/saturn branche

YM

File size: 1.8 KB
Line 
1MODULE vertical_interp_mod
2  USE icosa
3  PRIVATE
4 
5  TYPE(t_field),SAVE, POINTER :: f_p(:)
6 
7
8  PUBLIC init_vertical_interp, vertical_interp, compute_vertical_interp
9
10CONTAINS
11
12  SUBROUTINE init_vertical_interp
13  USE icosa
14  IMPLICIT NONE
15   
16    CALL allocate_field(f_p,field_t,type_real,llm+1)
17   
18  END SUBROUTINE init_vertical_interp
19   
20  SUBROUTINE vertical_interp(f_ps,f_in,f_out,pval)
21  USE icosa
22  USE pression_mod
23  IMPLICIT NONE
24    TYPE(t_field),POINTER :: f_ps(:)
25    TYPE(t_field),POINTER :: f_in(:)
26    TYPE(t_field),POINTER :: f_out(:)
27    REAL(rstd),INTENT(IN) :: pval
28
29    REAL(rstd),POINTER :: in(:,:)
30    REAL(rstd),POINTER :: out(:)
31    REAL(rstd),POINTER :: p(:,:)
32   
33    INTEGER :: ind
34       
35    CALL pression(f_ps,f_p)
36 
37    DO ind=1,ndomain
38      IF (.NOT. assigned_domain(ind)) CYCLE
39      CALL swap_dimensions(ind)
40      CALL swap_geometry(ind)
41      p=f_p(ind)
42      in=f_in(ind)
43      out=f_out(ind)
44      CALL compute_vertical_interp(p,in,out,pval)
45    ENDDO
46   
47  END SUBROUTINE  vertical_interp
48
49  SUBROUTINE compute_vertical_interp(p,in,out,pval)
50  IMPLICIT NONE
51    REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1)
52    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
53    REAL(rstd),INTENT(OUT) :: out(iim*jjm)
54    REAL(rstd) :: pval
55    REAL(rstd) :: coeff, pmid,pmidp1
56    INTEGER :: i,j,ij,l
57       
58    DO j=jj_begin-1,jj_end+1
59      DO i=ii_begin-1,ii_end+1
60        ij=(j-1)*iim+i
61        l=llm-1
62        DO WHILE(0.5*(p(ij,l)+p(ij,l+1))<pval .AND. l>1)
63          l=l-1
64        ENDDO
65        pmid=0.5*(p(ij,l)+p(ij,l+1))
66        pmidp1=0.5*(p(ij,l+1)+p(ij,l+2))
67
68        coeff=(pval-pmid)/(pmid-pmidp1)
69       
70        out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1))
71      ENDDO
72    ENDDO
73       
74  END SUBROUTINE compute_vertical_interp
75
76END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.