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

Last change on this file since 156 was 156, checked in by dubos, 11 years ago

new hydrostatic balance - tested with JW06 - code cleanup to follow

File size: 5.4 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  REAL(rstd), SAVE, POINTER :: mass_al(:), mass_bl(:), mass_ak(:), mass_bk(:), mass_dak(:), mass_dbk(:)
7  REAL(rstd) :: ptop ! pressure at top of atmosphere l=llm+1
8
9CONTAINS
10
11  SUBROUTINE init_disvert
12  USE disvert_std_mod, ONLY: ap_std=>ap, bp_std=>bp, presnivs_std=>presnivs, init_disvert_std=>init_disvert
13  USE disvert_ncar_mod, ONLY: ap_ncar=>ap, bp_ncar=>bp, presnivs_ncar=>presnivs, init_disvert_ncar=>init_disvert
14  USE disvert_ncarl30_mod, ONLY: ap_ncarl30=>ap, bp_ncarl30=>bp, presnivs_ncarl30=>presnivs, init_disvert_ncarl30=>init_disvert
15  USE disvert_dcmip31_mod, ONLY: ap_dcmip31=>ap, bp_dcmip31=>bp, presnivs_dcmip31=>presnivs, init_disvert_dcmip31=>init_disvert
16  USE disvert_dcmip200_mod, ONLY: ap_dcmip200=>ap, bp_dcmip200=>bp, presnivs_dcmip200=>presnivs, init_disvert_dcmip200=>init_disvert
17  USE icosa
18  USE mpipara
19  IMPLICIT NONE
20    CHARACTER(LEN=255) :: disvert_type = 'std'
21    INTEGER :: l
22
23    CALL getin("disvert",disvert_type)
24   
25    SELECT CASE (TRIM(disvert_type))
26      CASE('std')
27   
28        CALL init_disvert_std
29        ap=>ap_std
30        bp=>bp_std
31        presnivs=>presnivs_std
32     
33      CASE ('ncar')
34
35        CALL init_disvert_ncar
36        ap=>ap_ncar
37        bp=>bp_ncar
38        presnivs=>presnivs_ncar
39
40      CASE ('dcmip31')
41
42        CALL init_disvert_dcmip31
43        ap=>ap_dcmip31
44        bp=>bp_dcmip31
45        presnivs=>presnivs_dcmip31
46
47      CASE ('dcmip200')
48
49        CALL init_disvert_dcmip200
50        ap=>ap_dcmip200
51        bp=>bp_dcmip200
52        presnivs=>presnivs_dcmip200
53
54      CASE ('ncarl30')
55
56        CALL init_disvert_ncarl30
57        ap=>ap_ncarl30
58        bp=>bp_ncarl30
59        presnivs=>presnivs_ncarl30
60       
61      CASE default
62        IF (is_mpi_root) PRINT*,'Bad selector for variable disvert : <', TRIM(disvert_type),"> options are <std>, <ncar>, <ncarl30>" 
63        STOP
64       
65    END SELECT
66
67    ! Convert from pressure coordinate to mass coordinate
68    ! pk = ap(k) + bp(k)*ps(ij) = ptop + g*( mass_ak(k) + mass_bk(k)*ms(ij) )
69    ptop = ap(llm+1)
70    ALLOCATE(mass_al(llm+1))
71    ALLOCATE(mass_bl(llm+1))
72    ALLOCATE(mass_ak(llm))
73    ALLOCATE(mass_bk(llm))
74    ALLOCATE(mass_dak(llm))
75    ALLOCATE(mass_dbk(llm))
76
77    ! FIXME : leave ps for the moment ; change ps to ms later
78    DO l=1,llm+1
79!       mass_al(l) = (ap(l)-ptop)/g
80!       mass_bl(l) = bp(l)/g
81       mass_al(l) = (ap(l)-ptop)
82       mass_bl(l) = bp(l)
83    END DO
84    DO l=1,llm
85       mass_ak(l) = .5*(mass_al(l)+mass_al(l+1))
86       mass_bk(l) = .5*(mass_bl(l)+mass_bl(l+1))
87       mass_dak(l) = mass_al(l)-mass_al(l+1)  ! >0
88       mass_dbk(l) = mass_bl(l)-mass_bl(l+1)  ! >0
89    END DO
90
91  END SUBROUTINE init_disvert 
92 
93  SUBROUTINE write_apbp
94  USE icosa
95  USE netcdf_mod
96  IMPLICIT NONE
97    REAL(rstd) :: val(llm)
98    INTEGER :: status
99    INTEGER :: lev,ilev
100    INTEGER :: ncid,levid,ilevid,hyaiid,hybiid,hyamid,hybmid,P0id
101    INTEGER :: l
102   
103    status = NF90_CREATE('apbp.nc', NF90_CLOBBER, ncid)
104    status = NF90_DEF_DIM(ncid,'lev',llm,lev)
105    status = NF90_DEF_DIM(ncid,'ilev',llm+1,ilev)
106   
107    status = NF90_DEF_VAR(ncid,'lev',NF90_DOUBLE,(/ lev /),levid)
108    status = NF90_PUT_ATT(ncid,levid,"long_name","hybrid level at midpoints (1000*(A+B))")
109    status = NF90_PUT_ATT(ncid,levid,"units","Pa")
110    status = NF90_PUT_ATT(ncid,levid,"positive","up")
111    status = NF90_PUT_ATT(ncid,levid,"standard_name","atmosphere_hybrid_sigma_pressure_coordinate")
112    status = NF90_PUT_ATT(ncid,levid,"formula_terms","a: hyam b: hybm p0: P0 ps: PS")
113
114    status = NF90_DEF_VAR(ncid,'ilev',NF90_DOUBLE,(/ ilev /),ilevid)
115    status = NF90_PUT_ATT(ncid,ilevid,"long_name","hybrid level at interfaces (1000*(A+B))")
116    status = NF90_PUT_ATT(ncid,ilevid,"units","Pa")
117    status = NF90_PUT_ATT(ncid,ilevid,"positive","up")
118    status = NF90_PUT_ATT(ncid,ilevid,"standard_name","atmosphere_hybrid_sigma_pressure_coordinate")
119    status = NF90_PUT_ATT(ncid,ilevid,"formula_terms","a: hyai b: hybi p0: P0 ps: PS")
120   
121    status = NF90_DEF_VAR(ncid,'hyai',NF90_DOUBLE,(/ ilev /),hyaiid)
122    status = NF90_PUT_ATT(ncid,hyaiid,"long_name","hybrid A coefficient at layer interfaces")
123
124    status = NF90_DEF_VAR(ncid,'hybi',NF90_DOUBLE,(/ ilev /),hybiid)
125    status = NF90_PUT_ATT(ncid,hybiid,"long_name","hybrid B coefficient at layer interfaces")
126
127    status = NF90_DEF_VAR(ncid,'hyam',NF90_DOUBLE,(/ lev /),hyamid)
128    status = NF90_PUT_ATT(ncid,hyamid,"long_name","hybrid A coefficient at midpoint interfaces")
129
130    status = NF90_DEF_VAR(ncid,'hybm',NF90_DOUBLE,(/ lev /),hybmid)
131    status = NF90_PUT_ATT(ncid,hybmid,"long_name","hybrid B coefficient at midpoint interfaces")
132   
133    status = NF90_DEF_VAR(ncid,'P0',NF90_DOUBLE,varid=P0id)
134
135    status = NF90_ENDDEF(ncid)   
136   
137    status=NF90_PUT_VAR(ncid,ilevid, ap(:)+bp(:)*Preff)
138   
139    DO l=1,llm
140      val(l)= 0.5*(ap(l+1)+ap(l)+Preff*(bp(l)+bp(l+1)))
141    ENDDO
142   
143    status=NF90_PUT_VAR(ncid,levid, val)
144
145    status=NF90_PUT_VAR(ncid,hyaiid, ap(:)/Preff)
146    status=NF90_PUT_VAR(ncid,hybiid, bp(:))
147   
148    DO l=1,llm
149      val(l)= 0.5*(ap(l+1)+ap(l))
150    ENDDO
151    status=NF90_PUT_VAR(ncid,hyamid, val(:)/Preff)
152   
153     DO l=1,llm
154      val(l)= 0.5*(bp(l+1)+bp(l))
155    ENDDO
156    status=NF90_PUT_VAR(ncid,hybmid, val(:))
157 
158    status=NF90_PUT_VAR(ncid,P0id, Preff)
159   
160   status=NF90_CLOSE(ncid)
161  END SUBROUTINE write_apbp
162
163END MODULE disvert_mod
Note: See TracBrowser for help on using the repository browser.