source: codes/icosagcm/trunk/src/disvert.f90 @ 115

Last change on this file since 115 was 115, checked in by ymipsl, 12 years ago

Implement dcmip31 vertcal discretisation

YM

File size: 4.2 KB
Line 
1MODULE disvert_mod
2  USE icosa
3  REAL(rstd), SAVE, POINTER :: ap(:)
4  REAL(rstd), SAVE, POINTER :: bp(:)
5  REAL(rstd), SAVE, POINTER :: presnivs(:)
6
7CONTAINS
8
9  SUBROUTINE init_disvert
10  USE disvert_std_mod, ONLY: ap_std=>ap, bp_std=>bp, presnivs_std=>presnivs, init_disvert_std=>init_disvert
11  USE disvert_ncar_mod, ONLY: ap_ncar=>ap, bp_ncar=>bp, presnivs_ncar=>presnivs, init_disvert_ncar=>init_disvert
12  USE disvert_ncarl30_mod, ONLY: ap_ncarl30=>ap, bp_ncarl30=>bp, presnivs_ncarl30=>presnivs, init_disvert_ncarl30=>init_disvert
13  USE disvert_dcmip31_mod, ONLY: ap_dcmip31=>ap, bp_dcmip31=>bp, presnivs_dcmip31=>presnivs, init_disvert_dcmip31=>init_disvert
14  USE icosa
15  IMPLICIT NONE
16    CHARACTER(LEN=255) :: disvert_type = 'std'
17   
18    CALL getin("disvert",disvert_type)
19   
20    SELECT CASE (TRIM(disvert_type))
21      CASE('std')
22   
23        CALL init_disvert_std
24        ap=>ap_std
25        bp=>bp_std
26        presnivs=>presnivs_std
27     
28      CASE ('ncar')
29
30        CALL init_disvert_ncar
31        ap=>ap_ncar
32        bp=>bp_ncar
33        presnivs=>presnivs_ncar
34
35      CASE ('dcmip31')
36
37        CALL init_disvert_dcmip31
38        ap=>ap_dcmip31
39        bp=>bp_dcmip31
40        presnivs=>presnivs_dcmip31
41
42      CASE ('ncarl30')
43
44        CALL init_disvert_ncarl30
45        ap=>ap_ncarl30
46        bp=>bp_ncarl30
47        presnivs=>presnivs_ncarl30
48       
49      CASE default
50        PRINT*,'Bad selector for variable disvert : <', TRIM(disvert_type),"> options are <std>, <ncar>, <ncarl30>" 
51        STOP
52       
53    END SELECT
54
55  END SUBROUTINE init_disvert 
56 
57  SUBROUTINE write_apbp
58  USE icosa
59  USE netcdf_mod
60  IMPLICIT NONE
61    REAL(rstd) :: val(llm)
62    INTEGER :: status
63    INTEGER :: lev,ilev
64    INTEGER :: ncid,levid,ilevid,hyaiid,hybiid,hyamid,hybmid,P0id
65    INTEGER :: l
66   
67    status = NF90_CREATE('apbp.nc', NF90_CLOBBER, ncid)
68    status = NF90_DEF_DIM(ncid,'lev',llm,lev)
69    status = NF90_DEF_DIM(ncid,'ilev',llm+1,ilev)
70   
71    status = NF90_DEF_VAR(ncid,'lev',NF90_DOUBLE,(/ lev /),levid)
72    status = NF90_PUT_ATT(ncid,levid,"long_name","hybrid level at midpoints (1000*(A+B))")
73    status = NF90_PUT_ATT(ncid,levid,"units","Pa")
74    status = NF90_PUT_ATT(ncid,levid,"positive","up")
75    status = NF90_PUT_ATT(ncid,levid,"standard_name","atmosphere_hybrid_sigma_pressure_coordinate")
76    status = NF90_PUT_ATT(ncid,levid,"formula_terms","a: hyam b: hybm p0: P0 ps: PS")
77
78    status = NF90_DEF_VAR(ncid,'ilev',NF90_DOUBLE,(/ ilev /),ilevid)
79    status = NF90_PUT_ATT(ncid,ilevid,"long_name","hybrid level at interfaces (1000*(A+B))")
80    status = NF90_PUT_ATT(ncid,ilevid,"units","Pa")
81    status = NF90_PUT_ATT(ncid,ilevid,"positive","up")
82    status = NF90_PUT_ATT(ncid,ilevid,"standard_name","atmosphere_hybrid_sigma_pressure_coordinate")
83    status = NF90_PUT_ATT(ncid,ilevid,"formula_terms","a: hyai b: hybi p0: P0 ps: PS")
84   
85    status = NF90_DEF_VAR(ncid,'hyai',NF90_DOUBLE,(/ ilev /),hyaiid)
86    status = NF90_PUT_ATT(ncid,hyaiid,"long_name","hybrid A coefficient at layer interfaces")
87
88    status = NF90_DEF_VAR(ncid,'hybi',NF90_DOUBLE,(/ ilev /),hybiid)
89    status = NF90_PUT_ATT(ncid,hybiid,"long_name","hybrid B coefficient at layer interfaces")
90
91    status = NF90_DEF_VAR(ncid,'hyam',NF90_DOUBLE,(/ lev /),hyamid)
92    status = NF90_PUT_ATT(ncid,hyamid,"long_name","hybrid A coefficient at midpoint interfaces")
93
94    status = NF90_DEF_VAR(ncid,'hybm',NF90_DOUBLE,(/ lev /),hybmid)
95    status = NF90_PUT_ATT(ncid,hybmid,"long_name","hybrid B coefficient at midpoint interfaces")
96   
97    status = NF90_DEF_VAR(ncid,'P0',NF90_DOUBLE,varid=P0id)
98
99    status = NF90_ENDDEF(ncid)   
100   
101    PRINT*,ap
102    PRINT*,bp
103    status=NF90_PUT_VAR(ncid,ilevid, ap(:)+bp(:)*Preff)
104   
105    DO l=1,llm
106      val(l)= 0.5*(ap(l+1)+ap(l)+Preff*(bp(l)+bp(l+1)))
107    ENDDO
108   
109    status=NF90_PUT_VAR(ncid,levid, val)
110
111    status=NF90_PUT_VAR(ncid,hyaiid, ap(:)/Preff)
112    status=NF90_PUT_VAR(ncid,hybiid, bp(:))
113   
114    DO l=1,llm
115      val(l)= 0.5*(ap(l+1)+ap(l))
116    ENDDO
117    status=NF90_PUT_VAR(ncid,hyamid, val(:)/Preff)
118   
119     DO l=1,llm
120      val(l)= 0.5*(bp(l+1)+bp(l))
121    ENDDO
122    status=NF90_PUT_VAR(ncid,hybmid, val(:))
123 
124    status=NF90_PUT_VAR(ncid,P0id, Preff)
125   
126   status=NF90_CLOSE(ncid)
127  END SUBROUTINE write_apbp
128
129END MODULE disvert_mod
Note: See TracBrowser for help on using the repository browser.