source: codes/icosagcm/devel/src/diagnostics/exner.f90 @ 913

Last change on this file since 913 was 913, checked in by dubos, 5 years ago

devel : compute_pression for unstructured mesh

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