source: codes/icosagcm/trunk/src/vertical_interp.f90 @ 352

Last change on this file since 352 was 295, checked in by ymipsl, 10 years ago

Merging OpenMP parallisme mode : by subdomain and on vertical level.
This feature is actually experimental but may be retro-compatible with the last method based only on subdomain

YM

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