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

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

Add dcmip 2.0-0 vertical discretisation

YM

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