source: codes/icosagcm/trunk/src/exner.f90 @ 519

Last change on this file since 519 was 428, checked in by dubos, 8 years ago

theta-related cleanup

File size: 1.8 KB
RevLine 
[12]1MODULE exner_mod
2
[186]3  INTEGER,SAVE :: caldyn_exner
4!$OMP THREADPRIVATE(caldyn_exner)
5
[133]6  INTEGER, PARAMETER :: lmdz=3, direct=4
[121]7
[12]8CONTAINS
[121]9 
[12]10  SUBROUTINE exner(f_ps,f_p,f_pks,f_pk)
[19]11  USE icosa
[12]12  IMPLICIT NONE
[428]13    TYPE(t_field), POINTER :: f_ps(:)  ! IN
14    TYPE(t_field), POINTER :: f_p(:)   ! IN
15    TYPE(t_field), POINTER :: f_pks(:) ! OUT
16    TYPE(t_field), POINTER :: f_pk(:)  ! OUT
[12]17 
18    REAL(rstd), POINTER :: ps(:)
19    REAL(rstd), POINTER :: p(:,:)
20    REAL(rstd), POINTER :: pks(:)
21    REAL(rstd), POINTER :: pk(:,:)
22    INTEGER :: ind
23
[295]24!$OMP BARRIER
[12]25    DO ind=1,ndomain
[186]26      IF (.NOT. assigned_domain(ind)) CYCLE
[12]27      CALL swap_dimensions(ind)
28      CALL swap_geometry(ind)
29      ps=f_ps(ind)
30      p=f_p(ind)
31      pks=f_pks(ind)
32      pk=f_pk(ind)
33      CALL compute_exner(ps, p, pks, pk, 0)
34    ENDDO
[295]35!$OMP BARRIER
[12]36 
37  END SUBROUTINE exner
38 
39  SUBROUTINE compute_exner(ps,p,pks,pk,offset)
[19]40  USE icosa
[12]41  USE disvert_mod
42  USE pression_mod
[295]43  USE omp_para
[12]44  IMPLICIT NONE
45    REAL(rstd),INTENT(IN) :: ps(iim*jjm)
46    REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1)
47    REAL(rstd),INTENT(OUT) :: pks(iim*jjm)
48    REAL(rstd),INTENT(OUT) :: pk(iim*jjm,llm)
49    INTEGER,INTENT(IN) :: offset
50    INTEGER :: i,j,ij,l
51   
[428]52    ! surface : pks
53    IF (is_omp_level_master) THEN
[50]54       
[428]55       DO j=jj_begin-offset,jj_end+offset
56          DO i=ii_begin-offset,ii_end+offset
57             ij=(j-1)*iim+i
58             pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
59          ENDDO
60       ENDDO
[50]61       
[428]62    ENDIF
63   
64    ! 3D : pk
65    DO l = 1, llm
66       DO j=jj_begin-offset,jj_end+offset
67          DO i=ii_begin-offset,ii_end+offset
68             ij=(j-1)*iim+i
69             pk(ij,l) = cpp * ((.5/preff)*(p(ij,l)+p(ij,l+1))) ** kappa
[50]70             ENDDO
71          ENDDO
72       ENDDO
[428]73       
[12]74  END SUBROUTINE compute_exner
[50]75 
[12]76END MODULE exner_mod
Note: See TracBrowser for help on using the repository browser.