source: codes/icosagcm/trunk/src/vertical/vertical_interp.f90

Last change on this file was 548, checked in by dubos, 7 years ago

trunk : reorganize source tree

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_pmid,f_in,f_out,pval)
21  USE icosa
22  USE pression_mod
23  USE omp_para
24  IMPLICIT NONE
25    TYPE(t_field),POINTER :: f_pmid(:)
26    TYPE(t_field),POINTER :: f_in(:)
27    TYPE(t_field),POINTER :: f_out(:)
28    REAL(rstd),INTENT(IN) :: pval
29
30    REAL(rstd),POINTER :: in(:,:)
31    REAL(rstd),POINTER :: out(:)
32    REAL(rstd),POINTER :: pmid(:,:)
33   
34    INTEGER :: ind
35       
36    DO ind=1,ndomain
37      IF (.NOT. assigned_domain(ind)) CYCLE
38      CALL swap_dimensions(ind)
39      CALL swap_geometry(ind)
40      pmid=f_pmid(ind)
41      in=f_in(ind)
42      out=f_out(ind)
43      CALL compute_vertical_interp(pmid,in,out,pval)
44    ENDDO
45   
46  END SUBROUTINE  vertical_interp
47
48  SUBROUTINE compute_vertical_interp(pmid,in,out,pval)
49  USE omp_para
50  IMPLICIT NONE
51    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
52    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
53    REAL(rstd),INTENT(OUT) :: out(iim*jjm)
54    REAL(rstd) :: pval, coeff
55    INTEGER :: i,j,ij,l
56       
57!$OMP BARRIER   
58    IF (is_omp_level_master) THEN
59   
60      DO j=jj_begin-1,jj_end+1
61        DO i=ii_begin-1,ii_end+1
62          ij=(j-1)*iim+i
63          l=llm-1
64          DO WHILE(pmid(ij,l)<pval .AND. l>1)
65            l=l-1
66          ENDDO
67          coeff=(pval-pmid(ij,l))/(pmid(ij,l)-pmid(ij,l+1))
68          out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1))
69        ENDDO
70      ENDDO   
71    ENDIF
72!$OMP BARRIER
73
74  END SUBROUTINE compute_vertical_interp
75
76END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.