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

Last change on this file since 187 was 186, checked in by ymipsl, 10 years ago

Add new openMP parallelism based on distribution of domains on threads. There is no more limitation of number of threads by MPI process.

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.