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

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

trunk : reorganize source tree

File size: 1.8 KB
RevLine 
[90]1MODULE vertical_interp_mod
2  USE icosa
3  PRIVATE
4 
[436]5!  TYPE(t_field),SAVE, POINTER :: f_p(:)
[90]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   
[436]16!    CALL allocate_field(f_p,field_t,type_real,llm+1)
[90]17   
18  END SUBROUTINE init_vertical_interp
19   
[436]20  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval)
[90]21  USE icosa
22  USE pression_mod
[295]23  USE omp_para
[90]24  IMPLICIT NONE
[436]25    TYPE(t_field),POINTER :: f_pmid(:)
[90]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(:)
[436]32    REAL(rstd),POINTER :: pmid(:,:)
[90]33   
34    INTEGER :: ind
35       
36    DO ind=1,ndomain
[186]37      IF (.NOT. assigned_domain(ind)) CYCLE
[90]38      CALL swap_dimensions(ind)
39      CALL swap_geometry(ind)
[436]40      pmid=f_pmid(ind)
[90]41      in=f_in(ind)
42      out=f_out(ind)
[436]43      CALL compute_vertical_interp(pmid,in,out,pval)
[90]44    ENDDO
45   
46  END SUBROUTINE  vertical_interp
47
[436]48  SUBROUTINE compute_vertical_interp(pmid,in,out,pval)
[295]49  USE omp_para
[90]50  IMPLICIT NONE
[436]51    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
[90]52    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
53    REAL(rstd),INTENT(OUT) :: out(iim*jjm)
[436]54    REAL(rstd) :: pval, coeff
[90]55    INTEGER :: i,j,ij,l
56       
[295]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
[436]64          DO WHILE(pmid(ij,l)<pval .AND. l>1)
[295]65            l=l-1
66          ENDDO
[436]67          coeff=(pval-pmid(ij,l))/(pmid(ij,l)-pmid(ij,l+1))
[295]68          out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1))
69        ENDDO
[436]70      ENDDO   
[295]71    ENDIF
[436]72!$OMP BARRIER
73
[90]74  END SUBROUTINE compute_vertical_interp
75
76END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.