source: codes/icosagcm/trunk/src/initial/etat0_williamson.f90

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

trunk : reorganize source tree

File size: 1.9 KB
Line 
1MODULE etat0_williamson_mod
2  USE icosa
3  PRIVATE
4  REAL(rstd), PARAMETER :: h0=8.E3
5  REAL(rstd), PARAMETER :: R0=4
6  REAL(rstd), PARAMETER :: K0=7.848E-6
7  REAL(rstd), PARAMETER :: omega0=K0
8 
9  PUBLIC getin_etat0, compute_etat0
10 
11CONTAINS
12
13  SUBROUTINE getin_etat0
14    USE mpipara, ONLY : is_mpi_root
15    USE disvert_mod, ONLY : caldyn_eta, eta_lag
16    IF(caldyn_eta /= eta_lag) THEN
17       IF(is_mpi_root) PRINT *, 'etat0_type=williamson91.6 (Williamson,1991) must be used with caldyn_eta=eta_lag'
18       STOP
19    END IF
20
21    IF(llm>1) THEN
22       IF(is_mpi_root) PRINT *, 'etat0_type=williamson91.6 (Williamson,1991) must be used with llm=1 but llm =',llm
23       STOP
24    END IF
25  END SUBROUTINE getin_etat0
26
27  SUBROUTINE compute_etat0(ngrid,lon,lat, phis,mass,rhodz,ulon,ulat)
28    IMPLICIT NONE 
29    INTEGER, INTENT(IN)    :: ngrid
30    REAL(rstd),INTENT(IN)  :: lon(ngrid)
31    REAL(rstd),INTENT(IN)  :: lat(ngrid)
32    REAL(rstd),INTENT(OUT) :: phis(ngrid)
33    REAL(rstd),INTENT(OUT) :: mass(ngrid)
34    REAL(rstd),INTENT(OUT) :: rhodz(ngrid)
35    REAL(rstd),INTENT(OUT) :: ulon(ngrid)
36    REAL(rstd),INTENT(OUT) :: ulat(ngrid)
37
38    REAL(rstd) :: coslat,sinlat, A,B,C   
39    INTEGER :: ij
40   
41    DO ij=1,ngrid
42       coslat=cos(lat(ij))
43       sinlat=sin(lat(ij))
44       A = 0.5*omega0*(2*omega+omega0)*coslat**2   &
45            + 0.25*K0**2*coslat**(2*R0)*((R0+1)*coslat**2+(2*R0**2-R0-2)-2*R0**2/coslat**2)
46       B = 2*(omega+omega0)*K0/((R0+1)*(R0+2))*coslat**R0*((R0**2+2*R0+2)-(R0+1)**2*coslat**2)
47       C = 0.25*K0**2*coslat**(2*R0)*((R0+1)*coslat**2-(R0+2))
48       
49       mass(ij) = (g*h0+radius**2*A+radius**2*B*cos(R0*lon(ij))+radius**2*C*cos(2*R0*lon(ij)))/g
50       ulon(ij) = radius*omega0*coslat+radius*K0*coslat**(R0-1)*(R0*sinlat**2-coslat**2)*cos(R0*lon(ij))
51       ulat(ij) = -radius*K0*R0*coslat**(R0-1)*sinlat*sin(R0*lon(ij))
52    ENDDO
53
54    phis(:)=0.
55    rhodz(:)=mass(:)
56
57  END SUBROUTINE compute_etat0
58 
59END MODULE etat0_williamson_mod
Note: See TracBrowser for help on using the repository browser.